add commandline arguments to serialize demo for xml export and Bullet import file name
update AntTweakBar version in CDTestFramework add btCompoundShape support in BulletXmlWorldImporter (this importer is still premature/work-in-progress)
This commit is contained in:
@@ -18,9 +18,6 @@ subject to the following restrictions:
|
||||
#include "btBulletDynamicsCommon.h"
|
||||
#include "string_split.h"
|
||||
|
||||
#if defined(__APPLE__) || defined(__CELLOS_LV2__)
|
||||
#define stricmp(a, b) strcasecmp((a), (b))
|
||||
#endif
|
||||
|
||||
btBulletXmlWorldImporter::btBulletXmlWorldImporter(btDynamicsWorld* world)
|
||||
:btWorldImporter(world),
|
||||
@@ -61,7 +58,7 @@ static int get_int_attribute_by_name(const TiXmlElement* pElement, const char* a
|
||||
const TiXmlAttribute* pAttrib=pElement->FirstAttribute();
|
||||
while (pAttrib)
|
||||
{
|
||||
if (!stricmp(pAttrib->Name(),attribName))
|
||||
if (!strcmp(pAttrib->Name(),attribName))
|
||||
if (pAttrib->QueryIntValue(value)==TIXML_SUCCESS)
|
||||
return 1;
|
||||
// if (pAttrib->QueryDoubleValue(&dval)==TIXML_SUCCESS) printf( " d=%1.1f", dval);
|
||||
@@ -115,11 +112,13 @@ void btBulletXmlWorldImporter::deSerializeVector3FloatData(TiXmlNode* pParent,bt
|
||||
|
||||
|
||||
#define SET_INT_VALUE(xmlnode, targetdata, argname) \
|
||||
btAssert((xmlnode)->FirstChild(#argname) && (xmlnode)->FirstChild(#argname)->ToElement());\
|
||||
if ((xmlnode)->FirstChild(#argname) && (xmlnode)->FirstChild(#argname)->ToElement())\
|
||||
(targetdata)->argname= (int)atof(xmlnode->FirstChild(#argname)->ToElement()->GetText());
|
||||
|
||||
|
||||
#define SET_FLOAT_VALUE(xmlnode, targetdata, argname) \
|
||||
btAssert((xmlnode)->FirstChild(#argname) && (xmlnode)->FirstChild(#argname)->ToElement());\
|
||||
if ((xmlnode)->FirstChild(#argname) && (xmlnode)->FirstChild(#argname)->ToElement())\
|
||||
(targetdata)->argname= (float)atof(xmlnode->FirstChild(#argname)->ToElement()->GetText());
|
||||
|
||||
@@ -127,6 +126,7 @@ void btBulletXmlWorldImporter::deSerializeVector3FloatData(TiXmlNode* pParent,bt
|
||||
#define SET_POINTER_VALUE(xmlnode, targetdata, argname, pointertype) \
|
||||
{\
|
||||
TiXmlNode* node = xmlnode->FirstChild(#argname);\
|
||||
btAssert(node);\
|
||||
if (node)\
|
||||
{\
|
||||
const char* txt = (node)->ToElement()->GetText();\
|
||||
@@ -153,6 +153,7 @@ void btBulletXmlWorldImporter::deSerializeVector3FloatData(TiXmlNode* pParent,bt
|
||||
#define SET_MATRIX33_VALUE(n, targetdata, argname) \
|
||||
{\
|
||||
TiXmlNode* xmlnode = n->FirstChild(#argname);\
|
||||
btAssert(xmlnode);\
|
||||
if (xmlnode)\
|
||||
{\
|
||||
TiXmlNode* eleNode = xmlnode->FirstChild("m_el");\
|
||||
@@ -167,6 +168,7 @@ void btBulletXmlWorldImporter::deSerializeVector3FloatData(TiXmlNode* pParent,bt
|
||||
(targetdata)->argname.m_el[0].m_floats[3] = vec4.m_floats[3];\
|
||||
\
|
||||
TiXmlNode* n1 = eleNode->FirstChild()->NextSibling();\
|
||||
btAssert(n1);\
|
||||
if (n1)\
|
||||
{\
|
||||
const char* txt= n1->ToElement()->GetText();\
|
||||
@@ -177,6 +179,7 @@ void btBulletXmlWorldImporter::deSerializeVector3FloatData(TiXmlNode* pParent,bt
|
||||
(targetdata)->argname.m_el[1].m_floats[3] = vec4.m_floats[3];\
|
||||
\
|
||||
TiXmlNode* n2 = n1->NextSibling();\
|
||||
btAssert(n2);\
|
||||
if (n2)\
|
||||
{\
|
||||
const char* txt= n2->ToElement()->GetText();\
|
||||
@@ -194,6 +197,7 @@ void btBulletXmlWorldImporter::deSerializeVector3FloatData(TiXmlNode* pParent,bt
|
||||
#define SET_TRANSFORM_VALUE(n, targetdata, argname) \
|
||||
{\
|
||||
TiXmlNode* trNode = n->FirstChild(#argname);\
|
||||
btAssert(trNode);\
|
||||
if (trNode)\
|
||||
{\
|
||||
SET_VECTOR4_VALUE(trNode,&(targetdata)->argname,m_origin)\
|
||||
@@ -242,17 +246,55 @@ void btBulletXmlWorldImporter::deSerializeCompoundShapeChildData(TiXmlNode* pPar
|
||||
int ptr;
|
||||
get_int_attribute_by_name(pParent->ToElement(),"pointer",&ptr);
|
||||
|
||||
btCompoundShapeChildData* compoundChildData = (btCompoundShapeChildData*) btAlignedAlloc(sizeof(btCompoundShapeChildData),16);
|
||||
int numChildren = 0;
|
||||
btAlignedObjectArray<btCompoundShapeChildData>* compoundChildArrayPtr = new btAlignedObjectArray<btCompoundShapeChildData>;
|
||||
{
|
||||
TiXmlNode* transNode = pParent->FirstChild("m_transform");
|
||||
TiXmlNode* colShapeNode = pParent->FirstChild("m_childShape");
|
||||
TiXmlNode* marginNode = pParent->FirstChild("m_childMargin");
|
||||
TiXmlNode* childTypeNode = pParent->FirstChild("m_childShapeType");
|
||||
|
||||
SET_TRANSFORM_VALUE(pParent, compoundChildData,m_transform);
|
||||
SET_POINTER_VALUE(pParent, *compoundChildData,m_childShape,btCollisionShapeData*);
|
||||
int i=0;
|
||||
while (transNode && colShapeNode && marginNode && childTypeNode)
|
||||
{
|
||||
compoundChildArrayPtr->expandNonInitializing();
|
||||
SET_VECTOR4_VALUE (transNode,&compoundChildArrayPtr->at(i).m_transform,m_origin)
|
||||
SET_MATRIX33_VALUE(transNode,&compoundChildArrayPtr->at(i).m_transform,m_basis)
|
||||
|
||||
const char* txt = (colShapeNode)->ToElement()->GetText();
|
||||
compoundChildArrayPtr->at(i).m_childShape = (btCollisionShapeData*) (int) atof(txt);
|
||||
|
||||
btAssert(childTypeNode->ToElement());
|
||||
if (childTypeNode->ToElement())
|
||||
{
|
||||
compoundChildArrayPtr->at(i).m_childShapeType = (int)atof(childTypeNode->ToElement()->GetText());
|
||||
}
|
||||
|
||||
btAssert(marginNode->ToElement());
|
||||
if (marginNode->ToElement())
|
||||
{
|
||||
compoundChildArrayPtr->at(i).m_childMargin = (float)atof(marginNode->ToElement()->GetText());
|
||||
}
|
||||
|
||||
transNode = transNode->NextSibling("m_transform");
|
||||
colShapeNode = colShapeNode->NextSibling("m_childShape");
|
||||
marginNode = marginNode->NextSibling("m_childMargin");
|
||||
childTypeNode = childTypeNode->NextSibling("m_childShapeType");
|
||||
i++;
|
||||
}
|
||||
|
||||
numChildren = i;
|
||||
|
||||
}
|
||||
|
||||
btAssert(numChildren);
|
||||
if (numChildren)
|
||||
{
|
||||
m_compoundShapeChildDataArrays.push_back(compoundChildArrayPtr);
|
||||
btCompoundShapeChildData* cd = &compoundChildArrayPtr->at(0);
|
||||
m_pointerLookup.insert(ptr,cd);
|
||||
}
|
||||
|
||||
SET_INT_VALUE(pParent, compoundChildData, m_childShapeType);
|
||||
SET_FLOAT_VALUE(pParent, compoundChildData, m_childMargin);
|
||||
|
||||
|
||||
m_compoundShapeChildData.push_back(compoundChildData);
|
||||
m_pointerLookup.insert(ptr,compoundChildData);
|
||||
}
|
||||
|
||||
void btBulletXmlWorldImporter::deSerializeCompoundShapeData(TiXmlNode* pParent)
|
||||
@@ -262,12 +304,27 @@ void btBulletXmlWorldImporter::deSerializeCompoundShapeData(TiXmlNode* pParent)
|
||||
|
||||
btCompoundShapeData* compoundData = (btCompoundShapeData*) btAlignedAlloc(sizeof(btCompoundShapeData),16);
|
||||
|
||||
TiXmlNode* xmlColShape = pParent ->FirstChild("m_collisionShapeData");
|
||||
btAssert(xmlColShape);
|
||||
deSerializeCollisionShapeData(xmlColShape,&compoundData->m_collisionShapeData);
|
||||
|
||||
SET_INT_VALUE(pParent, compoundData,m_numChildShapes);
|
||||
|
||||
TiXmlNode* xmlShapeData = pParent->FirstChild("m_collisionShapeData");
|
||||
btAssert(xmlShapeData );
|
||||
deSerializeCollisionShapeData(xmlShapeData,&compoundData->m_collisionShapeData);
|
||||
|
||||
SET_POINTER_VALUE(pParent, *compoundData,m_childShapePtr,btCompoundShapeChildData*);
|
||||
SET_INT_VALUE(pParent, compoundData,m_numChildShapes);
|
||||
|
||||
{
|
||||
TiXmlNode* node = pParent->FirstChild("m_childShapePtr");\
|
||||
btAssert(node);
|
||||
while (node)
|
||||
{
|
||||
const char* txt = (node)->ToElement()->GetText();
|
||||
compoundData->m_childShapePtr = (btCompoundShapeChildData*) (int) atof(txt);
|
||||
node = node->NextSibling("m_childShapePtr");
|
||||
}
|
||||
//SET_POINTER_VALUE(xmlColShape, *compoundData,m_childShapePtr,btCompoundShapeChildData*);
|
||||
|
||||
}
|
||||
SET_FLOAT_VALUE(pParent, compoundData,m_collisionMargin);
|
||||
|
||||
m_collisionShapeData.push_back((btCollisionShapeData*)compoundData);
|
||||
@@ -524,11 +581,15 @@ void btBulletXmlWorldImporter::fixupCollisionDataPointers(btCollisionShapeData*
|
||||
{
|
||||
btCompoundShapeData* compound = (btCompoundShapeData*) shapeData;
|
||||
int ptr = (intptr_t) compound->m_childShapePtr;
|
||||
btCompoundShapeChildData** c = (btCompoundShapeChildData**)m_pointerLookup.find(ptr);
|
||||
void** cdptr = m_pointerLookup.find(ptr);
|
||||
btCompoundShapeChildData** c = (btCompoundShapeChildData**)cdptr;
|
||||
btAssert(c);
|
||||
if (c)
|
||||
{
|
||||
compound->m_childShapePtr = *c;
|
||||
} else
|
||||
{
|
||||
compound->m_childShapePtr = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -542,6 +603,9 @@ void btBulletXmlWorldImporter::fixupCollisionDataPointers(btCollisionShapeData*
|
||||
if (ptrptr)
|
||||
{
|
||||
convexData->m_unscaledPointsFloatPtr = *ptrptr;
|
||||
} else
|
||||
{
|
||||
convexData->m_unscaledPointsFloatPtr = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -570,7 +634,7 @@ void btBulletXmlWorldImporter::auto_serialize_root_level_children(TiXmlNode* pPa
|
||||
for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling(), numChildren++)
|
||||
{
|
||||
// printf("child Name=%s\n", pChild->Value());
|
||||
if (!stricmp(pChild->Value(),"btVector3FloatData"))
|
||||
if (!strcmp(pChild->Value(),"btVector3FloatData"))
|
||||
{
|
||||
int ptr;
|
||||
get_int_attribute_by_name(pChild->ToElement(),"pointer",&ptr);
|
||||
@@ -586,56 +650,56 @@ void btBulletXmlWorldImporter::auto_serialize_root_level_children(TiXmlNode* pPa
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!stricmp(pChild->Value(),"btGeneric6DofConstraintData"))
|
||||
if (!strcmp(pChild->Value(),"btGeneric6DofConstraintData"))
|
||||
{
|
||||
deSerializeGeneric6DofConstraintData(pChild);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!stricmp(pChild->Value(),"btStaticPlaneShapeData"))
|
||||
if (!strcmp(pChild->Value(),"btStaticPlaneShapeData"))
|
||||
{
|
||||
deSerializeStaticPlaneShapeData(pChild);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!stricmp(pChild->Value(),"btCompoundShapeData"))
|
||||
if (!strcmp(pChild->Value(),"btCompoundShapeData"))
|
||||
{
|
||||
deSerializeCompoundShapeData(pChild);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!stricmp(pChild->Value(),"btCompoundShapeChildData"))
|
||||
if (!strcmp(pChild->Value(),"btCompoundShapeChildData"))
|
||||
{
|
||||
deSerializeCompoundShapeChildData(pChild);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!stricmp(pChild->Value(),"btConvexHullShapeData"))
|
||||
if (!strcmp(pChild->Value(),"btConvexHullShapeData"))
|
||||
{
|
||||
deSerializeConvexHullShapeData(pChild);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!stricmp(pChild->Value(),"btDynamicsWorldFloatData"))
|
||||
if (!strcmp(pChild->Value(),"btDynamicsWorldFloatData"))
|
||||
{
|
||||
deSerializeDynamicsWorldData(pChild);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (!stricmp(pChild->Value(),"btConvexInternalShapeData"))
|
||||
if (!strcmp(pChild->Value(),"btConvexInternalShapeData"))
|
||||
{
|
||||
deSerializeConvexInternalShapeData(pChild);
|
||||
continue;
|
||||
}
|
||||
if (!stricmp(pChild->Value(),"btRigidBodyFloatData"))
|
||||
if (!strcmp(pChild->Value(),"btRigidBodyFloatData"))
|
||||
{
|
||||
deSerializeRigidBodyFloatData(pChild);
|
||||
continue;
|
||||
}
|
||||
|
||||
printf("Error: btBulletXmlWorldImporter doesn't support %s yet\n", pChild->Value());
|
||||
btAssert(0);
|
||||
//printf("Error: btBulletXmlWorldImporter doesn't support %s yet\n", pChild->Value());
|
||||
// btAssert(0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -643,15 +707,19 @@ void btBulletXmlWorldImporter::auto_serialize_root_level_children(TiXmlNode* pPa
|
||||
///fixup pointers in various places, in the right order
|
||||
|
||||
//fixup compoundshape child data
|
||||
for (int i=0;i<m_compoundShapeChildData.size();i++)
|
||||
for (int i=0;i<m_compoundShapeChildDataArrays.size();i++)
|
||||
{
|
||||
btCompoundShapeChildData* childData = m_compoundShapeChildData[i];
|
||||
int hashKey = (intptr_t) childData->m_childShape;
|
||||
btCollisionShapeData** ptrptr = (btCollisionShapeData**)m_pointerLookup[hashKey];
|
||||
btAssert(ptrptr);
|
||||
if (ptrptr)
|
||||
btAlignedObjectArray<btCompoundShapeChildData>* childDataArray = m_compoundShapeChildDataArrays[i];
|
||||
for (int c=0;c<childDataArray->size();c++)
|
||||
{
|
||||
childData->m_childShape = *ptrptr;
|
||||
btCompoundShapeChildData* childData = &childDataArray->at(c);
|
||||
int hashKey = (intptr_t) childData->m_childShape;
|
||||
btCollisionShapeData** ptrptr = (btCollisionShapeData**)m_pointerLookup[hashKey];
|
||||
btAssert(ptrptr);
|
||||
if (ptrptr)
|
||||
{
|
||||
childData->m_childShape = *ptrptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -668,7 +736,7 @@ void btBulletXmlWorldImporter::auto_serialize_root_level_children(TiXmlNode* pPa
|
||||
btRigidBodyData* rbData = m_rigidBodyData[i];
|
||||
int hashKey = (intptr_t)rbData->m_collisionObjectData.m_collisionShape;
|
||||
void** ptrptr = m_pointerLookup.find(hashKey);
|
||||
btAssert(ptrptr);
|
||||
//btAssert(ptrptr);
|
||||
rbData->m_collisionObjectData.m_broadphaseHandle = 0;
|
||||
rbData->m_collisionObjectData.m_rootCollisionShape = 0;
|
||||
rbData->m_collisionObjectData.m_name = 0;//tbd
|
||||
|
||||
Reference in New Issue
Block a user