Browse Source

Remove the PhysX changes orig. bundled with unlock

tickets/08/8/1
John Johns 4 years ago
parent
commit
d0f1e6f3e7
  1. 44
      Sources/Plasma/PubUtilLib/plPhysX/plSimulationMgr.cpp
  2. 18
      Sources/Plasma/PubUtilLib/plPhysX/plSimulationMgr.h

44
Sources/Plasma/PubUtilLib/plPhysX/plSimulationMgr.cpp

@ -347,6 +347,8 @@ plSimulationMgr* plSimulationMgr::GetInstance()
plSimulationMgr::plSimulationMgr() plSimulationMgr::plSimulationMgr()
: fSuspended(true) : fSuspended(true)
, fMaxDelta(kDefaultMaxDelta)
, fStepSize(kDefaultStepSize)
, fAccumulator(0.0f) , fAccumulator(0.0f)
, fStepCount(0) , fStepCount(0)
, fLOSDispatch(TRACKED_NEW plLOSDispatch()) , fLOSDispatch(TRACKED_NEW plLOSDispatch())
@ -420,20 +422,16 @@ NxScene* plSimulationMgr::GetScene(plKey world)
if (!scene) if (!scene)
{ {
UInt32 maxSteps = (UInt32)hsCeil(fMaxDelta / fStepSize);
NxSceneDesc sceneDesc; NxSceneDesc sceneDesc;
sceneDesc.gravity.set(0, 0, -32.174049f); sceneDesc.gravity.set(0, 0, -32.174049f);
sceneDesc.userTriggerReport = &gSensorReport; sceneDesc.userTriggerReport = &gSensorReport;
sceneDesc.userContactReport = &gContactReport; sceneDesc.userContactReport = &gContactReport;
sceneDesc.maxTimestep = fStepSize;
sceneDesc.maxIter = maxSteps;
scene = fSDK->createScene(sceneDesc); scene = fSDK->createScene(sceneDesc);
// See "Advancing The Simulation State" in the PhysX SDK Documentation
// This will cause PhysX to only update for our step size. If we call simulate
// faster than that, PhysX will return immediately. If we call it slower than that,
// PhysX will do some extra steps for us (isn't that nice?).
// Anyway, this should be a good way to make us independent of the framerate.
// If not, I blame the usual suspects
scene->setTiming(kDefaultStepSize);
// Most physicals use the default friction and restitution values, so we // Most physicals use the default friction and restitution values, so we
// make them the default. // make them the default.
NxMaterial* mat = scene->getMaterialFromIndex(0); NxMaterial* mat = scene->getMaterialFromIndex(0);
@ -607,24 +605,24 @@ void plSimulationMgr::Advance(float delSecs)
return; return;
fAccumulator += delSecs; fAccumulator += delSecs;
if (fAccumulator < kDefaultStepSize) if (fAccumulator < fStepSize)
{ {
// Not enough time has passed to perform a substep. // Not enough time has passed to perform a substep.
plPXPhysicalControllerCore::UpdateNonPhysical(fAccumulator / kDefaultStepSize); plPXPhysicalControllerCore::UpdateNonPhysical(fAccumulator / fStepSize);
return; return;
} }
else if (fAccumulator > kDefaultMaxDelta) else if (fAccumulator > fMaxDelta)
{ {
if (fExtraProfile) if (fExtraProfile)
Log("Step clamped from %f to limit of %f", fAccumulator, kDefaultMaxDelta); Log("Step clamped from %f to limit of %f", fAccumulator, fMaxDelta);
fAccumulator = kDefaultMaxDelta; fAccumulator = kDefaultMaxDelta;
} }
++fStepCount; ++fStepCount;
// Perform as many whole substeps as possible saving the remainder in our accumulator. // Perform as many whole substeps as possible saving the remainder in our accumulator.
int numSubSteps = (int)(fAccumulator / kDefaultStepSize + 0.000001f); int numSubSteps = (int)(fAccumulator / fStepSize + 0.000001f);
float delta = numSubSteps * kDefaultStepSize; float delta = numSubSteps * fStepSize;
fAccumulator -= delta; fAccumulator -= delta;
plProfile_IncCount(StepLen, (int)(delta*1000)); plProfile_IncCount(StepLen, (int)(delta*1000));
@ -651,7 +649,7 @@ void plSimulationMgr::Advance(float delSecs)
} }
} }
plPXPhysicalControllerCore::Update(numSubSteps, fAccumulator / kDefaultStepSize); plPXPhysicalControllerCore::Update(numSubSteps, fAccumulator / fStepSize);
//sending off and clearing the Collision Messages generated by scene->simulate //sending off and clearing the Collision Messages generated by scene->simulate
IDispatchCollisionMessages(); IDispatchCollisionMessages();
@ -774,6 +772,22 @@ void plSimulationMgr::ISendUpdates()
// RESOLUTION & TIMEOUT PARAMETERS // RESOLUTION & TIMEOUT PARAMETERS
// //
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
void plSimulationMgr::SetMaxDelta(float maxDelta)
{
fMaxDelta = maxDelta;
}
float plSimulationMgr::GetMaxDelta() const
{
return fMaxDelta;
}
void plSimulationMgr::SetStepsPerSecond(int stepsPerSecond)
{
fStepSize = 1.0f / (float)stepsPerSecond;
}
int plSimulationMgr::GetStepsPerSecond()
{
return (int)((1.0 / fStepSize) + 0.5f); // round to nearest int
}
int plSimulationMgr::GetMaterialIdx(NxScene* scene, hsScalar friction, hsScalar restitution) int plSimulationMgr::GetMaterialIdx(NxScene* scene, hsScalar friction, hsScalar restitution)
{ {

18
Sources/Plasma/PubUtilLib/plPhysX/plSimulationMgr.h

@ -115,6 +115,20 @@ protected:
plSimulationMgr(); plSimulationMgr();
virtual ~plSimulationMgr(); virtual ~plSimulationMgr();
// Set the maximum amount of time (in seconds) that the physics will advance
// between frames. If a frame-to-frame delta is bigger than this, we'll
// clamp it to this value.
// WARNING: animation doesn't do this, so if we clamp the time animated
// physicals and the avatar may move at a faster rate than usual.
void SetMaxDelta(float maxDelta);
float GetMaxDelta() const;
// Set the number of steps per second that physics will advance.
// The more steps per second, the less fallthough and more accurate
// simulation response.
void SetStepsPerSecond(int stepsPerSecond);
int GetStepsPerSecond();
// Walk through the synchronization requests and send them as appropriate. // Walk through the synchronization requests and send them as appropriate.
void IProcessSynchs(); void IProcessSynchs();
@ -143,7 +157,11 @@ protected:
// but nothing will move. // but nothing will move.
bool fSuspended; bool fSuspended;
float fMaxDelta;
float fStepSize;
float fAccumulator; float fAccumulator;
UInt32 fStepCount; UInt32 fStepCount;
// A utility class to keep track of a request for a physical synchronization. // A utility class to keep track of a request for a physical synchronization.

Loading…
Cancel
Save