diff options
author | Benoit Bolsee <benoit.bolsee@online.be> | 2009-06-17 12:36:37 +0400 |
---|---|---|
committer | Benoit Bolsee <benoit.bolsee@online.be> | 2009-06-17 12:36:37 +0400 |
commit | fa3cd4aadfca4141735a59aa801dc9425e1b9ba7 (patch) | |
tree | 5a6781caa6185aa0848b37f23672eb759f0837c5 /source/gameengine/Physics | |
parent | 5de1ddf96ccf715c4c1eeb189328a72cd250ab4d (diff) |
BGE #18823: Loading older blend files (from the blender Gamekit 1.0 demos) that use Sumo crash on playback in 2.48.5, worked in rc3. Fixed by upgrading Sumo to support the new method of sensor synchronization introduced with Sensor objects in Bullet. Sumo demo will not crash but may still not run well as other features and methods have not been ported.
Diffstat (limited to 'source/gameengine/Physics')
3 files changed, 104 insertions, 4 deletions
diff --git a/source/gameengine/Physics/Sumo/SumoPhysicsController.cpp b/source/gameengine/Physics/Sumo/SumoPhysicsController.cpp index 56caa9236bf..5e77567a95a 100644 --- a/source/gameengine/Physics/Sumo/SumoPhysicsController.cpp +++ b/source/gameengine/Physics/Sumo/SumoPhysicsController.cpp @@ -402,7 +402,13 @@ void SumoPhysicsController::SetSimulatedTime(float) void SumoPhysicsController::WriteMotionStateToDynamics(bool) { - + float tmp[4]; + m_MotionState->getWorldPosition(tmp[0], tmp[1], tmp[2]); + MT_Point3 pos(tmp); + m_sumoObj->setPosition(pos); + m_MotionState->getWorldOrientation(tmp[0], tmp[1], tmp[2], tmp[3]); + MT_Quaternion quat(tmp); + m_sumoObj->setOrientation(quat); } // this is the actual callback from sumo, and the position/orientation //is written to the scenegraph, using the motionstate abstraction @@ -493,3 +499,70 @@ float SumoPhysicsController::GetRadius() const return 0.f; } + +/////////////////////////////////////////////////////////// +///A small utility class, SumoDefaultMotionState +/// +/////////////////////////////////////////////////////////// + +SumoDefaultMotionState::SumoDefaultMotionState() +{ + m_worldTransform.setIdentity(); + m_localScaling.setValue(1.f,1.f,1.f); +} + + +SumoDefaultMotionState::~SumoDefaultMotionState() +{ + +} + +void SumoDefaultMotionState::getWorldPosition(float& posX,float& posY,float& posZ) +{ + posX = m_worldTransform.getOrigin().x(); + posY = m_worldTransform.getOrigin().y(); + posZ = m_worldTransform.getOrigin().z(); +} + +void SumoDefaultMotionState::getWorldScaling(float& scaleX,float& scaleY,float& scaleZ) +{ + scaleX = m_localScaling.x(); + scaleY = m_localScaling.y(); + scaleZ = m_localScaling.z(); +} + +void SumoDefaultMotionState::getWorldOrientation(float& quatIma0,float& quatIma1,float& quatIma2,float& quatReal) +{ + MT_Quaternion quat = m_worldTransform.getRotation(); + quatIma0 = quat.x(); + quatIma1 = quat.y(); + quatIma2 = quat.z(); + quatReal = quat.w(); +} + +void SumoDefaultMotionState::getWorldOrientation(float* ori) +{ + m_worldTransform.getBasis().getValue(ori); +} + +void SumoDefaultMotionState::setWorldOrientation(const float* ori) +{ + m_worldTransform.getBasis().setValue(ori); +} +void SumoDefaultMotionState::setWorldPosition(float posX,float posY,float posZ) +{ + MT_Point3 pos(posX,posY,posZ); + m_worldTransform.setOrigin( pos ); +} + +void SumoDefaultMotionState::setWorldOrientation(float quatIma0,float quatIma1,float quatIma2,float quatReal) +{ + MT_Quaternion orn(quatIma0,quatIma1,quatIma2,quatReal); + m_worldTransform.setRotation( orn ); +} + +void SumoDefaultMotionState::calculateWorldTransformations() +{ + +} + diff --git a/source/gameengine/Physics/Sumo/SumoPhysicsController.h b/source/gameengine/Physics/Sumo/SumoPhysicsController.h index adf29649f18..25d6d68f3b8 100644 --- a/source/gameengine/Physics/Sumo/SumoPhysicsController.h +++ b/source/gameengine/Physics/Sumo/SumoPhysicsController.h @@ -30,6 +30,7 @@ #define __SUMO_PHYSICSCONTROLLER_H #include "PHY_IPhysicsController.h" +#include "PHY_IMotionState.h" #include "SM_Scene.h" #include "SM_Callback.h" @@ -188,5 +189,30 @@ private: }; +///SumoDefaultMotionState implements standard motionstate, using btTransform +class SumoDefaultMotionState : public PHY_IMotionState + +{ + public: + SumoDefaultMotionState(); + + virtual ~SumoDefaultMotionState(); + + virtual void getWorldPosition(float& posX,float& posY,float& posZ); + virtual void getWorldScaling(float& scaleX,float& scaleY,float& scaleZ); + virtual void getWorldOrientation(float& quatIma0,float& quatIma1,float& quatIma2,float& quatReal); + + virtual void setWorldPosition(float posX,float posY,float posZ); + virtual void setWorldOrientation(float quatIma0,float quatIma1,float quatIma2,float quatReal); + virtual void getWorldOrientation(float* ori); + virtual void setWorldOrientation(const float* ori); + + virtual void calculateWorldTransformations(); + + MT_Transform m_worldTransform; + MT_Vector3 m_localScaling; + +}; + #endif //__SUMO_PHYSICSCONTROLLER_H diff --git a/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp b/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp index b4daf0a3f80..941a41b1396 100644 --- a/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp @@ -244,8 +244,8 @@ PHY_IPhysicsController* SumoPhysicsEnvironment::CreateSphereController(float rad //testing MT_Quaternion rotquatje(MT_Vector3(0,0,1),MT_radians(90)); ob->setOrientation(rotquatje); - - PHY_IPhysicsController* ctrl = new SumoPhysicsController(m_sumoScene,ob,0,false); + PHY_IMotionState* motionState = new SumoDefaultMotionState(); + PHY_IPhysicsController* ctrl = new SumoPhysicsController(m_sumoScene,ob,motionState,false); ctrl->SetMargin(radius); return ctrl; } @@ -256,8 +256,9 @@ PHY_IPhysicsController* SumoPhysicsEnvironment::CreateConeController(float coner ob->setPosition(MT_Point3(0.f,0.f,0.f)); MT_Quaternion rotquatje(MT_Vector3(0,0,1),MT_radians(90)); ob->setOrientation(rotquatje); + PHY_IMotionState* motionState = new SumoDefaultMotionState(); - PHY_IPhysicsController* ctrl = new SumoPhysicsController(m_sumoScene,ob,0,false); + PHY_IPhysicsController* ctrl = new SumoPhysicsController(m_sumoScene,ob,motionState,false); return ctrl; } |