public static byte[] compressVectorArray(Vector3[] data, CPVectorCompressionMode compressionMode) { float recPrecision = getModeResize(compressionMode); float precision = 1.0f / recPrecision; int bitSize = getModeBitsize(compressionMode); /* 7 bytes * 3 for size * 1 for rounding ((size*3 * bitSize) >> 3) */ int size = data.Length; int bytesSize = ((size * 3 * bitSize) >> 3) + 4; BitOutputStream bitOutputStream = new BitOutputStream(bytesSize); bitOutputStream.WriteBits(24, size); for (int i = 0; i < size; i++) { int value = vectorFloatToInt(data[i].x, recPrecision, precision); bitOutputStream.WriteBits(bitSize, value); value = vectorFloatToInt(data[i].y, recPrecision, precision); bitOutputStream.WriteBits(bitSize, value); value = vectorFloatToInt(data[i].z, recPrecision, precision); bitOutputStream.WriteBits(bitSize, value); } return(bitOutputStream.GetData()); }
public static int getModeBitsize(CPVectorCompressionMode mode) { switch (mode) { case CPVectorCompressionMode.LOW_UNIT_PRECISION: return(LOW_UNIT_BITSIZE); case CPVectorCompressionMode.MEDIUM_UNIT_PRECISION: return(MEDIUM_UNIT_BITSIZE); case CPVectorCompressionMode.HIGH_UNIT_PRECISION: return(HIGH_UNIT_BITSIZE); } return(0); }
public static float getModeResize(CPVectorCompressionMode mode) { switch (mode) { case CPVectorCompressionMode.LOW_UNIT_PRECISION: return(LOW_UNIT_TICKS * 0.5f); case CPVectorCompressionMode.MEDIUM_UNIT_PRECISION: return(MEDIUM_UNIT_TICKS * 0.5f); case CPVectorCompressionMode.HIGH_UNIT_PRECISION: return(HIGH_UNIT_TICKS * 0.5f); } return(0); }
public static Vector3[] getCompressedVectorArray(byte[] data, CPVectorCompressionMode compressionMode) { float recPrecision = getModeResize(compressionMode); float precision = 1.0f / recPrecision; BitInputStream bitInputStream = new BitInputStream(data); int bitsSize = getModeBitsize(compressionMode); int size = bitInputStream.ReadBits(24); Vector3[] values = new Vector3[size]; for (int i = 0; i < values.Length; i++) { int read = bitInputStream.ReadBits(bitsSize); values[i].x = (read) * precision - 1; read = bitInputStream.ReadBits(bitsSize); values[i].y = (read) * precision - 1; read = bitInputStream.ReadBits(bitsSize); values[i].z = (read) * precision - 1; values[i].Normalize(); } return(values); }