void WriteVelocities(BitStream stream, MyEntity entity, float simulationRatio,bool moving) { Vector3 linear = entity.Physics != null ? entity.Physics.LinearVelocity * simulationRatio : Vector3.Zero; Vector3 angular = entity.Physics != null ? entity.Physics.AngularVelocity * simulationRatio : Vector3.Zero; if (moving) { stream.Write(linear); // 6B stream.Write(angular); // 6B } }
/// <summary> /// Serializes physics and takes into account support (what's entity standing on) /// </summary> private void SerializePhysicsWithSupport(BitStream stream, EndpointId forClient,uint timestamp, byte packetId, int maxBitPosition) { if (stream.Writing) { // TODO: only prototype implementation SetSupport(FindSupportDelegate()); stream.WriteBool(m_supportPhysics != null); if (m_supportPhysics != null) { stream.WriteInt64(m_supportPhysics.Entity.EntityId); var localToParent = Entity.WorldMatrix * MatrixD.Invert(m_supportPhysics.Entity.PositionComp.WorldMatrix); stream.Write(localToParent.Translation); stream.Write(Quaternion.CreateFromForwardUp(localToParent.Forward, localToParent.Up).ToVector4()); bool moving = IsMoving(Entity); stream.WriteBool(moving); SerializeVelocities(stream, Entity, EffectiveSimulationRatio, !IsControlledLocally, moving); } else { base.Serialize(stream, forClient,timestamp, packetId, maxBitPosition); } } else { if (stream.ReadBool()) { MyEntity support; bool apply = MyEntities.TryGetEntityById(stream.ReadInt64(), out support) && !IsControlledLocally; var pos = stream.ReadVector3D(); var orient = Quaternion.FromVector4(stream.ReadVector4()); if (apply) { var old = Entity.PositionComp.WorldMatrix; MatrixD localToParent = MatrixD.CreateFromQuaternion(orient); localToParent.Translation = pos; MatrixD matrix = localToParent * support.WorldMatrix; Entity.PositionComp.SetWorldMatrix(matrix, null, true); SetSupport(MySupportHelper.FindPhysics(support)); var handler = MoveHandler; if (handler != null) { handler(ref old, ref matrix); } } else { SetSupport(null); } bool moving = stream.ReadBool(); SerializeVelocities(stream, Entity, EffectiveSimulationRatio, apply, moving); } else { SetSupport(null); base.Serialize(stream, forClient, timestamp, packetId, maxBitPosition); } } }
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 } }
static void WriteVelocities(BitStream stream, MyEntity entity, float simulationRatio,bool moving) { HalfVector3 linear = entity.Physics != null ? Vector3.Round(entity.Physics.LinearVelocity * simulationRatio, NUM_DECIMAL_PRECISION) : Vector3.Zero; HalfVector3 angular = entity.Physics != null ? Vector3.Round(entity.Physics.AngularVelocity * simulationRatio, NUM_DECIMAL_PRECISION) : Vector3.Zero; if (moving) { stream.Write(linear); // 6B stream.Write(angular); // 6B } }