Пример #1
0
    public static void Put(this INetBuffer writer, Vector3 value, bool delta = false)
    {
        if (GameConfig.deltaZeroCompression && delta)
        {
            if (Vector3.SqrMagnitude(value) < 0.0001)
            {
                writer.Put(false);
                return;
            }
            writer.Put(true);
        }

        if (GameConfig.deltaZeroDeep && delta)
        {
            writer.Put(value.x, true);
            writer.Put(value.y, true);
            writer.Put(value.z, true);
        }
        else
        {
            writer.Put(value.x);
            writer.Put(value.y);
            writer.Put(value.z);
        }
    }
Пример #2
0
    public static void Put(this INetBuffer writer, Quaternion value, bool delta = false)
    {
        if (GameConfig.deltaZeroCompression && delta)
        {
            if (value == Quaternion.identity)
            {
                writer.Put(false);
                return;
            }
            writer.Put(true);
        }

        bool deltaZero = GameConfig.deltaZeroDeep && delta;

        if (GameConfig.smallestThree)
        {
            SmallestThree.EncodeQuaternion(writer, value, delta);
        }
        else
        {
            writer.Put(value.x, deltaZero);
            writer.Put(value.y, deltaZero);
            writer.Put(value.z, deltaZero);
            writer.Put(value.w, deltaZero);
        }
    }
Пример #3
0
    public static Quaternion GetQuaternion(this INetBuffer reader, bool delta = false)
    {
        if (reader.CompressionSchema.DeltaZeroCompression && delta)
        {
            bool changed = reader.GetBool();
            if (!changed)
            {
                return(Quaternion.identity);
            }
        }

        bool deltaZero = reader.CompressionSchema.DeltaZeroDeep && delta;

        if (reader.CompressionSchema.SmallestThree)
        {
            return(SmallestThree.DecodeQuaternion(reader, delta));
        }

        float x = reader.GetFloat(deltaZero);
        float y = reader.GetFloat(deltaZero);
        float z = reader.GetFloat(deltaZero);
        float w = reader.GetFloat(deltaZero);

        return(new Quaternion(x, y, z, w));
    }
Пример #4
0
    public static Quaternion DecodeQuaternion(INetBuffer reader, bool delta = false)
    {
        bool deltaZero = reader.CompressionSchema.DeltaZeroDeep && delta;

        byte  maxIndex = reader.GetByte();
        float a        = reader.GetShort(deltaZero) / QUAT_FLOAT_PRECISION_MULT;
        float b        = reader.GetShort(deltaZero) / QUAT_FLOAT_PRECISION_MULT;
        float c        = reader.GetShort(deltaZero) / QUAT_FLOAT_PRECISION_MULT;

        float d = Mathf.Sqrt(1f - (a * a + b * b + c * c));

        switch (maxIndex)
        {
        case 0:
            return(new Quaternion(d, a, b, c));

        case 1:
            return(new Quaternion(a, d, b, c));

        case 2:
            return(new Quaternion(a, b, d, c));

        case 3:
            return(new Quaternion(a, b, c, d));

        default:
            throw new InvalidProgramException("Unexpected quaternion index.");
        }
    }
Пример #5
0
 public void Serialize(INetBuffer writer)
 {
     writer.Put(Tick);
     writer.Put(PlayerStates.Length);
     foreach (var playerState in PlayerStates)
     {
         playerState.Serialize(writer);
     }
 }
Пример #6
0
    public void Deserialize(INetBuffer reader)
    {
        Tick = reader.GetInt();
        int playerStateCount = reader.GetInt();

        PlayerStates = new PlayerState[playerStateCount];
        PlayerState playerState = new PlayerState();

        for (int i = 0; i < playerStateCount; i++)
        {
            playerState.Deserialize(reader);
            PlayerStates[i] = playerState;
        }
    }
Пример #7
0
    public static Vector3 GetVector3(this INetBuffer reader, bool delta = false)
    {
        if (reader.CompressionSchema.DeltaZeroCompression && delta)
        {
            bool changed = reader.GetBool();
            if (!changed)
            {
                return(Vector3.zero);
            }
        }

        if (reader.CompressionSchema.DeltaZeroDeep && delta)
        {
            return(new Vector3(reader.GetFloat(true), reader.GetFloat(true), reader.GetFloat(true)));
        }

        return(new Vector3(reader.GetFloat(), reader.GetFloat(), reader.GetFloat()));
    }
Пример #8
0
 public void Deserialize(INetBuffer reader)
 {
     PlayerId = reader.GetInt();
     Position = reader.GetVector3(true);
     Rotation = reader.GetQuaternion(true);
 }
Пример #9
0
 public void Serialize(INetBuffer writer)
 {
     writer.Put(PlayerId);
     writer.Put(Position, true);
     writer.Put(Rotation, true);
 }
Пример #10
0
 public void Write(INetBuffer buffer)
 {
     throw new NotImplementedException();
 }
Пример #11
0
        /// <summary>
        /// Append all the bits of message to this message
        /// </summary>
        public void Write(INetBuffer buffer)
        {
            NetBuffer _buffer = (NetBuffer)buffer;
            EnsureBufferSize(m_bitLength + (buffer.LengthBytes * 8));

            Write(_buffer.m_data, 0, buffer.LengthBytes);

            // did we write excessive bits?
            int bitsInLastByte = (_buffer.m_bitLength % 8);
            if (bitsInLastByte != 0)
            {
                int excessBits = 8 - bitsInLastByte;
                m_bitLength -= excessBits;
            }
        }
Пример #12
0
    public static void EncodeQuaternion(INetBuffer writer, Quaternion quaternion, bool delta = false)
    {
        byte  maxIndex     = 0;
        float maxValue     = float.MinValue;
        float maxValueSign = 1;

        // Find the largest value in the quaternion and save its index.
        for (byte i = 0; i < 4; i++)
        {
            var value    = quaternion[i];
            var absValue = Mathf.Abs(value);
            if (absValue > maxValue)
            {
                maxIndex = i;
                maxValue = absValue;

                // Note the sign of the maxValue for later.
                maxValueSign = Mathf.Sign(value);
            }
        }

        // Encode the smallest three components.
        short a, b, c;

        switch (maxIndex)
        {
        case 0:
            a = (short)(quaternion.y * maxValueSign * QUAT_FLOAT_PRECISION_MULT);
            b = (short)(quaternion.z * maxValueSign * QUAT_FLOAT_PRECISION_MULT);
            c = (short)(quaternion.w * maxValueSign * QUAT_FLOAT_PRECISION_MULT);
            break;

        case 1:
            a = (short)(quaternion.x * maxValueSign * QUAT_FLOAT_PRECISION_MULT);
            b = (short)(quaternion.z * maxValueSign * QUAT_FLOAT_PRECISION_MULT);
            c = (short)(quaternion.w * maxValueSign * QUAT_FLOAT_PRECISION_MULT);
            break;

        case 2:
            a = (short)(quaternion.x * maxValueSign * QUAT_FLOAT_PRECISION_MULT);
            b = (short)(quaternion.y * maxValueSign * QUAT_FLOAT_PRECISION_MULT);
            c = (short)(quaternion.w * maxValueSign * QUAT_FLOAT_PRECISION_MULT);
            break;

        case 3:
            a = (short)(quaternion.x * maxValueSign * QUAT_FLOAT_PRECISION_MULT);
            b = (short)(quaternion.y * maxValueSign * QUAT_FLOAT_PRECISION_MULT);
            c = (short)(quaternion.z * maxValueSign * QUAT_FLOAT_PRECISION_MULT);
            break;

        default:
            throw new InvalidProgramException("Unexpected quaternion index.");
        }

        bool deltaZero = GameConfig.deltaZeroDeep && delta;

        writer.Put(maxIndex);
        writer.Put(a, deltaZero);
        writer.Put(b, deltaZero);
        writer.Put(c, deltaZero);
    }