2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2014 Erwin Coumans http://bulletphysics.org
5 This software is provided 'as-is', without any express or implied warranty.
6 In no event will the authors be held liable for any damages arising from the use of this software.
7 Permission is granted to anyone to use this software for any purpose,
8 including commercial applications, and to alter it and redistribute it freely,
9 subject to the following restrictions:
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.
12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
13 3. This notice may not be removed or altered from any source distribution.
16 #include "btCollisionWorldImporter.h"
17 #include "btBulletCollisionCommon.h"
18 #include "LinearMath/btSerializer.h" //for btBulletSerializedArrays definition
20 #ifdef SUPPORT_GIMPACT_SHAPE_IMPORT
21 #include "BulletCollision/Gimpact/btGImpactShape.h"
22 #endif //SUPPORT_GIMPACT_SHAPE_IMPORT
24 btCollisionWorldImporter::btCollisionWorldImporter(btCollisionWorld* world)
25 : m_collisionWorld(world),
30 btCollisionWorldImporter::~btCollisionWorldImporter()
34 bool btCollisionWorldImporter::convertAllObjects(btBulletSerializedArrays* arrays)
41 for (i = 0; i < arrays->m_bvhsDouble.size(); i++)
43 btOptimizedBvh* bvh = createOptimizedBvh();
44 btQuantizedBvhDoubleData* bvhData = arrays->m_bvhsDouble[i];
45 bvh->deSerializeDouble(*bvhData);
46 m_bvhMap.insert(arrays->m_bvhsDouble[i], bvh);
48 for (i = 0; i < arrays->m_bvhsFloat.size(); i++)
50 btOptimizedBvh* bvh = createOptimizedBvh();
51 btQuantizedBvhFloatData* bvhData = arrays->m_bvhsFloat[i];
52 bvh->deSerializeFloat(*bvhData);
53 m_bvhMap.insert(arrays->m_bvhsFloat[i], bvh);
56 for (i = 0; i < arrays->m_colShapeData.size(); i++)
58 btCollisionShapeData* shapeData = arrays->m_colShapeData[i];
59 btCollisionShape* shape = convertCollisionShape(shapeData);
62 // printf("shapeMap.insert(%x,%x)\n",shapeData,shape);
63 m_shapeMap.insert(shapeData, shape);
66 if (shape && shapeData->m_name)
68 char* newname = duplicateName(shapeData->m_name);
69 m_objectNameMap.insert(shape, newname);
70 m_nameShapeMap.insert(newname, shape);
74 for (i = 0; i < arrays->m_collisionObjectDataDouble.size(); i++)
76 btCollisionObjectDoubleData* colObjData = arrays->m_collisionObjectDataDouble[i];
77 btCollisionShape** shapePtr = m_shapeMap.find(colObjData->m_collisionShape);
78 if (shapePtr && *shapePtr)
80 btTransform startTransform;
81 colObjData->m_worldTransform.m_origin.m_floats[3] = 0.f;
82 startTransform.deSerializeDouble(colObjData->m_worldTransform);
84 btCollisionShape* shape = (btCollisionShape*)*shapePtr;
85 btCollisionObject* body = createCollisionObject(startTransform, shape, colObjData->m_name);
86 body->setFriction(btScalar(colObjData->m_friction));
87 body->setRestitution(btScalar(colObjData->m_restitution));
89 #ifdef USE_INTERNAL_EDGE_UTILITY
90 if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
92 btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape;
93 if (trimesh->getTriangleInfoMap())
95 body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK);
98 #endif //USE_INTERNAL_EDGE_UTILITY
99 m_bodyMap.insert(colObjData, body);
103 printf("error: no shape found\n");
106 for (i = 0; i < arrays->m_collisionObjectDataFloat.size(); i++)
108 btCollisionObjectFloatData* colObjData = arrays->m_collisionObjectDataFloat[i];
109 btCollisionShape** shapePtr = m_shapeMap.find(colObjData->m_collisionShape);
110 if (shapePtr && *shapePtr)
112 btTransform startTransform;
113 colObjData->m_worldTransform.m_origin.m_floats[3] = 0.f;
114 startTransform.deSerializeFloat(colObjData->m_worldTransform);
116 btCollisionShape* shape = (btCollisionShape*)*shapePtr;
117 btCollisionObject* body = createCollisionObject(startTransform, shape, colObjData->m_name);
119 #ifdef USE_INTERNAL_EDGE_UTILITY
120 if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
122 btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape;
123 if (trimesh->getTriangleInfoMap())
125 body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK);
128 #endif //USE_INTERNAL_EDGE_UTILITY
129 m_bodyMap.insert(colObjData, body);
133 printf("error: no shape found\n");
140 void btCollisionWorldImporter::deleteAllData()
144 for (i = 0; i < m_allocatedCollisionObjects.size(); i++)
146 if (m_collisionWorld)
147 m_collisionWorld->removeCollisionObject(m_allocatedCollisionObjects[i]);
148 delete m_allocatedCollisionObjects[i];
151 m_allocatedCollisionObjects.clear();
153 for (i = 0; i < m_allocatedCollisionShapes.size(); i++)
155 delete m_allocatedCollisionShapes[i];
157 m_allocatedCollisionShapes.clear();
159 for (i = 0; i < m_allocatedBvhs.size(); i++)
161 delete m_allocatedBvhs[i];
163 m_allocatedBvhs.clear();
165 for (i = 0; i < m_allocatedTriangleInfoMaps.size(); i++)
167 delete m_allocatedTriangleInfoMaps[i];
169 m_allocatedTriangleInfoMaps.clear();
170 for (i = 0; i < m_allocatedTriangleIndexArrays.size(); i++)
172 delete m_allocatedTriangleIndexArrays[i];
174 m_allocatedTriangleIndexArrays.clear();
175 for (i = 0; i < m_allocatedNames.size(); i++)
177 delete[] m_allocatedNames[i];
179 m_allocatedNames.clear();
181 for (i = 0; i < m_allocatedbtStridingMeshInterfaceDatas.size(); i++)
183 btStridingMeshInterfaceData* curData = m_allocatedbtStridingMeshInterfaceDatas[i];
185 for (int a = 0; a < curData->m_numMeshParts; a++)
187 btMeshPartData* curPart = &curData->m_meshPartsPtr[a];
188 if (curPart->m_vertices3f)
189 delete[] curPart->m_vertices3f;
191 if (curPart->m_vertices3d)
192 delete[] curPart->m_vertices3d;
194 if (curPart->m_indices32)
195 delete[] curPart->m_indices32;
197 if (curPart->m_3indices16)
198 delete[] curPart->m_3indices16;
200 if (curPart->m_indices16)
201 delete[] curPart->m_indices16;
203 if (curPart->m_3indices8)
204 delete[] curPart->m_3indices8;
206 delete[] curData->m_meshPartsPtr;
209 m_allocatedbtStridingMeshInterfaceDatas.clear();
211 for (i = 0; i < m_indexArrays.size(); i++)
213 btAlignedFree(m_indexArrays[i]);
215 m_indexArrays.clear();
217 for (i = 0; i < m_shortIndexArrays.size(); i++)
219 btAlignedFree(m_shortIndexArrays[i]);
221 m_shortIndexArrays.clear();
223 for (i = 0; i < m_charIndexArrays.size(); i++)
225 btAlignedFree(m_charIndexArrays[i]);
227 m_charIndexArrays.clear();
229 for (i = 0; i < m_floatVertexArrays.size(); i++)
231 btAlignedFree(m_floatVertexArrays[i]);
233 m_floatVertexArrays.clear();
235 for (i = 0; i < m_doubleVertexArrays.size(); i++)
237 btAlignedFree(m_doubleVertexArrays[i]);
239 m_doubleVertexArrays.clear();
242 btCollisionShape* btCollisionWorldImporter::convertCollisionShape(btCollisionShapeData* shapeData)
244 btCollisionShape* shape = 0;
246 switch (shapeData->m_shapeType)
248 case STATIC_PLANE_PROXYTYPE:
250 btStaticPlaneShapeData* planeData = (btStaticPlaneShapeData*)shapeData;
251 btVector3 planeNormal, localScaling;
252 planeNormal.deSerializeFloat(planeData->m_planeNormal);
253 localScaling.deSerializeFloat(planeData->m_localScaling);
254 shape = createPlaneShape(planeNormal, planeData->m_planeConstant);
255 shape->setLocalScaling(localScaling);
259 case SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE:
261 btScaledTriangleMeshShapeData* scaledMesh = (btScaledTriangleMeshShapeData*)shapeData;
262 btCollisionShapeData* colShapeData = (btCollisionShapeData*)&scaledMesh->m_trimeshShapeData;
263 colShapeData->m_shapeType = TRIANGLE_MESH_SHAPE_PROXYTYPE;
264 btCollisionShape* childShape = convertCollisionShape(colShapeData);
265 btBvhTriangleMeshShape* meshShape = (btBvhTriangleMeshShape*)childShape;
266 btVector3 localScaling;
267 localScaling.deSerializeFloat(scaledMesh->m_localScaling);
269 shape = createScaledTrangleMeshShape(meshShape, localScaling);
272 #ifdef SUPPORT_GIMPACT_SHAPE_IMPORT
273 case GIMPACT_SHAPE_PROXYTYPE:
275 btGImpactMeshShapeData* gimpactData = (btGImpactMeshShapeData*)shapeData;
276 if (gimpactData->m_gimpactSubType == CONST_GIMPACT_TRIMESH_SHAPE)
278 btStridingMeshInterfaceData* interfaceData = createStridingMeshInterfaceData(&gimpactData->m_meshInterface);
279 btTriangleIndexVertexArray* meshInterface = createMeshInterface(*interfaceData);
281 btGImpactMeshShape* gimpactShape = createGimpactShape(meshInterface);
282 btVector3 localScaling;
283 localScaling.deSerializeFloat(gimpactData->m_localScaling);
284 gimpactShape->setLocalScaling(localScaling);
285 gimpactShape->setMargin(btScalar(gimpactData->m_collisionMargin));
286 gimpactShape->updateBound();
287 shape = gimpactShape;
291 printf("unsupported gimpact sub type\n");
295 #endif //SUPPORT_GIMPACT_SHAPE_IMPORT
296 //The btCapsuleShape* API has issue passing the margin/scaling/halfextents unmodified through the API
298 case CAPSULE_SHAPE_PROXYTYPE:
300 btCapsuleShapeData* capData = (btCapsuleShapeData*)shapeData;
302 switch (capData->m_upAxis)
306 shape = createCapsuleShapeX(1, 1);
311 shape = createCapsuleShapeY(1, 1);
316 shape = createCapsuleShapeZ(1, 1);
321 printf("error: wrong up axis for btCapsuleShape\n");
326 btCapsuleShape* cap = (btCapsuleShape*)shape;
327 cap->deSerializeFloat(capData);
331 case CYLINDER_SHAPE_PROXYTYPE:
332 case CONE_SHAPE_PROXYTYPE:
333 case BOX_SHAPE_PROXYTYPE:
334 case SPHERE_SHAPE_PROXYTYPE:
335 case MULTI_SPHERE_SHAPE_PROXYTYPE:
336 case CONVEX_HULL_SHAPE_PROXYTYPE:
338 btConvexInternalShapeData* bsd = (btConvexInternalShapeData*)shapeData;
339 btVector3 implicitShapeDimensions;
340 implicitShapeDimensions.deSerializeFloat(bsd->m_implicitShapeDimensions);
341 btVector3 localScaling;
342 localScaling.deSerializeFloat(bsd->m_localScaling);
343 btVector3 margin(bsd->m_collisionMargin, bsd->m_collisionMargin, bsd->m_collisionMargin);
344 switch (shapeData->m_shapeType)
346 case BOX_SHAPE_PROXYTYPE:
348 btBoxShape* box = (btBoxShape*)createBoxShape(implicitShapeDimensions / localScaling + margin);
349 //box->initializePolyhedralFeatures();
354 case SPHERE_SHAPE_PROXYTYPE:
356 shape = createSphereShape(implicitShapeDimensions.getX());
360 case CYLINDER_SHAPE_PROXYTYPE:
362 btCylinderShapeData* cylData = (btCylinderShapeData*)shapeData;
363 btVector3 halfExtents = implicitShapeDimensions + margin;
364 switch (cylData->m_upAxis)
368 shape = createCylinderShapeX(halfExtents.getY(), halfExtents.getX());
373 shape = createCylinderShapeY(halfExtents.getX(), halfExtents.getY());
378 shape = createCylinderShapeZ(halfExtents.getX(), halfExtents.getZ());
383 printf("unknown Cylinder up axis\n");
389 case CONE_SHAPE_PROXYTYPE:
391 btConeShapeData* conData = (btConeShapeData*)shapeData;
392 btVector3 halfExtents = implicitShapeDimensions; //+margin;
393 switch (conData->m_upIndex)
397 shape = createConeShapeX(halfExtents.getY(), halfExtents.getX());
402 shape = createConeShapeY(halfExtents.getX(), halfExtents.getY());
407 shape = createConeShapeZ(halfExtents.getX(), halfExtents.getZ());
412 printf("unknown Cone up axis\n");
418 case MULTI_SPHERE_SHAPE_PROXYTYPE:
420 btMultiSphereShapeData* mss = (btMultiSphereShapeData*)bsd;
421 int numSpheres = mss->m_localPositionArraySize;
423 btAlignedObjectArray<btVector3> tmpPos;
424 btAlignedObjectArray<btScalar> radii;
425 radii.resize(numSpheres);
426 tmpPos.resize(numSpheres);
428 for (i = 0; i < numSpheres; i++)
430 tmpPos[i].deSerializeFloat(mss->m_localPositionArrayPtr[i].m_pos);
431 radii[i] = mss->m_localPositionArrayPtr[i].m_radius;
433 shape = createMultiSphereShape(&tmpPos[0], &radii[0], numSpheres);
436 case CONVEX_HULL_SHAPE_PROXYTYPE:
438 // int sz = sizeof(btConvexHullShapeData);
439 // int sz2 = sizeof(btConvexInternalShapeData);
440 // int sz3 = sizeof(btCollisionShapeData);
441 btConvexHullShapeData* convexData = (btConvexHullShapeData*)bsd;
442 int numPoints = convexData->m_numUnscaledPoints;
444 btAlignedObjectArray<btVector3> tmpPoints;
445 tmpPoints.resize(numPoints);
447 for (i = 0; i < numPoints; i++)
449 #ifdef BT_USE_DOUBLE_PRECISION
450 if (convexData->m_unscaledPointsDoublePtr)
451 tmpPoints[i].deSerialize(convexData->m_unscaledPointsDoublePtr[i]);
452 if (convexData->m_unscaledPointsFloatPtr)
453 tmpPoints[i].deSerializeFloat(convexData->m_unscaledPointsFloatPtr[i]);
455 if (convexData->m_unscaledPointsFloatPtr)
456 tmpPoints[i].deSerialize(convexData->m_unscaledPointsFloatPtr[i]);
457 if (convexData->m_unscaledPointsDoublePtr)
458 tmpPoints[i].deSerializeDouble(convexData->m_unscaledPointsDoublePtr[i]);
459 #endif //BT_USE_DOUBLE_PRECISION
461 btConvexHullShape* hullShape = createConvexHullShape();
462 for (i = 0; i < numPoints; i++)
464 hullShape->addPoint(tmpPoints[i]);
466 hullShape->setMargin(bsd->m_collisionMargin);
467 //hullShape->initializePolyhedralFeatures();
473 printf("error: cannot create shape type (%d)\n", shapeData->m_shapeType);
479 shape->setMargin(bsd->m_collisionMargin);
481 btVector3 localScaling;
482 localScaling.deSerializeFloat(bsd->m_localScaling);
483 shape->setLocalScaling(localScaling);
487 case TRIANGLE_MESH_SHAPE_PROXYTYPE:
489 btTriangleMeshShapeData* trimesh = (btTriangleMeshShapeData*)shapeData;
490 btStridingMeshInterfaceData* interfaceData = createStridingMeshInterfaceData(&trimesh->m_meshInterface);
491 btTriangleIndexVertexArray* meshInterface = createMeshInterface(*interfaceData);
492 if (!meshInterface->getNumSubParts())
498 scaling.deSerializeFloat(trimesh->m_meshInterface.m_scaling);
499 meshInterface->setScaling(scaling);
501 btOptimizedBvh* bvh = 0;
503 if (trimesh->m_quantizedFloatBvh)
505 btOptimizedBvh** bvhPtr = m_bvhMap.find(trimesh->m_quantizedFloatBvh);
506 if (bvhPtr && *bvhPtr)
512 bvh = createOptimizedBvh();
513 bvh->deSerializeFloat(*trimesh->m_quantizedFloatBvh);
516 if (trimesh->m_quantizedDoubleBvh)
518 btOptimizedBvh** bvhPtr = m_bvhMap.find(trimesh->m_quantizedDoubleBvh);
519 if (bvhPtr && *bvhPtr)
525 bvh = createOptimizedBvh();
526 bvh->deSerializeDouble(*trimesh->m_quantizedDoubleBvh);
531 btBvhTriangleMeshShape* trimeshShape = createBvhTriangleMeshShape(meshInterface, bvh);
532 trimeshShape->setMargin(trimesh->m_collisionMargin);
533 shape = trimeshShape;
535 if (trimesh->m_triangleInfoMap)
537 btTriangleInfoMap* map = createTriangleInfoMap();
538 map->deSerialize(*trimesh->m_triangleInfoMap);
539 trimeshShape->setTriangleInfoMap(map);
541 #ifdef USE_INTERNAL_EDGE_UTILITY
542 gContactAddedCallback = btAdjustInternalEdgeContactsCallback;
543 #endif //USE_INTERNAL_EDGE_UTILITY
546 //printf("trimesh->m_collisionMargin=%f\n",trimesh->m_collisionMargin);
549 case COMPOUND_SHAPE_PROXYTYPE:
551 btCompoundShapeData* compoundData = (btCompoundShapeData*)shapeData;
552 btCompoundShape* compoundShape = createCompoundShape();
554 //btCompoundShapeChildData* childShapeDataArray = &compoundData->m_childShapePtr[0];
556 btAlignedObjectArray<btCollisionShape*> childShapes;
557 for (int i = 0; i < compoundData->m_numChildShapes; i++)
559 //btCompoundShapeChildData* ptr = &compoundData->m_childShapePtr[i];
561 btCollisionShapeData* cd = compoundData->m_childShapePtr[i].m_childShape;
563 btCollisionShape* childShape = convertCollisionShape(cd);
566 btTransform localTransform;
567 localTransform.deSerializeFloat(compoundData->m_childShapePtr[i].m_transform);
568 compoundShape->addChildShape(localTransform, childShape);
573 printf("error: couldn't create childShape for compoundShape\n");
577 shape = compoundShape;
581 case SOFTBODY_SHAPE_PROXYTYPE:
588 printf("unsupported shape type (%d)\n", shapeData->m_shapeType);
596 char* btCollisionWorldImporter::duplicateName(const char* name)
600 int l = (int)strlen(name);
601 char* newName = new char[l + 1];
602 memcpy(newName, name, l);
604 m_allocatedNames.push_back(newName);
610 btTriangleIndexVertexArray* btCollisionWorldImporter::createMeshInterface(btStridingMeshInterfaceData& meshData)
612 btTriangleIndexVertexArray* meshInterface = createTriangleMeshContainer();
614 for (int i = 0; i < meshData.m_numMeshParts; i++)
616 btIndexedMesh meshPart;
617 meshPart.m_numTriangles = meshData.m_meshPartsPtr[i].m_numTriangles;
618 meshPart.m_numVertices = meshData.m_meshPartsPtr[i].m_numVertices;
620 if (meshData.m_meshPartsPtr[i].m_indices32)
622 meshPart.m_indexType = PHY_INTEGER;
623 meshPart.m_triangleIndexStride = 3 * sizeof(int);
624 int* indexArray = (int*)btAlignedAlloc(sizeof(int) * 3 * meshPart.m_numTriangles, 16);
625 m_indexArrays.push_back(indexArray);
626 for (int j = 0; j < 3 * meshPart.m_numTriangles; j++)
628 indexArray[j] = meshData.m_meshPartsPtr[i].m_indices32[j].m_value;
630 meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
634 if (meshData.m_meshPartsPtr[i].m_3indices16)
636 meshPart.m_indexType = PHY_SHORT;
637 meshPart.m_triangleIndexStride = sizeof(short int) * 3; //sizeof(btShortIntIndexTripletData);
639 short int* indexArray = (short int*)btAlignedAlloc(sizeof(short int) * 3 * meshPart.m_numTriangles, 16);
640 m_shortIndexArrays.push_back(indexArray);
642 for (int j = 0; j < meshPart.m_numTriangles; j++)
644 indexArray[3 * j] = meshData.m_meshPartsPtr[i].m_3indices16[j].m_values[0];
645 indexArray[3 * j + 1] = meshData.m_meshPartsPtr[i].m_3indices16[j].m_values[1];
646 indexArray[3 * j + 2] = meshData.m_meshPartsPtr[i].m_3indices16[j].m_values[2];
649 meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
651 if (meshData.m_meshPartsPtr[i].m_indices16)
653 meshPart.m_indexType = PHY_SHORT;
654 meshPart.m_triangleIndexStride = 3 * sizeof(short int);
655 short int* indexArray = (short int*)btAlignedAlloc(sizeof(short int) * 3 * meshPart.m_numTriangles, 16);
656 m_shortIndexArrays.push_back(indexArray);
657 for (int j = 0; j < 3 * meshPart.m_numTriangles; j++)
659 indexArray[j] = meshData.m_meshPartsPtr[i].m_indices16[j].m_value;
662 meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
665 if (meshData.m_meshPartsPtr[i].m_3indices8)
667 meshPart.m_indexType = PHY_UCHAR;
668 meshPart.m_triangleIndexStride = sizeof(unsigned char) * 3;
670 unsigned char* indexArray = (unsigned char*)btAlignedAlloc(sizeof(unsigned char) * 3 * meshPart.m_numTriangles, 16);
671 m_charIndexArrays.push_back(indexArray);
673 for (int j = 0; j < meshPart.m_numTriangles; j++)
675 indexArray[3 * j] = meshData.m_meshPartsPtr[i].m_3indices8[j].m_values[0];
676 indexArray[3 * j + 1] = meshData.m_meshPartsPtr[i].m_3indices8[j].m_values[1];
677 indexArray[3 * j + 2] = meshData.m_meshPartsPtr[i].m_3indices8[j].m_values[2];
680 meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
684 if (meshData.m_meshPartsPtr[i].m_vertices3f)
686 meshPart.m_vertexType = PHY_FLOAT;
687 meshPart.m_vertexStride = sizeof(btVector3FloatData);
688 btVector3FloatData* vertices = (btVector3FloatData*)btAlignedAlloc(sizeof(btVector3FloatData) * meshPart.m_numVertices, 16);
689 m_floatVertexArrays.push_back(vertices);
691 for (int j = 0; j < meshPart.m_numVertices; j++)
693 vertices[j].m_floats[0] = meshData.m_meshPartsPtr[i].m_vertices3f[j].m_floats[0];
694 vertices[j].m_floats[1] = meshData.m_meshPartsPtr[i].m_vertices3f[j].m_floats[1];
695 vertices[j].m_floats[2] = meshData.m_meshPartsPtr[i].m_vertices3f[j].m_floats[2];
696 vertices[j].m_floats[3] = meshData.m_meshPartsPtr[i].m_vertices3f[j].m_floats[3];
698 meshPart.m_vertexBase = (const unsigned char*)vertices;
702 meshPart.m_vertexType = PHY_DOUBLE;
703 meshPart.m_vertexStride = sizeof(btVector3DoubleData);
705 btVector3DoubleData* vertices = (btVector3DoubleData*)btAlignedAlloc(sizeof(btVector3DoubleData) * meshPart.m_numVertices, 16);
706 m_doubleVertexArrays.push_back(vertices);
708 for (int j = 0; j < meshPart.m_numVertices; j++)
710 vertices[j].m_floats[0] = meshData.m_meshPartsPtr[i].m_vertices3d[j].m_floats[0];
711 vertices[j].m_floats[1] = meshData.m_meshPartsPtr[i].m_vertices3d[j].m_floats[1];
712 vertices[j].m_floats[2] = meshData.m_meshPartsPtr[i].m_vertices3d[j].m_floats[2];
713 vertices[j].m_floats[3] = meshData.m_meshPartsPtr[i].m_vertices3d[j].m_floats[3];
715 meshPart.m_vertexBase = (const unsigned char*)vertices;
718 if (meshPart.m_triangleIndexBase && meshPart.m_vertexBase)
720 meshInterface->addIndexedMesh(meshPart, meshPart.m_indexType);
724 return meshInterface;
727 btStridingMeshInterfaceData* btCollisionWorldImporter::createStridingMeshInterfaceData(btStridingMeshInterfaceData* interfaceData)
729 //create a new btStridingMeshInterfaceData that is an exact copy of shapedata and store it in the WorldImporter
730 btStridingMeshInterfaceData* newData = new btStridingMeshInterfaceData;
732 newData->m_scaling = interfaceData->m_scaling;
733 newData->m_numMeshParts = interfaceData->m_numMeshParts;
734 newData->m_meshPartsPtr = new btMeshPartData[newData->m_numMeshParts];
736 for (int i = 0; i < newData->m_numMeshParts; i++)
738 btMeshPartData* curPart = &interfaceData->m_meshPartsPtr[i];
739 btMeshPartData* curNewPart = &newData->m_meshPartsPtr[i];
741 curNewPart->m_numTriangles = curPart->m_numTriangles;
742 curNewPart->m_numVertices = curPart->m_numVertices;
744 if (curPart->m_vertices3f)
746 curNewPart->m_vertices3f = new btVector3FloatData[curNewPart->m_numVertices];
747 memcpy(curNewPart->m_vertices3f, curPart->m_vertices3f, sizeof(btVector3FloatData) * curNewPart->m_numVertices);
750 curNewPart->m_vertices3f = NULL;
752 if (curPart->m_vertices3d)
754 curNewPart->m_vertices3d = new btVector3DoubleData[curNewPart->m_numVertices];
755 memcpy(curNewPart->m_vertices3d, curPart->m_vertices3d, sizeof(btVector3DoubleData) * curNewPart->m_numVertices);
758 curNewPart->m_vertices3d = NULL;
760 int numIndices = curNewPart->m_numTriangles * 3;
761 ///the m_3indices8 was not initialized in some Bullet versions, this can cause crashes at loading time
762 ///we catch it by only dealing with m_3indices8 if none of the other indices are initialized
763 bool uninitialized3indices8Workaround = false;
765 if (curPart->m_indices32)
767 uninitialized3indices8Workaround = true;
768 curNewPart->m_indices32 = new btIntIndexData[numIndices];
769 memcpy(curNewPart->m_indices32, curPart->m_indices32, sizeof(btIntIndexData) * numIndices);
772 curNewPart->m_indices32 = NULL;
774 if (curPart->m_3indices16)
776 uninitialized3indices8Workaround = true;
777 curNewPart->m_3indices16 = new btShortIntIndexTripletData[curNewPart->m_numTriangles];
778 memcpy(curNewPart->m_3indices16, curPart->m_3indices16, sizeof(btShortIntIndexTripletData) * curNewPart->m_numTriangles);
781 curNewPart->m_3indices16 = NULL;
783 if (curPart->m_indices16)
785 uninitialized3indices8Workaround = true;
786 curNewPart->m_indices16 = new btShortIntIndexData[numIndices];
787 memcpy(curNewPart->m_indices16, curPart->m_indices16, sizeof(btShortIntIndexData) * numIndices);
790 curNewPart->m_indices16 = NULL;
792 if (!uninitialized3indices8Workaround && curPart->m_3indices8)
794 curNewPart->m_3indices8 = new btCharIndexTripletData[curNewPart->m_numTriangles];
795 memcpy(curNewPart->m_3indices8, curPart->m_3indices8, sizeof(btCharIndexTripletData) * curNewPart->m_numTriangles);
798 curNewPart->m_3indices8 = NULL;
801 m_allocatedbtStridingMeshInterfaceDatas.push_back(newData);
806 #ifdef USE_INTERNAL_EDGE_UTILITY
807 extern ContactAddedCallback gContactAddedCallback;
809 static bool btAdjustInternalEdgeContactsCallback(btManifoldPoint& cp, const btCollisionObject* colObj0, int partId0, int index0, const btCollisionObject* colObj1, int partId1, int index1)
811 btAdjustInternalEdgeContacts(cp, colObj1, colObj0, partId1, index1);
812 //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_BACKFACE_MODE);
813 //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_DOUBLE_SIDED+BT_TRIANGLE_CONCAVE_DOUBLE_SIDED);
816 #endif //USE_INTERNAL_EDGE_UTILITY
819 btRigidBody* btWorldImporter::createRigidBody(bool isDynamic, btScalar mass, const btTransform& startTransform,btCollisionShape* shape,const char* bodyName)
821 btVector3 localInertia;
822 localInertia.setZero();
825 shape->calculateLocalInertia(mass,localInertia);
827 btRigidBody* body = new btRigidBody(mass,0,shape,localInertia);
828 body->setWorldTransform(startTransform);
831 m_dynamicsWorld->addRigidBody(body);
835 char* newname = duplicateName(bodyName);
836 m_objectNameMap.insert(body,newname);
837 m_nameBodyMap.insert(newname,body);
839 m_allocatedRigidBodies.push_back(body);
845 btCollisionObject* btCollisionWorldImporter::getCollisionObjectByName(const char* name)
847 btCollisionObject** bodyPtr = m_nameColObjMap.find(name);
848 if (bodyPtr && *bodyPtr)
855 btCollisionObject* btCollisionWorldImporter::createCollisionObject(const btTransform& startTransform, btCollisionShape* shape, const char* bodyName)
857 btCollisionObject* colObj = new btCollisionObject();
858 colObj->setWorldTransform(startTransform);
859 colObj->setCollisionShape(shape);
860 m_collisionWorld->addCollisionObject(colObj); //todo: flags etc
864 char* newname = duplicateName(bodyName);
865 m_objectNameMap.insert(colObj, newname);
866 m_nameColObjMap.insert(newname, colObj);
868 m_allocatedCollisionObjects.push_back(colObj);
873 btCollisionShape* btCollisionWorldImporter::createPlaneShape(const btVector3& planeNormal, btScalar planeConstant)
875 btStaticPlaneShape* shape = new btStaticPlaneShape(planeNormal, planeConstant);
876 m_allocatedCollisionShapes.push_back(shape);
879 btCollisionShape* btCollisionWorldImporter::createBoxShape(const btVector3& halfExtents)
881 btBoxShape* shape = new btBoxShape(halfExtents);
882 m_allocatedCollisionShapes.push_back(shape);
885 btCollisionShape* btCollisionWorldImporter::createSphereShape(btScalar radius)
887 btSphereShape* shape = new btSphereShape(radius);
888 m_allocatedCollisionShapes.push_back(shape);
892 btCollisionShape* btCollisionWorldImporter::createCapsuleShapeX(btScalar radius, btScalar height)
894 btCapsuleShapeX* shape = new btCapsuleShapeX(radius, height);
895 m_allocatedCollisionShapes.push_back(shape);
899 btCollisionShape* btCollisionWorldImporter::createCapsuleShapeY(btScalar radius, btScalar height)
901 btCapsuleShape* shape = new btCapsuleShape(radius, height);
902 m_allocatedCollisionShapes.push_back(shape);
906 btCollisionShape* btCollisionWorldImporter::createCapsuleShapeZ(btScalar radius, btScalar height)
908 btCapsuleShapeZ* shape = new btCapsuleShapeZ(radius, height);
909 m_allocatedCollisionShapes.push_back(shape);
913 btCollisionShape* btCollisionWorldImporter::createCylinderShapeX(btScalar radius, btScalar height)
915 btCylinderShapeX* shape = new btCylinderShapeX(btVector3(height, radius, radius));
916 m_allocatedCollisionShapes.push_back(shape);
920 btCollisionShape* btCollisionWorldImporter::createCylinderShapeY(btScalar radius, btScalar height)
922 btCylinderShape* shape = new btCylinderShape(btVector3(radius, height, radius));
923 m_allocatedCollisionShapes.push_back(shape);
927 btCollisionShape* btCollisionWorldImporter::createCylinderShapeZ(btScalar radius, btScalar height)
929 btCylinderShapeZ* shape = new btCylinderShapeZ(btVector3(radius, radius, height));
930 m_allocatedCollisionShapes.push_back(shape);
934 btCollisionShape* btCollisionWorldImporter::createConeShapeX(btScalar radius, btScalar height)
936 btConeShapeX* shape = new btConeShapeX(radius, height);
937 m_allocatedCollisionShapes.push_back(shape);
941 btCollisionShape* btCollisionWorldImporter::createConeShapeY(btScalar radius, btScalar height)
943 btConeShape* shape = new btConeShape(radius, height);
944 m_allocatedCollisionShapes.push_back(shape);
948 btCollisionShape* btCollisionWorldImporter::createConeShapeZ(btScalar radius, btScalar height)
950 btConeShapeZ* shape = new btConeShapeZ(radius, height);
951 m_allocatedCollisionShapes.push_back(shape);
955 btTriangleIndexVertexArray* btCollisionWorldImporter::createTriangleMeshContainer()
957 btTriangleIndexVertexArray* in = new btTriangleIndexVertexArray();
958 m_allocatedTriangleIndexArrays.push_back(in);
962 btOptimizedBvh* btCollisionWorldImporter::createOptimizedBvh()
964 btOptimizedBvh* bvh = new btOptimizedBvh();
965 m_allocatedBvhs.push_back(bvh);
969 btTriangleInfoMap* btCollisionWorldImporter::createTriangleInfoMap()
971 btTriangleInfoMap* tim = new btTriangleInfoMap();
972 m_allocatedTriangleInfoMaps.push_back(tim);
976 btBvhTriangleMeshShape* btCollisionWorldImporter::createBvhTriangleMeshShape(btStridingMeshInterface* trimesh, btOptimizedBvh* bvh)
980 btBvhTriangleMeshShape* bvhTriMesh = new btBvhTriangleMeshShape(trimesh, bvh->isQuantized(), false);
981 bvhTriMesh->setOptimizedBvh(bvh);
982 m_allocatedCollisionShapes.push_back(bvhTriMesh);
986 btBvhTriangleMeshShape* ts = new btBvhTriangleMeshShape(trimesh, true);
987 m_allocatedCollisionShapes.push_back(ts);
990 btCollisionShape* btCollisionWorldImporter::createConvexTriangleMeshShape(btStridingMeshInterface* trimesh)
994 #ifdef SUPPORT_GIMPACT_SHAPE_IMPORT
995 btGImpactMeshShape* btCollisionWorldImporter::createGimpactShape(btStridingMeshInterface* trimesh)
997 btGImpactMeshShape* shape = new btGImpactMeshShape(trimesh);
998 m_allocatedCollisionShapes.push_back(shape);
1001 #endif //SUPPORT_GIMPACT_SHAPE_IMPORT
1003 btConvexHullShape* btCollisionWorldImporter::createConvexHullShape()
1005 btConvexHullShape* shape = new btConvexHullShape();
1006 m_allocatedCollisionShapes.push_back(shape);
1010 btCompoundShape* btCollisionWorldImporter::createCompoundShape()
1012 btCompoundShape* shape = new btCompoundShape();
1013 m_allocatedCollisionShapes.push_back(shape);
1017 btScaledBvhTriangleMeshShape* btCollisionWorldImporter::createScaledTrangleMeshShape(btBvhTriangleMeshShape* meshShape, const btVector3& localScaling)
1019 btScaledBvhTriangleMeshShape* shape = new btScaledBvhTriangleMeshShape(meshShape, localScaling);
1020 m_allocatedCollisionShapes.push_back(shape);
1024 btMultiSphereShape* btCollisionWorldImporter::createMultiSphereShape(const btVector3* positions, const btScalar* radi, int numSpheres)
1026 btMultiSphereShape* shape = new btMultiSphereShape(positions, radi, numSpheres);
1027 m_allocatedCollisionShapes.push_back(shape);
1032 int btCollisionWorldImporter::getNumCollisionShapes() const
1034 return m_allocatedCollisionShapes.size();
1037 btCollisionShape* btCollisionWorldImporter::getCollisionShapeByIndex(int index)
1039 return m_allocatedCollisionShapes[index];
1042 btCollisionShape* btCollisionWorldImporter::getCollisionShapeByName(const char* name)
1044 btCollisionShape** shapePtr = m_nameShapeMap.find(name);
1045 if (shapePtr && *shapePtr)
1052 const char* btCollisionWorldImporter::getNameForPointer(const void* ptr) const
1054 const char* const* namePtr = m_objectNameMap.find(ptr);
1055 if (namePtr && *namePtr)
1060 int btCollisionWorldImporter::getNumRigidBodies() const
1062 return m_allocatedRigidBodies.size();
1065 btCollisionObject* btCollisionWorldImporter::getRigidBodyByIndex(int index) const
1067 return m_allocatedRigidBodies[index];
1070 int btCollisionWorldImporter::getNumBvhs() const
1072 return m_allocatedBvhs.size();
1074 btOptimizedBvh* btCollisionWorldImporter::getBvhByIndex(int index) const
1076 return m_allocatedBvhs[index];
1079 int btCollisionWorldImporter::getNumTriangleInfoMaps() const
1081 return m_allocatedTriangleInfoMaps.size();
1084 btTriangleInfoMap* btCollisionWorldImporter::getTriangleInfoMapByIndex(int index) const
1086 return m_allocatedTriangleInfoMaps[index];