コード例 #1
0
        public static bool CompressedQuaternionUnitTest()
        {
            var stream = new VRage.Library.Collections.BitStream();

            stream.ResetWrite();
            Quaternion q = Quaternion.Identity;

            stream.WriteQuaternionNormCompressed(q);
            stream.ResetRead();
            var  q2   = stream.ReadQuaternionNormCompressed();
            bool fail = !q.Equals(q2, 1 / 511.0f);

            stream.ResetWrite();
            q = Quaternion.CreateFromAxisAngle(Vector3.Forward, (float)Math.PI / 3.0f);
            stream.WriteQuaternionNormCompressed(q);
            stream.ResetRead();
            q2    = stream.ReadQuaternionNormCompressed();
            fail |= !q.Equals(q2, 1 / 511.0f);

            stream.ResetWrite();
            var v = new Vector3(1, -1, 3);

            v.Normalize();
            q = Quaternion.CreateFromAxisAngle(v, (float)Math.PI / 3.0f);
            stream.WriteQuaternionNormCompressed(q);
            stream.ResetRead();
            q2    = stream.ReadQuaternionNormCompressed();
            fail |= !q.Equals(q2, 1 / 511.0f);
            return(fail);
        }
コード例 #2
0
 void WriteTransform(BitStream stream, MyEntity entity, Vector3D? deltaPosBase, bool lowPrecisionOrientation)
 {
     var matrix = entity.WorldMatrix;
     stream.WriteBool(deltaPosBase == null);
     if (deltaPosBase == null)
     {
         stream.Write(matrix.Translation); // 24 B
     }
     else
     {
         stream.Write((Vector3)(matrix.Translation - deltaPosBase.Value)); // 6 B
     }
     var orientation = Quaternion.CreateFromForwardUp(matrix.Forward, matrix.Up);
     stream.WriteBool(lowPrecisionOrientation);
     if (lowPrecisionOrientation)
     {
         stream.WriteQuaternionNormCompressed(orientation); // 29b
     }
     else
     {
         stream.WriteQuaternionNorm(orientation); // 52b
     }
 }