LpVec3.java

net.minecraft.network.LpVec3

信息

  • 全限定名:net.minecraft.network.LpVec3
  • 类型:public class
  • 包:net.minecraft.network
  • 源码路径:src/main/java/net/minecraft/network/LpVec3.java
  • 起始行号:L7
  • 职责:

    TODO

字段/常量

  • DATA_BITS

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L8
    • 说明:

      TODO

  • DATA_BITS_MASK

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L9
    • 说明:

      TODO

  • MAX_QUANTIZED_VALUE

    • 类型: double
    • 修饰符: private static final
    • 源码定位: L10
    • 说明:

      TODO

  • SCALE_BITS

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L11
    • 说明:

      TODO

  • SCALE_BITS_MASK

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L12
    • 说明:

      TODO

  • CONTINUATION_FLAG

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L13
    • 说明:

      TODO

  • X_OFFSET

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L14
    • 说明:

      TODO

  • Y_OFFSET

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L15
    • 说明:

      TODO

  • Z_OFFSET

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L16
    • 说明:

      TODO

  • ABS_MAX_VALUE

    • 类型: double
    • 修饰符: public static final
    • 源码定位: L17
    • 说明:

      TODO

  • ABS_MIN_VALUE

    • 类型: double
    • 修饰符: public static final
    • 源码定位: L18
    • 说明:

      TODO

内部类/嵌套类型

构造器

方法

下面的方法块按源码顺序生成。

public static boolean hasContinuationBit(int in) @ L20

  • 方法名:hasContinuationBit
  • 源码定位:L20
  • 返回类型:boolean
  • 修饰符:public static

参数:

  • in: int

说明:

TODO

public static Vec3 read(ByteBuf input) @ L24

  • 方法名:read
  • 源码定位:L24
  • 返回类型:Vec3
  • 修饰符:public static

参数:

  • input: ByteBuf

说明:

TODO

public static void write(ByteBuf output, Vec3 value) @ L41

  • 方法名:write
  • 源码定位:L41
  • 返回类型:void
  • 修饰符:public static

参数:

  • output: ByteBuf
  • value: Vec3

说明:

TODO

private static double sanitize(double value) @ L65

  • 方法名:sanitize
  • 源码定位:L65
  • 返回类型:double
  • 修饰符:private static

参数:

  • value: double

说明:

TODO

private static long pack(double value) @ L69

  • 方法名:pack
  • 源码定位:L69
  • 返回类型:long
  • 修饰符:private static

参数:

  • value: double

说明:

TODO

private static double unpack(long value) @ L73

  • 方法名:unpack
  • 源码定位:L73
  • 返回类型:double
  • 修饰符:private static

参数:

  • value: long

说明:

TODO

代码

public class LpVec3 {
    private static final int DATA_BITS = 15;
    private static final int DATA_BITS_MASK = 32767;
    private static final double MAX_QUANTIZED_VALUE = 32766.0;
    private static final int SCALE_BITS = 2;
    private static final int SCALE_BITS_MASK = 3;
    private static final int CONTINUATION_FLAG = 4;
    private static final int X_OFFSET = 3;
    private static final int Y_OFFSET = 18;
    private static final int Z_OFFSET = 33;
    public static final double ABS_MAX_VALUE = 1.7179869183E10;
    public static final double ABS_MIN_VALUE = 3.051944088384301E-5;
 
    public static boolean hasContinuationBit(int in) {
        return (in & 4) == 4;
    }
 
    public static Vec3 read(ByteBuf input) {
        int lowest = input.readUnsignedByte();
        if (lowest == 0) {
            return Vec3.ZERO;
        } else {
            int middle = input.readUnsignedByte();
            long highest = input.readUnsignedInt();
            long buffer = highest << 16 | middle << 8 | lowest;
            long scale = lowest & 3;
            if (hasContinuationBit(lowest)) {
                scale |= (VarInt.read(input) & 4294967295L) << 2;
            }
 
            return new Vec3(unpack(buffer >> 3) * scale, unpack(buffer >> 18) * scale, unpack(buffer >> 33) * scale);
        }
    }
 
    public static void write(ByteBuf output, Vec3 value) {
        double x = sanitize(value.x);
        double y = sanitize(value.y);
        double z = sanitize(value.z);
        double chessboardLength = Mth.absMax(x, Mth.absMax(y, z));
        if (chessboardLength < 3.051944088384301E-5) {
            output.writeByte(0);
        } else {
            long scale = Mth.ceilLong(chessboardLength);
            boolean isPartial = (scale & 3L) != scale;
            long markers = isPartial ? scale & 3L | 4L : scale;
            long xn = pack(x / scale) << 3;
            long yn = pack(y / scale) << 18;
            long zn = pack(z / scale) << 33;
            long buffer = markers | xn | yn | zn;
            output.writeByte((byte)buffer);
            output.writeByte((byte)(buffer >> 8));
            output.writeInt((int)(buffer >> 16));
            if (isPartial) {
                VarInt.write(output, (int)(scale >> 2));
            }
        }
    }
 
    private static double sanitize(double value) {
        return Double.isNaN(value) ? 0.0 : Math.clamp(value, -1.7179869183E10, 1.7179869183E10);
    }
 
    private static long pack(double value) {
        return Math.round((value * 0.5 + 0.5) * 32766.0);
    }
 
    private static double unpack(long value) {
        return Math.min((double)(value & 32767L), 32766.0) * 2.0 / 32766.0 - 1.0;
    }
}

引用的其他类

  • VarInt

    • 引用位置: 方法调用
    • 关联成员: VarInt.read(), VarInt.write()
  • Mth

    • 引用位置: 方法调用
    • 关联成员: Mth.absMax(), Mth.ceilLong()
  • Vec3

    • 引用位置: 参数/构造调用/返回值
    • 关联成员: Vec3()