more refactoring, removed PhysicsInterface, cleaned up demos to make use of btDynamicsWorld derived classes.

removed two cached optimizations, type in btTransform and cached inverse transform (todo: test performance impact)
committed fixes that make the code adhere to 'who creates it, also destroys it'
This commit is contained in:
ejcoumans
2006-09-30 01:36:39 +00:00
parent 14397a2f72
commit d38549aa54
37 changed files with 317 additions and 995 deletions

View File

@@ -16,6 +16,7 @@ subject to the following restrictions:
#include "btDiscreteDynamicsWorld.h"
//collision detection
#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h"
@@ -32,12 +33,14 @@ subject to the following restrictions:
#include "BulletDynamics/Vehicle/btRaycastVehicle.h"
#include "BulletDynamics/Vehicle/btVehicleRaycaster.h"
#include "BulletDynamics/Vehicle/btWheelInfo.h"
#include "LinearMath/btIDebugDraw.h"
#include <algorithm>
btDiscreteDynamicsWorld::btDiscreteDynamicsWorld()
:btDynamicsWorld(),
m_constraintSolver(new btSequentialImpulseConstraintSolver)
m_constraintSolver(new btSequentialImpulseConstraintSolver),
m_debugDrawer(0)
{
m_islandManager = new btSimulationIslandManager();
m_ownsIslandManager = true;
@@ -47,11 +50,12 @@ m_constraintSolver(new btSequentialImpulseConstraintSolver)
btDiscreteDynamicsWorld::btDiscreteDynamicsWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache,btConstraintSolver* constraintSolver)
:btDynamicsWorld(dispatcher,pairCache),
m_constraintSolver(constraintSolver)
m_constraintSolver(constraintSolver? constraintSolver: new btSequentialImpulseConstraintSolver),
m_debugDrawer(0)
{
m_islandManager = new btSimulationIslandManager();
m_ownsIslandManager = true;
m_ownsConstraintSolver = false;
m_ownsConstraintSolver = (constraintSolver==0);
}
@@ -114,10 +118,9 @@ void btDiscreteDynamicsWorld::updateActivationState(float timeStep)
for (int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
if (colObj->m_internalOwner)
btRigidBody* body = btRigidBody::upcast(colObj);
if (body)
{
btRigidBody* body = (btRigidBody*)colObj->m_internalOwner;
body->updateDeactivation(timeStep);
if (body->wantsSleeping())
@@ -190,8 +193,8 @@ void btDiscreteDynamicsWorld::solveContactConstraints(btContactSolverInfo& solve
};
btIDebugDraw* debugDraw = 0;
InplaceSolverIslandCallback solverCallback( solverInfo, m_constraintSolver, debugDraw);
InplaceSolverIslandCallback solverCallback( solverInfo, m_constraintSolver, m_debugDrawer);
/// solve all the contact points and contact friction
@@ -277,23 +280,60 @@ void btDiscreteDynamicsWorld::calculateSimulationIslands()
Profiler::endBlock("IslandUnionFind");
#endif //USE_QUICKPROF
}
static void DrawAabb(btIDebugDraw* debugDrawer,const btVector3& from,const btVector3& to,const btVector3& color)
{
btVector3 halfExtents = (to-from)* 0.5f;
btVector3 center = (to+from) *0.5f;
int i,j;
btVector3 edgecoord(1.f,1.f,1.f),pa,pb;
for (i=0;i<4;i++)
{
for (j=0;j<3;j++)
{
pa = btVector3(edgecoord[0]*halfExtents[0], edgecoord[1]*halfExtents[1],
edgecoord[2]*halfExtents[2]);
pa+=center;
int othercoord = j%3;
edgecoord[othercoord]*=-1.f;
pb = btVector3(edgecoord[0]*halfExtents[0], edgecoord[1]*halfExtents[1],
edgecoord[2]*halfExtents[2]);
pb+=center;
debugDrawer->drawLine(pa,pb,color);
}
edgecoord = btVector3(-1.f,-1.f,-1.f);
if (i<3)
edgecoord[i]*=-1.f;
}
}
void btDiscreteDynamicsWorld::updateAabbs()
{
btVector3 colorvec(1,0,0);
btTransform predictedTrans;
for (int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
if (colObj->m_internalOwner)
btRigidBody* body = btRigidBody::upcast(colObj);
if (body)
{
btRigidBody* body = (btRigidBody*)colObj->m_internalOwner;
if (body->IsActive() && (!body->IsStatic()))
// if (body->IsActive() && (!body->IsStatic()))
{
btPoint3 minAabb,maxAabb;
colObj->m_collisionShape->getAabb(colObj->m_worldTransform, minAabb,maxAabb);
btSimpleBroadphase* bp = (btSimpleBroadphase*)m_broadphasePairCache;
bp->setAabb(body->m_broadphaseHandle,minAabb,maxAabb);
if (m_debugDrawer && (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawAabb))
{
DrawAabb(m_debugDrawer,minAabb,maxAabb,colorvec);
}
}
}
}
@@ -305,9 +345,9 @@ void btDiscreteDynamicsWorld::integrateTransforms(float timeStep)
for (int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
if (colObj->m_internalOwner)
btRigidBody* body = btRigidBody::upcast(colObj);
if (body)
{
btRigidBody* body = (btRigidBody*)colObj->m_internalOwner;
if (body->IsActive() && (!body->IsStatic()))
{
body->predictIntegratedTransform(timeStep, predictedTrans);
@@ -324,10 +364,9 @@ void btDiscreteDynamicsWorld::predictUnconstraintMotion(float timeStep)
for (int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
if (colObj->m_internalOwner)
btRigidBody* body = btRigidBody::upcast(colObj);
if (body)
{
btRigidBody* body = (btRigidBody*)colObj->m_internalOwner;
body->m_cachedInvertedWorldTransform = body->m_worldTransform.inverse();
if (body->IsActive() && (!body->IsStatic()))
{
body->applyForces( timeStep);

View File

@@ -25,6 +25,7 @@ class btSimulationIslandManager;
class btTypedConstraint;
struct btContactSolverInfo;
class btRaycastVehicle;
class btIDebugDraw;
#include <vector>
@@ -40,6 +41,8 @@ protected:
std::vector<btTypedConstraint*> m_constraints;
btIDebugDraw* m_debugDrawer;
bool m_ownsIslandManager;
bool m_ownsConstraintSolver;
@@ -49,8 +52,6 @@ protected:
void integrateTransforms(float timeStep);
void updateAabbs();
void calculateSimulationIslands();
void solveNoncontactConstraints(btContactSolverInfo& solverInfo);
@@ -65,7 +66,7 @@ public:
///this btDiscreteDynamicsWorld constructor gets created objects from the user, and will not delete those
btDiscreteDynamicsWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache,btConstraintSolver* constraintSolver);
btDiscreteDynamicsWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache,btConstraintSolver* constraintSolver=0);
///this btDiscreteDynamicsWorld will create and own dispatcher, pairCache and constraintSolver, and deletes it in the destructor.
btDiscreteDynamicsWorld();
@@ -74,6 +75,8 @@ public:
virtual void stepSimulation( float timeStep);
virtual void updateAabbs();
void addConstraint(btTypedConstraint* constraint);
void removeConstraint(btTypedConstraint* constraint);
@@ -97,6 +100,16 @@ public:
return this;
}
virtual void setDebugDrawer(btIDebugDraw* debugDrawer)
{
m_debugDrawer = debugDrawer;
}
virtual btIDebugDraw* getDebugDrawer()
{
return m_debugDrawer;
}
};
#endif //BT_DISCRETE_DYNAMICS_WORLD_H

View File

@@ -40,11 +40,16 @@ class btDynamicsWorld : public btCollisionWorld
///stepSimulation proceeds the simulation over timeStep units
virtual void stepSimulation( float timeStep) = 0;
virtual void updateAabbs() = 0;
virtual void addConstraint(btTypedConstraint* constraint) {};
virtual void removeConstraint(btTypedConstraint* constraint) {};
virtual void setDebugDrawer(btIDebugDraw* debugDrawer) = 0;
virtual btIDebugDraw* getDebugDrawer() = 0;
};
#endif //BT_DYNAMICS_WORLD_H

View File

@@ -48,6 +48,9 @@ btRigidBody::btRigidBody( const btMassProps& massProps,btScalar linearDamping,bt
m_debugBodyId = uniqueId++;
//m_internalOwner is to allow upcasting from collision object to rigid body
m_internalOwner = this;
setMassProps(massProps.m_mass, massProps.m_inertiaLocal);
setDamping(linearDamping, angularDamping);
m_worldTransform.setIdentity();

View File

@@ -65,6 +65,16 @@ public:
void proceedToTransform(const btTransform& newTrans);
///to keep collision detection and dynamics separate we don't store a rigidbody pointer
///but a rigidbody is derived from btCollisionObject, so we can safely perform an upcast
static const btRigidBody* upcast(const btCollisionObject* colObj)
{
return (const btRigidBody*)colObj->m_internalOwner;
}
static btRigidBody* upcast(btCollisionObject* colObj)
{
return (btRigidBody*)colObj->m_internalOwner;
}
/// continuous collision detection needs prediction
void predictIntegratedTransform(btScalar step, btTransform& predictedTransform) const;

View File

@@ -24,14 +24,16 @@ subject to the following restrictions:
btSimpleDynamicsWorld::btSimpleDynamicsWorld()
:m_constraintSolver(new btSequentialImpulseConstraintSolver),
m_ownsConstraintSolver(true)
m_ownsConstraintSolver(true),
m_debugDrawer(0)
{
}
btSimpleDynamicsWorld::btSimpleDynamicsWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache,btConstraintSolver* constraintSolver)
:btDynamicsWorld(dispatcher,pairCache),
m_constraintSolver(constraintSolver),
m_ownsConstraintSolver(false)
m_ownsConstraintSolver(false),
m_debugDrawer(0)
{
}
@@ -56,8 +58,8 @@ void btSimpleDynamicsWorld::stepSimulation(float timeStep)
int numManifolds = m_dispatcher1->getNumManifolds();
btContactSolverInfo infoGlobal;
infoGlobal.m_timeStep = timeStep;
btIDebugDraw* debugDrawer=0;
m_constraintSolver->solveGroup(manifoldPtr, numManifolds,infoGlobal,debugDrawer);
m_constraintSolver->solveGroup(manifoldPtr, numManifolds,infoGlobal,m_debugDrawer);
///integrate transforms
integrateTransforms(timeStep);
@@ -74,9 +76,9 @@ void btSimpleDynamicsWorld::updateAabbs()
for (int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
if (colObj->m_internalOwner)
btRigidBody* body = btRigidBody::upcast(colObj);
if (body)
{
btRigidBody* body = (btRigidBody*)colObj->m_internalOwner;
if (body->IsActive() && (!body->IsStatic()))
{
btPoint3 minAabb,maxAabb;
@@ -94,9 +96,9 @@ void btSimpleDynamicsWorld::integrateTransforms(float timeStep)
for (int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
if (colObj->m_internalOwner)
btRigidBody* body = btRigidBody::upcast(colObj);
if (body)
{
btRigidBody* body = (btRigidBody*)colObj->m_internalOwner;
if (body->IsActive() && (!body->IsStatic()))
{
body->predictIntegratedTransform(timeStep, predictedTrans);
@@ -113,10 +115,9 @@ void btSimpleDynamicsWorld::predictUnconstraintMotion(float timeStep)
for (int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
if (colObj->m_internalOwner)
btRigidBody* body = btRigidBody::upcast(colObj);
if (body)
{
btRigidBody* body = (btRigidBody*)colObj->m_internalOwner;
body->m_cachedInvertedWorldTransform = body->m_worldTransform.inverse();
if (body->IsActive() && (!body->IsStatic()))
{
body->applyForces( timeStep);

View File

@@ -35,12 +35,13 @@ protected:
bool m_ownsConstraintSolver;
btIDebugDraw* m_debugDrawer;
void predictUnconstraintMotion(float timeStep);
void integrateTransforms(float timeStep);
void updateAabbs();
public:
@@ -54,6 +55,17 @@ public:
virtual void stepSimulation( float timeStep);
virtual void setDebugDrawer(btIDebugDraw* debugDrawer)
{
m_debugDrawer = debugDrawer;
};
virtual btIDebugDraw* getDebugDrawer()
{
return m_debugDrawer;
}
virtual void updateAabbs();
};
#endif //BT_SIMPLE_DYNAMICS_WORLD_H