2 Bullet Continuous Collision Detection and Physics Library
\r
3 Copyright (c) 2003-2012 Erwin Coumans http://bulletphysics.org
\r
5 This software is provided 'as-is', without any express or implied warranty.
\r
6 In no event will the authors be held liable for any damages arising from the use of this software.
\r
7 Permission is granted to anyone to use this software for any purpose,
\r
8 including commercial applications, and to alter it and redistribute it freely,
\r
9 subject to the following restrictions:
\r
11 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
\r
12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
\r
13 3. This notice may not be removed or altered from any source distribution.
\r
16 #include "btBulletXmlWorldImporter.h"
\r
17 #include "tinyxml.h"
\r
18 #include "btBulletDynamicsCommon.h"
\r
19 #include "string_split.h"
\r
22 btBulletXmlWorldImporter::btBulletXmlWorldImporter(btDynamicsWorld* world)
\r
23 :btWorldImporter(world),
\r
30 btBulletXmlWorldImporter::~btBulletXmlWorldImporter()
\r
36 static int get_double_attribute_by_name(const TiXmlElement* pElement, const char* attribName,double* value)
\r
41 const TiXmlAttribute* pAttrib=pElement->FirstAttribute();
\r
44 if (pAttrib->Name()==attribName)
\r
45 if (pAttrib->QueryDoubleValue(value)==TIXML_SUCCESS)
\r
47 pAttrib=pAttrib->Next();
\r
53 static int get_int_attribute_by_name(const TiXmlElement* pElement, const char* attribName,int* value)
\r
58 const TiXmlAttribute* pAttrib=pElement->FirstAttribute();
\r
61 if (!strcmp(pAttrib->Name(),attribName))
\r
62 if (pAttrib->QueryIntValue(value)==TIXML_SUCCESS)
\r
64 // if (pAttrib->QueryDoubleValue(&dval)==TIXML_SUCCESS) printf( " d=%1.1f", dval);
\r
65 pAttrib=pAttrib->Next();
\r
70 void stringToFloatArray(const std::string& string, btAlignedObjectArray<float>& floats)
\r
72 btAlignedObjectArray<std::string> pieces;
\r
74 bullet_utils::split( pieces, string, " ");
\r
75 for (unsigned int i = 0; i < pieces.size(); ++i)
\r
77 assert(pieces[i]!="");
\r
78 floats.push_back((float)atof(pieces[i].c_str()));
\r
83 static btVector3FloatData TextToVector3Data(const char* txt)
\r
86 btAlignedObjectArray<float> floats;
\r
87 stringToFloatArray(txt, floats);
\r
88 assert(floats.size()==4);
\r
90 btVector3FloatData vec4;
\r
91 vec4.m_floats[0] = floats[0];
\r
92 vec4.m_floats[1] = floats[1];
\r
93 vec4.m_floats[2] = floats[2];
\r
94 vec4.m_floats[3] = floats[3];
\r
98 void btBulletXmlWorldImporter::deSerializeVector3FloatData(TiXmlNode* pParent,btAlignedObjectArray<btVector3FloatData>& vectors)
\r
100 TiXmlNode* flNode = pParent->FirstChild("m_floats");
\r
102 while (flNode && flNode->FirstChild())
\r
104 TiXmlText* pText = flNode->FirstChild()->ToText();
\r
105 // printf("value = %s\n",pText->Value());
\r
106 btVector3FloatData vec4 = TextToVector3Data(pText->Value());
\r
107 vectors.push_back(vec4);
\r
108 flNode = flNode->NextSibling();
\r
114 #define SET_INT_VALUE(xmlnode, targetdata, argname) \
\r
115 btAssert((xmlnode)->FirstChild(#argname) && (xmlnode)->FirstChild(#argname)->ToElement());\
\r
116 if ((xmlnode)->FirstChild(#argname) && (xmlnode)->FirstChild(#argname)->ToElement())\
\r
117 (targetdata)->argname= (int)atof(xmlnode->FirstChild(#argname)->ToElement()->GetText());
\r
120 #define SET_FLOAT_VALUE(xmlnode, targetdata, argname) \
\r
121 btAssert((xmlnode)->FirstChild(#argname) && (xmlnode)->FirstChild(#argname)->ToElement());\
\r
122 if ((xmlnode)->FirstChild(#argname) && (xmlnode)->FirstChild(#argname)->ToElement())\
\r
123 (targetdata)->argname= (float)atof(xmlnode->FirstChild(#argname)->ToElement()->GetText());
\r
126 #define SET_POINTER_VALUE(xmlnode, targetdata, argname, pointertype) \
\r
128 TiXmlNode* node = xmlnode->FirstChild(#argname);\
\r
132 const char* txt = (node)->ToElement()->GetText();\
\r
133 (targetdata).argname= (pointertype) (int) atof(txt);\
\r
137 #define SET_VECTOR4_VALUE(xmlnode, targetdata, argname) \
\r
139 TiXmlNode* flNode = xmlnode->FirstChild(#argname);\
\r
141 if (flNode && flNode->FirstChild())\
\r
143 const char* txt= flNode->FirstChild()->ToElement()->GetText();\
\r
144 btVector3FloatData vec4 = TextToVector3Data(txt);\
\r
145 (targetdata)->argname.m_floats[0] = vec4.m_floats[0];\
\r
146 (targetdata)->argname.m_floats[1] = vec4.m_floats[1];\
\r
147 (targetdata)->argname.m_floats[2] = vec4.m_floats[2];\
\r
148 (targetdata)->argname.m_floats[3] = vec4.m_floats[3];\
\r
153 #define SET_MATRIX33_VALUE(n, targetdata, argname) \
\r
155 TiXmlNode* xmlnode = n->FirstChild(#argname);\
\r
156 btAssert(xmlnode);\
\r
159 TiXmlNode* eleNode = xmlnode->FirstChild("m_el");\
\r
160 btAssert(eleNode);\
\r
161 if (eleNode&& eleNode->FirstChild())\
\r
163 const char* txt= eleNode->FirstChild()->ToElement()->GetText();\
\r
164 btVector3FloatData vec4 = TextToVector3Data(txt);\
\r
165 (targetdata)->argname.m_el[0].m_floats[0] = vec4.m_floats[0];\
\r
166 (targetdata)->argname.m_el[0].m_floats[1] = vec4.m_floats[1];\
\r
167 (targetdata)->argname.m_el[0].m_floats[2] = vec4.m_floats[2];\
\r
168 (targetdata)->argname.m_el[0].m_floats[3] = vec4.m_floats[3];\
\r
170 TiXmlNode* n1 = eleNode->FirstChild()->NextSibling();\
\r
174 const char* txt= n1->ToElement()->GetText();\
\r
175 btVector3FloatData vec4 = TextToVector3Data(txt);\
\r
176 (targetdata)->argname.m_el[1].m_floats[0] = vec4.m_floats[0];\
\r
177 (targetdata)->argname.m_el[1].m_floats[1] = vec4.m_floats[1];\
\r
178 (targetdata)->argname.m_el[1].m_floats[2] = vec4.m_floats[2];\
\r
179 (targetdata)->argname.m_el[1].m_floats[3] = vec4.m_floats[3];\
\r
181 TiXmlNode* n2 = n1->NextSibling();\
\r
185 const char* txt= n2->ToElement()->GetText();\
\r
186 btVector3FloatData vec4 = TextToVector3Data(txt);\
\r
187 (targetdata)->argname.m_el[2].m_floats[0] = vec4.m_floats[0];\
\r
188 (targetdata)->argname.m_el[2].m_floats[1] = vec4.m_floats[1];\
\r
189 (targetdata)->argname.m_el[2].m_floats[2] = vec4.m_floats[2];\
\r
190 (targetdata)->argname.m_el[2].m_floats[3] = vec4.m_floats[3];\
\r
197 #define SET_TRANSFORM_VALUE(n, targetdata, argname) \
\r
199 TiXmlNode* trNode = n->FirstChild(#argname);\
\r
203 SET_VECTOR4_VALUE(trNode,&(targetdata)->argname,m_origin)\
\r
204 SET_MATRIX33_VALUE(trNode, &(targetdata)->argname,m_basis)\
\r
209 void btBulletXmlWorldImporter::deSerializeCollisionShapeData(TiXmlNode* pParent, btCollisionShapeData* colShapeData)
\r
211 SET_INT_VALUE(pParent,colShapeData,m_shapeType)
\r
212 colShapeData->m_name = 0;
\r
217 void btBulletXmlWorldImporter::deSerializeConvexHullShapeData(TiXmlNode* pParent)
\r
220 get_int_attribute_by_name(pParent->ToElement(),"pointer",&ptr);
\r
222 btConvexHullShapeData* convexHullData = (btConvexHullShapeData*)btAlignedAlloc(sizeof(btConvexHullShapeData), 16);
\r
224 TiXmlNode* xmlConvexInt = pParent->FirstChild("m_convexInternalShapeData");
\r
225 btAssert(xmlConvexInt);
\r
227 TiXmlNode* xmlColShape = xmlConvexInt ->FirstChild("m_collisionShapeData");
\r
228 btAssert(xmlColShape);
\r
230 deSerializeCollisionShapeData(xmlColShape,&convexHullData->m_convexInternalShapeData.m_collisionShapeData);
\r
232 SET_FLOAT_VALUE(xmlConvexInt,&convexHullData->m_convexInternalShapeData,m_collisionMargin)
\r
233 SET_VECTOR4_VALUE(xmlConvexInt,&convexHullData->m_convexInternalShapeData,m_localScaling)
\r
234 SET_VECTOR4_VALUE(xmlConvexInt,&convexHullData->m_convexInternalShapeData,m_implicitShapeDimensions)
\r
236 SET_POINTER_VALUE(pParent,*convexHullData,m_unscaledPointsFloatPtr,btVector3FloatData*);
\r
237 SET_POINTER_VALUE(pParent,*convexHullData,m_unscaledPointsDoublePtr,btVector3DoubleData*);
\r
238 SET_INT_VALUE(pParent,convexHullData,m_numUnscaledPoints);
\r
240 m_collisionShapeData.push_back((btCollisionShapeData*)convexHullData);
\r
241 m_pointerLookup.insert((void*)ptr,convexHullData);
\r
244 void btBulletXmlWorldImporter::deSerializeCompoundShapeChildData(TiXmlNode* pParent)
\r
247 get_int_attribute_by_name(pParent->ToElement(),"pointer",&ptr);
\r
249 int numChildren = 0;
\r
250 btAlignedObjectArray<btCompoundShapeChildData>* compoundChildArrayPtr = new btAlignedObjectArray<btCompoundShapeChildData>;
\r
252 TiXmlNode* transNode = pParent->FirstChild("m_transform");
\r
253 TiXmlNode* colShapeNode = pParent->FirstChild("m_childShape");
\r
254 TiXmlNode* marginNode = pParent->FirstChild("m_childMargin");
\r
255 TiXmlNode* childTypeNode = pParent->FirstChild("m_childShapeType");
\r
258 while (transNode && colShapeNode && marginNode && childTypeNode)
\r
260 compoundChildArrayPtr->expandNonInitializing();
\r
261 SET_VECTOR4_VALUE (transNode,&compoundChildArrayPtr->at(i).m_transform,m_origin)
\r
262 SET_MATRIX33_VALUE(transNode,&compoundChildArrayPtr->at(i).m_transform,m_basis)
\r
264 const char* txt = (colShapeNode)->ToElement()->GetText();
\r
265 compoundChildArrayPtr->at(i).m_childShape = (btCollisionShapeData*) (int) atof(txt);
\r
267 btAssert(childTypeNode->ToElement());
\r
268 if (childTypeNode->ToElement())
\r
270 compoundChildArrayPtr->at(i).m_childShapeType = (int)atof(childTypeNode->ToElement()->GetText());
\r
273 btAssert(marginNode->ToElement());
\r
274 if (marginNode->ToElement())
\r
276 compoundChildArrayPtr->at(i).m_childMargin = (float)atof(marginNode->ToElement()->GetText());
\r
279 transNode = transNode->NextSibling("m_transform");
\r
280 colShapeNode = colShapeNode->NextSibling("m_childShape");
\r
281 marginNode = marginNode->NextSibling("m_childMargin");
\r
282 childTypeNode = childTypeNode->NextSibling("m_childShapeType");
\r
290 btAssert(numChildren);
\r
293 m_compoundShapeChildDataArrays.push_back(compoundChildArrayPtr);
\r
294 btCompoundShapeChildData* cd = &compoundChildArrayPtr->at(0);
\r
295 m_pointerLookup.insert((void*)ptr,cd);
\r
300 void btBulletXmlWorldImporter::deSerializeCompoundShapeData(TiXmlNode* pParent)
\r
303 get_int_attribute_by_name(pParent->ToElement(),"pointer",&ptr);
\r
305 btCompoundShapeData* compoundData = (btCompoundShapeData*) btAlignedAlloc(sizeof(btCompoundShapeData),16);
\r
307 TiXmlNode* xmlColShape = pParent ->FirstChild("m_collisionShapeData");
\r
308 btAssert(xmlColShape);
\r
309 deSerializeCollisionShapeData(xmlColShape,&compoundData->m_collisionShapeData);
\r
311 SET_INT_VALUE(pParent, compoundData,m_numChildShapes);
\r
313 TiXmlNode* xmlShapeData = pParent->FirstChild("m_collisionShapeData");
\r
314 btAssert(xmlShapeData );
\r
317 TiXmlNode* node = pParent->FirstChild("m_childShapePtr");\
\r
321 const char* txt = (node)->ToElement()->GetText();
\r
322 compoundData->m_childShapePtr = (btCompoundShapeChildData*) (int) atof(txt);
\r
323 node = node->NextSibling("m_childShapePtr");
\r
325 //SET_POINTER_VALUE(xmlColShape, *compoundData,m_childShapePtr,btCompoundShapeChildData*);
\r
328 SET_FLOAT_VALUE(pParent, compoundData,m_collisionMargin);
\r
330 m_collisionShapeData.push_back((btCollisionShapeData*)compoundData);
\r
331 m_pointerLookup.insert((void*)ptr,compoundData);
\r
335 void btBulletXmlWorldImporter::deSerializeStaticPlaneShapeData(TiXmlNode* pParent)
\r
338 get_int_attribute_by_name(pParent->ToElement(),"pointer",&ptr);
\r
340 btStaticPlaneShapeData* planeData = (btStaticPlaneShapeData*) btAlignedAlloc(sizeof(btStaticPlaneShapeData),16);
\r
342 TiXmlNode* xmlShapeData = pParent->FirstChild("m_collisionShapeData");
\r
343 btAssert(xmlShapeData );
\r
344 deSerializeCollisionShapeData(xmlShapeData,&planeData->m_collisionShapeData);
\r
346 SET_VECTOR4_VALUE(pParent, planeData,m_localScaling);
\r
347 SET_VECTOR4_VALUE(pParent, planeData,m_planeNormal);
\r
348 SET_FLOAT_VALUE(pParent, planeData,m_planeConstant);
\r
350 m_collisionShapeData.push_back((btCollisionShapeData*)planeData);
\r
351 m_pointerLookup.insert((void*)ptr,planeData);
\r
355 void btBulletXmlWorldImporter::deSerializeDynamicsWorldData(TiXmlNode* pParent)
\r
357 btContactSolverInfo solverInfo;
\r
358 //btVector3 gravity(0,0,0);
\r
360 //setDynamicsWorldInfo(gravity,solverInfo);
\r
362 //gravity and world info
\r
365 void btBulletXmlWorldImporter::deSerializeConvexInternalShapeData(TiXmlNode* pParent)
\r
368 get_int_attribute_by_name(pParent->ToElement(),"pointer",&ptr);
\r
371 btConvexInternalShapeData* convexShape = (btConvexInternalShapeData*) btAlignedAlloc(sizeof(btConvexInternalShapeData),16);
\r
372 memset(convexShape,0,sizeof(btConvexInternalShapeData));
\r
374 TiXmlNode* xmlShapeData = pParent->FirstChild("m_collisionShapeData");
\r
375 btAssert(xmlShapeData );
\r
377 deSerializeCollisionShapeData(xmlShapeData,&convexShape->m_collisionShapeData);
\r
380 SET_FLOAT_VALUE(pParent,convexShape,m_collisionMargin)
\r
381 SET_VECTOR4_VALUE(pParent,convexShape,m_localScaling)
\r
382 SET_VECTOR4_VALUE(pParent,convexShape,m_implicitShapeDimensions)
\r
384 m_collisionShapeData.push_back((btCollisionShapeData*)convexShape);
\r
385 m_pointerLookup.insert((void*)ptr,convexShape);
\r
390 enum btTypedConstraintType
\r
392 POINT2POINT_CONSTRAINT_TYPE=3,
\r
393 HINGE_CONSTRAINT_TYPE,
\r
394 CONETWIST_CONSTRAINT_TYPE,
\r
395 // D6_CONSTRAINT_TYPE,
\r
396 SLIDER_CONSTRAINT_TYPE,
\r
397 CONTACT_CONSTRAINT_TYPE,
\r
398 D6_SPRING_CONSTRAINT_TYPE,
\r
399 GEAR_CONSTRAINT_TYPE,
\r
400 MAX_CONSTRAINT_TYPE
\r
405 void btBulletXmlWorldImporter::deSerializeGeneric6DofConstraintData(TiXmlNode* pParent)
\r
408 get_int_attribute_by_name(pParent->ToElement(),"pointer",&ptr);
\r
410 btGeneric6DofConstraintData* dof6Data = (btGeneric6DofConstraintData*)btAlignedAlloc(sizeof(btGeneric6DofConstraintData),16);
\r
413 TiXmlNode* n = pParent->FirstChild("m_typeConstraintData");
\r
416 SET_POINTER_VALUE(n,dof6Data->m_typeConstraintData,m_rbA,btRigidBodyData*);
\r
417 SET_POINTER_VALUE(n,dof6Data->m_typeConstraintData,m_rbB,btRigidBodyData*);
\r
418 dof6Data->m_typeConstraintData.m_name = 0;//tbd
\r
419 SET_INT_VALUE(n,&dof6Data->m_typeConstraintData,m_objectType);
\r
420 SET_INT_VALUE(n,&dof6Data->m_typeConstraintData,m_userConstraintType);
\r
421 SET_INT_VALUE(n,&dof6Data->m_typeConstraintData,m_userConstraintId);
\r
422 SET_INT_VALUE(n,&dof6Data->m_typeConstraintData,m_needsFeedback);
\r
423 SET_FLOAT_VALUE(n,&dof6Data->m_typeConstraintData,m_appliedImpulse);
\r
424 SET_FLOAT_VALUE(n,&dof6Data->m_typeConstraintData,m_dbgDrawSize);
\r
425 SET_INT_VALUE(n,&dof6Data->m_typeConstraintData,m_disableCollisionsBetweenLinkedBodies);
\r
426 SET_INT_VALUE(n,&dof6Data->m_typeConstraintData,m_overrideNumSolverIterations);
\r
427 SET_FLOAT_VALUE(n,&dof6Data->m_typeConstraintData,m_breakingImpulseThreshold);
\r
428 SET_INT_VALUE(n,&dof6Data->m_typeConstraintData,m_isEnabled);
\r
432 SET_TRANSFORM_VALUE( pParent, dof6Data, m_rbAFrame);
\r
433 SET_TRANSFORM_VALUE( pParent, dof6Data, m_rbBFrame);
\r
434 SET_VECTOR4_VALUE(pParent, dof6Data, m_linearUpperLimit);
\r
435 SET_VECTOR4_VALUE(pParent, dof6Data, m_linearLowerLimit);
\r
436 SET_VECTOR4_VALUE(pParent, dof6Data, m_angularUpperLimit);
\r
437 SET_VECTOR4_VALUE(pParent, dof6Data, m_angularLowerLimit);
\r
438 SET_INT_VALUE(pParent, dof6Data,m_useLinearReferenceFrameA);
\r
439 SET_INT_VALUE(pParent, dof6Data,m_useOffsetForConstraintFrame);
\r
441 m_constraintData.push_back((btTypedConstraintData*)dof6Data);
\r
442 m_pointerLookup.insert((void*)ptr,dof6Data);
\r
445 void btBulletXmlWorldImporter::deSerializeRigidBodyFloatData(TiXmlNode* pParent)
\r
448 if (!get_int_attribute_by_name(pParent->ToElement(),"pointer",&ptr))
\r
454 btRigidBodyData* rbData = (btRigidBodyData*)btAlignedAlloc(sizeof(btRigidBodyData),16);
\r
456 TiXmlNode* n = pParent->FirstChild("m_collisionObjectData");
\r
460 SET_POINTER_VALUE(n,rbData->m_collisionObjectData,m_collisionShape, void*);
\r
461 SET_TRANSFORM_VALUE(n,&rbData->m_collisionObjectData,m_worldTransform);
\r
462 SET_TRANSFORM_VALUE(n,&rbData->m_collisionObjectData,m_interpolationWorldTransform);
\r
463 SET_VECTOR4_VALUE(n,&rbData->m_collisionObjectData,m_interpolationLinearVelocity)
\r
464 SET_VECTOR4_VALUE(n,&rbData->m_collisionObjectData,m_interpolationAngularVelocity)
\r
465 SET_VECTOR4_VALUE(n,&rbData->m_collisionObjectData,m_anisotropicFriction)
\r
466 SET_FLOAT_VALUE(n,&rbData->m_collisionObjectData,m_contactProcessingThreshold);
\r
467 SET_FLOAT_VALUE(n,&rbData->m_collisionObjectData,m_deactivationTime);
\r
468 SET_FLOAT_VALUE(n,&rbData->m_collisionObjectData,m_friction);
\r
469 SET_FLOAT_VALUE(n,&rbData->m_collisionObjectData,m_restitution);
\r
470 SET_FLOAT_VALUE(n,&rbData->m_collisionObjectData,m_hitFraction);
\r
471 SET_FLOAT_VALUE(n,&rbData->m_collisionObjectData,m_ccdSweptSphereRadius);
\r
472 SET_FLOAT_VALUE(n,&rbData->m_collisionObjectData,m_ccdMotionThreshold);
\r
473 SET_INT_VALUE(n,&rbData->m_collisionObjectData,m_hasAnisotropicFriction);
\r
474 SET_INT_VALUE(n,&rbData->m_collisionObjectData,m_collisionFlags);
\r
475 SET_INT_VALUE(n,&rbData->m_collisionObjectData,m_islandTag1);
\r
476 SET_INT_VALUE(n,&rbData->m_collisionObjectData,m_companionId);
\r
477 SET_INT_VALUE(n,&rbData->m_collisionObjectData,m_activationState1);
\r
478 SET_INT_VALUE(n,&rbData->m_collisionObjectData,m_internalType);
\r
479 SET_INT_VALUE(n,&rbData->m_collisionObjectData,m_checkCollideWith);
\r
482 // SET_VECTOR4_VALUE(pParent,rbData,m_linearVelocity);
\r
484 SET_MATRIX33_VALUE(pParent,rbData,m_invInertiaTensorWorld);
\r
487 SET_VECTOR4_VALUE(pParent,rbData,m_linearVelocity)
\r
488 SET_VECTOR4_VALUE(pParent,rbData,m_angularVelocity)
\r
489 SET_VECTOR4_VALUE(pParent,rbData,m_angularFactor)
\r
490 SET_VECTOR4_VALUE(pParent,rbData,m_linearFactor)
\r
491 SET_VECTOR4_VALUE(pParent,rbData,m_gravity)
\r
492 SET_VECTOR4_VALUE(pParent,rbData,m_gravity_acceleration )
\r
493 SET_VECTOR4_VALUE(pParent,rbData,m_invInertiaLocal)
\r
494 SET_VECTOR4_VALUE(pParent,rbData,m_totalTorque)
\r
495 SET_VECTOR4_VALUE(pParent,rbData,m_totalForce)
\r
496 SET_FLOAT_VALUE(pParent,rbData,m_inverseMass);
\r
497 SET_FLOAT_VALUE(pParent,rbData,m_linearDamping);
\r
498 SET_FLOAT_VALUE(pParent,rbData,m_angularDamping);
\r
499 SET_FLOAT_VALUE(pParent,rbData,m_additionalDampingFactor);
\r
500 SET_FLOAT_VALUE(pParent,rbData,m_additionalLinearDampingThresholdSqr);
\r
501 SET_FLOAT_VALUE(pParent,rbData,m_additionalAngularDampingThresholdSqr);
\r
502 SET_FLOAT_VALUE(pParent,rbData,m_additionalAngularDampingFactor);
\r
503 SET_FLOAT_VALUE(pParent,rbData,m_angularSleepingThreshold);
\r
504 SET_FLOAT_VALUE(pParent,rbData,m_linearSleepingThreshold);
\r
505 SET_INT_VALUE(pParent,rbData,m_additionalDamping);
\r
508 m_rigidBodyData.push_back(rbData);
\r
509 m_pointerLookup.insert((void*)ptr,rbData);
\r
511 // rbData->m_collisionObjectData.m_collisionShape = (void*) (int)atof(txt);
\r
515 TETRAHEDRAL_SHAPE_PROXYTYPE,
\r
516 CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE,
\r
518 CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE,
\r
519 CUSTOM_POLYHEDRAL_SHAPE_TYPE,
\r
520 //implicit convex shapes
\r
521 IMPLICIT_CONVEX_SHAPES_START_HERE,
\r
522 SPHERE_SHAPE_PROXYTYPE,
\r
523 MULTI_SPHERE_SHAPE_PROXYTYPE,
\r
524 CAPSULE_SHAPE_PROXYTYPE,
\r
525 CONE_SHAPE_PROXYTYPE,
\r
526 CONVEX_SHAPE_PROXYTYPE,
\r
527 CYLINDER_SHAPE_PROXYTYPE,
\r
528 UNIFORM_SCALING_SHAPE_PROXYTYPE,
\r
529 MINKOWSKI_SUM_SHAPE_PROXYTYPE,
\r
530 MINKOWSKI_DIFFERENCE_SHAPE_PROXYTYPE,
\r
531 BOX_2D_SHAPE_PROXYTYPE,
\r
532 CONVEX_2D_SHAPE_PROXYTYPE,
\r
533 CUSTOM_CONVEX_SHAPE_TYPE,
\r
535 CONCAVE_SHAPES_START_HERE,
\r
536 //keep all the convex shapetype below here, for the check IsConvexShape in broadphase proxy!
\r
537 TRIANGLE_MESH_SHAPE_PROXYTYPE,
\r
538 SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE,
\r
539 ///used for demo integration FAST/Swift collision library and Bullet
\r
540 FAST_CONCAVE_MESH_PROXYTYPE,
\r
542 TERRAIN_SHAPE_PROXYTYPE,
\r
543 ///Used for GIMPACT Trimesh integration
\r
544 GIMPACT_SHAPE_PROXYTYPE,
\r
545 ///Multimaterial mesh
\r
546 MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE,
\r
550 CUSTOM_CONCAVE_SHAPE_TYPE,
\r
551 CONCAVE_SHAPES_END_HERE,
\r
555 SOFTBODY_SHAPE_PROXYTYPE,
\r
556 HFFLUID_SHAPE_PROXYTYPE,
\r
557 HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE,
\r
558 INVALID_SHAPE_PROXYTYPE,
\r
560 MAX_BROADPHASE_COLLISION_TYPES
\r
563 void btBulletXmlWorldImporter::fixupConstraintData(btTypedConstraintData* tcd)
\r
567 btRigidBodyData** ptrptr = (btRigidBodyData**)m_pointerLookup.find(tcd->m_rbA);
\r
569 tcd->m_rbA = ptrptr? *ptrptr : 0;
\r
573 btRigidBodyData** ptrptr = (btRigidBodyData**)m_pointerLookup.find(tcd->m_rbB);
\r
575 tcd->m_rbB = ptrptr? *ptrptr : 0;
\r
580 void btBulletXmlWorldImporter::fixupCollisionDataPointers(btCollisionShapeData* shapeData)
\r
583 switch (shapeData->m_shapeType)
\r
586 case COMPOUND_SHAPE_PROXYTYPE:
\r
588 btCompoundShapeData* compound = (btCompoundShapeData*) shapeData;
\r
590 void** cdptr = m_pointerLookup.find((void*)compound->m_childShapePtr);
\r
591 btCompoundShapeChildData** c = (btCompoundShapeChildData**)cdptr;
\r
595 compound->m_childShapePtr = *c;
\r
598 compound->m_childShapePtr = 0;
\r
603 case CONVEX_HULL_SHAPE_PROXYTYPE:
\r
605 btConvexHullShapeData* convexData = (btConvexHullShapeData*)shapeData;
\r
606 btVector3FloatData** ptrptr = (btVector3FloatData**)m_pointerLookup.find((void*)convexData->m_unscaledPointsFloatPtr);
\r
610 convexData->m_unscaledPointsFloatPtr = *ptrptr;
\r
613 convexData->m_unscaledPointsFloatPtr = 0;
\r
618 case BOX_SHAPE_PROXYTYPE:
\r
619 case TRIANGLE_SHAPE_PROXYTYPE:
\r
620 case STATIC_PLANE_PROXYTYPE:
\r
621 case EMPTY_SHAPE_PROXYTYPE:
\r
632 void btBulletXmlWorldImporter::auto_serialize_root_level_children(TiXmlNode* pParent)
\r
634 int numChildren = 0;
\r
639 for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling(), numChildren++)
\r
641 // printf("child Name=%s\n", pChild->Value());
\r
642 if (!strcmp(pChild->Value(),"btVector3FloatData"))
\r
645 get_int_attribute_by_name(pChild->ToElement(),"pointer",&ptr);
\r
647 btAlignedObjectArray<btVector3FloatData> v;
\r
648 deSerializeVector3FloatData(pChild,v);
\r
649 int numVectors = v.size();
\r
650 btVector3FloatData* vectors= (btVector3FloatData*) btAlignedAlloc(sizeof(btVector3FloatData)*numVectors,16);
\r
651 for (int i=0;i<numVectors;i++)
\r
653 m_floatVertexArrays.push_back(vectors);
\r
654 m_pointerLookup.insert((void*)ptr,vectors);
\r
658 if (!strcmp(pChild->Value(),"btGeneric6DofConstraintData"))
\r
660 deSerializeGeneric6DofConstraintData(pChild);
\r
664 if (!strcmp(pChild->Value(),"btStaticPlaneShapeData"))
\r
666 deSerializeStaticPlaneShapeData(pChild);
\r
670 if (!strcmp(pChild->Value(),"btCompoundShapeData"))
\r
672 deSerializeCompoundShapeData(pChild);
\r
676 if (!strcmp(pChild->Value(),"btCompoundShapeChildData"))
\r
678 deSerializeCompoundShapeChildData(pChild);
\r
682 if (!strcmp(pChild->Value(),"btConvexHullShapeData"))
\r
684 deSerializeConvexHullShapeData(pChild);
\r
688 if (!strcmp(pChild->Value(),"btDynamicsWorldFloatData"))
\r
690 deSerializeDynamicsWorldData(pChild);
\r
695 if (!strcmp(pChild->Value(),"btConvexInternalShapeData"))
\r
697 deSerializeConvexInternalShapeData(pChild);
\r
700 if (!strcmp(pChild->Value(),"btRigidBodyFloatData"))
\r
702 deSerializeRigidBodyFloatData(pChild);
\r
706 //printf("Error: btBulletXmlWorldImporter doesn't support %s yet\n", pChild->Value());
\r
711 ///=================================================================
\r
712 ///fixup pointers in various places, in the right order
\r
714 //fixup compoundshape child data
\r
715 for (int i=0;i<m_compoundShapeChildDataArrays.size();i++)
\r
717 btAlignedObjectArray<btCompoundShapeChildData>* childDataArray = m_compoundShapeChildDataArrays[i];
\r
718 for (int c=0;c<childDataArray->size();c++)
\r
720 btCompoundShapeChildData* childData = &childDataArray->at(c);
\r
721 btCollisionShapeData** ptrptr = (btCollisionShapeData**)m_pointerLookup[childData->m_childShape];
\r
725 childData->m_childShape = *ptrptr;
\r
730 for (int i=0;i<this->m_collisionShapeData.size();i++)
\r
732 btCollisionShapeData* shapeData = m_collisionShapeData[i];
\r
733 fixupCollisionDataPointers(shapeData);
\r
737 ///now fixup pointers
\r
738 for (int i=0;i<m_rigidBodyData.size();i++)
\r
740 btRigidBodyData* rbData = m_rigidBodyData[i];
\r
742 void** ptrptr = m_pointerLookup.find(rbData->m_collisionObjectData.m_collisionShape);
\r
743 //btAssert(ptrptr);
\r
744 rbData->m_collisionObjectData.m_broadphaseHandle = 0;
\r
745 rbData->m_collisionObjectData.m_rootCollisionShape = 0;
\r
746 rbData->m_collisionObjectData.m_name = 0;//tbd
\r
749 rbData->m_collisionObjectData.m_collisionShape = *ptrptr;
\r
755 for (int i=0;i<m_constraintData.size();i++)
\r
757 btTypedConstraintData* tcd = m_constraintData[i];
\r
758 fixupConstraintData(tcd);
\r
761 ///=================================================================
\r
762 ///convert data into Bullet data in the right order
\r
764 ///convert collision shapes
\r
765 for (int i=0;i<this->m_collisionShapeData.size();i++)
\r
767 btCollisionShapeData* shapeData = m_collisionShapeData[i];
\r
768 btCollisionShape* shape = convertCollisionShape(shapeData);
\r
771 m_shapeMap.insert(shapeData,shape);
\r
773 if (shape&& shapeData->m_name)
\r
775 char* newname = duplicateName(shapeData->m_name);
\r
776 m_objectNameMap.insert(shape,newname);
\r
777 m_nameShapeMap.insert(newname,shape);
\r
781 for (int i=0;i<m_rigidBodyData.size();i++)
\r
783 #ifdef BT_USE_DOUBLE_PRECISION
\r
784 convertRigidBodyDouble(m_rigidBodyData[i]);
\r
786 convertRigidBodyFloat(m_rigidBodyData[i]);
\r
790 for (int i=0;i<m_constraintData.size();i++)
\r
792 btTypedConstraintData* tcd = m_constraintData[i];
\r
793 bool isDoublePrecision = false;
\r
794 btRigidBody* rbA = 0;
\r
795 btRigidBody* rbB = 0;
\r
797 btCollisionObject** ptrptr = m_bodyMap.find(tcd->m_rbA);
\r
800 rbA = btRigidBody::upcast(*ptrptr);
\r
804 btCollisionObject** ptrptr = m_bodyMap.find(tcd->m_rbB);
\r
807 rbB = btRigidBody::upcast(*ptrptr);
\r
812 convertConstraint(tcd,rbA,rbB,isDoublePrecision, m_fileVersion);
\r
818 void btBulletXmlWorldImporter::auto_serialize(TiXmlNode* pParent)
\r
820 // TiXmlElement* root = pParent->FirstChildElement("bullet_physics");
\r
824 for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling())
\r
826 if (pChild->Type()==TiXmlNode::TINYXML_ELEMENT)
\r
828 // printf("root Name=%s\n", pChild->Value());
\r
829 auto_serialize_root_level_children(pChild);
\r
834 printf("ERROR: no bullet_physics element\n");
\r
841 bool btBulletXmlWorldImporter::loadFile(const char* fileName)
\r
843 TiXmlDocument doc(fileName);
\r
845 bool loadOkay = doc.LoadFile();
\r
846 //dump_to_stdout(&doc,0);
\r
851 if (get_int_attribute_by_name(doc.FirstChildElement()->ToElement(),"version", &m_fileVersion))
\r
853 if (m_fileVersion==281)
\r
857 get_int_attribute_by_name(doc.FirstChildElement()->ToElement(),"itemcount", &itemcount);
\r
859 auto_serialize(&doc);
\r