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
path: root/extern
diff options
context:
space:
mode:
authorErwin Coumans <blender@erwincoumans.com>2006-05-11 04:13:42 +0400
committerErwin Coumans <blender@erwincoumans.com>2006-05-11 04:13:42 +0400
commit93c47e107198c91ad28d72acc2c6659d862e496e (patch)
treeef9f2dffc4573e339a0102a333b9123229055fa3 /extern
parent2358e85b6d250b3e4597ec8bd23890bf95f41ebb (diff)
- Added support for kinematic objects (interaction between rigidbodies), deriving linear/angular velocity from previous transform/current transform and deltatime.
- Made another attempt to migrate from Sumo to Bullet: import of older files automatically switch to Bullet, but you can override it, and save the file in 2.42 version. then it stays Sumo physics.
Diffstat (limited to 'extern')
-rw-r--r--extern/bullet/Bullet/BroadphaseCollision/SimpleBroadphase.cpp2
-rw-r--r--extern/bullet/Bullet/CollisionDispatch/CollisionObject.h7
-rw-r--r--extern/bullet/Bullet/CollisionDispatch/ConvexConcaveCollisionAlgorithm.cpp2
-rw-r--r--extern/bullet/Bullet/CollisionDispatch/ConvexConvexAlgorithm.cpp4
-rw-r--r--extern/bullet/BulletDynamics/Dynamics/RigidBody.cpp25
-rw-r--r--extern/bullet/BulletDynamics/Dynamics/RigidBody.h41
-rw-r--r--extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.cpp4
-rw-r--r--extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.h11
-rw-r--r--extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp22
-rw-r--r--extern/bullet/LinearMath/SimdTransformUtil.h2
10 files changed, 98 insertions, 22 deletions
diff --git a/extern/bullet/Bullet/BroadphaseCollision/SimpleBroadphase.cpp b/extern/bullet/Bullet/BroadphaseCollision/SimpleBroadphase.cpp
index c797ed96503..c0796f9b9f3 100644
--- a/extern/bullet/Bullet/BroadphaseCollision/SimpleBroadphase.cpp
+++ b/extern/bullet/Bullet/BroadphaseCollision/SimpleBroadphase.cpp
@@ -194,7 +194,9 @@ void SimpleBroadphase::AddOverlappingPair(BroadphaseProxy* proxy0,BroadphaseProx
if (m_NumOverlapBroadphasePair >= m_maxOverlap)
{
//printf("Error: too many overlapping objects: m_NumOverlapBroadphasePair: %d\n",m_NumOverlapBroadphasePair);
+#ifdef DEBUG
assert(0);
+#endif
} else
{
m_NumOverlapBroadphasePair++;
diff --git a/extern/bullet/Bullet/CollisionDispatch/CollisionObject.h b/extern/bullet/Bullet/CollisionDispatch/CollisionObject.h
index 09b346c0372..9c4e3f14b4a 100644
--- a/extern/bullet/Bullet/CollisionDispatch/CollisionObject.h
+++ b/extern/bullet/Bullet/CollisionDispatch/CollisionObject.h
@@ -31,8 +31,9 @@ struct CollisionObject
{
SimdTransform m_worldTransform;
- //m_nextPredictedWorldTransform is used for CCD and interpolation
- SimdTransform m_nextPredictedWorldTransform;
+ //m_interpolationWorldTransform is used for CCD and interpolation
+ //it can be either previous or future (predicted) transform
+ SimdTransform m_interpolationWorldTransform;
enum CollisionFlags
{
@@ -57,7 +58,7 @@ struct CollisionObject
bool mergesSimulationIslands() const;
- inline bool IsStatic() {
+ inline bool IsStatic() const {
return m_collisionFlags & isStatic;
}
diff --git a/extern/bullet/Bullet/CollisionDispatch/ConvexConcaveCollisionAlgorithm.cpp b/extern/bullet/Bullet/CollisionDispatch/ConvexConcaveCollisionAlgorithm.cpp
index 292b0d72de1..36764ac3191 100644
--- a/extern/bullet/Bullet/CollisionDispatch/ConvexConcaveCollisionAlgorithm.cpp
+++ b/extern/bullet/Bullet/CollisionDispatch/ConvexConcaveCollisionAlgorithm.cpp
@@ -184,7 +184,7 @@ float ConvexConcaveCollisionAlgorithm::CalculateTimeOfImpact(BroadphaseProxy* ,B
const SimdVector3& from = convexbody->m_worldTransform.getOrigin();
- SimdVector3 to = convexbody->m_nextPredictedWorldTransform.getOrigin();
+ SimdVector3 to = convexbody->m_interpolationWorldTransform.getOrigin();
//todo: only do if the motion exceeds the 'radius'
struct LocalTriangleRaycastCallback : public TriangleRaycastCallback
diff --git a/extern/bullet/Bullet/CollisionDispatch/ConvexConvexAlgorithm.cpp b/extern/bullet/Bullet/CollisionDispatch/ConvexConvexAlgorithm.cpp
index adb310c3f99..6963cf23548 100644
--- a/extern/bullet/Bullet/CollisionDispatch/ConvexConvexAlgorithm.cpp
+++ b/extern/bullet/Bullet/CollisionDispatch/ConvexConvexAlgorithm.cpp
@@ -374,8 +374,8 @@ float ConvexConvexAlgorithm::CalculateTimeOfImpact(BroadphaseProxy* proxy0,Broad
if (disableCcd)
return 1.f;
- if (ccd1.calcTimeOfImpact(col0->m_worldTransform,col0->m_nextPredictedWorldTransform,
- col1->m_worldTransform,col1->m_nextPredictedWorldTransform,result))
+ if (ccd1.calcTimeOfImpact(col0->m_worldTransform,col0->m_interpolationWorldTransform,
+ col1->m_worldTransform,col1->m_interpolationWorldTransform,result))
{
//store result.m_fraction in both bodies
diff --git a/extern/bullet/BulletDynamics/Dynamics/RigidBody.cpp b/extern/bullet/BulletDynamics/Dynamics/RigidBody.cpp
index 315a9d66c38..e4ccf83953a 100644
--- a/extern/bullet/BulletDynamics/Dynamics/RigidBody.cpp
+++ b/extern/bullet/BulletDynamics/Dynamics/RigidBody.cpp
@@ -33,7 +33,8 @@ RigidBody::RigidBody( const MassProps& massProps,SimdScalar linearDamping,SimdSc
m_linearDamping(0.f),
m_angularDamping(0.5f),
m_friction(friction),
- m_restitution(restitution)
+ m_restitution(restitution),
+ m_kinematicTimeStep(0.f)
{
m_debugBodyId = uniqueId++;
@@ -57,6 +58,21 @@ void RigidBody::predictIntegratedTransform(SimdScalar timeStep,SimdTransform& pr
SimdTransformUtil::IntegrateTransform(m_worldTransform,m_linearVelocity,m_angularVelocity,timeStep,predictedTransform);
}
+void RigidBody::saveKinematicState(SimdScalar timeStep)
+{
+
+ if (m_kinematicTimeStep)
+ {
+ SimdVector3 linVel,angVel;
+ SimdTransformUtil::CalculateVelocity(m_interpolationWorldTransform,m_worldTransform,m_kinematicTimeStep,m_linearVelocity,m_angularVelocity);
+ //printf("angular = %f %f %f\n",m_angularVelocity.getX(),m_angularVelocity.getY(),m_angularVelocity.getZ());
+ }
+
+
+ m_interpolationWorldTransform = m_worldTransform;
+
+ m_kinematicTimeStep = timeStep;
+}
void RigidBody::getAabb(SimdVector3& aabbMin,SimdVector3& aabbMax) const
{
@@ -65,6 +81,7 @@ void RigidBody::getAabb(SimdVector3& aabbMin,SimdVector3& aabbMax) const
+
void RigidBody::setGravity(const SimdVector3& acceleration)
{
if (m_inverseMass != 0.0f)
@@ -91,6 +108,9 @@ void RigidBody::setDamping(SimdScalar lin_damping, SimdScalar ang_damping)
void RigidBody::applyForces(SimdScalar step)
{
+ if (IsStatic())
+ return;
+
applyCentralForce(m_gravity);
@@ -165,6 +185,9 @@ void RigidBody::updateInertiaTensor()
void RigidBody::integrateVelocities(SimdScalar step)
{
+ if (IsStatic())
+ return;
+
m_linearVelocity += m_totalForce * (m_inverseMass * step);
m_angularVelocity += m_invInertiaTensorWorld * m_totalTorque * step;
diff --git a/extern/bullet/BulletDynamics/Dynamics/RigidBody.h b/extern/bullet/BulletDynamics/Dynamics/RigidBody.h
index 8489778d824..fd96dc99d60 100644
--- a/extern/bullet/BulletDynamics/Dynamics/RigidBody.h
+++ b/extern/bullet/BulletDynamics/Dynamics/RigidBody.h
@@ -48,6 +48,9 @@ public:
/// continuous collision detection needs prediction
void predictIntegratedTransform(SimdScalar step, SimdTransform& predictedTransform) const;
+ void saveKinematicState(SimdScalar step);
+
+
void applyForces(SimdScalar step);
void setGravity(const SimdVector3& acceleration);
@@ -65,7 +68,9 @@ public:
void setMassProps(SimdScalar mass, const SimdVector3& inertia);
SimdScalar getInvMass() const { return m_inverseMass; }
- const SimdMatrix3x3& getInvInertiaTensorWorld() const { return m_invInertiaTensorWorld; }
+ const SimdMatrix3x3& getInvInertiaTensorWorld() const {
+ return m_invInertiaTensorWorld;
+ }
void integrateVelocities(SimdScalar step);
@@ -104,7 +109,8 @@ public:
void applyTorqueImpulse(const SimdVector3& torque)
{
- m_angularVelocity += m_invInertiaTensorWorld * torque;
+ if (!IsStatic())
+ m_angularVelocity += m_invInertiaTensorWorld * torque;
}
@@ -125,20 +131,37 @@ public:
void updateInertiaTensor();
- const SimdPoint3& getCenterOfMassPosition() const { return m_worldTransform.getOrigin(); }
+ const SimdPoint3& getCenterOfMassPosition() const {
+ return m_worldTransform.getOrigin();
+ }
SimdQuaternion getOrientation() const;
- const SimdTransform& getCenterOfMassTransform() const { return m_worldTransform; }
- const SimdVector3& getLinearVelocity() const { return m_linearVelocity; }
- const SimdVector3& getAngularVelocity() const { return m_angularVelocity; }
+ const SimdTransform& getCenterOfMassTransform() const {
+ return m_worldTransform;
+ }
+ const SimdVector3& getLinearVelocity() const {
+ return m_linearVelocity;
+ }
+ const SimdVector3& getAngularVelocity() const {
+ return m_angularVelocity;
+ }
void setLinearVelocity(const SimdVector3& lin_vel);
- void setAngularVelocity(const SimdVector3& ang_vel) { m_angularVelocity = ang_vel; }
+ void setAngularVelocity(const SimdVector3& ang_vel) {
+ if (!IsStatic())
+ {
+ m_angularVelocity = ang_vel;
+ }
+ }
SimdVector3 getVelocityInLocalPoint(const SimdVector3& rel_pos) const
{
+ //we also calculate lin/ang velocity for kinematic objects
return m_linearVelocity + m_angularVelocity.cross(rel_pos);
+
+ //for kinematic objects, we could also use use:
+ // return (m_worldTransform(rel_pos) - m_interpolationWorldTransform(rel_pos)) / m_kinematicTimeStep;
}
void translate(const SimdVector3& v)
@@ -208,9 +231,13 @@ private:
SimdScalar m_friction;
SimdScalar m_restitution;
+ SimdScalar m_kinematicTimeStep;
+
BroadphaseProxy* m_broadphaseProxy;
+
+
public:
diff --git a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.cpp b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.cpp
index 79b311bd691..b8ce09729c2 100644
--- a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.cpp
+++ b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.cpp
@@ -31,7 +31,7 @@ class BP_Proxy;
float gDeactivationTime = 2.f;
bool gDisableDeactivation = false;
-float gLinearSleepingTreshold = 0.8f;
+float gLinearSleepingTreshold = 0.4f;
float gAngularSleepingTreshold = 1.0f;
#include "Dynamics/MassProps.h"
@@ -136,7 +136,7 @@ bool CcdPhysicsController::SynchronizeMotionStates(float time)
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...
diff --git a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.h b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.h
index f1933d55137..646b21f285e 100644
--- a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.h
+++ b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.h
@@ -171,6 +171,17 @@ class CcdPhysicsController : public PHY_IPhysicsController
void SetAabb(const SimdVector3& aabbMin,const SimdVector3& aabbMax);
+ class PHY_IMotionState* GetMotionState()
+ {
+ return m_MotionState;
+ }
+
+ const class PHY_IMotionState* GetMotionState() const
+ {
+ return m_MotionState;
+ }
+
+
};
#endif //BULLET2_PHYSICSCONTROLLER_H
diff --git a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp
index 9583839a7ae..7afd7bf8fc5 100644
--- a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp
+++ b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp
@@ -586,6 +586,7 @@ bool CcdPhysicsEnvironment::proceedDeltaTimeOneStep(float timeStep)
m_scalingPropagated = true;
}
+
#ifdef USE_QUICKPROF
Profiler::endBlock("SyncMotionStates");
@@ -605,9 +606,12 @@ bool CcdPhysicsEnvironment::proceedDeltaTimeOneStep(float timeStep)
RigidBody* body = ctrl->GetRigidBody();
if (body->GetActivationState() != ISLAND_SLEEPING)
{
- body->applyForces( timeStep);
- body->integrateVelocities( timeStep);
- body->predictIntegratedTransform(timeStep,body->m_nextPredictedWorldTransform);
+ if (!body->IsStatic())
+ {
+ body->applyForces( timeStep);
+ body->integrateVelocities( timeStep);
+ body->predictIntegratedTransform(timeStep,body->m_interpolationWorldTransform);
+ }
}
}
@@ -807,8 +811,15 @@ bool CcdPhysicsEnvironment::proceedDeltaTimeOneStep(float timeStep)
if (body->GetActivationState() != ISLAND_SLEEPING)
{
- body->predictIntegratedTransform(timeStep* toi, predictedTrans);
- body->proceedToTransform( predictedTrans);
+ if (body->IsStatic())
+ {
+ //to calculate velocities next frame
+ body->saveKinematicState(timeStep);
+ } else
+ {
+ body->predictIntegratedTransform(timeStep* toi, predictedTrans);
+ body->proceedToTransform( predictedTrans);
+ }
}
}
@@ -893,6 +904,7 @@ bool CcdPhysicsEnvironment::proceedDeltaTimeOneStep(float timeStep)
}
#endif //NEW_BULLET_VEHICLE_SUPPORT
}
+
return true;
}
diff --git a/extern/bullet/LinearMath/SimdTransformUtil.h b/extern/bullet/LinearMath/SimdTransformUtil.h
index 14c70c26326..9f6619ab43e 100644
--- a/extern/bullet/LinearMath/SimdTransformUtil.h
+++ b/extern/bullet/LinearMath/SimdTransformUtil.h
@@ -119,7 +119,7 @@ public:
axis[3] = 0.f;
//check for axis length
SimdScalar len = axis.length2();
- if (len < 0.001f)
+ if (len < SIMD_EPSILON*SIMD_EPSILON)
axis = SimdVector3(1.f,0.f,0.f);
else
axis /= SimdSqrt(len);