BulletDataExtractor.cpp 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. #include "BulletDataExtractor.h"
  2. #include "../BulletFileLoader/btBulletFile.h"
  3. #include <stdio.h>
  4. ///work-in-progress
  5. ///This ReadBulletSample is kept as simple as possible without dependencies to the Bullet SDK.
  6. ///It can be used to load .bullet data for other physics SDKs
  7. ///For a more complete example how to load and convert Bullet data using the Bullet SDK check out
  8. ///the Bullet/Demos/SerializeDemo and Bullet/Serialize/BulletWorldImporter
  9. using namespace Bullet;
  10. enum LocalBroadphaseNativeTypes
  11. {
  12. // polyhedral convex shapes
  13. BOX_SHAPE_PROXYTYPE,
  14. TRIANGLE_SHAPE_PROXYTYPE,
  15. TETRAHEDRAL_SHAPE_PROXYTYPE,
  16. CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE,
  17. CONVEX_HULL_SHAPE_PROXYTYPE,
  18. CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE,
  19. CUSTOM_POLYHEDRAL_SHAPE_TYPE,
  20. //implicit convex shapes
  21. IMPLICIT_CONVEX_SHAPES_START_HERE,
  22. SPHERE_SHAPE_PROXYTYPE,
  23. MULTI_SPHERE_SHAPE_PROXYTYPE,
  24. CAPSULE_SHAPE_PROXYTYPE,
  25. CONE_SHAPE_PROXYTYPE,
  26. CONVEX_SHAPE_PROXYTYPE,
  27. CYLINDER_SHAPE_PROXYTYPE,
  28. UNIFORM_SCALING_SHAPE_PROXYTYPE,
  29. MINKOWSKI_SUM_SHAPE_PROXYTYPE,
  30. MINKOWSKI_DIFFERENCE_SHAPE_PROXYTYPE,
  31. BOX_2D_SHAPE_PROXYTYPE,
  32. CONVEX_2D_SHAPE_PROXYTYPE,
  33. CUSTOM_CONVEX_SHAPE_TYPE,
  34. //concave shapes
  35. CONCAVE_SHAPES_START_HERE,
  36. //keep all the convex shapetype below here, for the check IsConvexShape in broadphase proxy!
  37. TRIANGLE_MESH_SHAPE_PROXYTYPE,
  38. SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE,
  39. ///used for demo integration FAST/Swift collision library and Bullet
  40. FAST_CONCAVE_MESH_PROXYTYPE,
  41. //terrain
  42. TERRAIN_SHAPE_PROXYTYPE,
  43. ///Used for GIMPACT Trimesh integration
  44. GIMPACT_SHAPE_PROXYTYPE,
  45. ///Multimaterial mesh
  46. MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE,
  47. EMPTY_SHAPE_PROXYTYPE,
  48. STATIC_PLANE_PROXYTYPE,
  49. CUSTOM_CONCAVE_SHAPE_TYPE,
  50. CONCAVE_SHAPES_END_HERE,
  51. COMPOUND_SHAPE_PROXYTYPE,
  52. SOFTBODY_SHAPE_PROXYTYPE,
  53. HFFLUID_SHAPE_PROXYTYPE,
  54. HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE,
  55. INVALID_SHAPE_PROXYTYPE,
  56. MAX_BROADPHASE_COLLISION_TYPES
  57. };
  58. btBulletDataExtractor::btBulletDataExtractor()
  59. {
  60. }
  61. btBulletDataExtractor::~btBulletDataExtractor()
  62. {
  63. }
  64. void btBulletDataExtractor::convertAllObjects(bParse::btBulletFile* bulletFile2)
  65. {
  66. int i;
  67. for (i=0;i<bulletFile2->m_collisionShapes.size();i++)
  68. {
  69. btCollisionShapeData* shapeData = (btCollisionShapeData*)bulletFile2->m_collisionShapes[i];
  70. if (shapeData->m_name)
  71. printf("converting shape %s\n", shapeData->m_name);
  72. void* shape = convertCollisionShape(shapeData);
  73. }
  74. }
  75. void* btBulletDataExtractor::convertCollisionShape( btCollisionShapeData* shapeData )
  76. {
  77. void* shape = 0;
  78. switch (shapeData->m_shapeType)
  79. {
  80. case STATIC_PLANE_PROXYTYPE:
  81. {
  82. btStaticPlaneShapeData* planeData = (btStaticPlaneShapeData*)shapeData;
  83. void* shape = createPlaneShape(planeData->m_planeNormal,planeData->m_planeConstant, planeData->m_localScaling);
  84. break;
  85. }
  86. case CYLINDER_SHAPE_PROXYTYPE:
  87. case CAPSULE_SHAPE_PROXYTYPE:
  88. case BOX_SHAPE_PROXYTYPE:
  89. case SPHERE_SHAPE_PROXYTYPE:
  90. case MULTI_SPHERE_SHAPE_PROXYTYPE:
  91. case CONVEX_HULL_SHAPE_PROXYTYPE:
  92. {
  93. btConvexInternalShapeData* bsd = (btConvexInternalShapeData*)shapeData;
  94. switch (shapeData->m_shapeType)
  95. {
  96. case BOX_SHAPE_PROXYTYPE:
  97. {
  98. shape = createBoxShape(bsd->m_implicitShapeDimensions, bsd->m_localScaling,bsd->m_collisionMargin);
  99. break;
  100. }
  101. case SPHERE_SHAPE_PROXYTYPE:
  102. {
  103. shape = createSphereShape(bsd->m_implicitShapeDimensions.m_floats[0],bsd->m_localScaling, bsd->m_collisionMargin);
  104. break;
  105. }
  106. #if 0
  107. case CAPSULE_SHAPE_PROXYTYPE:
  108. {
  109. btCapsuleShapeData* capData = (btCapsuleShapeData*)shapeData;
  110. switch (capData->m_upAxis)
  111. {
  112. case 0:
  113. {
  114. shape = createCapsuleShapeX(implicitShapeDimensions.getY(),2*implicitShapeDimensions.getX());
  115. break;
  116. }
  117. case 1:
  118. {
  119. shape = createCapsuleShapeY(implicitShapeDimensions.getX(),2*implicitShapeDimensions.getY());
  120. break;
  121. }
  122. case 2:
  123. {
  124. shape = createCapsuleShapeZ(implicitShapeDimensions.getX(),2*implicitShapeDimensions.getZ());
  125. break;
  126. }
  127. default:
  128. {
  129. printf("error: wrong up axis for btCapsuleShape\n");
  130. }
  131. };
  132. break;
  133. }
  134. case CYLINDER_SHAPE_PROXYTYPE:
  135. {
  136. btCylinderShapeData* cylData = (btCylinderShapeData*) shapeData;
  137. btVector3 halfExtents = implicitShapeDimensions+margin;
  138. switch (cylData->m_upAxis)
  139. {
  140. case 0:
  141. {
  142. shape = createCylinderShapeX(halfExtents.getY(),halfExtents.getX());
  143. break;
  144. }
  145. case 1:
  146. {
  147. shape = createCylinderShapeY(halfExtents.getX(),halfExtents.getY());
  148. break;
  149. }
  150. case 2:
  151. {
  152. shape = createCylinderShapeZ(halfExtents.getX(),halfExtents.getZ());
  153. break;
  154. }
  155. default:
  156. {
  157. printf("unknown Cylinder up axis\n");
  158. }
  159. };
  160. break;
  161. }
  162. case MULTI_SPHERE_SHAPE_PROXYTYPE:
  163. {
  164. btMultiSphereShapeData* mss = (btMultiSphereShapeData*)bsd;
  165. int numSpheres = mss->m_localPositionArraySize;
  166. int i;
  167. for ( i=0;i<numSpheres;i++)
  168. {
  169. tmpPos[i].deSerializeFloat(mss->m_localPositionArrayPtr[i].m_pos);
  170. radii[i] = mss->m_localPositionArrayPtr[i].m_radius;
  171. }
  172. shape = new btMultiSphereShape(&tmpPos[0],&radii[0],numSpheres);
  173. break;
  174. }
  175. case CONVEX_HULL_SHAPE_PROXYTYPE:
  176. {
  177. btConvexHullShapeData* convexData = (btConvexHullShapeData*)bsd;
  178. int numPoints = convexData->m_numUnscaledPoints;
  179. btAlignedObjectArray<btVector3> tmpPoints;
  180. tmpPoints.resize(numPoints);
  181. int i;
  182. for ( i=0;i<numPoints;i++)
  183. {
  184. if (convexData->m_unscaledPointsFloatPtr)
  185. tmpPoints[i].deSerialize(convexData->m_unscaledPointsFloatPtr[i]);
  186. if (convexData->m_unscaledPointsDoublePtr)
  187. tmpPoints[i].deSerializeDouble(convexData->m_unscaledPointsDoublePtr[i]);
  188. }
  189. shape = createConvexHullShape();
  190. return shape;
  191. break;
  192. }
  193. #endif
  194. default:
  195. {
  196. printf("error: cannot create shape type (%d)\n",shapeData->m_shapeType);
  197. }
  198. }
  199. break;
  200. }
  201. #if 0
  202. case TRIANGLE_MESH_SHAPE_PROXYTYPE:
  203. {
  204. btTriangleMeshShapeData* trimesh = (btTriangleMeshShapeData*)shapeData;
  205. btTriangleIndexVertexArray* meshInterface = createMeshInterface(trimesh->m_meshInterface);
  206. if (!meshInterface->getNumSubParts())
  207. {
  208. return 0;
  209. }
  210. btVector3 scaling; scaling.deSerializeFloat(trimesh->m_meshInterface.m_scaling);
  211. meshInterface->setScaling(scaling);
  212. btOptimizedBvh* bvh = 0;
  213. btBvhTriangleMeshShape* trimeshShape = createBvhTriangleMeshShape(meshInterface,bvh);
  214. trimeshShape->setMargin(trimesh->m_collisionMargin);
  215. shape = trimeshShape;
  216. if (trimesh->m_triangleInfoMap)
  217. {
  218. btTriangleInfoMap* map = createTriangleInfoMap();
  219. map->deSerialize(*trimesh->m_triangleInfoMap);
  220. trimeshShape->setTriangleInfoMap(map);
  221. #ifdef USE_INTERNAL_EDGE_UTILITY
  222. gContactAddedCallback = btAdjustInternalEdgeContactsCallback;
  223. #endif //USE_INTERNAL_EDGE_UTILITY
  224. }
  225. //printf("trimesh->m_collisionMargin=%f\n",trimesh->m_collisionMargin);
  226. break;
  227. }
  228. case COMPOUND_SHAPE_PROXYTYPE:
  229. {
  230. btCompoundShapeData* compoundData = (btCompoundShapeData*)shapeData;
  231. btCompoundShape* compoundShape = createCompoundShape();
  232. btAlignedObjectArray<btCollisionShape*> childShapes;
  233. for (int i=0;i<compoundData->m_numChildShapes;i++)
  234. {
  235. btCollisionShape* childShape = convertCollisionShape(compoundData->m_childShapePtr[i].m_childShape);
  236. if (childShape)
  237. {
  238. btTransform localTransform;
  239. localTransform.deSerializeFloat(compoundData->m_childShapePtr[i].m_transform);
  240. compoundShape->addChildShape(localTransform,childShape);
  241. } else
  242. {
  243. printf("error: couldn't create childShape for compoundShape\n");
  244. }
  245. }
  246. shape = compoundShape;
  247. break;
  248. }
  249. case GIMPACT_SHAPE_PROXYTYPE:
  250. {
  251. btGImpactMeshShapeData* gimpactData = (btGImpactMeshShapeData*) shapeData;
  252. if (gimpactData->m_gimpactSubType == CONST_GIMPACT_TRIMESH_SHAPE)
  253. {
  254. btTriangleIndexVertexArray* meshInterface = createMeshInterface(gimpactData->m_meshInterface);
  255. btGImpactMeshShape* gimpactShape = createGimpactShape(meshInterface);
  256. btVector3 localScaling;
  257. localScaling.deSerializeFloat(gimpactData->m_localScaling);
  258. gimpactShape->setLocalScaling(localScaling);
  259. gimpactShape->setMargin(btScalar(gimpactData->m_collisionMargin));
  260. gimpactShape->updateBound();
  261. shape = gimpactShape;
  262. } else
  263. {
  264. printf("unsupported gimpact sub type\n");
  265. }
  266. break;
  267. }
  268. case SOFTBODY_SHAPE_PROXYTYPE:
  269. {
  270. return 0;
  271. }
  272. #endif
  273. default:
  274. {
  275. printf("unsupported shape type (%d)\n",shapeData->m_shapeType);
  276. }
  277. }
  278. return shape;
  279. }
  280. void* btBulletDataExtractor::createBoxShape( const Bullet::btVector3FloatData& halfDimensions, const Bullet::btVector3FloatData& localScaling, float collisionMargin)
  281. {
  282. printf("createBoxShape with halfDimensions %f,%f,%f\n",halfDimensions.m_floats[0], halfDimensions.m_floats[1],halfDimensions.m_floats[2]);
  283. return 0;
  284. }
  285. void* btBulletDataExtractor::createSphereShape( float radius, const Bullet::btVector3FloatData& localScaling, float collisionMargin)
  286. {
  287. printf("createSphereShape with radius %f\n",radius);
  288. return 0;
  289. }
  290. void* btBulletDataExtractor::createPlaneShape( const btVector3FloatData& planeNormal, float planeConstant, const Bullet::btVector3FloatData& localScaling)
  291. {
  292. printf("createPlaneShape with normal %f,%f,%f and planeConstant\n",planeNormal.m_floats[0], planeNormal.m_floats[1],planeNormal.m_floats[2],planeConstant);
  293. return 0;
  294. }