From 0154c613d0af2f8c806e70026b7c21dc41788943 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 20 Jan 2015 11:02:48 -0800 Subject: [PATCH] change FrameCount to NumSubsteps for more accuracy --- libraries/physics/src/KinematicController.cpp | 4 ++-- libraries/physics/src/KinematicController.h | 2 +- libraries/physics/src/PhysicsEngine.cpp | 24 ++++++++++++------- libraries/physics/src/PhysicsEngine.h | 4 +++- .../src/SimpleEntityKinematicController.cpp | 6 ++--- 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/libraries/physics/src/KinematicController.cpp b/libraries/physics/src/KinematicController.cpp index abcf669694..354b285bc1 100644 --- a/libraries/physics/src/KinematicController.cpp +++ b/libraries/physics/src/KinematicController.cpp @@ -13,10 +13,10 @@ #include "PhysicsEngine.h" KinematicController::KinematicController() { - _lastFrame = PhysicsEngine::getFrameCount(); + _lastSubstep = PhysicsEngine::getNumSubsteps(); } void KinematicController::start() { _enabled = true; - _lastFrame = PhysicsEngine::getFrameCount(); + _lastSubstep = PhysicsEngine::getNumSubsteps(); } diff --git a/libraries/physics/src/KinematicController.h b/libraries/physics/src/KinematicController.h index 382d4cbfd9..60b8548607 100644 --- a/libraries/physics/src/KinematicController.h +++ b/libraries/physics/src/KinematicController.h @@ -30,7 +30,7 @@ public: protected: bool _enabled = false; - uint32_t _lastFrame; + uint32_t _lastSubstep; }; #endif // hifi_KinematicController_h diff --git a/libraries/physics/src/PhysicsEngine.cpp b/libraries/physics/src/PhysicsEngine.cpp index ca64184bd7..af4a49aefe 100644 --- a/libraries/physics/src/PhysicsEngine.cpp +++ b/libraries/physics/src/PhysicsEngine.cpp @@ -13,11 +13,11 @@ #include "ShapeInfoUtil.h" #include "ThreadSafeDynamicsWorld.h" -static uint32_t _frameCount; +static uint32_t _numSubsteps; // static -uint32_t PhysicsEngine::getFrameCount() { - return _frameCount; +uint32_t PhysicsEngine::getNumSubsteps() { + return _numSubsteps; } PhysicsEngine::PhysicsEngine(const glm::vec3& offset) @@ -47,8 +47,8 @@ void PhysicsEngine::updateEntitiesInternal(const quint64& now) { ObjectMotionState* state = *stateItr; if (state->doesNotNeedToSendUpdate()) { stateItr = _outgoingPackets.erase(stateItr); - } else if (state->shouldSendUpdate(_frameCount)) { - state->sendUpdate(_entityPacketSender, _frameCount); + } else if (state->shouldSendUpdate(_numSubsteps)) { + state->sendUpdate(_entityPacketSender, _numSubsteps); ++stateItr; } else { ++stateItr; @@ -141,7 +141,7 @@ void PhysicsEngine::relayIncomingChangesToSimulation() { } else if (flags) { // an EASY update does NOT require that the body be pulled out of physics engine // hence the MotionState has all the knowledge and authority to perform the update. - motionState->updateObjectEasy(flags, _frameCount); + motionState->updateObjectEasy(flags, _numSubsteps); } } @@ -216,8 +216,8 @@ void PhysicsEngine::stepSimulation() { float timeStep = btMin(dt, MAX_TIMESTEP); // This is step (2). - int numSubSteps = _dynamicsWorld->stepSimulation(timeStep, MAX_NUM_SUBSTEPS, PHYSICS_ENGINE_FIXED_SUBSTEP); - _frameCount += (uint32_t)numSubSteps; + int numSubsteps = _dynamicsWorld->stepSimulation(timeStep, MAX_NUM_SUBSTEPS, PHYSICS_ENGINE_FIXED_SUBSTEP); + _numSubsteps += (uint32_t)numSubsteps; unlock(); // This is step (3) which is done outside of stepSimulation() so we can lock _entityTree. @@ -233,6 +233,12 @@ void PhysicsEngine::stepSimulation() { _dynamicsWorld->synchronizeMotionStates(); unlock(); _entityTree->unlock(); + + handleCollisionEvents(); +} + +void PhysicsEngine::handleCollisionEvents() { + } // Bullet collision flags are as follows: @@ -352,7 +358,7 @@ void PhysicsEngine::updateObjectHard(btRigidBody* body, ObjectMotionState* motio } bool easyUpdate = flags & EASY_DIRTY_PHYSICS_FLAGS; if (easyUpdate) { - motionState->updateObjectEasy(flags, _frameCount); + motionState->updateObjectEasy(flags, _numSubsteps); } // update the motion parameters diff --git a/libraries/physics/src/PhysicsEngine.h b/libraries/physics/src/PhysicsEngine.h index f37f12ea8d..7304f598e2 100644 --- a/libraries/physics/src/PhysicsEngine.h +++ b/libraries/physics/src/PhysicsEngine.h @@ -33,7 +33,7 @@ class ObjectMotionState; class PhysicsEngine : public EntitySimulation { public: - static uint32_t getFrameCount(); + static uint32_t getNumSubsteps(); PhysicsEngine(const glm::vec3& offset); @@ -51,6 +51,8 @@ public: void stepSimulation(); + void handleCollisionEvents(); + /// \param offset position of simulation origin in domain-frame void setOriginOffset(const glm::vec3& offset) { _originOffset = offset; } diff --git a/libraries/physics/src/SimpleEntityKinematicController.cpp b/libraries/physics/src/SimpleEntityKinematicController.cpp index 478ec1d12f..e834d4e91b 100644 --- a/libraries/physics/src/SimpleEntityKinematicController.cpp +++ b/libraries/physics/src/SimpleEntityKinematicController.cpp @@ -13,9 +13,9 @@ #include "SimpleEntityKinematicController.h" void SimpleEntityKinematicController:: stepForward() { - uint32_t frame = PhysicsEngine::getFrameCount(); - float dt = (frame - _lastFrame) * PHYSICS_ENGINE_FIXED_SUBSTEP; + uint32_t substep = PhysicsEngine::getNumSubsteps(); + float dt = (substep - _lastSubstep) * PHYSICS_ENGINE_FIXED_SUBSTEP; _entity->simulateSimpleKinematicMotion(dt); - _lastFrame = frame; + _lastSubstep = substep; }