mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-16 00:54:54 +00:00
rigidshape pef tweaks
account for integration for atrest evaluation. if we're atrest, *don't* network momentums. just send the bool
This commit is contained in:
parent
3c358d45d0
commit
43309fef2a
3 changed files with 58 additions and 30 deletions
|
|
@ -363,4 +363,6 @@ void Rigid::setAtRest()
|
||||||
linMomentum.set(0.0f,0.0f,0.0f);
|
linMomentum.set(0.0f,0.0f,0.0f);
|
||||||
angVelocity.set(0.0f,0.0f,0.0f);
|
angVelocity.set(0.0f,0.0f,0.0f);
|
||||||
angMomentum.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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1117,7 +1117,7 @@ void RigidShape::updatePos(F32 dt)
|
||||||
if (mCollisionList.getCount())
|
if (mCollisionList.getCount())
|
||||||
{
|
{
|
||||||
F32 k = mRigid.getKineticEnergy();
|
F32 k = mRigid.getKineticEnergy();
|
||||||
F32 G = mNetGravity* dt;
|
F32 G = mNetGravity* dt * mDataBlock->integration;
|
||||||
F32 Kg = 0.5 * mRigid.mass * G * G;
|
F32 Kg = 0.5 * mRigid.mass * G * G;
|
||||||
if (k < sRestTol * Kg && ++restCount > sRestCount)
|
if (k < sRestTol * Kg && ++restCount > sRestCount)
|
||||||
mRigid.setAtRest();
|
mRigid.setAtRest();
|
||||||
|
|
@ -1494,10 +1494,12 @@ void RigidShape::writePacketData(GameConnection *connection, BitStream *stream)
|
||||||
Parent::writePacketData(connection, stream);
|
Parent::writePacketData(connection, stream);
|
||||||
|
|
||||||
mathWrite(*stream, mRigid.linPosition);
|
mathWrite(*stream, mRigid.linPosition);
|
||||||
mathWrite(*stream, mRigid.angPosition);
|
if (!stream->writeFlag(mRigid.atRest))
|
||||||
mathWrite(*stream, mRigid.linMomentum);
|
{
|
||||||
mathWrite(*stream, mRigid.angMomentum);
|
mathWrite(*stream, mRigid.angPosition);
|
||||||
stream->writeFlag(mRigid.atRest);
|
mathWrite(*stream, mRigid.linMomentum);
|
||||||
|
mathWrite(*stream, mRigid.angMomentum);
|
||||||
|
}
|
||||||
stream->writeFlag(mContacts.getCount() == 0);
|
stream->writeFlag(mContacts.getCount() == 0);
|
||||||
|
|
||||||
stream->writeFlag(mDisableMove);
|
stream->writeFlag(mDisableMove);
|
||||||
|
|
@ -1509,14 +1511,20 @@ void RigidShape::readPacketData(GameConnection *connection, BitStream *stream)
|
||||||
Parent::readPacketData(connection, stream);
|
Parent::readPacketData(connection, stream);
|
||||||
|
|
||||||
mathRead(*stream, &mRigid.linPosition);
|
mathRead(*stream, &mRigid.linPosition);
|
||||||
mathRead(*stream, &mRigid.angPosition);
|
if (stream->readFlag())
|
||||||
mathRead(*stream, &mRigid.linMomentum);
|
{
|
||||||
mathRead(*stream, &mRigid.angMomentum);
|
mRigid.setAtRest();
|
||||||
mRigid.atRest = stream->readFlag();
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mathRead(*stream, &mRigid.angPosition);
|
||||||
|
mathRead(*stream, &mRigid.linMomentum);
|
||||||
|
mathRead(*stream, &mRigid.angMomentum);
|
||||||
|
mRigid.updateInertialTensor();
|
||||||
|
mRigid.updateVelocity();
|
||||||
|
}
|
||||||
if (stream->readFlag())
|
if (stream->readFlag())
|
||||||
mContacts.clear();
|
mContacts.clear();
|
||||||
mRigid.updateInertialTensor();
|
|
||||||
mRigid.updateVelocity();
|
|
||||||
|
|
||||||
mDisableMove = stream->readFlag();
|
mDisableMove = stream->readFlag();
|
||||||
stream->setCompressionPoint(mRigid.linPosition);
|
stream->setCompressionPoint(mRigid.linPosition);
|
||||||
|
|
@ -1541,10 +1549,12 @@ U32 RigidShape::packUpdate(NetConnection *con, U32 mask, BitStream *stream)
|
||||||
stream->writeFlag(mask & ForceMoveMask);
|
stream->writeFlag(mask & ForceMoveMask);
|
||||||
|
|
||||||
stream->writeCompressedPoint(mRigid.linPosition);
|
stream->writeCompressedPoint(mRigid.linPosition);
|
||||||
mathWrite(*stream, mRigid.angPosition);
|
if (!stream->writeFlag(mRigid.atRest))
|
||||||
mathWrite(*stream, mRigid.linMomentum);
|
{
|
||||||
mathWrite(*stream, mRigid.angMomentum);
|
mathWrite(*stream, mRigid.angPosition);
|
||||||
stream->writeFlag(mRigid.atRest);
|
mathWrite(*stream, mRigid.linMomentum);
|
||||||
|
mathWrite(*stream, mRigid.angMomentum);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(stream->writeFlag(mask & FreezeMask))
|
if(stream->writeFlag(mask & FreezeMask))
|
||||||
|
|
@ -1574,11 +1584,18 @@ void RigidShape::unpackUpdate(NetConnection *con, BitStream *stream)
|
||||||
|
|
||||||
// Read in new position and momentum values
|
// Read in new position and momentum values
|
||||||
stream->readCompressedPoint(&mRigid.linPosition);
|
stream->readCompressedPoint(&mRigid.linPosition);
|
||||||
mathRead(*stream, &mRigid.angPosition);
|
|
||||||
mathRead(*stream, &mRigid.linMomentum);
|
if (stream->readFlag())
|
||||||
mathRead(*stream, &mRigid.angMomentum);
|
{
|
||||||
mRigid.atRest = stream->readFlag();
|
mRigid.setAtRest();
|
||||||
mRigid.updateVelocity();
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mathRead(*stream, &mRigid.angPosition);
|
||||||
|
mathRead(*stream, &mRigid.linMomentum);
|
||||||
|
mathRead(*stream, &mRigid.angMomentum);
|
||||||
|
mRigid.updateVelocity();
|
||||||
|
}
|
||||||
|
|
||||||
if (!forceUpdate && isProperlyAdded())
|
if (!forceUpdate && isProperlyAdded())
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -807,7 +807,7 @@ void Vehicle::updatePos(F32 dt)
|
||||||
if (mCollisionList.getCount())
|
if (mCollisionList.getCount())
|
||||||
{
|
{
|
||||||
F32 k = mRigid.getKineticEnergy();
|
F32 k = mRigid.getKineticEnergy();
|
||||||
F32 G = mNetGravity* dt;
|
F32 G = mNetGravity* dt * mDataBlock->integration;
|
||||||
F32 Kg = 0.5 * mRigid.mass * G * G;
|
F32 Kg = 0.5 * mRigid.mass * G * G;
|
||||||
if (k < sRestTol * Kg && ++restCount > sRestCount)
|
if (k < sRestTol * Kg && ++restCount > sRestCount)
|
||||||
mRigid.setAtRest();
|
mRigid.setAtRest();
|
||||||
|
|
@ -962,10 +962,12 @@ U32 Vehicle::packUpdate(NetConnection *con, U32 mask, BitStream *stream)
|
||||||
if (stream->writeFlag(mask & PositionMask))
|
if (stream->writeFlag(mask & PositionMask))
|
||||||
{
|
{
|
||||||
stream->writeCompressedPoint(mRigid.linPosition);
|
stream->writeCompressedPoint(mRigid.linPosition);
|
||||||
mathWrite(*stream, mRigid.angPosition);
|
if (!stream->writeFlag(mRigid.atRest))
|
||||||
mathWrite(*stream, mRigid.linMomentum);
|
{
|
||||||
mathWrite(*stream, mRigid.angMomentum);
|
mathWrite(*stream, mRigid.angPosition);
|
||||||
stream->writeFlag(mRigid.atRest);
|
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
|
// Read in new position and momentum values
|
||||||
stream->readCompressedPoint(&mRigid.linPosition);
|
stream->readCompressedPoint(&mRigid.linPosition);
|
||||||
mathRead(*stream, &mRigid.angPosition);
|
|
||||||
mathRead(*stream, &mRigid.linMomentum);
|
if (stream->readFlag())
|
||||||
mathRead(*stream, &mRigid.angMomentum);
|
{
|
||||||
mRigid.atRest = stream->readFlag();
|
mRigid.setAtRest();
|
||||||
mRigid.updateVelocity();
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mathRead(*stream, &mRigid.angPosition);
|
||||||
|
mathRead(*stream, &mRigid.linMomentum);
|
||||||
|
mathRead(*stream, &mRigid.angMomentum);
|
||||||
|
mRigid.updateVelocity();
|
||||||
|
}
|
||||||
|
|
||||||
if (isProperlyAdded())
|
if (isProperlyAdded())
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue