Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
 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));
 }
Beispiel #3
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);
        }
Beispiel #4
0
        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;
        }
Beispiel #5
0
        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));
        }
Beispiel #6
0
 public static int ReadCompressedAxisFromBitstream(ref UdpKit.UdpBitStream bitstream, int axis, bool lowerBitsOnly = false)
 {
     return(bitstream.ReadInt(lowerBitsOnly ? AxisRanges(axis).lowerBits : AxisRanges(axis).bits));
 }
Beispiel #7
0
 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);
 }
Beispiel #8
0
 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);
         }
     }
 }