diff options
author | Erwin Coumans <blender@erwincoumans.com> | 2006-04-14 08:03:56 +0400 |
---|---|---|
committer | Erwin Coumans <blender@erwincoumans.com> | 2006-04-14 08:03:56 +0400 |
commit | 187cc0a5fe854f01dea750db1130e24f7347ab45 (patch) | |
tree | 570c7d34445c236d154a1315bea48be8a9bbd6ca /extern | |
parent | 5a26279d63620eb4a44e376941ee81af68657d80 (diff) |
enabled ipo in combination with physics (no friction effect from kinematic to dynamic transferred yet)
Diffstat (limited to 'extern')
-rw-r--r-- | extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.cpp | 46 |
1 files changed, 35 insertions, 11 deletions
diff --git a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.cpp b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.cpp index fdb30faa5cf..6b892655300 100644 --- a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.cpp +++ b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.cpp @@ -6,7 +6,7 @@ #include "BroadphaseCollision/BroadphaseInterface.h" #include "CollisionShapes/ConvexShape.h" #include "CcdPhysicsEnvironment.h" - +#include "SimdTransformUtil.h" class BP_Proxy; @@ -93,20 +93,44 @@ CcdPhysicsController::~CcdPhysicsController() */ bool CcdPhysicsController::SynchronizeMotionStates(float time) { - const SimdVector3& worldPos = m_body->getCenterOfMassPosition(); - m_MotionState->setWorldPosition(worldPos[0],worldPos[1],worldPos[2]); - - const SimdQuaternion& worldquat = m_body->getOrientation(); - m_MotionState->setWorldOrientation(worldquat[0],worldquat[1],worldquat[2],worldquat[3]); + //don't sync non-dynamic... + + if (m_body->getInvMass() != 0.f) + { + const SimdVector3& worldPos = m_body->getCenterOfMassPosition(); + m_MotionState->setWorldPosition(worldPos[0],worldPos[1],worldPos[2]); + + const SimdQuaternion& worldquat = m_body->getOrientation(); + m_MotionState->setWorldOrientation(worldquat[0],worldquat[1],worldquat[2],worldquat[3]); + + m_MotionState->calculateWorldTransformations(); - m_MotionState->calculateWorldTransformations(); + float scale[3]; + m_MotionState->getWorldScaling(scale[0],scale[1],scale[2]); + SimdVector3 scaling(scale[0],scale[1],scale[2]); + GetCollisionShape()->setLocalScaling(scaling); + } else + { + SimdVector3 worldPos; + SimdQuaternion worldquat; - float scale[3]; - m_MotionState->getWorldScaling(scale[0],scale[1],scale[2]); - SimdVector3 scaling(scale[0],scale[1],scale[2]); - GetCollisionShape()->setLocalScaling(scaling); + m_MotionState->getWorldPosition(worldPos[0],worldPos[1],worldPos[2]); + m_MotionState->getWorldOrientation(worldquat[0],worldquat[1],worldquat[2],worldquat[3]); + SimdTransform oldTrans = m_body->getCenterOfMassTransform(); + SimdTransform newTrans(worldquat,worldPos); + + m_body->setCenterOfMassTransform(newTrans); + //need to keep track of previous position for friction effects... + + m_MotionState->calculateWorldTransformations(); + float scale[3]; + m_MotionState->getWorldScaling(scale[0],scale[1],scale[2]); + SimdVector3 scaling(scale[0],scale[1],scale[2]); + GetCollisionShape()->setLocalScaling(scaling); + } return true; + } /** |