Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Bolsee <benoit.bolsee@online.be>2009-06-17 12:36:37 +0400
committerBenoit Bolsee <benoit.bolsee@online.be>2009-06-17 12:36:37 +0400
commitfa3cd4aadfca4141735a59aa801dc9425e1b9ba7 (patch)
tree5a6781caa6185aa0848b37f23672eb759f0837c5 /source/gameengine/Physics
parent5de1ddf96ccf715c4c1eeb189328a72cd250ab4d (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')
-rw-r--r--source/gameengine/Physics/Sumo/SumoPhysicsController.cpp75
-rw-r--r--source/gameengine/Physics/Sumo/SumoPhysicsController.h26
-rw-r--r--source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp7
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;
}