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;
}
}