moved implementation from ColladaDemo into ColladaConverter, so that it can be used without change with any btDynamicsWorld.

This commit is contained in:
ejcoumans
2008-02-08 23:46:37 +00:00
parent 7ca3020133
commit 6b3587a505
5 changed files with 129 additions and 108 deletions

View File

@@ -42,102 +42,11 @@ class MyColladaConverter : public ColladaConverter
public: public:
MyColladaConverter(DemoApplication* demoApp) MyColladaConverter(DemoApplication* demoApp)
:m_demoApp(demoApp) : ColladaConverter(demoApp->getDynamicsWorld()),
m_demoApp(demoApp)
{ {
} }
///those 2 virtuals are called for each constraint/physics object
virtual btTypedConstraint* createUniversalD6Constraint(
class btRigidBody* bodyRef,class btRigidBody* bodyOther,
btTransform& localAttachmentFrameRef,
btTransform& localAttachmentOther,
const btVector3& linearMinLimits,
const btVector3& linearMaxLimits,
const btVector3& angularMinLimits,
const btVector3& angularMaxLimits,
bool disableCollisionsBetweenLinkedBodies
)
{
if (bodyRef)
{
if (!bodyOther)
{
btRigidBody::btRigidBodyConstructionInfo cinfo(0,0,0);
bodyOther = new btRigidBody(cinfo);
bodyOther->setWorldTransform(bodyRef->getWorldTransform());
localAttachmentOther = localAttachmentFrameRef;
}
bool useReferenceFrameA = true;
btGeneric6DofConstraint* genericConstraint = new btGeneric6DofConstraint(
*bodyRef,*bodyOther,
localAttachmentFrameRef,localAttachmentOther,useReferenceFrameA);
genericConstraint->setLinearLowerLimit(linearMinLimits);
genericConstraint->setLinearUpperLimit(linearMaxLimits);
genericConstraint->setAngularLowerLimit(angularMinLimits);
genericConstraint->setAngularUpperLimit(angularMaxLimits);
m_demoApp->getDynamicsWorld()->addConstraint( genericConstraint,disableCollisionsBetweenLinkedBodies );
return genericConstraint;
}
return 0;
}
virtual btRigidBody* createRigidBody(bool isDynamic,
float mass,
const btTransform& startTransform,
btCollisionShape* shape)
{
if (!isDynamic && (mass != 0.f))
{
printf("Warning: non-dynamic objects needs to have zero mass!\n");
mass = 0.f;
}
if (isDynamic && (mass == 0.f))
{
printf("Warning: dynamic rigidbodies needs nonzero mass!\n");
mass = 1.f;
}
btRigidBody* body = m_demoApp->localCreateRigidBody(mass, startTransform,shape);
return body;
}
virtual int getNumRigidBodies ()
{
return m_demoApp->getDynamicsWorld()->getNumCollisionObjects();
}
virtual btRigidBody* getRigidBody (int i)
{
return btRigidBody::upcast(m_demoApp->getDynamicsWorld()->getCollisionObjectArray ()[i]);
}
virtual int getNumConstraints ()
{
return m_demoApp->getDynamicsWorld()->getNumConstraints ();
}
virtual btTypedConstraint* getConstraint (int i)
{
return m_demoApp->getDynamicsWorld()->getConstraint (i);
}
virtual void setGravity(const btVector3& grav)
{
m_demoApp->getDynamicsWorld()->setGravity(grav);
}
virtual btVector3 getGravity ()
{
return m_demoApp->getDynamicsWorld()->getGravity ();
}
virtual void setCameraInfo(const btVector3& camUp,int forwardAxis) virtual void setCameraInfo(const btVector3& camUp,int forwardAxis)
{ {

View File

@@ -3,5 +3,6 @@ ${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Extras/BulletColla
) )
ADD_LIBRARY(LibBulletColladaConverter ADD_LIBRARY(LibBulletColladaConverter
ColladaConverter.h
ColladaConverter.cpp ColladaConverter.cpp
) )

View File

@@ -172,8 +172,9 @@ btTransform GetbtTransformFromCOLLADA_DOM(domMatrix_Array& matrixArray,
ColladaConverter::ColladaConverter() ColladaConverter::ColladaConverter(btDynamicsWorld* dynaWorld)
:m_collada(0), :m_dynamicsWorld(dynaWorld),
m_collada(0),
m_dom(0), m_dom(0),
m_filename(0), m_filename(0),
m_unitMeterScaling(1.f) m_unitMeterScaling(1.f)
@@ -2904,3 +2905,108 @@ void ColladaConverter::ConvertRigidBodyRef( btRigidBodyInput& rbInput,btRigidBod
} }
///those 2 virtuals are called for each constraint/physics object
btTypedConstraint* ColladaConverter::createUniversalD6Constraint(
class btRigidBody* bodyRef,class btRigidBody* bodyOther,
btTransform& localAttachmentFrameRef,
btTransform& localAttachmentOther,
const btVector3& linearMinLimits,
const btVector3& linearMaxLimits,
const btVector3& angularMinLimits,
const btVector3& angularMaxLimits,
bool disableCollisionsBetweenLinkedBodies
)
{
if (bodyRef)
{
if (!bodyOther)
{
btRigidBody::btRigidBodyConstructionInfo cinfo(0,0,0);
bodyOther = new btRigidBody(cinfo);
bodyOther->setWorldTransform(bodyRef->getWorldTransform());
localAttachmentOther = localAttachmentFrameRef;
}
bool useReferenceFrameA = true;
btGeneric6DofConstraint* genericConstraint = new btGeneric6DofConstraint(
*bodyRef,*bodyOther,
localAttachmentFrameRef,localAttachmentOther,useReferenceFrameA);
genericConstraint->setLinearLowerLimit(linearMinLimits);
genericConstraint->setLinearUpperLimit(linearMaxLimits);
genericConstraint->setAngularLowerLimit(angularMinLimits);
genericConstraint->setAngularUpperLimit(angularMaxLimits);
m_dynamicsWorld->addConstraint( genericConstraint,disableCollisionsBetweenLinkedBodies );
return genericConstraint;
}
return 0;
}
btRigidBody* ColladaConverter::createRigidBody(bool isDynamic,
float mass,
const btTransform& startTransform,
btCollisionShape* shape)
{
if (!isDynamic && (mass != 0.f))
{
printf("Warning: non-dynamic objects needs to have zero mass!\n");
mass = 0.f;
}
if (isDynamic && (mass == 0.f))
{
printf("Warning: dynamic rigidbodies needs nonzero mass!\n");
mass = 1.f;
}
btVector3 localInertia(0,0,0);
if (isDynamic)
shape->calculateLocalInertia(mass,localInertia);
//using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects
btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform);
btRigidBody::btRigidBodyConstructionInfo cInfo(mass,myMotionState,shape,localInertia);
btRigidBody* body = new btRigidBody(cInfo);
m_dynamicsWorld->addRigidBody(body);
return body;
}
int ColladaConverter::getNumRigidBodies ()
{
return m_dynamicsWorld->getNumCollisionObjects();
}
btRigidBody* ColladaConverter::getRigidBody (int i)
{
return btRigidBody::upcast(m_dynamicsWorld->getCollisionObjectArray ()[i]);
}
int ColladaConverter::getNumConstraints ()
{
return m_dynamicsWorld->getNumConstraints ();
}
btTypedConstraint* ColladaConverter::getConstraint (int i)
{
return m_dynamicsWorld->getConstraint (i);
}
void ColladaConverter::setGravity(const btVector3& grav)
{
m_dynamicsWorld->setGravity(grav);
}
btVector3 ColladaConverter::getGravity ()
{
return m_dynamicsWorld->getGravity ();
}

View File

@@ -24,13 +24,16 @@ subject to the following restrictions:
class btCollisionShape; class btCollisionShape;
class btRigidBody; class btRigidBody;
class btTypedConstraint; class btTypedConstraint;
class btDynamicsWorld;
class ConstraintInput; class ConstraintInput;
///ColladaConverter helps converting the physics assets from COLLADA DOM into physics objects ///ColladaConverter helps converting the physics assets from COLLADA DOM into physics objects
class ColladaConverter class ColladaConverter
{ {
protected: protected:
btDynamicsWorld* m_dynamicsWorld;
class DAE* m_collada; class DAE* m_collada;
class domCOLLADA* m_dom; class domCOLLADA* m_dom;
char* m_filename; char* m_filename;
@@ -89,7 +92,7 @@ protected:
void syncOrAddRigidBody (btRigidBody* body); void syncOrAddRigidBody (btRigidBody* body);
void syncOrAddConstraint (btTypedConstraint* constraint); void syncOrAddConstraint (btTypedConstraint* constraint);
public: public:
ColladaConverter(); ColladaConverter(btDynamicsWorld* dynaWorld);
///load a COLLADA .dae file ///load a COLLADA .dae file
bool load(const char* filename); bool load(const char* filename);
@@ -108,18 +111,20 @@ public:
const btVector3& angularMinLimits, const btVector3& angularMinLimits,
const btVector3& angularMaxLimits, const btVector3& angularMaxLimits,
bool disableCollisionsBetweenLinkedBodies bool disableCollisionsBetweenLinkedBodies
) = 0; );
virtual btRigidBody* createRigidBody(bool isDynamic, virtual btRigidBody* createRigidBody(bool isDynamic,
float mass, float mass,
const btTransform& startTransform, const btTransform& startTransform,
btCollisionShape* shape) = 0; btCollisionShape* shape);
virtual int getNumRigidBodies () = 0; virtual int getNumRigidBodies ();
virtual btRigidBody* getRigidBody (int i) = 0; virtual btRigidBody* getRigidBody (int i);
virtual int getNumConstraints () = 0; virtual int getNumConstraints ();
virtual btTypedConstraint* getConstraint (int i) = 0; virtual btTypedConstraint* getConstraint (int i);
virtual void setGravity(const btVector3& gravity) = 0; virtual void setGravity(const btVector3& gravity);
virtual btVector3 getGravity () = 0; virtual btVector3 getGravity ();
virtual void setCameraInfo(const btVector3& up, int forwardAxis) = 0; virtual void setCameraInfo(const btVector3& up, int forwardAxis)
{
};
}; };
#endif //COLLADA_CONVERTER_H #endif //COLLADA_CONVERTER_H

View File

@@ -2,7 +2,7 @@ SubDir TOP Extras BulletColladaConverter ;
#IncludeDir Extras/BulletColladaConverter ; #IncludeDir Extras/BulletColladaConverter ;
Library BulletColladaConverter : [ Wildcard . : */.h *.cpp ] : noinstall ; Library BulletColladaConverter : [ Wildcard . : *.h *.cpp ] : noinstall ;
CFlags BulletColladaConverter : [ FIncludes $(TOP)/Extras/BulletColladaConverter ] [ FIncludes $(TOP)/Extras/COLLADA_DOM/include ] [ FIncludes $(TOP)/Extras/COLLADA_DOM/include/1.4 ] [ FIncludes $(TOP)/Extras/LibXML ] [ FIncludes $(TOP)/Extras/LibXML/include ] ; CFlags BulletColladaConverter : [ FIncludes $(TOP)/Extras/BulletColladaConverter ] [ FIncludes $(TOP)/Extras/COLLADA_DOM/include ] [ FIncludes $(TOP)/Extras/COLLADA_DOM/include/1.4 ] [ FIncludes $(TOP)/Extras/LibXML ] [ FIncludes $(TOP)/Extras/LibXML/include ] ;
LibDepends BulletColladaConverter : colladadom libxml ; LibDepends BulletColladaConverter : colladadom libxml ;