2 #include "BulletDataExtractor.h"
\r
3 #include "../BulletFileLoader/btBulletFile.h"
\r
8 ///This ReadBulletSample is kept as simple as possible without dependencies to the Bullet SDK.
\r
9 ///It can be used to load .bullet data for other physics SDKs
\r
10 ///For a more complete example how to load and convert Bullet data using the Bullet SDK check out
\r
11 ///the Bullet/Demos/SerializeDemo and Bullet/Serialize/BulletWorldImporter
\r
13 using namespace Bullet;
\r
15 enum LocalBroadphaseNativeTypes
\r
17 // polyhedral convex shapes
\r
18 BOX_SHAPE_PROXYTYPE,
\r
19 TRIANGLE_SHAPE_PROXYTYPE,
\r
20 TETRAHEDRAL_SHAPE_PROXYTYPE,
\r
21 CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE,
\r
22 CONVEX_HULL_SHAPE_PROXYTYPE,
\r
23 CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE,
\r
24 CUSTOM_POLYHEDRAL_SHAPE_TYPE,
\r
25 //implicit convex shapes
\r
26 IMPLICIT_CONVEX_SHAPES_START_HERE,
\r
27 SPHERE_SHAPE_PROXYTYPE,
\r
28 MULTI_SPHERE_SHAPE_PROXYTYPE,
\r
29 CAPSULE_SHAPE_PROXYTYPE,
\r
30 CONE_SHAPE_PROXYTYPE,
\r
31 CONVEX_SHAPE_PROXYTYPE,
\r
32 CYLINDER_SHAPE_PROXYTYPE,
\r
33 UNIFORM_SCALING_SHAPE_PROXYTYPE,
\r
34 MINKOWSKI_SUM_SHAPE_PROXYTYPE,
\r
35 MINKOWSKI_DIFFERENCE_SHAPE_PROXYTYPE,
\r
36 BOX_2D_SHAPE_PROXYTYPE,
\r
37 CONVEX_2D_SHAPE_PROXYTYPE,
\r
38 CUSTOM_CONVEX_SHAPE_TYPE,
\r
40 CONCAVE_SHAPES_START_HERE,
\r
41 //keep all the convex shapetype below here, for the check IsConvexShape in broadphase proxy!
\r
42 TRIANGLE_MESH_SHAPE_PROXYTYPE,
\r
43 SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE,
\r
44 ///used for demo integration FAST/Swift collision library and Bullet
\r
45 FAST_CONCAVE_MESH_PROXYTYPE,
\r
47 TERRAIN_SHAPE_PROXYTYPE,
\r
48 ///Used for GIMPACT Trimesh integration
\r
49 GIMPACT_SHAPE_PROXYTYPE,
\r
50 ///Multimaterial mesh
\r
51 MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE,
\r
53 EMPTY_SHAPE_PROXYTYPE,
\r
54 STATIC_PLANE_PROXYTYPE,
\r
55 CUSTOM_CONCAVE_SHAPE_TYPE,
\r
56 CONCAVE_SHAPES_END_HERE,
\r
58 COMPOUND_SHAPE_PROXYTYPE,
\r
60 SOFTBODY_SHAPE_PROXYTYPE,
\r
61 HFFLUID_SHAPE_PROXYTYPE,
\r
62 HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE,
\r
63 INVALID_SHAPE_PROXYTYPE,
\r
65 MAX_BROADPHASE_COLLISION_TYPES
\r
69 btBulletDataExtractor::btBulletDataExtractor()
\r
73 btBulletDataExtractor::~btBulletDataExtractor()
\r
77 void btBulletDataExtractor::convertAllObjects(bParse::btBulletFile* bulletFile2)
\r
81 for (i=0;i<bulletFile2->m_collisionShapes.size();i++)
\r
83 btCollisionShapeData* shapeData = (btCollisionShapeData*)bulletFile2->m_collisionShapes[i];
\r
84 if (shapeData->m_name)
\r
85 printf("converting shape %s\n", shapeData->m_name);
\r
86 void* shape = convertCollisionShape(shapeData);
\r
93 void* btBulletDataExtractor::convertCollisionShape( btCollisionShapeData* shapeData )
\r
97 switch (shapeData->m_shapeType)
\r
99 case STATIC_PLANE_PROXYTYPE:
\r
101 btStaticPlaneShapeData* planeData = (btStaticPlaneShapeData*)shapeData;
\r
102 void* shape = createPlaneShape(planeData->m_planeNormal,planeData->m_planeConstant, planeData->m_localScaling);
\r
106 case CYLINDER_SHAPE_PROXYTYPE:
\r
107 case CAPSULE_SHAPE_PROXYTYPE:
\r
108 case BOX_SHAPE_PROXYTYPE:
\r
109 case SPHERE_SHAPE_PROXYTYPE:
\r
110 case MULTI_SPHERE_SHAPE_PROXYTYPE:
\r
111 case CONVEX_HULL_SHAPE_PROXYTYPE:
\r
113 btConvexInternalShapeData* bsd = (btConvexInternalShapeData*)shapeData;
\r
115 switch (shapeData->m_shapeType)
\r
117 case BOX_SHAPE_PROXYTYPE:
\r
119 shape = createBoxShape(bsd->m_implicitShapeDimensions, bsd->m_localScaling,bsd->m_collisionMargin);
\r
122 case SPHERE_SHAPE_PROXYTYPE:
\r
124 shape = createSphereShape(bsd->m_implicitShapeDimensions.m_floats[0],bsd->m_localScaling, bsd->m_collisionMargin);
\r
128 case CAPSULE_SHAPE_PROXYTYPE:
\r
130 btCapsuleShapeData* capData = (btCapsuleShapeData*)shapeData;
\r
131 switch (capData->m_upAxis)
\r
135 shape = createCapsuleShapeX(implicitShapeDimensions.getY(),2*implicitShapeDimensions.getX());
\r
140 shape = createCapsuleShapeY(implicitShapeDimensions.getX(),2*implicitShapeDimensions.getY());
\r
145 shape = createCapsuleShapeZ(implicitShapeDimensions.getX(),2*implicitShapeDimensions.getZ());
\r
150 printf("error: wrong up axis for btCapsuleShape\n");
\r
157 case CYLINDER_SHAPE_PROXYTYPE:
\r
159 btCylinderShapeData* cylData = (btCylinderShapeData*) shapeData;
\r
160 btVector3 halfExtents = implicitShapeDimensions+margin;
\r
161 switch (cylData->m_upAxis)
\r
165 shape = createCylinderShapeX(halfExtents.getY(),halfExtents.getX());
\r
170 shape = createCylinderShapeY(halfExtents.getX(),halfExtents.getY());
\r
175 shape = createCylinderShapeZ(halfExtents.getX(),halfExtents.getZ());
\r
180 printf("unknown Cylinder up axis\n");
\r
189 case MULTI_SPHERE_SHAPE_PROXYTYPE:
\r
191 btMultiSphereShapeData* mss = (btMultiSphereShapeData*)bsd;
\r
192 int numSpheres = mss->m_localPositionArraySize;
\r
194 for ( i=0;i<numSpheres;i++)
\r
196 tmpPos[i].deSerializeFloat(mss->m_localPositionArrayPtr[i].m_pos);
\r
197 radii[i] = mss->m_localPositionArrayPtr[i].m_radius;
\r
199 shape = new btMultiSphereShape(&tmpPos[0],&radii[0],numSpheres);
\r
202 case CONVEX_HULL_SHAPE_PROXYTYPE:
\r
204 btConvexHullShapeData* convexData = (btConvexHullShapeData*)bsd;
\r
205 int numPoints = convexData->m_numUnscaledPoints;
\r
207 btAlignedObjectArray<btVector3> tmpPoints;
\r
208 tmpPoints.resize(numPoints);
\r
210 for ( i=0;i<numPoints;i++)
\r
212 if (convexData->m_unscaledPointsFloatPtr)
\r
213 tmpPoints[i].deSerialize(convexData->m_unscaledPointsFloatPtr[i]);
\r
214 if (convexData->m_unscaledPointsDoublePtr)
\r
215 tmpPoints[i].deSerializeDouble(convexData->m_unscaledPointsDoublePtr[i]);
\r
217 shape = createConvexHullShape();
\r
226 printf("error: cannot create shape type (%d)\n",shapeData->m_shapeType);
\r
233 case TRIANGLE_MESH_SHAPE_PROXYTYPE:
\r
235 btTriangleMeshShapeData* trimesh = (btTriangleMeshShapeData*)shapeData;
\r
236 btTriangleIndexVertexArray* meshInterface = createMeshInterface(trimesh->m_meshInterface);
\r
237 if (!meshInterface->getNumSubParts())
\r
242 btVector3 scaling; scaling.deSerializeFloat(trimesh->m_meshInterface.m_scaling);
\r
243 meshInterface->setScaling(scaling);
\r
246 btOptimizedBvh* bvh = 0;
\r
248 btBvhTriangleMeshShape* trimeshShape = createBvhTriangleMeshShape(meshInterface,bvh);
\r
249 trimeshShape->setMargin(trimesh->m_collisionMargin);
\r
250 shape = trimeshShape;
\r
252 if (trimesh->m_triangleInfoMap)
\r
254 btTriangleInfoMap* map = createTriangleInfoMap();
\r
255 map->deSerialize(*trimesh->m_triangleInfoMap);
\r
256 trimeshShape->setTriangleInfoMap(map);
\r
258 #ifdef USE_INTERNAL_EDGE_UTILITY
\r
259 gContactAddedCallback = btAdjustInternalEdgeContactsCallback;
\r
260 #endif //USE_INTERNAL_EDGE_UTILITY
\r
264 //printf("trimesh->m_collisionMargin=%f\n",trimesh->m_collisionMargin);
\r
267 case COMPOUND_SHAPE_PROXYTYPE:
\r
269 btCompoundShapeData* compoundData = (btCompoundShapeData*)shapeData;
\r
270 btCompoundShape* compoundShape = createCompoundShape();
\r
273 btAlignedObjectArray<btCollisionShape*> childShapes;
\r
274 for (int i=0;i<compoundData->m_numChildShapes;i++)
\r
276 btCollisionShape* childShape = convertCollisionShape(compoundData->m_childShapePtr[i].m_childShape);
\r
279 btTransform localTransform;
\r
280 localTransform.deSerializeFloat(compoundData->m_childShapePtr[i].m_transform);
\r
281 compoundShape->addChildShape(localTransform,childShape);
\r
284 printf("error: couldn't create childShape for compoundShape\n");
\r
288 shape = compoundShape;
\r
293 case GIMPACT_SHAPE_PROXYTYPE:
\r
295 btGImpactMeshShapeData* gimpactData = (btGImpactMeshShapeData*) shapeData;
\r
296 if (gimpactData->m_gimpactSubType == CONST_GIMPACT_TRIMESH_SHAPE)
\r
298 btTriangleIndexVertexArray* meshInterface = createMeshInterface(gimpactData->m_meshInterface);
\r
299 btGImpactMeshShape* gimpactShape = createGimpactShape(meshInterface);
\r
300 btVector3 localScaling;
\r
301 localScaling.deSerializeFloat(gimpactData->m_localScaling);
\r
302 gimpactShape->setLocalScaling(localScaling);
\r
303 gimpactShape->setMargin(btScalar(gimpactData->m_collisionMargin));
\r
304 gimpactShape->updateBound();
\r
305 shape = gimpactShape;
\r
308 printf("unsupported gimpact sub type\n");
\r
312 case SOFTBODY_SHAPE_PROXYTYPE:
\r
319 printf("unsupported shape type (%d)\n",shapeData->m_shapeType);
\r
327 void* btBulletDataExtractor::createBoxShape( const Bullet::btVector3FloatData& halfDimensions, const Bullet::btVector3FloatData& localScaling, float collisionMargin)
\r
329 printf("createBoxShape with halfDimensions %f,%f,%f\n",halfDimensions.m_floats[0], halfDimensions.m_floats[1],halfDimensions.m_floats[2]);
\r
333 void* btBulletDataExtractor::createSphereShape( float radius, const Bullet::btVector3FloatData& localScaling, float collisionMargin)
\r
335 printf("createSphereShape with radius %f\n",radius);
\r
340 void* btBulletDataExtractor::createPlaneShape( const btVector3FloatData& planeNormal, float planeConstant, const Bullet::btVector3FloatData& localScaling)
\r
342 printf("createPlaneShape with normal %f,%f,%f and planeConstant\n",planeNormal.m_floats[0], planeNormal.m_floats[1],planeNormal.m_floats[2],planeConstant);
\r