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); }
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 } }