diff --git a/Demos/ColladaDemo/ColladaDemo.cpp b/Demos/ColladaDemo/ColladaDemo.cpp index 6c0666093..541437bcb 100644 --- a/Demos/ColladaDemo/ColladaDemo.cpp +++ b/Demos/ColladaDemo/ColladaDemo.cpp @@ -42,103 +42,12 @@ class MyColladaConverter : public ColladaConverter public: 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) { m_demoApp->setCameraUp(camUp); diff --git a/Extras/BulletColladaConverter/CMakeLists.txt b/Extras/BulletColladaConverter/CMakeLists.txt index f19aa08e7..7456e387a 100644 --- a/Extras/BulletColladaConverter/CMakeLists.txt +++ b/Extras/BulletColladaConverter/CMakeLists.txt @@ -3,5 +3,6 @@ ${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Extras/BulletColla ) ADD_LIBRARY(LibBulletColladaConverter + ColladaConverter.h ColladaConverter.cpp ) diff --git a/Extras/BulletColladaConverter/ColladaConverter.cpp b/Extras/BulletColladaConverter/ColladaConverter.cpp index 5b1dd1ffc..5ab42631f 100644 --- a/Extras/BulletColladaConverter/ColladaConverter.cpp +++ b/Extras/BulletColladaConverter/ColladaConverter.cpp @@ -172,8 +172,9 @@ btTransform GetbtTransformFromCOLLADA_DOM(domMatrix_Array& matrixArray, -ColladaConverter::ColladaConverter() -:m_collada(0), +ColladaConverter::ColladaConverter(btDynamicsWorld* dynaWorld) +:m_dynamicsWorld(dynaWorld), +m_collada(0), m_dom(0), m_filename(0), 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 (); +} diff --git a/Extras/BulletColladaConverter/ColladaConverter.h b/Extras/BulletColladaConverter/ColladaConverter.h index 8c575a23c..c9c9b12ed 100644 --- a/Extras/BulletColladaConverter/ColladaConverter.h +++ b/Extras/BulletColladaConverter/ColladaConverter.h @@ -24,13 +24,16 @@ subject to the following restrictions: class btCollisionShape; class btRigidBody; class btTypedConstraint; - +class btDynamicsWorld; class ConstraintInput; ///ColladaConverter helps converting the physics assets from COLLADA DOM into physics objects class ColladaConverter { protected: + + btDynamicsWorld* m_dynamicsWorld; + class DAE* m_collada; class domCOLLADA* m_dom; char* m_filename; @@ -89,7 +92,7 @@ protected: void syncOrAddRigidBody (btRigidBody* body); void syncOrAddConstraint (btTypedConstraint* constraint); public: - ColladaConverter(); + ColladaConverter(btDynamicsWorld* dynaWorld); ///load a COLLADA .dae file bool load(const char* filename); @@ -108,18 +111,20 @@ public: const btVector3& angularMinLimits, const btVector3& angularMaxLimits, bool disableCollisionsBetweenLinkedBodies - ) = 0; + ); virtual btRigidBody* createRigidBody(bool isDynamic, float mass, const btTransform& startTransform, - btCollisionShape* shape) = 0; - virtual int getNumRigidBodies () = 0; - virtual btRigidBody* getRigidBody (int i) = 0; - virtual int getNumConstraints () = 0; - virtual btTypedConstraint* getConstraint (int i) = 0; - virtual void setGravity(const btVector3& gravity) = 0; - virtual btVector3 getGravity () = 0; - virtual void setCameraInfo(const btVector3& up, int forwardAxis) = 0; + btCollisionShape* shape); + virtual int getNumRigidBodies (); + virtual btRigidBody* getRigidBody (int i); + virtual int getNumConstraints (); + virtual btTypedConstraint* getConstraint (int i); + virtual void setGravity(const btVector3& gravity); + virtual btVector3 getGravity (); + virtual void setCameraInfo(const btVector3& up, int forwardAxis) + { + }; }; #endif //COLLADA_CONVERTER_H diff --git a/Extras/BulletColladaConverter/Jamfile b/Extras/BulletColladaConverter/Jamfile index f169bfc76..7b33a9067 100644 --- a/Extras/BulletColladaConverter/Jamfile +++ b/Extras/BulletColladaConverter/Jamfile @@ -2,7 +2,7 @@ SubDir TOP 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 ] ; LibDepends BulletColladaConverter : colladadom libxml ;