diff --git a/Extras/BulletColladaConverter/ColladaConverter.cpp b/Extras/BulletColladaConverter/ColladaConverter.cpp index c25d91100..64214ba6f 100644 --- a/Extras/BulletColladaConverter/ColladaConverter.cpp +++ b/Extras/BulletColladaConverter/ColladaConverter.cpp @@ -158,9 +158,10 @@ m_use4componentVertices(true) bool ColladaConverter::load(const char* orgfilename) { - const char* filename = fixFileName(orgfilename); + reset (); + //Collada-m_dom m_collada = new DAE; @@ -199,7 +200,20 @@ bool ColladaConverter::load(const char* orgfilename) } +// resets the collada converter state +void ColladaConverter::reset () +{ + // clear the maps + m_rbUserInfoHashMap.clear (); + m_constraintUserInfoHashMap.clear (); + // delete the dom + if (m_collada) + delete m_collada; + + m_collada = NULL; + m_dom = NULL; +} bool ColladaConverter::convert() @@ -630,9 +644,80 @@ btRigidBodyColladaInfo* ColladaConverter::findRigidBodyColladaInfo(const btRigid return rbci; } +bool ColladaConverter::instantiateDom () +{ + if (!m_collada) + { + m_collada = new DAE; + + //set the default IOPlugin and Database + m_collada->setIOPlugin( NULL ); + m_collada->setDatabase( NULL ); + + daeInt error; + const char* documentName = "bullet snapshot"; + + //create a new document. Calling daeDatabase::insertDocument will create the + //daeDocument for you. This function will also create a domCOLLADA root + //element for you. + daeDocument *doc = NULL; + error = m_collada->getDatabase()->insertDocument(documentName, &doc ); + if ( error != DAE_OK || doc == NULL ) + { + printf("Failed to create new document\n"); + return false; + } + + m_dom = daeSafeCast(doc->getDomRoot()); + + //create the required asset tag + domAssetRef asset = daeSafeCast( m_dom->createAndPlace( COLLADA_ELEMENT_ASSET ) ); + domAsset::domCreatedRef created = daeSafeCast( asset->createAndPlace( COLLADA_ELEMENT_CREATED ) ); + created->setValue("2008-02-12T15:28:54.891550"); + domAsset::domModifiedRef modified = daeSafeCast( asset->createAndPlace( COLLADA_ELEMENT_MODIFIED ) ); + modified->setValue("2008-02-12T15:28:54.891550"); + + domAsset::domContributorRef contrib = daeSafeCast( asset->createAndPlace( COLLADA_TYPE_CONTRIBUTOR ) ); + + domAsset::domContributor::domAuthoring_toolRef authoringtool = daeSafeCast( contrib->createAndPlace( COLLADA_ELEMENT_AUTHORING_TOOL ) ); + char authbuffer[512]; + sprintf(authbuffer,"Bullet Physics SDK %d Snapshot(BulletColladaConverter) http://bulletphysics.com",BT_BULLET_VERSION); + authoringtool->setValue(authbuffer); + + domAsset::domUp_axisRef yup = daeSafeCast( asset->createAndPlace( COLLADA_ELEMENT_UP_AXIS ) ); + yup->setValue(UPAXISTYPE_Y_UP); + + domPhysics_sceneRef physicsScene = getDefaultPhysicsScene (); + domPhysics_scene::domTechnique_commonRef common = daeSafeCast(physicsScene->createAndPlace (COLLADA_ELEMENT_TECHNIQUE_COMMON)); + domTargetableFloat3Ref g = daeSafeCast(common->createAndPlace (COLLADA_ELEMENT_GRAVITY)); + btVector3 btG = getGravity (); + g->getValue().set3 (btG[0], btG[1], btG[2]); + + if (!m_dom->getScene()) + { + domCOLLADA::domScene* scene = daeSafeCast( m_dom->createAndPlace( COLLADA_ELEMENT_SCENE ) ); + { + domInstanceWithExtra* ivs = daeSafeCast( scene->createAndPlace( COLLADA_ELEMENT_INSTANCE_VISUAL_SCENE ) ); + daeURI uri; + uri.setElement( getDefaultVisualScene() ); + uri.resolveURI(); + ivs->setUrl( uri ); + } + { + domInstanceWithExtra* ips = daeSafeCast( scene->createAndPlace( COLLADA_ELEMENT_INSTANCE_PHYSICS_SCENE ) ); + daeURI uri; + uri.setElement( getDefaultPhysicsScene() ); + uri.resolveURI(); + ips->setUrl( uri ); + } + + } + } + return true; +} + domNode* ColladaConverter::findNode (btRigidBody* rb) { - btRigidBodyColladaInfo* rbci = findRigidBodyColladaInfo(rb); if (rbci) { @@ -2202,7 +2287,6 @@ void ColladaConverter::syncOrAddRigidBody (btRigidBody* body) printf("New body\n"); btCollisionShape* shape = body->getCollisionShape (); - if (!nodeName) { snprintf(&nodeNameGen[0], 512, "BulletUnnamed-%d", random_node_name_key++); @@ -2251,7 +2335,6 @@ void ColladaConverter::syncOrAddRigidBody (btRigidBody* body) btRigidBodyColladaInfo* value = new btRigidBodyColladaInfo(body,dNode,dRigidBody,dInstanceRigidBody); m_rbUserInfoHashMap.insert(btHashKeyPtr(value->getUid()),value); - } } @@ -2290,74 +2373,9 @@ void ColladaConverter::syncOrAddConstraint (btTypedConstraint* constraint) bool ColladaConverter::save(const char* filename) { - if (!m_collada) + if (!instantiateDom ()) { - m_collada = new DAE; - - //set the default IOPlugin and Database - m_collada->setIOPlugin( NULL ); - m_collada->setDatabase( NULL ); - - - daeInt error; - const char* documentName = "bullet snapshot"; - - //create a new document. Calling daeDatabase::insertDocument will create the - //daeDocument for you. This function will also create a domCOLLADA root - //element for you. - daeDocument *doc = NULL; - error = m_collada->getDatabase()->insertDocument(documentName, &doc ); - if ( error != DAE_OK || doc == NULL ) - { - printf("Failed to create new document\n"); - return false; - } - - m_dom = daeSafeCast(doc->getDomRoot()); - - //create the required asset tag - domAssetRef asset = daeSafeCast( m_dom->createAndPlace( COLLADA_ELEMENT_ASSET ) ); - domAsset::domCreatedRef created = daeSafeCast( asset->createAndPlace( COLLADA_ELEMENT_CREATED ) ); - created->setValue("2008-02-12T15:28:54.891550"); - domAsset::domModifiedRef modified = daeSafeCast( asset->createAndPlace( COLLADA_ELEMENT_MODIFIED ) ); - modified->setValue("2008-02-12T15:28:54.891550"); - - domAsset::domContributorRef contrib = daeSafeCast( asset->createAndPlace( COLLADA_TYPE_CONTRIBUTOR ) ); - - domAsset::domContributor::domAuthoring_toolRef authoringtool = daeSafeCast( contrib->createAndPlace( COLLADA_ELEMENT_AUTHORING_TOOL ) ); - char authbuffer[512]; - sprintf(authbuffer,"Bullet Physics SDK %d Snapshot(BulletColladaConverter) http://bulletphysics.com",BT_BULLET_VERSION); - authoringtool->setValue(authbuffer); - - domAsset::domUp_axisRef yup = daeSafeCast( asset->createAndPlace( COLLADA_ELEMENT_UP_AXIS ) ); - yup->setValue(UPAXISTYPE_Y_UP); - - domPhysics_sceneRef physicsScene = getDefaultPhysicsScene (); - domPhysics_scene::domTechnique_commonRef common = daeSafeCast(physicsScene->createAndPlace (COLLADA_ELEMENT_TECHNIQUE_COMMON)); - domTargetableFloat3Ref g = daeSafeCast(common->createAndPlace (COLLADA_ELEMENT_GRAVITY)); - btVector3 btG = getGravity (); - g->getValue().set3 (btG[0], btG[1], btG[2]); - - - if (!m_dom->getScene()) - { - domCOLLADA::domScene* scene = daeSafeCast( m_dom->createAndPlace( COLLADA_ELEMENT_SCENE ) ); - { - domInstanceWithExtra* ivs = daeSafeCast( scene->createAndPlace( COLLADA_ELEMENT_INSTANCE_VISUAL_SCENE ) ); - daeURI uri; - uri.setElement( getDefaultVisualScene() ); - uri.resolveURI(); - ivs->setUrl( uri ); - } - { - domInstanceWithExtra* ips = daeSafeCast( scene->createAndPlace( COLLADA_ELEMENT_INSTANCE_PHYSICS_SCENE ) ); - daeURI uri; - uri.setElement( getDefaultPhysicsScene() ); - uri.resolveURI(); - ips->setUrl( uri ); - } - - } + return false; } /* Dump the scene */ @@ -3136,13 +3154,18 @@ btVector3 ColladaConverter::getGravity () void ColladaConverter::registerRigidBody(btRigidBody* body, const char* name) { - + if (!instantiateDom ()) + { + return; + } + btRigidBodyColladaInfo* rbci = findRigidBodyColladaInfo(body); if (!rbci) { syncOrAddRigidBody (body); rbci = findRigidBodyColladaInfo(body); + btAssert (rbci); } // update dom @@ -3220,6 +3243,10 @@ const char* ColladaConverter::getName (btRigidBody* body) void ColladaConverter::registerConstraint(btTypedConstraint* constraint, const char* name) { + if (!instantiateDom ()) + { + return; + } btRigidConstraintColladaInfo* rcci = findRigidConstraintColladaInfo(constraint); if (!rcci) diff --git a/Extras/BulletColladaConverter/ColladaConverter.h b/Extras/BulletColladaConverter/ColladaConverter.h index 9f4a1cdeb..4fece24b2 100644 --- a/Extras/BulletColladaConverter/ColladaConverter.h +++ b/Extras/BulletColladaConverter/ColladaConverter.h @@ -118,6 +118,8 @@ protected: btRigidBodyColladaInfo* findRigidBodyColladaInfo(const btRigidBody* body); btRigidConstraintColladaInfo* findRigidConstraintColladaInfo(btTypedConstraint* constraint); + bool instantiateDom (); + /* Searches based on matching name/id */ class domNode* findNode (const char* nodeName); class domRigid_body* findRigid_body (const char* rigidBodyName); @@ -166,6 +168,9 @@ public: ///load a COLLADA .dae file bool load(const char* filename); + // resets the collada converter state + void reset (); + ///save a snapshot in COLLADA physics .dae format. ///if the filename is left empty, modify the filename used during loading bool save(const char* filename = 0);