diff options
Diffstat (limited to 'source/gameengine/Physics')
8 files changed, 51 insertions, 25 deletions
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp index 0a0b4939ea5..cdf617f1722 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp @@ -192,7 +192,7 @@ void CcdPhysicsEnvironment::removeCcdPhysicsController(CcdPhysicsController* ctr if ((&p2p->GetRigidBodyA() == ctrl->GetRigidBody() || (&p2p->GetRigidBodyB() == ctrl->GetRigidBody()))) { - removeConstraint(p2p); + removeConstraint(p2p->GetConstraintId()); //only 1 constraint per constroller break; } @@ -209,7 +209,7 @@ void CcdPhysicsEnvironment::removeCcdPhysicsController(CcdPhysicsController* ctr if ((&p2p->GetRigidBodyA() == ctrl->GetRigidBody() || (&p2p->GetRigidBodyB() == ctrl->GetRigidBody()))) { - removeConstraint(p2p); + removeConstraint(p2p->GetConstraintId()); //only 1 constraint per constroller break; } @@ -301,14 +301,28 @@ void CcdPhysicsEnvironment::beginFrame() } -/// Perform an integration step of duration 'timeStep'. bool CcdPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep) { + + if (!SimdFuzzyZero(timeStep)) + { + //Blender runs 30hertz, so subdivide so we get 60 hertz + proceedDeltaTimeOneStep(0.5f*timeStep); + proceedDeltaTimeOneStep(0.5f*timeStep); + } else + { + //todo: interpolate + } + return true; +} +/// Perform an integration step of duration 'timeStep'. +bool CcdPhysicsEnvironment::proceedDeltaTimeOneStep(float timeStep) +{ // printf("CcdPhysicsEnvironment::proceedDeltaTime\n"); - if (timeStep == 0.f) + if (SimdFuzzyZero(timeStep)) return true; if (m_debugDrawer) @@ -318,9 +332,6 @@ bool CcdPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep) - //clamp hardcoded for now - if (timeStep > 0.02) - timeStep = 0.02; //this is needed because scaling is not known in advance, and scaling has to propagate to the shape if (!m_scalingPropagated) @@ -758,7 +769,9 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl } m_p2pConstraints.push_back(p2p); - return 0; + + //64 bit systems can't cast pointer to int. could use size_t instead. + return p2p->GetConstraintId(); break; } @@ -773,17 +786,24 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl } -void CcdPhysicsEnvironment::removeConstraint(void* p2p) +void CcdPhysicsEnvironment::removeConstraint(int constraintId) { - std::vector<Point2PointConstraint*>::iterator i = - std::find(m_p2pConstraints.begin(), m_p2pConstraints.end(), - (Point2PointConstraint *)p2p); + std::vector<Point2PointConstraint*>::iterator i; + + //std::find(m_p2pConstraints.begin(), m_p2pConstraints.end(), + // (Point2PointConstraint *)p2p); - if (!(i == m_p2pConstraints.end()) ) - { - std::swap(*i, m_p2pConstraints.back()); - m_p2pConstraints.pop_back(); - } + for (i=m_p2pConstraints.begin(); + !(i==m_p2pConstraints.end()); i++) + { + Point2PointConstraint* p2p = (*i); + if (p2p->GetConstraintId() == constraintId) + { + std::swap(*i, m_p2pConstraints.back()); + m_p2pConstraints.pop_back(); + break; + } + } } PHY_IPhysicsController* CcdPhysicsEnvironment::rayTest(PHY_IPhysicsController* ignoreClient, float fromX,float fromY,float fromZ, float toX,float toY,float toZ, diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h index 6050af2f3c8..1b2527aa5bb 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h @@ -63,6 +63,8 @@ class CcdPhysicsEnvironment : public PHY_IPhysicsEnvironment virtual void endFrame() {}; /// Perform an integration step of duration 'timeStep'. virtual bool proceedDeltaTime(double curTime,float timeStep); + bool proceedDeltaTimeOneStep(float timeStep); + virtual void setFixedTimeStep(bool useFixedTimeStep,float fixedTimeStep){}; //returns 0.f if no fixed timestep is used @@ -75,7 +77,7 @@ class CcdPhysicsEnvironment : public PHY_IPhysicsEnvironment virtual int createConstraint(class PHY_IPhysicsController* ctrl,class PHY_IPhysicsController* ctrl2,PHY_ConstraintType type, float pivotX,float pivotY,float pivotZ, float axisX,float axisY,float axisZ); - virtual void removeConstraint(void* constraintid); + virtual void removeConstraint(int constraintid); virtual PHY_IPhysicsController* rayTest(PHY_IPhysicsController* ignoreClient, float fromX,float fromY,float fromZ, float toX,float toY,float toZ, diff --git a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp index 0b6f8a4ded4..0532a9a8cf7 100644 --- a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp @@ -101,7 +101,7 @@ int DummyPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ct } -void DummyPhysicsEnvironment::removeConstraint(void * constraintid) +void DummyPhysicsEnvironment::removeConstraint(int constraintid) { if (constraintid) { diff --git a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h index 0a359feea6d..a400459afe6 100644 --- a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h +++ b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h @@ -61,7 +61,7 @@ public: float pivotX,float pivotY,float pivotZ, float axisX,float axisY,float axisZ); - virtual void removeConstraint(void * constraintid); + virtual void removeConstraint(int constraintid); virtual PHY_IPhysicsController* rayTest(PHY_IPhysicsController* ignoreClient, float fromX,float fromY,float fromZ, float toX,float toY,float toZ, float& hitX,float& hitY,float& hitZ,float& normalX,float& normalY,float& normalZ); diff --git a/source/gameengine/Physics/Sumo/Fuzzics/src/SM_Scene.cpp b/source/gameengine/Physics/Sumo/Fuzzics/src/SM_Scene.cpp index 081a2fb9794..656051be4f5 100644 --- a/source/gameengine/Physics/Sumo/Fuzzics/src/SM_Scene.cpp +++ b/source/gameengine/Physics/Sumo/Fuzzics/src/SM_Scene.cpp @@ -183,7 +183,7 @@ bool SM_Scene::proceed(MT_Scalar curtime, MT_Scalar ticrate) if (!m_frames) { if (ticrate > 0.) - m_frames = (unsigned int)(curtime*ticrate + 1.0); + m_frames = (unsigned int)(curtime*ticrate) + 1.0; else m_frames = (unsigned int)(curtime*65536.0); } @@ -275,7 +275,11 @@ bool SM_Scene::proceed(MT_Scalar curtime, MT_Scalar ticrate) for (i = m_objectList.begin(); i != m_objectList.end(); ++i) (*i)->interpolate(curtime); - m_frames = (unsigned int)(curtime*ticrate + 1.0); + //only update the m_frames after an actual physics timestep + if (num_samples) + { + m_frames = (unsigned int)(curtime*ticrate) + 1.0; + } } else { diff --git a/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp b/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp index 8d03fd4b0f4..ead6dcc0106 100644 --- a/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp @@ -117,7 +117,7 @@ int SumoPhysicsEnvironment::createConstraint( return constraintid; } -void SumoPhysicsEnvironment::removeConstraint(void * constraintid) +void SumoPhysicsEnvironment::removeConstraint(int constraintid) { if (constraintid) { diff --git a/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.h b/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.h index c93e34825b9..e1641407166 100644 --- a/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.h +++ b/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.h @@ -66,7 +66,7 @@ public: float pivotX,float pivotY,float pivotZ, float axisX,float axisY,float axisZ); - virtual void removeConstraint(void * constraintid); + virtual void removeConstraint(int constraintid); virtual PHY_IPhysicsController* rayTest(PHY_IPhysicsController* ignoreClient,float fromX,float fromY,float fromZ, float toX,float toY,float toZ, float& hitX,float& hitY,float& hitZ,float& normalX,float& normalY,float& normalZ); diff --git a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h index 1158563527a..078f84d4de2 100644 --- a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h +++ b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h @@ -83,7 +83,7 @@ class PHY_IPhysicsEnvironment virtual int createConstraint(class PHY_IPhysicsController* ctrl,class PHY_IPhysicsController* ctrl2,PHY_ConstraintType type, float pivotX,float pivotY,float pivotZ, float axisX,float axisY,float axisZ)=0; - virtual void removeConstraint(void * constraintid)=0; + virtual void removeConstraint(int constraintid)=0; virtual PHY_IPhysicsController* rayTest(PHY_IPhysicsController* ignoreClient, float fromX,float fromY,float fromZ, float toX,float toY,float toZ, float& hitX,float& hitY,float& hitZ,float& normalX,float& normalY,float& normalZ)=0; |