Ensure that the dom is instantiated inside registerRigidBody and registerConstraint.
Add a reset method to the colladaconverter so that the user can reuse the same converter.
This commit is contained in:
@@ -158,9 +158,10 @@ m_use4componentVertices(true)
|
|||||||
|
|
||||||
bool ColladaConverter::load(const char* orgfilename)
|
bool ColladaConverter::load(const char* orgfilename)
|
||||||
{
|
{
|
||||||
|
|
||||||
const char* filename = fixFileName(orgfilename);
|
const char* filename = fixFileName(orgfilename);
|
||||||
|
|
||||||
|
reset ();
|
||||||
|
|
||||||
//Collada-m_dom
|
//Collada-m_dom
|
||||||
m_collada = new DAE;
|
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()
|
bool ColladaConverter::convert()
|
||||||
@@ -630,9 +644,80 @@ btRigidBodyColladaInfo* ColladaConverter::findRigidBodyColladaInfo(const btRigid
|
|||||||
return rbci;
|
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<domCOLLADA>(doc->getDomRoot());
|
||||||
|
|
||||||
|
//create the required asset tag
|
||||||
|
domAssetRef asset = daeSafeCast<domAsset>( m_dom->createAndPlace( COLLADA_ELEMENT_ASSET ) );
|
||||||
|
domAsset::domCreatedRef created = daeSafeCast<domAsset::domCreated>( asset->createAndPlace( COLLADA_ELEMENT_CREATED ) );
|
||||||
|
created->setValue("2008-02-12T15:28:54.891550");
|
||||||
|
domAsset::domModifiedRef modified = daeSafeCast<domAsset::domModified>( asset->createAndPlace( COLLADA_ELEMENT_MODIFIED ) );
|
||||||
|
modified->setValue("2008-02-12T15:28:54.891550");
|
||||||
|
|
||||||
|
domAsset::domContributorRef contrib = daeSafeCast<domAsset::domContributor>( asset->createAndPlace( COLLADA_TYPE_CONTRIBUTOR ) );
|
||||||
|
|
||||||
|
domAsset::domContributor::domAuthoring_toolRef authoringtool = daeSafeCast<domAsset::domContributor::domAuthoring_tool>( 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<domAsset::domUp_axis>( asset->createAndPlace( COLLADA_ELEMENT_UP_AXIS ) );
|
||||||
|
yup->setValue(UPAXISTYPE_Y_UP);
|
||||||
|
|
||||||
|
domPhysics_sceneRef physicsScene = getDefaultPhysicsScene ();
|
||||||
|
domPhysics_scene::domTechnique_commonRef common = daeSafeCast<domPhysics_scene::domTechnique_common>(physicsScene->createAndPlace (COLLADA_ELEMENT_TECHNIQUE_COMMON));
|
||||||
|
domTargetableFloat3Ref g = daeSafeCast<domTargetableFloat3>(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<domCOLLADA::domScene>( m_dom->createAndPlace( COLLADA_ELEMENT_SCENE ) );
|
||||||
|
{
|
||||||
|
domInstanceWithExtra* ivs = daeSafeCast<domInstanceWithExtra>( scene->createAndPlace( COLLADA_ELEMENT_INSTANCE_VISUAL_SCENE ) );
|
||||||
|
daeURI uri;
|
||||||
|
uri.setElement( getDefaultVisualScene() );
|
||||||
|
uri.resolveURI();
|
||||||
|
ivs->setUrl( uri );
|
||||||
|
}
|
||||||
|
{
|
||||||
|
domInstanceWithExtra* ips = daeSafeCast<domInstanceWithExtra>( scene->createAndPlace( COLLADA_ELEMENT_INSTANCE_PHYSICS_SCENE ) );
|
||||||
|
daeURI uri;
|
||||||
|
uri.setElement( getDefaultPhysicsScene() );
|
||||||
|
uri.resolveURI();
|
||||||
|
ips->setUrl( uri );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
domNode* ColladaConverter::findNode (btRigidBody* rb)
|
domNode* ColladaConverter::findNode (btRigidBody* rb)
|
||||||
{
|
{
|
||||||
|
|
||||||
btRigidBodyColladaInfo* rbci = findRigidBodyColladaInfo(rb);
|
btRigidBodyColladaInfo* rbci = findRigidBodyColladaInfo(rb);
|
||||||
if (rbci)
|
if (rbci)
|
||||||
{
|
{
|
||||||
@@ -2202,7 +2287,6 @@ void ColladaConverter::syncOrAddRigidBody (btRigidBody* body)
|
|||||||
printf("New body\n");
|
printf("New body\n");
|
||||||
btCollisionShape* shape = body->getCollisionShape ();
|
btCollisionShape* shape = body->getCollisionShape ();
|
||||||
|
|
||||||
|
|
||||||
if (!nodeName)
|
if (!nodeName)
|
||||||
{
|
{
|
||||||
snprintf(&nodeNameGen[0], 512, "BulletUnnamed-%d", random_node_name_key++);
|
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);
|
btRigidBodyColladaInfo* value = new btRigidBodyColladaInfo(body,dNode,dRigidBody,dInstanceRigidBody);
|
||||||
m_rbUserInfoHashMap.insert(btHashKeyPtr<btRigidBodyColladaInfo*>(value->getUid()),value);
|
m_rbUserInfoHashMap.insert(btHashKeyPtr<btRigidBodyColladaInfo*>(value->getUid()),value);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2290,76 +2373,11 @@ void ColladaConverter::syncOrAddConstraint (btTypedConstraint* constraint)
|
|||||||
|
|
||||||
bool ColladaConverter::save(const char* filename)
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_dom = daeSafeCast<domCOLLADA>(doc->getDomRoot());
|
|
||||||
|
|
||||||
//create the required asset tag
|
|
||||||
domAssetRef asset = daeSafeCast<domAsset>( m_dom->createAndPlace( COLLADA_ELEMENT_ASSET ) );
|
|
||||||
domAsset::domCreatedRef created = daeSafeCast<domAsset::domCreated>( asset->createAndPlace( COLLADA_ELEMENT_CREATED ) );
|
|
||||||
created->setValue("2008-02-12T15:28:54.891550");
|
|
||||||
domAsset::domModifiedRef modified = daeSafeCast<domAsset::domModified>( asset->createAndPlace( COLLADA_ELEMENT_MODIFIED ) );
|
|
||||||
modified->setValue("2008-02-12T15:28:54.891550");
|
|
||||||
|
|
||||||
domAsset::domContributorRef contrib = daeSafeCast<domAsset::domContributor>( asset->createAndPlace( COLLADA_TYPE_CONTRIBUTOR ) );
|
|
||||||
|
|
||||||
domAsset::domContributor::domAuthoring_toolRef authoringtool = daeSafeCast<domAsset::domContributor::domAuthoring_tool>( 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<domAsset::domUp_axis>( asset->createAndPlace( COLLADA_ELEMENT_UP_AXIS ) );
|
|
||||||
yup->setValue(UPAXISTYPE_Y_UP);
|
|
||||||
|
|
||||||
domPhysics_sceneRef physicsScene = getDefaultPhysicsScene ();
|
|
||||||
domPhysics_scene::domTechnique_commonRef common = daeSafeCast<domPhysics_scene::domTechnique_common>(physicsScene->createAndPlace (COLLADA_ELEMENT_TECHNIQUE_COMMON));
|
|
||||||
domTargetableFloat3Ref g = daeSafeCast<domTargetableFloat3>(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<domCOLLADA::domScene>( m_dom->createAndPlace( COLLADA_ELEMENT_SCENE ) );
|
|
||||||
{
|
|
||||||
domInstanceWithExtra* ivs = daeSafeCast<domInstanceWithExtra>( scene->createAndPlace( COLLADA_ELEMENT_INSTANCE_VISUAL_SCENE ) );
|
|
||||||
daeURI uri;
|
|
||||||
uri.setElement( getDefaultVisualScene() );
|
|
||||||
uri.resolveURI();
|
|
||||||
ivs->setUrl( uri );
|
|
||||||
}
|
|
||||||
{
|
|
||||||
domInstanceWithExtra* ips = daeSafeCast<domInstanceWithExtra>( scene->createAndPlace( COLLADA_ELEMENT_INSTANCE_PHYSICS_SCENE ) );
|
|
||||||
daeURI uri;
|
|
||||||
uri.setElement( getDefaultPhysicsScene() );
|
|
||||||
uri.resolveURI();
|
|
||||||
ips->setUrl( uri );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Dump the scene */
|
/* Dump the scene */
|
||||||
for (int i = 0; i < getNumRigidBodies (); i++)
|
for (int i = 0; i < getNumRigidBodies (); i++)
|
||||||
{
|
{
|
||||||
@@ -3136,6 +3154,10 @@ btVector3 ColladaConverter::getGravity ()
|
|||||||
|
|
||||||
void ColladaConverter::registerRigidBody(btRigidBody* body, const char* name)
|
void ColladaConverter::registerRigidBody(btRigidBody* body, const char* name)
|
||||||
{
|
{
|
||||||
|
if (!instantiateDom ())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
btRigidBodyColladaInfo* rbci = findRigidBodyColladaInfo(body);
|
btRigidBodyColladaInfo* rbci = findRigidBodyColladaInfo(body);
|
||||||
|
|
||||||
@@ -3143,6 +3165,7 @@ void ColladaConverter::registerRigidBody(btRigidBody* body, const char* name)
|
|||||||
{
|
{
|
||||||
syncOrAddRigidBody (body);
|
syncOrAddRigidBody (body);
|
||||||
rbci = findRigidBodyColladaInfo(body);
|
rbci = findRigidBodyColladaInfo(body);
|
||||||
|
btAssert (rbci);
|
||||||
}
|
}
|
||||||
|
|
||||||
// update dom
|
// update dom
|
||||||
@@ -3220,6 +3243,10 @@ const char* ColladaConverter::getName (btRigidBody* body)
|
|||||||
|
|
||||||
void ColladaConverter::registerConstraint(btTypedConstraint* constraint, const char* name)
|
void ColladaConverter::registerConstraint(btTypedConstraint* constraint, const char* name)
|
||||||
{
|
{
|
||||||
|
if (!instantiateDom ())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
btRigidConstraintColladaInfo* rcci = findRigidConstraintColladaInfo(constraint);
|
btRigidConstraintColladaInfo* rcci = findRigidConstraintColladaInfo(constraint);
|
||||||
if (!rcci)
|
if (!rcci)
|
||||||
|
|||||||
@@ -118,6 +118,8 @@ protected:
|
|||||||
btRigidBodyColladaInfo* findRigidBodyColladaInfo(const btRigidBody* body);
|
btRigidBodyColladaInfo* findRigidBodyColladaInfo(const btRigidBody* body);
|
||||||
btRigidConstraintColladaInfo* findRigidConstraintColladaInfo(btTypedConstraint* constraint);
|
btRigidConstraintColladaInfo* findRigidConstraintColladaInfo(btTypedConstraint* constraint);
|
||||||
|
|
||||||
|
bool instantiateDom ();
|
||||||
|
|
||||||
/* Searches based on matching name/id */
|
/* Searches based on matching name/id */
|
||||||
class domNode* findNode (const char* nodeName);
|
class domNode* findNode (const char* nodeName);
|
||||||
class domRigid_body* findRigid_body (const char* rigidBodyName);
|
class domRigid_body* findRigid_body (const char* rigidBodyName);
|
||||||
@@ -166,6 +168,9 @@ public:
|
|||||||
///load a COLLADA .dae file
|
///load a COLLADA .dae file
|
||||||
bool load(const char* filename);
|
bool load(const char* filename);
|
||||||
|
|
||||||
|
// resets the collada converter state
|
||||||
|
void reset ();
|
||||||
|
|
||||||
///save a snapshot in COLLADA physics .dae format.
|
///save a snapshot in COLLADA physics .dae format.
|
||||||
///if the filename is left empty, modify the filename used during loading
|
///if the filename is left empty, modify the filename used during loading
|
||||||
bool save(const char* filename = 0);
|
bool save(const char* filename = 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user