Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Physics timing #1901

Merged
merged 1 commit into from
Jan 7, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Engine/source/T3D/physics/bullet/btWorld.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,8 @@ void BtWorld::tickPhysics( U32 elapsedMs )
// Convert it to seconds.
const F32 elapsedSec = (F32)elapsedMs * 0.001f;

// Simulate... it is recommended to always use Bullet's default fixed timestep/
mDynamicsWorld->stepSimulation( elapsedSec * mEditorTimeScale );
// Simulate
mDynamicsWorld->stepSimulation( elapsedSec * mEditorTimeScale, smPhysicsMaxSubSteps, smPhysicsStepTime);

mIsSimulating = true;

Expand Down
3 changes: 3 additions & 0 deletions Engine/source/T3D/physics/physicsWorld.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@
#include "platform/platform.h"
#include "T3D/physics/physicsWorld.h"

//Physics timing
F32 PhysicsWorld::smPhysicsStepTime = 1.0f / 60.f; //default 60fps
U32 PhysicsWorld::smPhysicsMaxSubSteps = 4;

PhysicsWorld::PhysicsWorld()
: mGravity( 0, 0, -20.0f ) // NOTE: This matches the gravity used for player objects.
Expand Down
4 changes: 4 additions & 0 deletions Engine/source/T3D/physics/physicsWorld.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,10 @@ class PhysicsWorld
virtual PhysicsBody* castRay( const Point3F &start, const Point3F &end, U32 bodyTypes = BT_All ) = 0;

virtual void explosion( const Point3F &pos, F32 radius, F32 forceMagnitude ) = 0;

/// Physics timing
static F32 smPhysicsStepTime;
static U32 smPhysicsMaxSubSteps;
};


Expand Down
22 changes: 4 additions & 18 deletions Engine/source/T3D/physics/physx3/px3World.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,6 @@ physx::PxDefaultCpuDispatcher* Px3World::smCpuDispatcher=NULL;
Px3ConsoleStream* Px3World::smErrorCallback = NULL;
physx::PxVisualDebuggerConnection* Px3World::smPvdConnection=NULL;
physx::PxDefaultAllocator Px3World::smMemoryAlloc;
//Physics timing
F32 Px3World::smPhysicsStepTime = 1.0f/(F32)TickMs;
U32 Px3World::smPhysicsMaxIterations = 4;

Px3World::Px3World(): mScene( NULL ),
mProcessList( NULL ),
Expand All @@ -76,12 +73,6 @@ physx::PxCooking *Px3World::getCooking()
return smCooking;
}

void Px3World::setTiming(F32 stepTime,U32 maxIterations)
{
smPhysicsStepTime = stepTime;
smPhysicsMaxIterations = maxIterations;
}

bool Px3World::restartSDK( bool destroyOnly, Px3World *clientWorld, Px3World *serverWorld)
{
// If either the client or the server still exist
Expand Down Expand Up @@ -246,20 +237,20 @@ bool Px3World::initWorld( bool isServer, ProcessList *processList )
// Most of this borrowed from bullet physics library, see btDiscreteDynamicsWorld.cpp
bool Px3World::_simulate(const F32 dt)
{
int numSimulationSubSteps = 0;
S32 numSimulationSubSteps = 0;
//fixed timestep with interpolation
mAccumulator += dt;
if (mAccumulator >= smPhysicsStepTime)
{
numSimulationSubSteps = int(mAccumulator / smPhysicsStepTime);
numSimulationSubSteps = S32(mAccumulator / smPhysicsStepTime);
mAccumulator -= numSimulationSubSteps * smPhysicsStepTime;
}
if (numSimulationSubSteps)
{
//clamp the number of substeps, to prevent simulation grinding spiralling down to a halt
int clampedSimulationSteps = (numSimulationSubSteps > smPhysicsMaxIterations)? smPhysicsMaxIterations : numSimulationSubSteps;
S32 clampedSimulationSteps = (numSimulationSubSteps > smPhysicsMaxSubSteps)? smPhysicsMaxSubSteps : numSimulationSubSteps;

for (int i=0;i<clampedSimulationSteps;i++)
for (S32 i=0;i<clampedSimulationSteps;i++)
{
mScene->fetchResults(true);
mScene->simulate(smPhysicsStepTime);
Expand Down Expand Up @@ -618,8 +609,3 @@ void Px3World::onDebugDraw( const SceneRenderState *state )
}

}
//set simulation timing via script
DefineEngineFunction( physx3SetSimulationTiming, void, ( F32 stepTime, U32 maxSteps ),, "Set simulation timing of the PhysX 3 plugin" )
{
Px3World::setTiming(stepTime,maxSteps);
}
3 changes: 0 additions & 3 deletions Engine/source/T3D/physics/physx3/px3World.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,6 @@ class Px3World : public PhysicsWorld
static physx::PxProfileZoneManager* smProfileZoneManager;
static physx::PxDefaultCpuDispatcher* smCpuDispatcher;
static physx::PxVisualDebuggerConnection* smPvdConnection;
static F32 smPhysicsStepTime;
static U32 smPhysicsMaxIterations;
F32 mAccumulator;
bool _simulate(const F32 dt);

Expand Down Expand Up @@ -103,7 +101,6 @@ class Px3World : public PhysicsWorld
static bool restartSDK( bool destroyOnly = false, Px3World *clientWorld = NULL, Px3World *serverWorld = NULL );
static void releaseWriteLocks();
static physx::PxCooking *getCooking();
static void setTiming(F32 stepTime,U32 maxIterations);
static void lockScenes();
static void unlockScenes();
};
Expand Down