Browse Source

Merge pull request #220 from DavidWyand-GG/RigidShapeChanges

New RigidShape method to force client
David Wyand 12 years ago
parent
commit
404cffc11a
2 changed files with 30 additions and 5 deletions
  1. 21 1
      Engine/source/T3D/rigidShape.cpp
  2. 9 4
      Engine/source/T3D/rigidShape.h

+ 21 - 1
Engine/source/T3D/rigidShape.cpp

@@ -1003,6 +1003,11 @@ void RigidShape::setTransform(const MatrixF& newMat)
    mContacts.clear();
 }
 
+void RigidShape::forceClientTransform()
+{
+   setMaskBits(ForceMoveMask);
+}
+
 
 //-----------------------------------------------------------------------------
 
@@ -1456,6 +1461,8 @@ U32 RigidShape::packUpdate(NetConnection *con, U32 mask, BitStream *stream)
 
    if (stream->writeFlag(mask & PositionMask))
    {
+      stream->writeFlag(mask & ForceMoveMask);
+
       stream->writeCompressedPoint(mRigid.linPosition);
       mathWrite(*stream, mRigid.angPosition);
       mathWrite(*stream, mRigid.linMomentum);
@@ -1480,6 +1487,10 @@ void RigidShape::unpackUpdate(NetConnection *con, BitStream *stream)
 
    if (stream->readFlag()) 
    {
+      // Check if we need to jump to the given transform
+      // rather than interpolate to it.
+      bool forceUpdate = stream->readFlag();
+
       mPredictionCount = sMaxPredictionTicks;
       F32 speed = mRigid.linVelocity.len();
       mDelta.warpRot[0] = mRigid.angPosition;
@@ -1492,7 +1503,7 @@ void RigidShape::unpackUpdate(NetConnection *con, BitStream *stream)
       mRigid.atRest = stream->readFlag();
       mRigid.updateVelocity();
 
-      if (isProperlyAdded()) 
+      if (!forceUpdate && isProperlyAdded()) 
       {
          // Determine number of ticks to warp based on the average
          // of the client and server velocities.
@@ -1710,3 +1721,12 @@ DefineEngineMethod( RigidShape, freezeSim, void, (bool isFrozen),,
 {
    object->freezeSim(isFrozen);
 }
+
+DefineEngineMethod( RigidShape, forceClientTransform, void, (),,
+   "@brief Forces the client to jump to the RigidShape's transform rather then warp to it.\n\n")
+{
+   if(object->isServerObject())
+   {
+      object->forceClientTransform();
+   }
+}

+ 9 - 4
Engine/source/T3D/rigidShape.h

@@ -152,10 +152,11 @@ class RigidShape: public ShapeBase
       WheelCollision = BIT(1),
    };
    enum MaskBits {
-      PositionMask = Parent::NextFreeMask << 0,
-      EnergyMask   = Parent::NextFreeMask << 1,
-      FreezeMask   = Parent::NextFreeMask << 2,
-      NextFreeMask = Parent::NextFreeMask << 3
+      PositionMask   = Parent::NextFreeMask << 0,
+      EnergyMask     = Parent::NextFreeMask << 1,
+      FreezeMask     = Parent::NextFreeMask << 2,
+      ForceMoveMask  = Parent::NextFreeMask << 3,
+      NextFreeMask = Parent::NextFreeMask << 4
    };
 
    void updateDustTrail( F32 dt );
@@ -283,6 +284,10 @@ public:
    /// @param   impulse   Impulse vector to apply.
    void applyImpulse(const Point3F &r, const Point3F &impulse);
 
+   /// Forces the client to jump to the RigidShape's transform rather
+   /// then warp to it.
+   void forceClientTransform();
+
    void getCameraParameters(F32 *min, F32* max, Point3F* offset, MatrixF* rot);
    void getCameraTransform(F32* pos, MatrixF* mat);
    ///@}