moved implementation from ColladaDemo into ColladaConverter, so that it can be used without change with any btDynamicsWorld.
This commit is contained in:
@@ -42,103 +42,12 @@ 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)
|
||||||
{
|
{
|
||||||
m_demoApp->setCameraUp(camUp);
|
m_demoApp->setCameraUp(camUp);
|
||||||
|
|||||||
@@ -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
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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 ();
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 ;
|
||||||
|
|||||||
Reference in New Issue
Block a user