/// <param name="forcedUpdate">Indicates that this update is expected, so there will be no bool bit before it indicating whether it was sent.</param> /// <returns></returns> public override bool ReadFromBitstream(ref UdpKit.UdpBitStream bitstream, MsgType msgType, Frame targetFrame, int i, bool forcedUpdate, bool isKeyframe) { // Only read for the sent bit if not forced, there is no check bit for forced updates (since all clients and server know it is forced) bool hasChanged = forcedUpdate || bitstream.ReadBool(); if (!hasChanged) { targetFrame.positions[i] = GenericX.NULL; return(false); } for (int axis = 0; axis < 3; axis++) { if (axisRanges[axis].useAxis) { xyz[axis] = (compression == Compression.HalfFloat) ? bitstream.ReadHalf() : //(compression == Compression.Global) ? NSTCompressVector.ReadAxisFromBitstream(ref bitstream, axis, (cullUpperBits && !isKeyframe)) : (compression == Compression.LocalRange) ? axisRanges[axis].Decode(bitstream.ReadUInt(axisRanges[axis].bits)) : bitstream.ReadFloat(); } } targetFrame.positions[i] = new Vector3 ( (axisRanges[0].useAxis) ? xyz[0] : Localized[0], (axisRanges[1].useAxis) ? xyz[1] : Localized[1], (axisRanges[2].useAxis) ? xyz[2] : Localized[2] ); return(true); }
public static CompressedElement ReadCompressedPosFromBitstream(ref UdpKit.UdpBitStream bitstream, XYZBool _includeXYZ, bool lowerBitsOnly = false) { return(new CompressedElement( (_includeXYZ[0]) ? (bitstream.ReadUInt(lowerBitsOnly ? AxisRanges(0).lowerBits : AxisRanges(0).bits)) : 0, (_includeXYZ[1]) ? (bitstream.ReadUInt(lowerBitsOnly ? AxisRanges(1).lowerBits : AxisRanges(1).bits)) : 0, (_includeXYZ[2]) ? (bitstream.ReadUInt(lowerBitsOnly ? AxisRanges(2).lowerBits : AxisRanges(2).bits)) : 0)); }
public static uint WriteAxisToBitstream(this float val, int axis, ref UdpKit.UdpBitStream bitstream, bool lowerBitsOnly = false) { //TODO: use lowerbits from inside ranges uint compressedAxis = val.CompressAxis(axis); bitstream.WriteUInt(val.CompressAxis(axis), lowerBitsOnly ? AxisRanges(axis).lowerBits : AxisRanges(axis).bits); return(compressedAxis); }
public override void WriteToBitstream(ref UdpKit.UdpBitStream bitstream, MsgType msgType, bool forceUpdate, bool isKeyframe) { // Compress the current element rotation using the selected compression method. CompressedElement newCPos = CompressElement(); // For frames between forced updates, we need to first send a flag bit for if this element is being sent if (!forceUpdate) { bool hasChanged = !CompressedElement.Compare(newCPos, lastSentCompressed); bitstream.WriteBool(hasChanged); // if no changes have occured we are done. if (!hasChanged) { return; } } //TODO insert haschanged tests here for (int axis = 0; axis < 3; axis++) { if (axisRanges[axis].useAxis) { highestChangedBit[axis] = CompressedElement.HighestDifferentBit(newCPos[axis], lastSentCompressed[axis]); } } for (int axis = 0; axis < 3; axis++) { if (axisRanges[axis].useAxis) { if (compression == Compression.HalfFloat) { bitstream.WriteUInt(newCPos[axis], 16); } //else if (compression == Compression.Global) //{ // newCPos[axis].WriteCompressedAxisToBitstream(axis, ref bitstream, (cullUpperBits && !isKeyframe)); //} else if (compression == Compression.LocalRange) { bitstream.WriteUInt(newCPos[axis], axisRanges[axis].bits); } else { bitstream.WriteUInt(newCPos[axis], 32); } } } lastSentCompressed = newCPos; }
public static float ReadAxisFromBitstream(ref UdpKit.UdpBitStream bitstream, int axis, bool lowerBitsOnly = false) { uint compressedAxis = bitstream.ReadUInt(lowerBitsOnly ? AxisRanges(axis).lowerBits : AxisRanges(axis).bits); return(compressedAxis.DecompressAxis(axis)); }
public static int ReadCompressedAxisFromBitstream(ref UdpKit.UdpBitStream bitstream, int axis, bool lowerBitsOnly = false) { return(bitstream.ReadInt(lowerBitsOnly ? AxisRanges(axis).lowerBits : AxisRanges(axis).bits)); }
public static void WriteCompressedAxisToBitstream(this uint val, int axis, ref UdpKit.UdpBitStream bitstream, bool lowerBitsOnly = false) { //TODO: use lowerbits from inside ranges bitstream.WriteUInt(val, lowerBitsOnly ? AxisRanges(axis).lowerBits : AxisRanges(axis).bits); }
public static void WriteCompPosToBitstream(this CompressedElement compressedpos, ref UdpKit.UdpBitStream bitstream, XYZBool _includeXYZ, bool lowerBitsOnly = false) { for (int axis = 0; axis < 3; axis++) { //TODO: use lowerbits from inside ranges if (_includeXYZ[axis]) { bitstream.WriteUInt(compressedpos[axis], lowerBitsOnly ? AxisRanges(axis).lowerBits : AxisRanges(axis).bits); } } }