From 43309fef2ad6e4e41a9725e168123c5a51ab6c31 Mon Sep 17 00:00:00 2001 From: AzaezelX Date: Fri, 28 Feb 2025 17:54:20 -0600 Subject: [PATCH] rigidshape pef tweaks account for integration for atrest evaluation. if we're atrest, *don't* network momentums. just send the bool --- Engine/source/T3D/rigid.cpp | 2 + Engine/source/T3D/rigidShape.cpp | 57 +++++++++++++++++--------- Engine/source/T3D/vehicles/vehicle.cpp | 29 ++++++++----- 3 files changed, 58 insertions(+), 30 deletions(-) diff --git a/Engine/source/T3D/rigid.cpp b/Engine/source/T3D/rigid.cpp index 3dea66a6a..7b84a7e18 100644 --- a/Engine/source/T3D/rigid.cpp +++ b/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); } diff --git a/Engine/source/T3D/rigidShape.cpp b/Engine/source/T3D/rigidShape.cpp index cfdd8258f..0ebbdf829 100644 --- a/Engine/source/T3D/rigidShape.cpp +++ b/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()) { diff --git a/Engine/source/T3D/vehicles/vehicle.cpp b/Engine/source/T3D/vehicles/vehicle.cpp index a1e4a426a..0170174e0 100644 --- a/Engine/source/T3D/vehicles/vehicle.cpp +++ b/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()) {