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

@@ -15,7 +15,6 @@ subject to the following restrictions:
#include "BspConverter.h" #include "BspConverter.h"
#include "BspLoader.h" #include "BspLoader.h"
#include "CcdPhysicsEnvironment.h"
#include "LinearMath/btVector3.h" #include "LinearMath/btVector3.h"
void BspConverter::convertBsp(BspLoader& bspLoader,float scaling) void BspConverter::convertBsp(BspLoader& bspLoader,float scaling)

View File

@@ -13,9 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
#include "CcdPhysicsEnvironment.h"
#include "CcdPhysicsController.h"
#include "btBulletDynamicsCommon.h" #include "btBulletDynamicsCommon.h"
#include "LinearMath/btQuickprof.h" #include "LinearMath/btQuickprof.h"
@@ -31,7 +28,6 @@ subject to the following restrictions:
#include "BspConverter.h" #include "BspConverter.h"
#endif //QUAKE_BSP_IMPORTING #endif //QUAKE_BSP_IMPORTING
#include "PHY_Pro.h"
#include "BMF_Api.h" #include "BMF_Api.h"
#include <stdio.h> //printf debugging #include <stdio.h> //printf debugging
@@ -76,7 +72,9 @@ public:
//this create an internal copy of the vertices //this create an internal copy of the vertices
btCollisionShape* shape = new btConvexHullShape(&vertices[0],vertices.size()); btCollisionShape* shape = new btConvexHullShape(&vertices[0],vertices.size());
m_demoApp->localCreatePhysicsObject(isDynamic, mass, startTransform,shape); btRigidBody* body = m_demoApp->localCreateRigidBody(isDynamic, mass, startTransform,shape);
assert(body);
m_demoApp->getDynamicsWorld()->addCollisionObject( body );
} }
} }
}; };
@@ -124,6 +122,11 @@ int main(int argc,char** argv)
return glutmain(argc, argv,640,480,"Bullet Quake BSP Physics Viewer http://bullet.sourceforge.net",bspDemo); return glutmain(argc, argv,640,480,"Bullet Quake BSP Physics Viewer http://bullet.sourceforge.net",bspDemo);
} }
BspDemo::~BspDemo()
{
delete m_dynamicsWorld;
}
void BspDemo::initPhysics(char* bspfilename) void BspDemo::initPhysics(char* bspfilename)
{ {
@@ -132,16 +135,7 @@ void BspDemo::initPhysics(char* bspfilename)
m_forwardAxis = 1; m_forwardAxis = 1;
///Setup a Physics Simulation Environment ///Setup a Physics Simulation Environment
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(); m_dynamicsWorld = new btDiscreteDynamicsWorld();
btVector3 worldAabbMin(-10000,-10000,-10000);
btVector3 worldAabbMax(10000,10000,10000);
btOverlappingPairCache* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax);
//BroadphaseInterface* broadphase = new btSimpleBroadphase();
m_physicsEnvironmentPtr = new CcdPhysicsEnvironment(dispatcher,broadphase);
m_physicsEnvironmentPtr->setDeactivationTime(2.f);
m_physicsEnvironmentPtr->setGravity(0,0,-10);
m_physicsEnvironmentPtr->setDebugDrawer(&debugDrawer);
#ifdef QUAKE_BSP_IMPORTING #ifdef QUAKE_BSP_IMPORTING
@@ -192,7 +186,7 @@ void BspDemo::clientMoveAndDisplay()
{ {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
m_physicsEnvironmentPtr->proceedDeltaTime(0.f,deltaTime); m_dynamicsWorld->stepSimulation(deltaTime);
renderme(); renderme();
@@ -208,7 +202,7 @@ void BspDemo::displayCallback(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
m_physicsEnvironmentPtr->UpdateAabbs(deltaTime); //m_dynamicsWorld->UpdateAabbs(deltaTime);
renderme(); renderme();

View File

@@ -22,6 +22,8 @@ class BspDemo : public DemoApplication
{ {
public: public:
virtual ~BspDemo();
void initPhysics(char* bspfilename); void initPhysics(char* bspfilename);
virtual void clientMoveAndDisplay(); virtual void clientMoveAndDisplay();

View File

@@ -21,10 +21,8 @@ subject to the following restrictions:
#include "LinearMath/btQuickprof.h" #include "LinearMath/btQuickprof.h"
#include "LinearMath/btIDebugDraw.h" #include "LinearMath/btIDebugDraw.h"
#include "GLDebugDrawer.h" #include "GLDebugDrawer.h"
#include "PHY_Pro.h"
#include "BMF_Api.h" #include "BMF_Api.h"
#include <stdio.h> //printf debugging #include <stdio.h> //printf debugging
@@ -154,14 +152,7 @@ void CcdPhysicsDemo::displayCallback(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/* m_dynamicsWorld->updateAabbs();
if (m_physicsEnvironmentPtr)
{
m_physicsEnvironmentPtr->UpdateAabbs(deltaTime);
//draw contactpoints
m_physicsEnvironmentPtr->CallbackTriggers();
}
*/
renderme(); renderme();
@@ -253,6 +244,8 @@ void CcdPhysicsDemo::initPhysics()
m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver); m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver);
m_dynamicsWorld->setDebugDrawer(&debugDrawer);
#ifdef USER_DEFINED_FRICTION_MODEL #ifdef USER_DEFINED_FRICTION_MODEL
btSequentialImpulseConstraintSolver* solver = (btSequentialImpulseConstraintSolver*) m_physicsEnvironmentPtr->GetConstraintSolver(); btSequentialImpulseConstraintSolver* solver = (btSequentialImpulseConstraintSolver*) m_physicsEnvironmentPtr->GetConstraintSolver();

View File

@@ -1,67 +0,0 @@
/*
Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#include "MyMotionState.h"
#include "LinearMath/btPoint3.h"
MyMotionState::MyMotionState()
{
m_worldTransform.setIdentity();
}
MyMotionState::~MyMotionState()
{
}
void MyMotionState::getWorldPosition(float& posX,float& posY,float& posZ)
{
posX = m_worldTransform.getOrigin().x();
posY = m_worldTransform.getOrigin().y();
posZ = m_worldTransform.getOrigin().z();
}
void MyMotionState::getWorldScaling(float& scaleX,float& scaleY,float& scaleZ)
{
scaleX = 1.;
scaleY = 1.;
scaleZ = 1.;
}
void MyMotionState::getWorldOrientation(float& quatIma0,float& quatIma1,float& quatIma2,float& quatReal)
{
quatIma0 = m_worldTransform.getRotation().x();
quatIma1 = m_worldTransform.getRotation().y();
quatIma2 = m_worldTransform.getRotation().z();
quatReal = m_worldTransform.getRotation()[3];
}
void MyMotionState::setWorldPosition(float posX,float posY,float posZ)
{
btPoint3 pos(posX,posY,posZ);
m_worldTransform.setOrigin( pos );
}
void MyMotionState::setWorldOrientation(float quatIma0,float quatIma1,float quatIma2,float quatReal)
{
btQuaternion orn(quatIma0,quatIma1,quatIma2,quatReal);
m_worldTransform.setRotation( orn );
}
void MyMotionState::calculateWorldTransformations()
{
}

View File

@@ -1,44 +0,0 @@
/*
Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#ifndef MY_MOTIONSTATE_H
#define MY_MOTIONSTATE_H
#include "PHY_IMotionState.h"
#include <LinearMath/btTransform.h>
class MyMotionState : public PHY_IMotionState
{
public:
MyMotionState();
virtual ~MyMotionState();
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 calculateWorldTransformations();
btTransform m_worldTransform;
};
#endif //MY_MOTIONSTATE_H

View File

@@ -14,7 +14,7 @@ subject to the following restrictions:
*/ */
#include "ColladaConverter.h" #include "ColladaConverter.h"
#include "btBulletDynamicsCommon.h"
#include "dae.h" #include "dae.h"
#include "dom/domCOLLADA.h" #include "dom/domCOLLADA.h"
@@ -27,10 +27,9 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btTriangleMesh.h" #include "BulletCollision/CollisionShapes/btTriangleMesh.h"
#include "BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h" #include "BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h"
#include "BulletCollision/CollisionShapes/btTriangleMeshShape.h" #include "BulletCollision/CollisionShapes/btTriangleMeshShape.h"
#include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h" //#include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h"
#include "BulletCollision/CollisionShapes/btCompoundShape.h" #include "BulletCollision/CollisionShapes/btCompoundShape.h"
#include "CcdPhysicsController.h"
char* getLastFileName(); char* getLastFileName();
@@ -537,18 +536,18 @@ void ColladaConverter::prepareConstraints(ConstraintInput& input)
daeString orgUri0 = attachRefBody->getRigid_body().getOriginalURI(); daeString orgUri0 = attachRefBody->getRigid_body().getOriginalURI();
daeString orgUri1 = attachBody1->getRigid_body().getOriginalURI(); daeString orgUri1 = attachBody1->getRigid_body().getOriginalURI();
CcdPhysicsController* ctrl0=0,*ctrl1=0; btRigidBody* body0=0,*body1=0;
for (int i=0;i<m_numObjects;i++) for (int i=0;i<m_numObjects;i++)
{ {
char* bodyName = (char*)m_physObjects[i]->getNewClientInfo(); char* bodyName = (char*)m_rigidBodies[i]->m_userObjectPointer;
if (!strcmp(bodyName,orgUri0)) if (!strcmp(bodyName,orgUri0))
{ {
ctrl0=m_physObjects[i]; body0=m_rigidBodies[i];
} }
if (!strcmp(bodyName,orgUri1)) if (!strcmp(bodyName,orgUri1))
{ {
ctrl1=m_physObjects[i]; body1=m_rigidBodies[i];
} }
} }
@@ -572,7 +571,6 @@ void ColladaConverter::prepareConstraints(ConstraintInput& input)
btVector3 angularMax(coneMaxLimit.get(0),coneMaxLimit.get(1),coneMaxLimit.get(2)); btVector3 angularMax(coneMaxLimit.get(0),coneMaxLimit.get(1),coneMaxLimit.get(2));
{ {
int constraintId;
btTransform attachFrameRef0; btTransform attachFrameRef0;
attachFrameRef0 = attachFrameRef0 =
@@ -635,11 +633,11 @@ void ColladaConverter::prepareConstraints(ConstraintInput& input)
} }
if (ctrl0 && ctrl1) if (body0&& body1)
{ {
constraintId = createUniversalD6Constraint( createUniversalD6Constraint(
ctrl0, body0,
ctrl1, body1,
attachFrameRef0, attachFrameRef0,
attachFrameOther, attachFrameOther,
linearLowerLimits, linearLowerLimits,
@@ -699,12 +697,12 @@ void ColladaConverter::PreparePhysicsObject(struct btRigidBodyInput& input, bool
CcdPhysicsController* ctrl = createPhysicsObject(isDynamics,mass,startTransform,colShape); btRigidBody* body= createRigidBody(isDynamics,mass,startTransform,colShape);
if (ctrl) if (body)
{ {
//for bodyName lookup in constraints //for bodyName lookup in constraints
ctrl->setNewClientInfo((void*)input.m_bodyName); body->m_userObjectPointer = (void*)input.m_bodyName;
m_physObjects[m_numObjects] = ctrl; m_rigidBodies[m_numObjects] = body;
m_numObjects++; m_numObjects++;
} }
@@ -733,12 +731,8 @@ bool ColladaConverter::saveAs(const char* filename)
{ {
float np[3]; btVector3 np = m_rigidBodies[i]->m_worldTransform.getOrigin();
domFloat3 newPos = m_colladadomNodes[i]->getTranslate_array().get(0)->getValue(); domFloat3 newPos = m_colladadomNodes[i]->getTranslate_array().get(0)->getValue();
m_physObjects[i]->GetMotionState()->getWorldPosition(
np[0],
np[1],
np[2]);
newPos.set(0,np[0]); newPos.set(0,np[0]);
newPos.set(1,np[1]); newPos.set(1,np[1]);
newPos.set(2,np[2]); newPos.set(2,np[2]);
@@ -764,7 +758,7 @@ bool ColladaConverter::saveAs(const char* filename)
} }
{ {
btQuaternion quat = m_physObjects[i]->getRigidBody()->getCenterOfMassTransform().getRotation(); btQuaternion quat = m_rigidBodies[i]->getCenterOfMassTransform().getRotation();
btVector3 axis(quat.getX(),quat.getY(),quat.getZ()); btVector3 axis(quat.getX(),quat.getY(),quat.getZ());
axis[3] = 0.f; axis[3] = 0.f;
//check for axis length //check for axis length
@@ -1059,7 +1053,11 @@ void ColladaConverter::ConvertRigidBodyRef( btRigidBodyInput& rbInput,btRigidBod
} else } else
{ {
printf("static concave triangle <mesh> added\n"); printf("static concave triangle <mesh> added\n");
rbOutput.m_colShape = new btTriangleMeshShape(trimesh); //rbOutput.m_colShape = new btTriangleMeshShape(trimesh);//btBvhTriangleMeshShape(trimesh);
//rbOutput.m_colShape = new btBvhTriangleMeshShape(trimesh);
rbOutput.m_colShape = new btConvexTriangleMeshShape(trimesh);
//btTriangleMeshShape
} }
} }

View File

@@ -22,8 +22,9 @@ subject to the following restrictions:
#include "LinearMath/btVector3.h" #include "LinearMath/btVector3.h"
class btCollisionShape; class btCollisionShape;
class PHY_IPhysicsController; class btRigidBody;
class CcdPhysicsController; class btTypedConstraint;
class ConstraintInput; class ConstraintInput;
//use some reasonable number here //use some reasonable number here
@@ -42,7 +43,7 @@ protected:
const char* m_filename; const char* m_filename;
int m_numObjects; int m_numObjects;
CcdPhysicsController* m_physObjects[COLLADA_CONVERTER_MAX_NUM_OBJECTS]; btRigidBody* m_rigidBodies[COLLADA_CONVERTER_MAX_NUM_OBJECTS];
void PreparePhysicsObject(struct btRigidBodyInput& input, bool isDynamics, float mass,btCollisionShape* colShape); void PreparePhysicsObject(struct btRigidBodyInput& input, bool isDynamics, float mass,btCollisionShape* colShape);
@@ -66,8 +67,8 @@ public:
bool convert(); bool convert();
///those 2 virtuals are called for each constraint/physics object ///those 2 virtuals are called for each constraint/physics object
virtual int createUniversalD6Constraint( virtual btTypedConstraint* createUniversalD6Constraint(
class PHY_IPhysicsController* ctrlRef,class PHY_IPhysicsController* ctrlOther, class btRigidBody* body0,class btRigidBody* otherBody,
btTransform& localAttachmentFrameRef, btTransform& localAttachmentFrameRef,
btTransform& localAttachmentOther, btTransform& localAttachmentOther,
const btVector3& linearMinLimits, const btVector3& linearMinLimits,
@@ -76,7 +77,7 @@ public:
const btVector3& angularMaxLimits const btVector3& angularMaxLimits
) = 0; ) = 0;
virtual CcdPhysicsController* createPhysicsObject(bool isDynamic, virtual btRigidBody* createRigidBody(bool isDynamic,
float mass, float mass,
const btTransform& startTransform, const btTransform& startTransform,
btCollisionShape* shape) = 0; btCollisionShape* shape) = 0;

View File

@@ -13,8 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
#include "CcdPhysicsEnvironment.h"
#include "CcdPhysicsController.h"
#include "btBulletDynamicsCommon.h" #include "btBulletDynamicsCommon.h"
#include "LinearMath/btQuickprof.h" #include "LinearMath/btQuickprof.h"
#include "LinearMath/btIDebugDraw.h" #include "LinearMath/btIDebugDraw.h"
@@ -26,7 +24,7 @@ subject to the following restrictions:
//COLLADA_DOM should compile under all platforms, and is enabled by default. //COLLADA_DOM should compile under all platforms, and is enabled by default.
#include "ColladaConverter.h" #include "ColladaConverter.h"
#include "PHY_Pro.h"
#include "BMF_Api.h" #include "BMF_Api.h"
#include <stdio.h> //printf debugging #include <stdio.h> //printf debugging
@@ -35,6 +33,7 @@ float deltaTime = 1.f/60.f;
#include "ColladaDemo.h" #include "ColladaDemo.h"
#include "GL_ShapeDrawer.h" #include "GL_ShapeDrawer.h"
#include "GlutStuff.h" #include "GlutStuff.h"
int maxObj = 1;
///custom version of the converter, that creates physics objects/constraints ///custom version of the converter, that creates physics objects/constraints
class MyColladaConverter : public ColladaConverter class MyColladaConverter : public ColladaConverter
@@ -48,8 +47,8 @@ class MyColladaConverter : public ColladaConverter
} }
///those 2 virtuals are called for each constraint/physics object ///those 2 virtuals are called for each constraint/physics object
virtual int createUniversalD6Constraint( virtual btTypedConstraint* createUniversalD6Constraint(
class PHY_IPhysicsController* ctrlRef,class PHY_IPhysicsController* ctrlOther, class btRigidBody* bodyRef,class btRigidBody* bodyOther,
btTransform& localAttachmentFrameRef, btTransform& localAttachmentFrameRef,
btTransform& localAttachmentOther, btTransform& localAttachmentOther,
const btVector3& linearMinLimits, const btVector3& linearMinLimits,
@@ -58,30 +57,49 @@ class MyColladaConverter : public ColladaConverter
const btVector3& angularMaxLimits const btVector3& angularMaxLimits
) )
{ {
return m_demoApp->getPhysicsEnvironment()->createUniversalD6Constraint( if (bodyRef && bodyOther)
ctrlRef,ctrlOther, {
localAttachmentFrameRef, btGeneric6DofConstraint* genericConstraint = new btGeneric6DofConstraint(
localAttachmentOther, *bodyRef,*bodyOther,
linearMinLimits, localAttachmentFrameRef,localAttachmentOther);
linearMaxLimits,
angularMinLimits, genericConstraint->setLinearLowerLimit(linearMinLimits);
angularMaxLimits genericConstraint->setLinearUpperLimit(linearMaxLimits);
); genericConstraint->setAngularLowerLimit(angularMinLimits);
genericConstraint->setAngularUpperLimit(angularMaxLimits);
m_demoApp->getDynamicsWorld()->addConstraint( genericConstraint );
return genericConstraint;
}
return 0;
} }
virtual CcdPhysicsController* createPhysicsObject(bool isDynamic, virtual btRigidBody* createRigidBody(bool isDynamic,
float mass, float mass,
const btTransform& startTransform, const btTransform& startTransform,
btCollisionShape* shape) btCollisionShape* shape)
{ {
CcdPhysicsController* ctrl = m_demoApp->localCreatePhysicsObject(isDynamic, mass, startTransform,shape); if (!isDynamic)
return ctrl; {
printf("nondyna\n");
} else
{
if (!maxObj)
return 0;
maxObj--;
}
btRigidBody* body = m_demoApp->localCreateRigidBody(isDynamic, mass, startTransform,shape);
m_demoApp->getDynamicsWorld()->addCollisionObject(body);
return body;
} }
virtual void setGravity(const btVector3& grav) virtual void setGravity(const btVector3& grav)
{ {
m_demoApp->getPhysicsEnvironment()->setGravity(grav.getX(),grav.getY(),grav.getZ()); m_demoApp->setGravity(grav);
} }
virtual void setCameraInfo(const btVector3& camUp,int forwardAxis) virtual void setCameraInfo(const btVector3& camUp,int forwardAxis)
{ {
@@ -141,16 +159,11 @@ void ColladaDemo::initPhysics(const char* filename)
m_cameraUp = btVector3(0,0,1); m_cameraUp = btVector3(0,0,1);
m_forwardAxis = 1; m_forwardAxis = 1;
///Setup a Physics Simulation Environment m_dynamicsWorld = new btDiscreteDynamicsWorld();
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(); //m_dynamicsWorld = new btSimpleDynamicsWorld();
btVector3 worldAabbMin(-10000,-10000,-10000);
btVector3 worldAabbMax(10000,10000,10000); m_dynamicsWorld->setDebugDrawer(&debugDrawer);
btOverlappingPairCache* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax);
//BroadphaseInterface* broadphase = new btSimpleBroadphase();
m_physicsEnvironmentPtr = new CcdPhysicsEnvironment(dispatcher,broadphase);
m_physicsEnvironmentPtr->setDeactivationTime(2.f);
m_physicsEnvironmentPtr->setGravity(0,0,-10);
m_physicsEnvironmentPtr->setDebugDrawer(&debugDrawer);
MyColladaConverter* converter = new MyColladaConverter(this); MyColladaConverter* converter = new MyColladaConverter(this);
@@ -174,7 +187,7 @@ void ColladaDemo::clientMoveAndDisplay()
{ {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
m_physicsEnvironmentPtr->proceedDeltaTime(0.f,deltaTime); m_dynamicsWorld->stepSimulation(deltaTime);
renderme(); renderme();
@@ -190,7 +203,7 @@ void ColladaDemo::displayCallback(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
m_physicsEnvironmentPtr->UpdateAabbs(deltaTime); m_dynamicsWorld->updateAabbs();
renderme(); renderme();

View File

@@ -13,13 +13,9 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
#include "CcdPhysicsEnvironment.h"
#include "CcdPhysicsController.h"
#include "MyMotionState.h"
#include "btBulletDynamicsCommon.h" #include "btBulletDynamicsCommon.h"
#include "LinearMath/btIDebugDraw.h" #include "LinearMath/btIDebugDraw.h"
#include "GLDebugDrawer.h" #include "GLDebugDrawer.h"
#include "PHY_Pro.h"
#include "ConcaveDemo.h" #include "ConcaveDemo.h"
#include "GL_ShapeDrawer.h" #include "GL_ShapeDrawer.h"
#include "GlutStuff.h" #include "GlutStuff.h"
@@ -159,30 +155,31 @@ void ConcaveDemo::initPhysics()
btOverlappingPairCache* broadphase = new btSimpleBroadphase(); btOverlappingPairCache* broadphase = new btSimpleBroadphase();
m_dynamicsWorld = new btDiscreteDynamicsWorld();
m_physicsEnvironmentPtr = new CcdPhysicsEnvironment(dispatcher,broadphase); bool isDynamic = false;
bool isDynamic = false;
float mass = 0.f; float mass = 0.f;
btTransform startTransform; btTransform startTransform;
startTransform.setIdentity(); startTransform.setIdentity();
startTransform.setOrigin(btVector3(0,-2,0)); startTransform.setOrigin(btVector3(0,0,0));
CcdPhysicsController* staticTrimesh = localCreatePhysicsObject(isDynamic, mass, startTransform,trimeshShape); btRigidBody* staticBody = localCreateRigidBody(isDynamic, mass, startTransform,trimeshShape);
staticBody->m_collisionFlags |=btCollisionObject::isStatic;
getDynamicsWorld()->addCollisionObject(staticBody);
//enable custom material callback //enable custom material callback
staticTrimesh->getRigidBody()->m_collisionFlags |= btCollisionObject::customMaterialCallback; staticBody->m_collisionFlags |= btCollisionObject::customMaterialCallback;
{ {
for (int i=0;i<10;i++) for (int i=0;i<10;i++)
{ {
btCollisionShape* boxShape = new btBoxShape(btVector3(1,1,1)); btCollisionShape* boxShape = new btBoxShape(btVector3(1,1,1));
startTransform.setOrigin(btVector3(2*i,1,1)); startTransform.setOrigin(btVector3(2*i,1,1));
localCreatePhysicsObject(true, 1, startTransform,boxShape); getDynamicsWorld()->addCollisionObject(localCreateRigidBody(true, 1, startTransform,boxShape));
} }
} }
m_physicsEnvironmentPtr->setGravity(-1,-10,1);
m_physicsEnvironmentPtr->setDebugDrawer(&debugDrawer);
} }
void ConcaveDemo::clientMoveAndDisplay() void ConcaveDemo::clientMoveAndDisplay()
@@ -191,7 +188,7 @@ void ConcaveDemo::clientMoveAndDisplay()
float deltaTime = 1.f/60.f; float deltaTime = 1.f/60.f;
m_physicsEnvironmentPtr->proceedDeltaTime(0.f,deltaTime); m_dynamicsWorld->stepSimulation(deltaTime);
renderme(); renderme();
@@ -202,7 +199,7 @@ void ConcaveDemo::clientMoveAndDisplay()
void ConcaveDemo::clientResetScene() void ConcaveDemo::clientResetScene()
{ {
int numObj = m_physicsEnvironmentPtr->GetNumControllers(); /*int numObj = m_physicsEnvironmentPtr->GetNumControllers();
//skip ground //skip ground
for (int i=1;i<numObj;i++) for (int i=1;i<numObj;i++)
@@ -213,6 +210,8 @@ void ConcaveDemo::clientResetScene()
ctrl->SetLinearVelocity(0,0,0,0); ctrl->SetLinearVelocity(0,0,0,0);
ctrl->SetAngularVelocity(0,0,0,0); ctrl->SetAngularVelocity(0,0,0,0);
} }
*/
} }

View File

@@ -1,67 +0,0 @@
/*
Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#include "MyMotionState.h"
#include "LinearMath/btPoint3.h"
MyMotionState::MyMotionState()
{
m_worldTransform.setIdentity();
}
MyMotionState::~MyMotionState()
{
}
void MyMotionState::getWorldPosition(float& posX,float& posY,float& posZ)
{
posX = m_worldTransform.getOrigin().x();
posY = m_worldTransform.getOrigin().y();
posZ = m_worldTransform.getOrigin().z();
}
void MyMotionState::getWorldScaling(float& scaleX,float& scaleY,float& scaleZ)
{
scaleX = 1.;
scaleY = 1.;
scaleZ = 1.;
}
void MyMotionState::getWorldOrientation(float& quatIma0,float& quatIma1,float& quatIma2,float& quatReal)
{
quatIma0 = m_worldTransform.getRotation().x();
quatIma1 = m_worldTransform.getRotation().y();
quatIma2 = m_worldTransform.getRotation().z();
quatReal = m_worldTransform.getRotation()[3];
}
void MyMotionState::setWorldPosition(float posX,float posY,float posZ)
{
btPoint3 pos(posX,posY,posZ);
m_worldTransform.setOrigin( pos );
}
void MyMotionState::setWorldOrientation(float quatIma0,float quatIma1,float quatIma2,float quatReal)
{
btQuaternion orn(quatIma0,quatIma1,quatIma2,quatReal);
m_worldTransform.setRotation( orn );
}
void MyMotionState::calculateWorldTransformations()
{
}

View File

@@ -1,44 +0,0 @@
/*
Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#ifndef MY_MOTIONSTATE_H
#define MY_MOTIONSTATE_H
#include "PHY_IMotionState.h"
#include <LinearMath/btTransform.h>
class MyMotionState : public PHY_IMotionState
{
public:
MyMotionState();
virtual ~MyMotionState();
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 calculateWorldTransformations();
btTransform m_worldTransform;
};
#endif //MY_MOTIONSTATE_H

View File

@@ -13,15 +13,12 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
#include "CcdPhysicsEnvironment.h"
#include "CcdPhysicsController.h"
#include "MyMotionState.h"
#include "btBulletDynamicsCommon.h" #include "btBulletDynamicsCommon.h"
#include "LinearMath/btIDebugDraw.h" #include "LinearMath/btIDebugDraw.h"
#include "GLDebugDrawer.h" #include "GLDebugDrawer.h"
#include "PHY_Pro.h"
#include "BMF_Api.h" #include "BMF_Api.h"
#include <stdio.h> //printf debugging #include <stdio.h> //printf debugging
@@ -61,10 +58,7 @@ void ConstraintDemo::initPhysics()
btOverlappingPairCache* broadphase = new btSimpleBroadphase(); btOverlappingPairCache* broadphase = new btSimpleBroadphase();
m_physicsEnvironmentPtr = new CcdPhysicsEnvironment(dispatcher,broadphase); m_dynamicsWorld = new btDiscreteDynamicsWorld();
m_physicsEnvironmentPtr->setDeactivationTime(0.f);
m_physicsEnvironmentPtr->setGravity(0,-10,0);
btCollisionShape* shape = new btBoxShape(btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS)); btCollisionShape* shape = new btBoxShape(btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS));
btTransform trans; btTransform trans;
@@ -74,10 +68,12 @@ void ConstraintDemo::initPhysics()
bool isDynamic = false; bool isDynamic = false;
float mass = 1.f; float mass = 1.f;
CcdPhysicsController* ctrl0 = localCreatePhysicsObject( isDynamic,mass,trans,shape); btRigidBody* body0 = localCreateRigidBody( isDynamic,mass,trans,shape);
getDynamicsWorld()->addCollisionObject(body0);
trans.setOrigin(btVector3(2*CUBE_HALF_EXTENTS,20,0)); trans.setOrigin(btVector3(2*CUBE_HALF_EXTENTS,20,0));
isDynamic = true; isDynamic = true;
CcdPhysicsController* ctrl1 = localCreatePhysicsObject( isDynamic,mass,trans,shape); btRigidBody* body1 = localCreateRigidBody( isDynamic,mass,trans,shape);
getDynamicsWorld()->addCollisionObject(body1);
clientResetScene(); clientResetScene();
@@ -85,21 +81,17 @@ void ConstraintDemo::initPhysics()
{ {
int constraintId; int constraintId;
float pivotX=CUBE_HALF_EXTENTS, btVector3 pivotInA(CUBE_HALF_EXTENTS,-CUBE_HALF_EXTENTS,-CUBE_HALF_EXTENTS);
pivotY=-CUBE_HALF_EXTENTS, btVector3 axisInA(0,0,1);
pivotZ=-CUBE_HALF_EXTENTS;
float axisX=0,axisY=0,axisZ=1;
btVector3 pivotInB = body1 ? body1->getCenterOfMassTransform().inverse()(body0->getCenterOfMassTransform()(pivotInA)) : pivotInA;
btVector3 axisInB = body1?
(body1->getCenterOfMassTransform().getBasis().inverse()*(body1->getCenterOfMassTransform().getBasis() * axisInA)) :
body0->getCenterOfMassTransform().getBasis() * axisInA;
constraintId =m_physicsEnvironmentPtr->createConstraint( btTypedConstraint* p2p = new btPoint2PointConstraint(*body0,*body1,pivotInA,pivotInB);
ctrl0,
ctrl1, m_dynamicsWorld->addConstraint(p2p);
PHY_POINT2POINT_CONSTRAINT,
//PHY_GENERIC_6DOF_CONSTRAINT,//can leave any of the 6 degree of freedom 'free' or 'locked'
//PHY_LINEHINGE_CONSTRAINT,
pivotX,pivotY,pivotZ,
axisX,axisY,axisZ
);
} }
} }
@@ -112,8 +104,7 @@ void ConstraintDemo::clientMoveAndDisplay()
float deltaTime = 1.f/60.f; float deltaTime = 1.f/60.f;
m_physicsEnvironmentPtr->proceedDeltaTime(0.f,deltaTime); m_dynamicsWorld->stepSimulation(deltaTime);
renderme(); renderme();
glFlush(); glFlush();

View File

@@ -1,67 +0,0 @@
/*
Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#include "MyMotionState.h"
#include "LinearMath/btPoint3.h"
MyMotionState::MyMotionState()
{
m_worldTransform.setIdentity();
}
MyMotionState::~MyMotionState()
{
}
void MyMotionState::getWorldPosition(float& posX,float& posY,float& posZ)
{
posX = m_worldTransform.getOrigin().x();
posY = m_worldTransform.getOrigin().y();
posZ = m_worldTransform.getOrigin().z();
}
void MyMotionState::getWorldScaling(float& scaleX,float& scaleY,float& scaleZ)
{
scaleX = 1.;
scaleY = 1.;
scaleZ = 1.;
}
void MyMotionState::getWorldOrientation(float& quatIma0,float& quatIma1,float& quatIma2,float& quatReal)
{
quatIma0 = m_worldTransform.getRotation().x();
quatIma1 = m_worldTransform.getRotation().y();
quatIma2 = m_worldTransform.getRotation().z();
quatReal = m_worldTransform.getRotation()[3];
}
void MyMotionState::setWorldPosition(float posX,float posY,float posZ)
{
btPoint3 pos(posX,posY,posZ);
m_worldTransform.setOrigin( pos );
}
void MyMotionState::setWorldOrientation(float quatIma0,float quatIma1,float quatIma2,float quatReal)
{
btQuaternion orn(quatIma0,quatIma1,quatIma2,quatReal);
m_worldTransform.setRotation( orn );
}
void MyMotionState::calculateWorldTransformations()
{
}

View File

@@ -1,44 +0,0 @@
/*
Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#ifndef MY_MOTIONSTATE_H
#define MY_MOTIONSTATE_H
#include "PHY_IMotionState.h"
#include <LinearMath/btTransform.h>
class MyMotionState : public PHY_IMotionState
{
public:
MyMotionState();
virtual ~MyMotionState();
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 calculateWorldTransformations();
btTransform m_worldTransform;
};
#endif //MY_MOTIONSTATE_H

View File

@@ -16,18 +16,12 @@ subject to the following restrictions:
#include "cd_wavefront.h" #include "cd_wavefront.h"
#include "ConvexBuilder.h" #include "ConvexBuilder.h"
#include "CcdPhysicsEnvironment.h"
#include "CcdPhysicsController.h"
#include "btBulletDynamicsCommon.h" #include "btBulletDynamicsCommon.h"
#include "LinearMath/btQuickprof.h" #include "LinearMath/btQuickprof.h"
#include "LinearMath/btIDebugDraw.h" #include "LinearMath/btIDebugDraw.h"
#include "GLDebugDrawer.h" #include "GLDebugDrawer.h"
#include "PHY_Pro.h"
#include "BMF_Api.h" #include "BMF_Api.h"
#include <stdio.h> //printf debugging #include <stdio.h> //printf debugging
@@ -90,16 +84,14 @@ void ConvexDecompositionDemo::initPhysics(const char* filename)
btOverlappingPairCache* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax); btOverlappingPairCache* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax);
//OverlappingPairCache* broadphase = new btSimpleBroadphase(); //OverlappingPairCache* broadphase = new btSimpleBroadphase();
m_physicsEnvironmentPtr = new CcdPhysicsEnvironment(dispatcher,broadphase); btConstraintSolver* solver = new btSequentialImpulseConstraintSolver();
m_physicsEnvironmentPtr->setDeactivationTime(2.f); m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver);
m_physicsEnvironmentPtr->setGravity(0,-10,0);
btTransform startTransform; btTransform startTransform;
startTransform.setIdentity(); startTransform.setIdentity();
startTransform.setOrigin(btVector3(0,-4,0)); startTransform.setOrigin(btVector3(0,-4,0));
localCreatePhysicsObject(false,0,startTransform,new btBoxShape(btVector3(30,2,30))); localCreateRigidBody(false,0,startTransform,new btBoxShape(btVector3(30,2,30)));
class MyConvexDecomposition : public ConvexDecomposition::ConvexDecompInterface class MyConvexDecomposition : public ConvexDecomposition::ConvexDecompInterface
{ {
@@ -200,8 +192,8 @@ void ConvexDecompositionDemo::initPhysics(const char* filename)
btTransform trans; btTransform trans;
trans.setIdentity(); trans.setIdentity();
trans.setOrigin(centroid); trans.setOrigin(centroid);
m_convexDemo->localCreatePhysicsObject(isDynamic, mass, trans,convexShape); btRigidBody* body = m_convexDemo->localCreateRigidBody(isDynamic, mass, trans,convexShape);
m_convexDemo->getDynamicsWorld()->addCollisionObject(body);
mBaseCount+=result.mHullVcount; // advance the 'base index' counter. mBaseCount+=result.mHullVcount; // advance the 'base index' counter.
@@ -245,7 +237,7 @@ void ConvexDecompositionDemo::initPhysics(const char* filename)
startTransform.setIdentity(); startTransform.setIdentity();
startTransform.setOrigin(btVector3(20,2,0)); startTransform.setOrigin(btVector3(20,2,0));
localCreatePhysicsObject(isDynamic, mass, startTransform,convexShape); localCreateRigidBody(isDynamic, mass, startTransform,convexShape);
} }
@@ -296,7 +288,7 @@ void ConvexDecompositionDemo::initPhysics(const char* filename)
} }
m_physicsEnvironmentPtr->setDebugDrawer(&debugDrawer); m_dynamicsWorld->setDebugDrawer(&debugDrawer);
} }
@@ -305,8 +297,7 @@ void ConvexDecompositionDemo::clientMoveAndDisplay()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
m_dynamicsWorld->stepSimulation(deltaTime);
m_physicsEnvironmentPtr->proceedDeltaTime(0.f,deltaTime);
renderme(); renderme();
@@ -322,7 +313,7 @@ void ConvexDecompositionDemo::displayCallback(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
m_physicsEnvironmentPtr->UpdateAabbs(deltaTime); m_dynamicsWorld->updateAabbs();
renderme(); renderme();

View File

@@ -18,10 +18,7 @@ subject to the following restrictions:
#include "LinearMath/btIDebugDraw.h" #include "LinearMath/btIDebugDraw.h"
#include "BulletDynamics/Dynamics/btDynamicsWorld.h" #include "BulletDynamics/Dynamics/btDynamicsWorld.h"
#include "CcdPhysicsEnvironment.h"
#include "CcdPhysicsController.h"
#include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h"//picking #include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h"//picking
#include "PHY_Pro.h"
#include "BulletCollision/CollisionShapes/btCollisionShape.h" #include "BulletCollision/CollisionShapes/btCollisionShape.h"
#include "BulletCollision/CollisionShapes/btBoxShape.h" #include "BulletCollision/CollisionShapes/btBoxShape.h"
#include "GL_ShapeDrawer.h" #include "GL_ShapeDrawer.h"
@@ -31,8 +28,6 @@ subject to the following restrictions:
int numObjects = 0; int numObjects = 0;
const int maxNumObjects = 16384; const int maxNumObjects = 16384;
DefaultMotionState ms[maxNumObjects];
CcdPhysicsController* physObjects[maxNumObjects];
btTransform startTransforms[maxNumObjects]; btTransform startTransforms[maxNumObjects];
btCollisionShape* gShapePtr[maxNumObjects];//1 rigidbody has 1 shape (no re-use of shapes) btCollisionShape* gShapePtr[maxNumObjects];//1 rigidbody has 1 shape (no re-use of shapes)
@@ -40,9 +35,9 @@ btCollisionShape* gShapePtr[maxNumObjects];//1 rigidbody has 1 shape (no re-use
DemoApplication::DemoApplication() DemoApplication::DemoApplication()
//see btIDebugDraw.h for modes //see btIDebugDraw.h for modes
: :
m_physicsEnvironmentPtr(0),
m_dynamicsWorld(0), m_dynamicsWorld(0),
m_pickConstraint(0), m_pickConstraint(0),
m_gravity(0,-10,0),
m_cameraDistance(15.0), m_cameraDistance(15.0),
m_debugMode(0), m_debugMode(0),
m_ele(0.f), m_ele(0.f),
@@ -340,8 +335,7 @@ void DemoApplication::keyboardCallback(unsigned char key, int x, int y)
break; break;
} }
if (m_physicsEnvironmentPtr) getDynamicsWorld()->getDebugDrawer()->setDebugMode(m_debugMode);
m_physicsEnvironmentPtr->setDebugMode(m_debugMode);
glutPostRedisplay(); glutPostRedisplay();
@@ -411,27 +405,6 @@ void DemoApplication::shootBox(const btVector3& destination)
body->setAngularVelocity(btVector3(0,0,0)); body->setAngularVelocity(btVector3(0,0,0));
} }
if (m_physicsEnvironmentPtr)
{
bool isDynamic = true;
float mass = 1.f;
btTransform startTransform;
startTransform.setIdentity();
btVector3 camPos = getCameraPosition();
startTransform.setOrigin(camPos);
btCollisionShape* boxShape = new btBoxShape(btVector3(1.f,1.f,1.f));
CcdPhysicsController* newBox = localCreatePhysicsObject(isDynamic, mass, startTransform,boxShape);
btVector3 linVel(destination[0]-camPos[0],destination[1]-camPos[1],destination[2]-camPos[2]);
linVel.normalize();
linVel*=m_ShootBoxInitialSpeed;
newBox->setPosition(camPos[0],camPos[1],camPos[2]);
newBox->setOrientation(0,0,0,1);
newBox->SetLinearVelocity(linVel[0],linVel[1],linVel[2],false);
newBox->SetAngularVelocity(0,0,0,false);
}
} }
@@ -513,11 +486,9 @@ void DemoApplication::mouseFunc(int button, int state, int x, int y)
if (rayCallback.HasHit()) if (rayCallback.HasHit())
{ {
if (rayCallback.m_collisionObject->m_internalOwner) btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject);
if (body)
{ {
btRigidBody* body = (btRigidBody*)rayCallback.m_collisionObject->m_internalOwner;
if (body)
{
body->SetActivationState(ACTIVE_TAG); body->SetActivationState(ACTIVE_TAG);
btVector3 impulse = rayTo; btVector3 impulse = rayTo;
impulse.normalize(); impulse.normalize();
@@ -526,39 +497,10 @@ void DemoApplication::mouseFunc(int button, int state, int x, int y)
btVector3 relPos = rayCallback.m_hitPointWorld - body->getCenterOfMassPosition(); btVector3 relPos = rayCallback.m_hitPointWorld - body->getCenterOfMassPosition();
body->applyImpulse(impulse,relPos); body->applyImpulse(impulse,relPos);
} }
}
} }
} }
//apply an impulse
if (m_physicsEnvironmentPtr)
{
float hit[3];
float normal[3];
PHY_IPhysicsController* hitObj = m_physicsEnvironmentPtr->rayTest(0,m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2],rayTo.getX(),rayTo.getY(),rayTo.getZ(),hit[0],hit[1],hit[2],normal[0],normal[1],normal[2]);
if (hitObj)
{
CcdPhysicsController* physCtrl = static_cast<CcdPhysicsController*>(hitObj);
btRigidBody* body = physCtrl->getRigidBody();
if (body)
{
body->SetActivationState(ACTIVE_TAG);
btVector3 impulse = rayTo;
impulse.normalize();
float impulseStrength = 10.f;
impulse *= impulseStrength;
btVector3 relPos(
hit[0] - body->getCenterOfMassPosition().getX(),
hit[1] - body->getCenterOfMassPosition().getY(),
hit[2] - body->getCenterOfMassPosition().getZ());
body->applyImpulse(impulse,relPos);
}
}
}
} else } else
{ {
@@ -581,10 +523,11 @@ void DemoApplication::mouseFunc(int button, int state, int x, int y)
if (rayCallback.HasHit()) if (rayCallback.HasHit())
{ {
if (rayCallback.m_collisionObject->m_internalOwner)
btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject);
if (body)
{ {
btRigidBody* body = (btRigidBody*)rayCallback.m_collisionObject->m_internalOwner; if (!body->IsStatic())
if (body && !body->IsStatic())
{ {
pickedBody = body; pickedBody = body;
pickedBody->SetActivationState(DISABLE_DEACTIVATION); pickedBody->SetActivationState(DISABLE_DEACTIVATION);
@@ -612,51 +555,6 @@ void DemoApplication::mouseFunc(int button, int state, int x, int y)
} }
} }
//add a point to point constraint for picking
if (m_physicsEnvironmentPtr)
{
float hit[3];
float normal[3];
PHY_IPhysicsController* hitObj = m_physicsEnvironmentPtr->rayTest(0,m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2],rayTo.getX(),rayTo.getY(),rayTo.getZ(),hit[0],hit[1],hit[2],normal[0],normal[1],normal[2]);
if (hitObj)
{
CcdPhysicsController* physCtrl = static_cast<CcdPhysicsController*>(hitObj);
btRigidBody* body = physCtrl->getRigidBody();
if (body && !body->IsStatic())
{
pickedBody = body;
pickedBody->SetActivationState(DISABLE_DEACTIVATION);
btVector3 pickPos(hit[0],hit[1],hit[2]);
btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos;
gPickingConstraintId = m_physicsEnvironmentPtr->createConstraint(physCtrl,0,PHY_POINT2POINT_CONSTRAINT,
localPivot.getX(),
localPivot.getY(),
localPivot.getZ(),
0,0,0);
//printf("created constraint %i",gPickingConstraintId);
//save mouse position for dragging
gOldPickingPos = rayTo;
btVector3 eyePos(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2]);
gOldPickingDist = (pickPos-eyePos).length();
btPoint2PointConstraint* p2p = static_cast<btPoint2PointConstraint*>(m_physicsEnvironmentPtr->getConstraintById(gPickingConstraintId));
if (p2p)
{
//very weak constraint for picking
p2p->m_setting.m_tau = 0.1f;
}
}
}
}
} else } else
{ {
@@ -671,17 +569,7 @@ void DemoApplication::mouseFunc(int button, int state, int x, int y)
pickedBody = 0; pickedBody = 0;
} }
if (gPickingConstraintId && m_physicsEnvironmentPtr)
{
m_physicsEnvironmentPtr->removeConstraint(gPickingConstraintId);
//printf("removed constraint %i",gPickingConstraintId);
gPickingConstraintId = 0;
pickedBody->ForceActivationState(ACTIVE_TAG);
pickedBody->m_deactivationTime = 0.f;
pickedBody = 0;
}
} }
break; break;
@@ -717,27 +605,7 @@ void DemoApplication::mouseMotionFunc(int x,int y)
} }
if (gPickingConstraintId && m_physicsEnvironmentPtr)
{
//move the constraint pivot
btPoint2PointConstraint* p2p = static_cast<btPoint2PointConstraint*>(m_physicsEnvironmentPtr->getConstraintById(gPickingConstraintId));
if (p2p)
{
//keep it at the same picking distance
btVector3 newRayTo = getRayTo(x,y);
btVector3 eyePos(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2]);
btVector3 dir = newRayTo-eyePos;
dir.normalize();
dir *= gOldPickingDist;
btVector3 newPos = eyePos + dir;
p2p->setPivotB(newPos);
}
}
} }
@@ -753,82 +621,27 @@ btRigidBody* DemoApplication::localCreateRigidBody(bool isDynamic, float mass, c
btRigidBody* body = new btRigidBody(massProps); btRigidBody* body = new btRigidBody(massProps);
body->m_collisionShape = shape; body->m_collisionShape = shape;
body->m_worldTransform = startTransform; body->m_worldTransform = startTransform;
body->m_internalOwner = body;
body->setMassProps( mass, localInertia);
body->setGravity(btVector3(0,-9.8f,0));
if (!isDynamic) if (!isDynamic)
{ {
body->m_collisionFlags = btCollisionObject::isStatic;//?? body->m_collisionFlags = btCollisionObject::isStatic;//??
// body->getBroadphaseProxy()->m_collisionFilterGroup = 1;/btCcdConstructionInfo::StaticFilter;
// body->getBroadphaseProxy()->m_collisionFilterMask = btCcdConstructionInfo::AllFilter ^ btCcdConstructionInfo::StaticFilter;
body->setMassProps( 0.f, localInertia);
} else
{
body->setMassProps( mass, localInertia);
body->m_collisionFlags = 0;
} }
body->setGravity(m_gravity);
return body; return body;
} }
///Very basic import
CcdPhysicsController* DemoApplication::localCreatePhysicsObject(bool isDynamic, float mass, const btTransform& startTransform,btCollisionShape* shape)
{
startTransforms[numObjects] = startTransform;
btCcdConstructionInfo ccdObjectCi;
ccdObjectCi.m_friction = 0.5f;
btTransform tr;
tr.setIdentity();
int i = numObjects;
{
gShapePtr[i] = shape;
gShapePtr[i]->setMargin(0.05f);
btQuaternion orn = startTransform.getRotation();
ms[i].setWorldOrientation(orn[0],orn[1],orn[2],orn[3]);
ms[i].setWorldPosition(startTransform.getOrigin().getX(),startTransform.getOrigin().getY(),startTransform.getOrigin().getZ());
ccdObjectCi.m_MotionState = &ms[i];
ccdObjectCi.m_gravity = btVector3(0,-9.8,0);
ccdObjectCi.m_localInertiaTensor =btVector3(0,0,0);
if (!isDynamic)
{
ccdObjectCi.m_mass = 0.f;
ccdObjectCi.m_collisionFlags = btCollisionObject::isStatic;
ccdObjectCi.m_collisionFilterGroup = btCcdConstructionInfo::StaticFilter;
ccdObjectCi.m_collisionFilterMask = btCcdConstructionInfo::AllFilter ^ btCcdConstructionInfo::StaticFilter;
}
else
{
ccdObjectCi.m_mass = mass;
ccdObjectCi.m_collisionFlags = 0;
}
btVector3 localInertia(0.f,0.f,0.f);
if (isDynamic)
{
gShapePtr[i]->calculateLocalInertia(ccdObjectCi.m_mass,localInertia);
}
ccdObjectCi.m_localInertiaTensor = localInertia;
ccdObjectCi.m_collisionShape = gShapePtr[i];
physObjects[i]= new CcdPhysicsController( ccdObjectCi);
// Only do CCD if motion in one timestep (1.f/60.f) exceeds CUBE_HALF_EXTENTS
physObjects[i]->getRigidBody()->m_ccdSquareMotionTreshold = 0.f;
//Experimental: better estimation of CCD Time of Impact:
//physObjects[i]->getRigidBody()->m_ccdSweptShereRadius = 0.5*CUBE_HALF_EXTENTS;
m_physicsEnvironmentPtr->addCcdPhysicsController( physObjects[i]);
}
//return newly created PhysicsController
return physObjects[numObjects++];
}
void DemoApplication::renderme() void DemoApplication::renderme()
{ {
@@ -950,192 +763,4 @@ void DemoApplication::renderme()
} }
if (m_physicsEnvironmentPtr)
{
if (getDebugMode() & btIDebugDraw::DBG_DisableBulletLCP)
{
//don't use Bullet, use quickstep
m_physicsEnvironmentPtr->setSolverType(0);
} else
{
//Bullet LCP solver
m_physicsEnvironmentPtr->setSolverType(1);
}
if (getDebugMode() & btIDebugDraw::DBG_EnableCCD)
{
m_physicsEnvironmentPtr->setCcdMode(3);
} else
{
m_physicsEnvironmentPtr->setCcdMode(0);
}
bool isSatEnabled = (getDebugMode() & btIDebugDraw::DBG_EnableSatComparison);
m_physicsEnvironmentPtr->EnableSatCollisionDetection(isSatEnabled);
int numPhysicsObjects = m_physicsEnvironmentPtr->GetNumControllers();
int i;
for (i=0;i<numPhysicsObjects;i++)
{
CcdPhysicsController* ctrl = m_physicsEnvironmentPtr->GetPhysicsController(i);
btRigidBody* body = ctrl->getRigidBody();
body->m_worldTransform.getOpenGLMatrix( m );
btVector3 wireColor(1.f,1.0f,0.5f); //wants deactivation
if (i & 1)
{
wireColor = btVector3(0.f,0.0f,1.f);
}
///color differently for active, sleeping, wantsdeactivation states
if (ctrl->getRigidBody()->GetActivationState() == 1) //active
{
if (i & 1)
{
wireColor += btVector3 (1.f,0.f,0.f);
} else
{
wireColor += btVector3 (.5f,0.f,0.f);
}
}
if (ctrl->getRigidBody()->GetActivationState() == 2) //ISLAND_SLEEPING
{
if (i & 1)
{
wireColor += btVector3 (0.f,1.f, 0.f);
} else
{
wireColor += btVector3 (0.f,0.5f,0.f);
}
}
char extraDebug[125];
sprintf(extraDebug,"Island:%i, Body:%i",ctrl->getRigidBody()->m_islandTag1,ctrl->getRigidBody()->m_debugBodyId);
ctrl->getRigidBody()->getCollisionShape()->setExtraDebugInfo(extraDebug);
float vec[16];
btTransform ident;
ident.setIdentity();
ident.getOpenGLMatrix(vec);
GL_ShapeDrawer::drawOpenGL(m,ctrl->getRigidBody()->getCollisionShape(),wireColor,getDebugMode());
}
if (!(getDebugMode() & btIDebugDraw::DBG_NoHelpText))
{
float xOffset = 10.f;
float yStart = 20.f;
float yIncr = -2.f;
char buf[124];
glColor3f(0, 0, 0);
#ifdef USE_QUICKPROF
if ( getDebugMode() & btIDebugDraw::DBG_ProfileTimings)
{
static int counter = 0;
counter++;
std::map<std::string, hidden::ProfileBlock*>::iterator iter;
for (iter = btProfiler::mProfileBlocks.begin(); iter != btProfiler::mProfileBlocks.end(); ++iter)
{
char blockTime[128];
sprintf(blockTime, "%s: %lf",&((*iter).first[0]),btProfiler::getBlockTime((*iter).first, btProfiler::BLOCK_CYCLE_SECONDS));//BLOCK_TOTAL_PERCENT));
glRasterPos3f(xOffset,yStart,0);
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),blockTime);
yStart += yIncr;
}
}
#endif //USE_QUICKPROF
//profiling << btProfiler::createStatsString(btProfiler::BLOCK_TOTAL_PERCENT);
//<< std::endl;
glRasterPos3f(xOffset,yStart,0);
sprintf(buf,"mouse to interact");
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
yStart += yIncr;
glRasterPos3f(xOffset,yStart,0);
sprintf(buf,"space to reset");
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
yStart += yIncr;
glRasterPos3f(xOffset,yStart,0);
sprintf(buf,"cursor keys and z,x to navigate");
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
yStart += yIncr;
glRasterPos3f(xOffset,yStart,0);
sprintf(buf,"i to toggle simulation, s single step");
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
yStart += yIncr;
glRasterPos3f(xOffset,yStart,0);
sprintf(buf,"q to quit");
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
yStart += yIncr;
glRasterPos3f(xOffset,yStart,0);
sprintf(buf,"d to toggle deactivation");
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
yStart += yIncr;
glRasterPos3f(xOffset,yStart,0);
sprintf(buf,"a to draw temporal AABBs");
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
yStart += yIncr;
glRasterPos3f(xOffset,yStart,0);
sprintf(buf,"h to toggle help text");
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
yStart += yIncr;
bool useBulletLCP = !(getDebugMode() & btIDebugDraw::DBG_DisableBulletLCP);
bool useCCD = (getDebugMode() & btIDebugDraw::DBG_EnableCCD);
glRasterPos3f(xOffset,yStart,0);
sprintf(buf,"m Bullet GJK = %i",!isSatEnabled);
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
yStart += yIncr;
glRasterPos3f(xOffset,yStart,0);
sprintf(buf,"n Bullet LCP = %i",useBulletLCP);
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
yStart += yIncr;
glRasterPos3f(xOffset,yStart,0);
sprintf(buf,"1 CCD mode (adhoc) = %i",useCCD);
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
yStart += yIncr;
glRasterPos3f(xOffset,yStart,0);
sprintf(buf,"+- shooting speed = %10.2f",m_ShootBoxInitialSpeed);
BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf);
yStart += yIncr;
}
}
} }

View File

@@ -39,8 +39,6 @@ subject to the following restrictions:
#include "LinearMath/btMatrix3x3.h" #include "LinearMath/btMatrix3x3.h"
#include "LinearMath/btTransform.h" #include "LinearMath/btTransform.h"
class CcdPhysicsEnvironment;
class CcdPhysicsController;
class btCollisionShape; class btCollisionShape;
class btDynamicsWorld; class btDynamicsWorld;
class btRigidBody; class btRigidBody;
@@ -53,12 +51,13 @@ class DemoApplication
///this is the most important class ///this is the most important class
CcdPhysicsEnvironment* m_physicsEnvironmentPtr;
btDynamicsWorld* m_dynamicsWorld; btDynamicsWorld* m_dynamicsWorld;
///constraint for mouse picking
btTypedConstraint* m_pickConstraint; btTypedConstraint* m_pickConstraint;
btVector3 m_gravity;
float m_cameraDistance; float m_cameraDistance;
int m_debugMode; int m_debugMode;
@@ -82,12 +81,16 @@ class DemoApplication
bool m_idle; bool m_idle;
int m_lastKey; int m_lastKey;
public: public:
DemoApplication(); DemoApplication();
virtual ~DemoApplication(); virtual ~DemoApplication();
btDynamicsWorld* getDynamicsWorld()
{
return m_dynamicsWorld;
}
int getDebugMode() int getDebugMode()
{ {
@@ -99,10 +102,6 @@ class DemoApplication
m_debugMode = mode; m_debugMode = mode;
} }
CcdPhysicsEnvironment* getPhysicsEnvironment()
{
return m_physicsEnvironmentPtr;
}
void setCameraUp(const btVector3& camUp) void setCameraUp(const btVector3& camUp)
{ {
@@ -142,10 +141,12 @@ class DemoApplication
///Demo functions ///Demo functions
void shootBox(const btVector3& destination); void shootBox(const btVector3& destination);
void setGravity(const btVector3& grav)
{
m_gravity = grav;
}
btVector3 getRayTo(int x,int y); btVector3 getRayTo(int x,int y);
CcdPhysicsController* localCreatePhysicsObject(bool isDynamic, float mass, const btTransform& startTransform,btCollisionShape* shape);
btRigidBody* localCreateRigidBody(bool isDynamic, float mass, const btTransform& startTransform,btCollisionShape* shape); btRigidBody* localCreateRigidBody(bool isDynamic, float mass, const btTransform& startTransform,btCollisionShape* shape);
///callback methods by glut ///callback methods by glut

View File

@@ -226,7 +226,7 @@ void GL_ShapeDrawer::drawOpenGL(float* m, const btCollisionShape* shape, const b
gluCylinder(quadObj, radius, radius, 2.f*halfHeight, 15, 10); gluCylinder(quadObj, radius, radius, 2.f*halfHeight, 15, 10);
glPopMatrix(); glPopMatrix();
glEndList(); gluDeleteQuadric(quadObj);
break; break;
} }

View File

@@ -13,12 +13,9 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
#include "CcdPhysicsEnvironment.h"
#include "CcdPhysicsController.h"
#include "btBulletDynamicsCommon.h" #include "btBulletDynamicsCommon.h"
#include "LinearMath/btIDebugDraw.h" #include "LinearMath/btIDebugDraw.h"
#include "GLDebugDrawer.h" #include "GLDebugDrawer.h"
#include "PHY_Pro.h"
#include "UserCollisionAlgorithm.h" #include "UserCollisionAlgorithm.h"
#include "GL_ShapeDrawer.h" #include "GL_ShapeDrawer.h"
#include "GlutStuff.h" #include "GlutStuff.h"
@@ -129,7 +126,7 @@ void UserCollisionAlgorithm::initPhysics()
dispatcher->registerCollisionCreateFunc(SPHERE_SHAPE_PROXYTYPE,SPHERE_SHAPE_PROXYTYPE,new btSphereSphereCollisionAlgorithm::CreateFunc); dispatcher->registerCollisionCreateFunc(SPHERE_SHAPE_PROXYTYPE,SPHERE_SHAPE_PROXYTYPE,new btSphereSphereCollisionAlgorithm::CreateFunc);
m_physicsEnvironmentPtr = new CcdPhysicsEnvironment(dispatcher,broadphase); m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase);
bool isDynamic = false; bool isDynamic = false;
float mass = 0.f; float mass = 0.f;
@@ -137,21 +134,23 @@ void UserCollisionAlgorithm::initPhysics()
startTransform.setIdentity(); startTransform.setIdentity();
startTransform.setOrigin(btVector3(0,-2,0)); startTransform.setOrigin(btVector3(0,-2,0));
CcdPhysicsController* staticTrimesh = localCreatePhysicsObject(isDynamic, mass, startTransform,trimeshShape); btRigidBody* staticBody= localCreateRigidBody(isDynamic, mass, startTransform,trimeshShape);
getDynamicsWorld()->addCollisionObject(staticBody);
//enable custom material callback //enable custom material callback
staticTrimesh->getRigidBody()->m_collisionFlags |= btCollisionObject::customMaterialCallback; staticBody->m_collisionFlags |= btCollisionObject::customMaterialCallback;
{ {
for (int i=0;i<10;i++) for (int i=0;i<10;i++)
{ {
btCollisionShape* sphereShape = new btSphereShape(1); btCollisionShape* sphereShape = new btSphereShape(1);
startTransform.setOrigin(btVector3(1,2*i,1)); startTransform.setOrigin(btVector3(1,2*i,1));
localCreatePhysicsObject(true, 1, startTransform,sphereShape); btRigidBody* body = localCreateRigidBody(true, 1, startTransform,sphereShape);
getDynamicsWorld()->addCollisionObject(body);
} }
} }
m_physicsEnvironmentPtr->setGravity(-1,-10,1);
m_physicsEnvironmentPtr->setDebugDrawer(&debugDrawer);
m_dynamicsWorld->setDebugDrawer(&debugDrawer);
} }
void UserCollisionAlgorithm::clientMoveAndDisplay() void UserCollisionAlgorithm::clientMoveAndDisplay()
@@ -160,7 +159,7 @@ void UserCollisionAlgorithm::clientMoveAndDisplay()
float deltaTime = 1.f/60.f; float deltaTime = 1.f/60.f;
m_physicsEnvironmentPtr->proceedDeltaTime(0.f,deltaTime); m_dynamicsWorld->stepSimulation(deltaTime);
renderme(); renderme();
@@ -171,6 +170,7 @@ void UserCollisionAlgorithm::clientMoveAndDisplay()
void UserCollisionAlgorithm::clientResetScene() void UserCollisionAlgorithm::clientResetScene()
{ {
/*
int numObj = m_physicsEnvironmentPtr->GetNumControllers(); int numObj = m_physicsEnvironmentPtr->GetNumControllers();
//skip ground //skip ground
@@ -182,6 +182,8 @@ void UserCollisionAlgorithm::clientResetScene()
ctrl->SetLinearVelocity(0,0,0,0); ctrl->SetLinearVelocity(0,0,0,0);
ctrl->SetAngularVelocity(0,0,0,0); ctrl->SetAngularVelocity(0,0,0,0);
} }
*/
} }

View File

@@ -25,7 +25,6 @@ btCollisionObject::btCollisionObject()
m_ccdSweptShereRadius(0.f), m_ccdSweptShereRadius(0.f),
m_ccdSquareMotionTreshold(0.f) m_ccdSquareMotionTreshold(0.f)
{ {
m_cachedInvertedWorldTransform.setIdentity();
} }

View File

@@ -41,8 +41,6 @@ struct btCollisionObject
//it can be either previous or future (predicted) transform //it can be either previous or future (predicted) transform
btTransform m_interpolationWorldTransform; btTransform m_interpolationWorldTransform;
btTransform m_cachedInvertedWorldTransform;
enum CollisionFlags enum CollisionFlags
{ {
isStatic = 1, isStatic = 1,

View File

@@ -123,7 +123,6 @@ void btCollisionWorld::performDiscreteCollisionDetection()
btVector3 aabbMin,aabbMax; btVector3 aabbMin,aabbMax;
for (size_t i=0;i<m_collisionObjects.size();i++) for (size_t i=0;i<m_collisionObjects.size();i++)
{ {
m_collisionObjects[i]->m_cachedInvertedWorldTransform = m_collisionObjects[i]->m_worldTransform.inverse();
m_collisionObjects[i]->m_collisionShape->getAabb(m_collisionObjects[i]->m_worldTransform,aabbMin,aabbMax); m_collisionObjects[i]->m_collisionShape->getAabb(m_collisionObjects[i]->m_worldTransform,aabbMin,aabbMax);
m_broadphasePairCache->setAabb(m_collisionObjects[i]->m_broadphaseHandle,aabbMin,aabbMax); m_broadphasePairCache->setAabb(m_collisionObjects[i]->m_broadphaseHandle,aabbMin,aabbMax);
} }

View File

@@ -133,7 +133,7 @@ public:
struct LocalRayResult struct LocalRayResult
{ {
LocalRayResult(const btCollisionObject* collisionObject, LocalRayResult(btCollisionObject* collisionObject,
LocalShapeInfo* localShapeInfo, LocalShapeInfo* localShapeInfo,
const btVector3& hitNormalLocal, const btVector3& hitNormalLocal,
float hitFraction) float hitFraction)
@@ -144,7 +144,7 @@ public:
{ {
} }
const btCollisionObject* m_collisionObject; btCollisionObject* m_collisionObject;
LocalShapeInfo* m_localShapeInfo; LocalShapeInfo* m_localShapeInfo;
const btVector3& m_hitNormalLocal; const btVector3& m_hitNormalLocal;
float m_hitFraction; float m_hitFraction;
@@ -167,7 +167,7 @@ public:
:m_closestHitFraction(1.f) :m_closestHitFraction(1.f)
{ {
} }
virtual float AddSingleResult(const LocalRayResult& rayResult) = 0; virtual float AddSingleResult(LocalRayResult& rayResult) = 0;
}; };
struct ClosestRayResultCallback : public RayResultCallback struct ClosestRayResultCallback : public RayResultCallback
@@ -184,9 +184,9 @@ public:
btVector3 m_hitNormalWorld; btVector3 m_hitNormalWorld;
btVector3 m_hitPointWorld; btVector3 m_hitPointWorld;
const btCollisionObject* m_collisionObject; btCollisionObject* m_collisionObject;
virtual float AddSingleResult(const LocalRayResult& rayResult) virtual float AddSingleResult(LocalRayResult& rayResult)
{ {
//caller already does the filter on the m_closestHitFraction //caller already does the filter on the m_closestHitFraction

View File

@@ -217,8 +217,9 @@ float btConvexConcaveCollisionAlgorithm::calculateTimeOfImpact(btBroadphaseProxy
//btVector3 to = convexbody->m_interpolationWorldTransform.getOrigin(); //btVector3 to = convexbody->m_interpolationWorldTransform.getOrigin();
//todo: only do if the motion exceeds the 'radius' //todo: only do if the motion exceeds the 'radius'
btTransform convexFromLocal = triBody->m_cachedInvertedWorldTransform * convexbody->m_worldTransform; btTransform worldToLocalTrimesh = triBody->m_worldTransform.inverse();
btTransform convexToLocal = triBody->m_cachedInvertedWorldTransform * convexbody->m_interpolationWorldTransform; btTransform convexFromLocal = worldToLocalTrimesh * convexbody->m_worldTransform;
btTransform convexToLocal = worldToLocalTrimesh * convexbody->m_interpolationWorldTransform;
struct LocalTriangleSphereCastCallback : public btTriangleCallback struct LocalTriangleSphereCastCallback : public btTriangleCallback
{ {

View File

@@ -57,8 +57,8 @@ void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld,const b
return; return;
btTransform transAInv = m_body0->m_cachedInvertedWorldTransform; btTransform transAInv = m_body0->m_worldTransform.inverse();
btTransform transBInv= m_body1->m_cachedInvertedWorldTransform; btTransform transBInv= m_body1->m_worldTransform.inverse();
//transAInv = m_body0->m_worldTransform.inverse(); //transAInv = m_body0->m_worldTransform.inverse();
//transBInv= m_body1->m_worldTransform.inverse(); //transBInv= m_body1->m_worldTransform.inverse();

View File

@@ -148,14 +148,12 @@ btVector3 btConvexTriangleMeshShape::localGetSupportingVertex(const btVector3& v
int btConvexTriangleMeshShape::getNumVertices() const int btConvexTriangleMeshShape::getNumVertices() const
{ {
//cache this? //cache this?
assert(0);
return 0; return 0;
} }
int btConvexTriangleMeshShape::getNumEdges() const int btConvexTriangleMeshShape::getNumEdges() const
{ {
assert(0);
return 0; return 0;
} }

View File

@@ -13,6 +13,9 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef BT_TRIANGLE_INDEX_VERTEX_ARRAY_H
#define BT_TRIANGLE_INDEX_VERTEX_ARRAY_H
#include "btStridingMeshInterface.h" #include "btStridingMeshInterface.h"
#include <vector> #include <vector>
@@ -76,3 +79,4 @@ public:
}; };
#endif //BT_TRIANGLE_INDEX_VERTEX_ARRAY_H

View File

@@ -16,6 +16,7 @@ subject to the following restrictions:
#include "btDiscreteDynamicsWorld.h" #include "btDiscreteDynamicsWorld.h"
//collision detection //collision detection
#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" #include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" #include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h"
@@ -32,12 +33,14 @@ subject to the following restrictions:
#include "BulletDynamics/Vehicle/btRaycastVehicle.h" #include "BulletDynamics/Vehicle/btRaycastVehicle.h"
#include "BulletDynamics/Vehicle/btVehicleRaycaster.h" #include "BulletDynamics/Vehicle/btVehicleRaycaster.h"
#include "BulletDynamics/Vehicle/btWheelInfo.h" #include "BulletDynamics/Vehicle/btWheelInfo.h"
#include "LinearMath/btIDebugDraw.h"
#include <algorithm> #include <algorithm>
btDiscreteDynamicsWorld::btDiscreteDynamicsWorld() btDiscreteDynamicsWorld::btDiscreteDynamicsWorld()
:btDynamicsWorld(), :btDynamicsWorld(),
m_constraintSolver(new btSequentialImpulseConstraintSolver) m_constraintSolver(new btSequentialImpulseConstraintSolver),
m_debugDrawer(0)
{ {
m_islandManager = new btSimulationIslandManager(); m_islandManager = new btSimulationIslandManager();
m_ownsIslandManager = true; m_ownsIslandManager = true;
@@ -47,11 +50,12 @@ m_constraintSolver(new btSequentialImpulseConstraintSolver)
btDiscreteDynamicsWorld::btDiscreteDynamicsWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache,btConstraintSolver* constraintSolver) btDiscreteDynamicsWorld::btDiscreteDynamicsWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache,btConstraintSolver* constraintSolver)
:btDynamicsWorld(dispatcher,pairCache), :btDynamicsWorld(dispatcher,pairCache),
m_constraintSolver(constraintSolver) m_constraintSolver(constraintSolver? constraintSolver: new btSequentialImpulseConstraintSolver),
m_debugDrawer(0)
{ {
m_islandManager = new btSimulationIslandManager(); m_islandManager = new btSimulationIslandManager();
m_ownsIslandManager = true; 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++) for (int i=0;i<m_collisionObjects.size();i++)
{ {
btCollisionObject* colObj = m_collisionObjects[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); body->updateDeactivation(timeStep);
if (body->wantsSleeping()) 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 /// solve all the contact points and contact friction
@@ -277,23 +280,60 @@ void btDiscreteDynamicsWorld::calculateSimulationIslands()
Profiler::endBlock("IslandUnionFind"); Profiler::endBlock("IslandUnionFind");
#endif //USE_QUICKPROF #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() void btDiscreteDynamicsWorld::updateAabbs()
{ {
btVector3 colorvec(1,0,0);
btTransform predictedTrans; btTransform predictedTrans;
for (int i=0;i<m_collisionObjects.size();i++) for (int i=0;i<m_collisionObjects.size();i++)
{ {
btCollisionObject* colObj = m_collisionObjects[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; btPoint3 minAabb,maxAabb;
colObj->m_collisionShape->getAabb(colObj->m_worldTransform, minAabb,maxAabb); colObj->m_collisionShape->getAabb(colObj->m_worldTransform, minAabb,maxAabb);
btSimpleBroadphase* bp = (btSimpleBroadphase*)m_broadphasePairCache; btSimpleBroadphase* bp = (btSimpleBroadphase*)m_broadphasePairCache;
bp->setAabb(body->m_broadphaseHandle,minAabb,maxAabb); 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++) for (int i=0;i<m_collisionObjects.size();i++)
{ {
btCollisionObject* colObj = m_collisionObjects[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()))
{ {
body->predictIntegratedTransform(timeStep, predictedTrans); body->predictIntegratedTransform(timeStep, predictedTrans);
@@ -324,10 +364,9 @@ void btDiscreteDynamicsWorld::predictUnconstraintMotion(float timeStep)
for (int i=0;i<m_collisionObjects.size();i++) for (int i=0;i<m_collisionObjects.size();i++)
{ {
btCollisionObject* colObj = m_collisionObjects[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())) if (body->IsActive() && (!body->IsStatic()))
{ {
body->applyForces( timeStep); body->applyForces( timeStep);

View File

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

View File

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

View File

@@ -48,6 +48,9 @@ btRigidBody::btRigidBody( const btMassProps& massProps,btScalar linearDamping,bt
m_debugBodyId = uniqueId++; 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); setMassProps(massProps.m_mass, massProps.m_inertiaLocal);
setDamping(linearDamping, angularDamping); setDamping(linearDamping, angularDamping);
m_worldTransform.setIdentity(); m_worldTransform.setIdentity();

View File

@@ -65,6 +65,16 @@ public:
void proceedToTransform(const btTransform& newTrans); 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 /// continuous collision detection needs prediction
void predictIntegratedTransform(btScalar step, btTransform& predictedTransform) const; void predictIntegratedTransform(btScalar step, btTransform& predictedTransform) const;

View File

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

View File

@@ -35,11 +35,12 @@ protected:
bool m_ownsConstraintSolver; bool m_ownsConstraintSolver;
btIDebugDraw* m_debugDrawer;
void predictUnconstraintMotion(float timeStep); void predictUnconstraintMotion(float timeStep);
void integrateTransforms(float timeStep); void integrateTransforms(float timeStep);
void updateAabbs();
public: public:
@@ -54,6 +55,17 @@ public:
virtual void stepSimulation( float timeStep); 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 #endif //BT_SIMPLE_DYNAMICS_WORLD_H

View File

@@ -41,37 +41,26 @@ public:
explicit SIMD_FORCE_INLINE btTransform(const btQuaternion& q, explicit SIMD_FORCE_INLINE btTransform(const btQuaternion& q,
const btVector3& c = btVector3(btScalar(0), btScalar(0), btScalar(0))) const btVector3& c = btVector3(btScalar(0), btScalar(0), btScalar(0)))
: m_basis(q), : m_basis(q),
m_origin(c), m_origin(c)
m_type(RIGID)
{} {}
explicit SIMD_FORCE_INLINE btTransform(const btMatrix3x3& b, explicit SIMD_FORCE_INLINE btTransform(const btMatrix3x3& b,
const btVector3& c = btVector3(btScalar(0), btScalar(0), btScalar(0)), const btVector3& c = btVector3(btScalar(0), btScalar(0), btScalar(0)),
unsigned int type = AFFINE) unsigned int type = AFFINE)
: m_basis(b), : m_basis(b),
m_origin(c), m_origin(c)
m_type(type)
{} {}
SIMD_FORCE_INLINE void mult(const btTransform& t1, const btTransform& t2) { SIMD_FORCE_INLINE void mult(const btTransform& t1, const btTransform& t2) {
m_basis = t1.m_basis * t2.m_basis; m_basis = t1.m_basis * t2.m_basis;
m_origin = t1(t2.m_origin); m_origin = t1(t2.m_origin);
m_type = t1.m_type | t2.m_type;
} }
void multInverseLeft(const btTransform& t1, const btTransform& t2) { void multInverseLeft(const btTransform& t1, const btTransform& t2) {
btVector3 v = t2.m_origin - t1.m_origin; btVector3 v = t2.m_origin - t1.m_origin;
if (t1.m_type & SCALING) { m_basis = btMultTransposeLeft(t1.m_basis, t2.m_basis);
btMatrix3x3 inv = t1.m_basis.inverse(); m_origin = v * t1.m_basis;
m_basis = inv * t2.m_basis;
m_origin = inv * v;
}
else {
m_basis = btMultTransposeLeft(t1.m_basis, t2.m_basis);
m_origin = v * t1.m_basis;
}
m_type = t1.m_type | t2.m_type;
} }
SIMD_FORCE_INLINE btVector3 operator()(const btVector3& x) const SIMD_FORCE_INLINE btVector3 operator()(const btVector3& x) const
@@ -102,7 +91,6 @@ public:
{ {
m_basis.setValue(m); m_basis.setValue(m);
m_origin.setValue(&m[12]); m_origin.setValue(&m[12]);
m_type = AFFINE;
} }
@@ -126,7 +114,6 @@ public:
SIMD_FORCE_INLINE void setOrigin(const btVector3& origin) SIMD_FORCE_INLINE void setOrigin(const btVector3& origin)
{ {
m_origin = origin; m_origin = origin;
m_type |= TRANSLATION;
} }
SIMD_FORCE_INLINE btVector3 invXform(const btVector3& inVec) const; SIMD_FORCE_INLINE btVector3 invXform(const btVector3& inVec) const;
@@ -136,50 +123,36 @@ public:
SIMD_FORCE_INLINE void setBasis(const btMatrix3x3& basis) SIMD_FORCE_INLINE void setBasis(const btMatrix3x3& basis)
{ {
m_basis = basis; m_basis = basis;
m_type |= LINEAR;
} }
SIMD_FORCE_INLINE void setRotation(const btQuaternion& q) SIMD_FORCE_INLINE void setRotation(const btQuaternion& q)
{ {
m_basis.setRotation(q); m_basis.setRotation(q);
m_type = (m_type & ~LINEAR) | ROTATION;
} }
SIMD_FORCE_INLINE void scale(const btVector3& scaling) SIMD_FORCE_INLINE void scale(const btVector3& scaling)
{ {
m_basis = m_basis.scaled(scaling); m_basis = m_basis.scaled(scaling);
m_type |= SCALING;
} }
void setIdentity() void setIdentity()
{ {
m_basis.setIdentity(); m_basis.setIdentity();
m_origin.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0)); m_origin.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0));
m_type = 0x0;
} }
SIMD_FORCE_INLINE bool isIdentity() const { return m_type == 0x0; }
btTransform& operator*=(const btTransform& t) btTransform& operator*=(const btTransform& t)
{ {
m_origin += m_basis * t.m_origin; m_origin += m_basis * t.m_origin;
m_basis *= t.m_basis; m_basis *= t.m_basis;
m_type |= t.m_type;
return *this; return *this;
} }
btTransform inverse() const btTransform inverse() const
{ {
if (m_type) btMatrix3x3 inv = m_basis.transpose();
{ return btTransform(inv, inv * -m_origin);
btMatrix3x3 inv = (m_type & SCALING) ?
m_basis.inverse() :
m_basis.transpose();
return btTransform(inv, inv * -m_origin, m_type);
}
return *this;
} }
btTransform inverseTimes(const btTransform& t) const; btTransform inverseTimes(const btTransform& t) const;
@@ -190,7 +163,6 @@ private:
btMatrix3x3 m_basis; btMatrix3x3 m_basis;
btVector3 m_origin; btVector3 m_origin;
unsigned int m_type;
}; };
@@ -205,25 +177,15 @@ SIMD_FORCE_INLINE btTransform
btTransform::inverseTimes(const btTransform& t) const btTransform::inverseTimes(const btTransform& t) const
{ {
btVector3 v = t.getOrigin() - m_origin; btVector3 v = t.getOrigin() - m_origin;
if (m_type & SCALING)
{
btMatrix3x3 inv = m_basis.inverse();
return btTransform(inv * t.getBasis(), inv * v,
m_type | t.m_type);
}
else
{
return btTransform(m_basis.transposeTimes(t.m_basis), return btTransform(m_basis.transposeTimes(t.m_basis),
v * m_basis, m_type | t.m_type); v * m_basis);
}
} }
SIMD_FORCE_INLINE btTransform SIMD_FORCE_INLINE btTransform
btTransform::operator*(const btTransform& t) const btTransform::operator*(const btTransform& t) const
{ {
return btTransform(m_basis * t.m_basis, return btTransform(m_basis * t.m_basis,
(*this)(t.m_origin), (*this)(t.m_origin));
m_type | t.m_type);
} }

View File

@@ -24,6 +24,8 @@ subject to the following restrictions:
#include "BulletDynamics/Dynamics/btRigidBody.h" #include "BulletDynamics/Dynamics/btRigidBody.h"
#include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h" #include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h"
#include "BulletDynamics/ConstraintSolver/btHingeConstraint.h" #include "BulletDynamics/ConstraintSolver/btHingeConstraint.h"
#include "BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h"
#include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h" #include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h"
///Vehicle simulation, with wheel contact simulated by raycasts ///Vehicle simulation, with wheel contact simulated by raycasts
#include "BulletDynamics/Vehicle/btRaycastVehicle.h" #include "BulletDynamics/Vehicle/btRaycastVehicle.h"