Просмотр исходного кода

rigidshape pef tweaks
account for integration for atrest evaluation. if we're atrest, *don't* network momentums. just send the bool

AzaezelX 10 месяцев назад
Родитель
Сommit
43309fef2a
3 измененных файлов с 58 добавлено и 30 удалено
  1. 2 0
      Engine/source/T3D/rigid.cpp
  2. 37 20
      Engine/source/T3D/rigidShape.cpp
  3. 19 10
      Engine/source/T3D/vehicles/vehicle.cpp

+ 2 - 0
Engine/source/T3D/rigid.cpp

@@ -363,4 +363,6 @@ void Rigid::setAtRest()
    linMomentum.set(0.0f,0.0f,0.0f);
    angVelocity.set(0.0f,0.0f,0.0f);
    angMomentum.set(0.0f,0.0f,0.0f);
+   force.set(0.0f, 0.0f, 0.0f);
+   torque.set(0.0f, 0.0f, 0.0f);
 }

+ 37 - 20
Engine/source/T3D/rigidShape.cpp

@@ -1117,7 +1117,7 @@ void RigidShape::updatePos(F32 dt)
       if (mCollisionList.getCount())
       {
          F32 k = mRigid.getKineticEnergy();
-         F32 G = mNetGravity* dt;
+         F32 G = mNetGravity* dt * mDataBlock->integration;
          F32 Kg = 0.5 * mRigid.mass * G * G;
          if (k < sRestTol * Kg && ++restCount > sRestCount)
             mRigid.setAtRest();
@@ -1494,10 +1494,12 @@ void RigidShape::writePacketData(GameConnection *connection, BitStream *stream)
    Parent::writePacketData(connection, stream);
 
    mathWrite(*stream, mRigid.linPosition);
-   mathWrite(*stream, mRigid.angPosition);
-   mathWrite(*stream, mRigid.linMomentum);
-   mathWrite(*stream, mRigid.angMomentum);
-   stream->writeFlag(mRigid.atRest);
+   if (!stream->writeFlag(mRigid.atRest))
+   {
+      mathWrite(*stream, mRigid.angPosition);
+      mathWrite(*stream, mRigid.linMomentum);
+      mathWrite(*stream, mRigid.angMomentum);
+   }
    stream->writeFlag(mContacts.getCount() == 0);
 
    stream->writeFlag(mDisableMove);
@@ -1509,14 +1511,20 @@ void RigidShape::readPacketData(GameConnection *connection, BitStream *stream)
    Parent::readPacketData(connection, stream);
 
    mathRead(*stream, &mRigid.linPosition);
-   mathRead(*stream, &mRigid.angPosition);
-   mathRead(*stream, &mRigid.linMomentum);
-   mathRead(*stream, &mRigid.angMomentum);
-   mRigid.atRest = stream->readFlag();
+   if (stream->readFlag())
+   {
+      mRigid.setAtRest();
+   }
+   else
+   {
+      mathRead(*stream, &mRigid.angPosition);
+      mathRead(*stream, &mRigid.linMomentum);
+      mathRead(*stream, &mRigid.angMomentum);
+      mRigid.updateInertialTensor();
+      mRigid.updateVelocity();
+   }
    if (stream->readFlag())
       mContacts.clear();
-   mRigid.updateInertialTensor();
-   mRigid.updateVelocity();
 
    mDisableMove = stream->readFlag();
    stream->setCompressionPoint(mRigid.linPosition);
@@ -1541,10 +1549,12 @@ U32 RigidShape::packUpdate(NetConnection *con, U32 mask, BitStream *stream)
       stream->writeFlag(mask & ForceMoveMask);
 
       stream->writeCompressedPoint(mRigid.linPosition);
-      mathWrite(*stream, mRigid.angPosition);
-      mathWrite(*stream, mRigid.linMomentum);
-      mathWrite(*stream, mRigid.angMomentum);
-      stream->writeFlag(mRigid.atRest);
+      if (!stream->writeFlag(mRigid.atRest))
+      {
+         mathWrite(*stream, mRigid.angPosition);
+         mathWrite(*stream, mRigid.linMomentum);
+         mathWrite(*stream, mRigid.angMomentum);
+      }
    }
    
    if(stream->writeFlag(mask & FreezeMask))
@@ -1574,11 +1584,18 @@ void RigidShape::unpackUpdate(NetConnection *con, BitStream *stream)
 
       // Read in new position and momentum values
       stream->readCompressedPoint(&mRigid.linPosition);
-      mathRead(*stream, &mRigid.angPosition);
-      mathRead(*stream, &mRigid.linMomentum);
-      mathRead(*stream, &mRigid.angMomentum);
-      mRigid.atRest = stream->readFlag();
-      mRigid.updateVelocity();
+
+      if (stream->readFlag())
+      {
+         mRigid.setAtRest();
+      }
+      else
+      {
+         mathRead(*stream, &mRigid.angPosition);
+         mathRead(*stream, &mRigid.linMomentum);
+         mathRead(*stream, &mRigid.angMomentum);
+         mRigid.updateVelocity();
+      }
 
       if (!forceUpdate && isProperlyAdded()) 
       {

+ 19 - 10
Engine/source/T3D/vehicles/vehicle.cpp

@@ -807,7 +807,7 @@ void Vehicle::updatePos(F32 dt)
       if (mCollisionList.getCount()) 
       {
          F32 k = mRigid.getKineticEnergy();
-         F32 G = mNetGravity* dt;
+         F32 G = mNetGravity* dt * mDataBlock->integration;
          F32 Kg = 0.5 * mRigid.mass * G * G;
          if (k < sRestTol * Kg && ++restCount > sRestCount)
             mRigid.setAtRest();
@@ -962,10 +962,12 @@ U32 Vehicle::packUpdate(NetConnection *con, U32 mask, BitStream *stream)
    if (stream->writeFlag(mask & PositionMask))
    {
       stream->writeCompressedPoint(mRigid.linPosition);
-      mathWrite(*stream, mRigid.angPosition);
-      mathWrite(*stream, mRigid.linMomentum);
-      mathWrite(*stream, mRigid.angMomentum);
-      stream->writeFlag(mRigid.atRest);
+      if (!stream->writeFlag(mRigid.atRest))
+      {
+         mathWrite(*stream, mRigid.angPosition);
+         mathWrite(*stream, mRigid.linMomentum);
+         mathWrite(*stream, mRigid.angMomentum);
+      }
    }
 
    
@@ -997,11 +999,18 @@ void Vehicle::unpackUpdate(NetConnection *con, BitStream *stream)
 
       // Read in new position and momentum values
       stream->readCompressedPoint(&mRigid.linPosition);
-      mathRead(*stream, &mRigid.angPosition);
-      mathRead(*stream, &mRigid.linMomentum);
-      mathRead(*stream, &mRigid.angMomentum);
-      mRigid.atRest = stream->readFlag();
-      mRigid.updateVelocity();
+
+      if (stream->readFlag())
+      {
+         mRigid.setAtRest();
+      }
+      else
+      {
+         mathRead(*stream, &mRigid.angPosition);
+         mathRead(*stream, &mRigid.linMomentum);
+         mathRead(*stream, &mRigid.angMomentum);
+         mRigid.updateVelocity();
+      }
 
       if (isProperlyAdded()) 
       {