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:
authorErwin Coumans <blender@erwincoumans.com>2006-04-14 08:03:56 +0400
committerErwin Coumans <blender@erwincoumans.com>2006-04-14 08:03:56 +0400
commit187cc0a5fe854f01dea750db1130e24f7347ab45 (patch)
tree570c7d34445c236d154a1315bea48be8a9bbd6ca
parent5a26279d63620eb4a44e376941ee81af68657d80 (diff)
enabled ipo in combination with physics (no friction effect from kinematic to dynamic transferred yet)
-rw-r--r--extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.cpp46
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.cpp46
2 files changed, 70 insertions, 22 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;
+
}
/**
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
index fdb30faa5cf..6b892655300 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
+++ b/source/gameengine/Physics/Bullet/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;
+
}
/**