btWorldImporter.cpp 68 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123
  1. /*
  2. Bullet Continuous Collision Detection and Physics Library
  3. Copyright (c) 2003-2012 Erwin Coumans http://bulletphysics.org
  4. This software is provided 'as-is', without any express or implied warranty.
  5. In no event will the authors be held liable for any damages arising from the use of this software.
  6. Permission is granted to anyone to use this software for any purpose,
  7. including commercial applications, and to alter it and redistribute it freely,
  8. subject to the following restrictions:
  9. 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.
  10. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
  11. 3. This notice may not be removed or altered from any source distribution.
  12. */
  13. #include "btWorldImporter.h"
  14. #include "btBulletDynamicsCommon.h"
  15. #ifdef USE_GIMPACT
  16. #include "BulletCollision/Gimpact/btGImpactShape.h"
  17. #endif
  18. btWorldImporter::btWorldImporter(btDynamicsWorld* world)
  19. :m_dynamicsWorld(world),
  20. m_verboseMode(0),
  21. m_importerFlags(0)
  22. {
  23. }
  24. btWorldImporter::~btWorldImporter()
  25. {
  26. }
  27. void btWorldImporter::deleteAllData()
  28. {
  29. int i;
  30. for (i=0;i<m_allocatedConstraints.size();i++)
  31. {
  32. if(m_dynamicsWorld)
  33. m_dynamicsWorld->removeConstraint(m_allocatedConstraints[i]);
  34. delete m_allocatedConstraints[i];
  35. }
  36. m_allocatedConstraints.clear();
  37. for (i=0;i<m_allocatedRigidBodies.size();i++)
  38. {
  39. if(m_dynamicsWorld)
  40. m_dynamicsWorld->removeRigidBody(btRigidBody::upcast(m_allocatedRigidBodies[i]));
  41. delete m_allocatedRigidBodies[i];
  42. }
  43. m_allocatedRigidBodies.clear();
  44. for (i=0;i<m_allocatedCollisionShapes.size();i++)
  45. {
  46. delete m_allocatedCollisionShapes[i];
  47. }
  48. m_allocatedCollisionShapes.clear();
  49. for (i=0;i<m_allocatedBvhs.size();i++)
  50. {
  51. delete m_allocatedBvhs[i];
  52. }
  53. m_allocatedBvhs.clear();
  54. for (i=0;i<m_allocatedTriangleInfoMaps.size();i++)
  55. {
  56. delete m_allocatedTriangleInfoMaps[i];
  57. }
  58. m_allocatedTriangleInfoMaps.clear();
  59. for (i=0;i<m_allocatedTriangleIndexArrays.size();i++)
  60. {
  61. delete m_allocatedTriangleIndexArrays[i];
  62. }
  63. m_allocatedTriangleIndexArrays.clear();
  64. for (i=0;i<m_allocatedNames.size();i++)
  65. {
  66. delete[] m_allocatedNames[i];
  67. }
  68. m_allocatedNames.clear();
  69. for (i=0;i<m_allocatedbtStridingMeshInterfaceDatas.size();i++)
  70. {
  71. btStridingMeshInterfaceData* curData = m_allocatedbtStridingMeshInterfaceDatas[i];
  72. for(int a = 0;a < curData->m_numMeshParts;a++)
  73. {
  74. btMeshPartData* curPart = &curData->m_meshPartsPtr[a];
  75. if(curPart->m_vertices3f)
  76. delete [] curPart->m_vertices3f;
  77. if(curPart->m_vertices3d)
  78. delete [] curPart->m_vertices3d;
  79. if(curPart->m_indices32)
  80. delete [] curPart->m_indices32;
  81. if(curPart->m_3indices16)
  82. delete [] curPart->m_3indices16;
  83. if(curPart->m_indices16)
  84. delete [] curPart->m_indices16;
  85. if (curPart->m_3indices8)
  86. delete [] curPart->m_3indices8;
  87. }
  88. delete [] curData->m_meshPartsPtr;
  89. delete curData;
  90. }
  91. m_allocatedbtStridingMeshInterfaceDatas.clear();
  92. for (i=0;i<m_indexArrays.size();i++)
  93. {
  94. btAlignedFree(m_indexArrays[i]);
  95. }
  96. m_indexArrays.clear();
  97. for (i=0;i<m_shortIndexArrays.size();i++)
  98. {
  99. btAlignedFree(m_shortIndexArrays[i]);
  100. }
  101. m_shortIndexArrays.clear();
  102. for (i=0;i<m_charIndexArrays.size();i++)
  103. {
  104. btAlignedFree(m_charIndexArrays[i]);
  105. }
  106. m_charIndexArrays.clear();
  107. for (i=0;i<m_floatVertexArrays.size();i++)
  108. {
  109. btAlignedFree(m_floatVertexArrays[i]);
  110. }
  111. m_floatVertexArrays.clear();
  112. for (i=0;i<m_doubleVertexArrays.size();i++)
  113. {
  114. btAlignedFree(m_doubleVertexArrays[i]);
  115. }
  116. m_doubleVertexArrays.clear();
  117. }
  118. btCollisionShape* btWorldImporter::convertCollisionShape( btCollisionShapeData* shapeData )
  119. {
  120. btCollisionShape* shape = 0;
  121. switch (shapeData->m_shapeType)
  122. {
  123. case STATIC_PLANE_PROXYTYPE:
  124. {
  125. btStaticPlaneShapeData* planeData = (btStaticPlaneShapeData*)shapeData;
  126. btVector3 planeNormal,localScaling;
  127. planeNormal.deSerializeFloat(planeData->m_planeNormal);
  128. localScaling.deSerializeFloat(planeData->m_localScaling);
  129. shape = createPlaneShape(planeNormal,planeData->m_planeConstant);
  130. shape->setLocalScaling(localScaling);
  131. break;
  132. }
  133. case SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE:
  134. {
  135. btScaledTriangleMeshShapeData* scaledMesh = (btScaledTriangleMeshShapeData*) shapeData;
  136. btCollisionShapeData* colShapeData = (btCollisionShapeData*) &scaledMesh->m_trimeshShapeData;
  137. colShapeData->m_shapeType = TRIANGLE_MESH_SHAPE_PROXYTYPE;
  138. btCollisionShape* childShape = convertCollisionShape(colShapeData);
  139. btBvhTriangleMeshShape* meshShape = (btBvhTriangleMeshShape*)childShape;
  140. btVector3 localScaling;
  141. localScaling.deSerializeFloat(scaledMesh->m_localScaling);
  142. shape = createScaledTrangleMeshShape(meshShape, localScaling);
  143. break;
  144. }
  145. case GIMPACT_SHAPE_PROXYTYPE:
  146. {
  147. #ifdef USE_GIMPACT
  148. btGImpactMeshShapeData* gimpactData = (btGImpactMeshShapeData*) shapeData;
  149. if (gimpactData->m_gimpactSubType == CONST_GIMPACT_TRIMESH_SHAPE)
  150. {
  151. btStridingMeshInterfaceData* interfaceData = createStridingMeshInterfaceData(&gimpactData->m_meshInterface);
  152. btTriangleIndexVertexArray* meshInterface = createMeshInterface(*interfaceData);
  153. btGImpactMeshShape* gimpactShape = createGimpactShape(meshInterface);
  154. btVector3 localScaling;
  155. localScaling.deSerializeFloat(gimpactData->m_localScaling);
  156. gimpactShape->setLocalScaling(localScaling);
  157. gimpactShape->setMargin(btScalar(gimpactData->m_collisionMargin));
  158. gimpactShape->updateBound();
  159. shape = gimpactShape;
  160. } else
  161. {
  162. printf("unsupported gimpact sub type\n");
  163. }
  164. #endif//USE_GIMPACT
  165. break;
  166. }
  167. //The btCapsuleShape* API has issue passing the margin/scaling/halfextents unmodified through the API
  168. //so deal with this
  169. case CAPSULE_SHAPE_PROXYTYPE:
  170. {
  171. btCapsuleShapeData* capData = (btCapsuleShapeData*)shapeData;
  172. switch (capData->m_upAxis)
  173. {
  174. case 0:
  175. {
  176. shape = createCapsuleShapeX(1,1);
  177. break;
  178. }
  179. case 1:
  180. {
  181. shape = createCapsuleShapeY(1,1);
  182. break;
  183. }
  184. case 2:
  185. {
  186. shape = createCapsuleShapeZ(1,1);
  187. break;
  188. }
  189. default:
  190. {
  191. printf("error: wrong up axis for btCapsuleShape\n");
  192. }
  193. };
  194. if (shape)
  195. {
  196. btCapsuleShape* cap = (btCapsuleShape*) shape;
  197. cap->deSerializeFloat(capData);
  198. }
  199. break;
  200. }
  201. case CYLINDER_SHAPE_PROXYTYPE:
  202. case CONE_SHAPE_PROXYTYPE:
  203. case BOX_SHAPE_PROXYTYPE:
  204. case SPHERE_SHAPE_PROXYTYPE:
  205. case MULTI_SPHERE_SHAPE_PROXYTYPE:
  206. case CONVEX_HULL_SHAPE_PROXYTYPE:
  207. {
  208. btConvexInternalShapeData* bsd = (btConvexInternalShapeData*)shapeData;
  209. btVector3 implicitShapeDimensions;
  210. implicitShapeDimensions.deSerializeFloat(bsd->m_implicitShapeDimensions);
  211. btVector3 localScaling;
  212. localScaling.deSerializeFloat(bsd->m_localScaling);
  213. btVector3 margin(bsd->m_collisionMargin,bsd->m_collisionMargin,bsd->m_collisionMargin);
  214. switch (shapeData->m_shapeType)
  215. {
  216. case BOX_SHAPE_PROXYTYPE:
  217. {
  218. btBoxShape* box= (btBoxShape*)createBoxShape(implicitShapeDimensions/localScaling+margin);
  219. //box->initializePolyhedralFeatures();
  220. shape = box;
  221. break;
  222. }
  223. case SPHERE_SHAPE_PROXYTYPE:
  224. {
  225. shape = createSphereShape(implicitShapeDimensions.getX());
  226. break;
  227. }
  228. case CYLINDER_SHAPE_PROXYTYPE:
  229. {
  230. btCylinderShapeData* cylData = (btCylinderShapeData*) shapeData;
  231. btVector3 halfExtents = implicitShapeDimensions+margin;
  232. switch (cylData->m_upAxis)
  233. {
  234. case 0:
  235. {
  236. shape = createCylinderShapeX(halfExtents.getY(),halfExtents.getX());
  237. break;
  238. }
  239. case 1:
  240. {
  241. shape = createCylinderShapeY(halfExtents.getX(),halfExtents.getY());
  242. break;
  243. }
  244. case 2:
  245. {
  246. shape = createCylinderShapeZ(halfExtents.getX(),halfExtents.getZ());
  247. break;
  248. }
  249. default:
  250. {
  251. printf("unknown Cylinder up axis\n");
  252. }
  253. };
  254. break;
  255. }
  256. case CONE_SHAPE_PROXYTYPE:
  257. {
  258. btConeShapeData* conData = (btConeShapeData*) shapeData;
  259. btVector3 halfExtents = implicitShapeDimensions;//+margin;
  260. switch (conData->m_upIndex)
  261. {
  262. case 0:
  263. {
  264. shape = createConeShapeX(halfExtents.getY(),halfExtents.getX());
  265. break;
  266. }
  267. case 1:
  268. {
  269. shape = createConeShapeY(halfExtents.getX(),halfExtents.getY());
  270. break;
  271. }
  272. case 2:
  273. {
  274. shape = createConeShapeZ(halfExtents.getX(),halfExtents.getZ());
  275. break;
  276. }
  277. default:
  278. {
  279. printf("unknown Cone up axis\n");
  280. }
  281. };
  282. break;
  283. }
  284. case MULTI_SPHERE_SHAPE_PROXYTYPE:
  285. {
  286. btMultiSphereShapeData* mss = (btMultiSphereShapeData*)bsd;
  287. int numSpheres = mss->m_localPositionArraySize;
  288. btAlignedObjectArray<btVector3> tmpPos;
  289. btAlignedObjectArray<btScalar> radii;
  290. radii.resize(numSpheres);
  291. tmpPos.resize(numSpheres);
  292. int i;
  293. for ( i=0;i<numSpheres;i++)
  294. {
  295. tmpPos[i].deSerializeFloat(mss->m_localPositionArrayPtr[i].m_pos);
  296. radii[i] = mss->m_localPositionArrayPtr[i].m_radius;
  297. }
  298. shape = createMultiSphereShape(&tmpPos[0],&radii[0],numSpheres);
  299. break;
  300. }
  301. case CONVEX_HULL_SHAPE_PROXYTYPE:
  302. {
  303. // int sz = sizeof(btConvexHullShapeData);
  304. // int sz2 = sizeof(btConvexInternalShapeData);
  305. // int sz3 = sizeof(btCollisionShapeData);
  306. btConvexHullShapeData* convexData = (btConvexHullShapeData*)bsd;
  307. int numPoints = convexData->m_numUnscaledPoints;
  308. btAlignedObjectArray<btVector3> tmpPoints;
  309. tmpPoints.resize(numPoints);
  310. int i;
  311. for ( i=0;i<numPoints;i++)
  312. {
  313. #ifdef BT_USE_DOUBLE_PRECISION
  314. if (convexData->m_unscaledPointsDoublePtr)
  315. tmpPoints[i].deSerialize(convexData->m_unscaledPointsDoublePtr[i]);
  316. if (convexData->m_unscaledPointsFloatPtr)
  317. tmpPoints[i].deSerializeFloat(convexData->m_unscaledPointsFloatPtr[i]);
  318. #else
  319. if (convexData->m_unscaledPointsFloatPtr)
  320. tmpPoints[i].deSerialize(convexData->m_unscaledPointsFloatPtr[i]);
  321. if (convexData->m_unscaledPointsDoublePtr)
  322. tmpPoints[i].deSerializeDouble(convexData->m_unscaledPointsDoublePtr[i]);
  323. #endif //BT_USE_DOUBLE_PRECISION
  324. }
  325. btConvexHullShape* hullShape = createConvexHullShape();
  326. for (i=0;i<numPoints;i++)
  327. {
  328. hullShape->addPoint(tmpPoints[i]);
  329. }
  330. hullShape->setMargin(bsd->m_collisionMargin);
  331. //hullShape->initializePolyhedralFeatures();
  332. shape = hullShape;
  333. break;
  334. }
  335. default:
  336. {
  337. printf("error: cannot create shape type (%d)\n",shapeData->m_shapeType);
  338. }
  339. }
  340. if (shape)
  341. {
  342. shape->setMargin(bsd->m_collisionMargin);
  343. btVector3 localScaling;
  344. localScaling.deSerializeFloat(bsd->m_localScaling);
  345. shape->setLocalScaling(localScaling);
  346. }
  347. break;
  348. }
  349. case TRIANGLE_MESH_SHAPE_PROXYTYPE:
  350. {
  351. btTriangleMeshShapeData* trimesh = (btTriangleMeshShapeData*)shapeData;
  352. btStridingMeshInterfaceData* interfaceData = createStridingMeshInterfaceData(&trimesh->m_meshInterface);
  353. btTriangleIndexVertexArray* meshInterface = createMeshInterface(*interfaceData);
  354. if (!meshInterface->getNumSubParts())
  355. {
  356. return 0;
  357. }
  358. btVector3 scaling; scaling.deSerializeFloat(trimesh->m_meshInterface.m_scaling);
  359. meshInterface->setScaling(scaling);
  360. btOptimizedBvh* bvh = 0;
  361. #if 1
  362. if (trimesh->m_quantizedFloatBvh)
  363. {
  364. btOptimizedBvh** bvhPtr = m_bvhMap.find(trimesh->m_quantizedFloatBvh);
  365. if (bvhPtr && *bvhPtr)
  366. {
  367. bvh = *bvhPtr;
  368. } else
  369. {
  370. bvh = createOptimizedBvh();
  371. bvh->deSerializeFloat(*trimesh->m_quantizedFloatBvh);
  372. }
  373. }
  374. if (trimesh->m_quantizedDoubleBvh)
  375. {
  376. btOptimizedBvh** bvhPtr = m_bvhMap.find(trimesh->m_quantizedDoubleBvh);
  377. if (bvhPtr && *bvhPtr)
  378. {
  379. bvh = *bvhPtr;
  380. } else
  381. {
  382. bvh = createOptimizedBvh();
  383. bvh->deSerializeDouble(*trimesh->m_quantizedDoubleBvh);
  384. }
  385. }
  386. #endif
  387. btBvhTriangleMeshShape* trimeshShape = createBvhTriangleMeshShape(meshInterface,bvh);
  388. trimeshShape->setMargin(trimesh->m_collisionMargin);
  389. shape = trimeshShape;
  390. if (trimesh->m_triangleInfoMap)
  391. {
  392. btTriangleInfoMap* map = createTriangleInfoMap();
  393. map->deSerialize(*trimesh->m_triangleInfoMap);
  394. trimeshShape->setTriangleInfoMap(map);
  395. #ifdef USE_INTERNAL_EDGE_UTILITY
  396. gContactAddedCallback = btAdjustInternalEdgeContactsCallback;
  397. #endif //USE_INTERNAL_EDGE_UTILITY
  398. }
  399. //printf("trimesh->m_collisionMargin=%f\n",trimesh->m_collisionMargin);
  400. break;
  401. }
  402. case COMPOUND_SHAPE_PROXYTYPE:
  403. {
  404. btCompoundShapeData* compoundData = (btCompoundShapeData*)shapeData;
  405. btCompoundShape* compoundShape = createCompoundShape();
  406. btAlignedObjectArray<btCollisionShape*> childShapes;
  407. for (int i=0;i<compoundData->m_numChildShapes;i++)
  408. {
  409. btCollisionShapeData* cd = compoundData->m_childShapePtr[i].m_childShape;
  410. btCollisionShape* childShape = convertCollisionShape(cd);
  411. if (childShape)
  412. {
  413. btTransform localTransform;
  414. localTransform.deSerializeFloat(compoundData->m_childShapePtr[i].m_transform);
  415. compoundShape->addChildShape(localTransform,childShape);
  416. } else
  417. {
  418. #ifdef _DEBUG
  419. printf("error: couldn't create childShape for compoundShape\n");
  420. #endif
  421. }
  422. }
  423. shape = compoundShape;
  424. break;
  425. }
  426. case SOFTBODY_SHAPE_PROXYTYPE:
  427. {
  428. return 0;
  429. }
  430. default:
  431. {
  432. #ifdef _DEBUG
  433. printf("unsupported shape type (%d)\n",shapeData->m_shapeType);
  434. #endif
  435. }
  436. }
  437. return shape;
  438. }
  439. char* btWorldImporter::duplicateName(const char* name)
  440. {
  441. if (name)
  442. {
  443. int l = (int)strlen(name);
  444. char* newName = new char[l+1];
  445. memcpy(newName,name,l);
  446. newName[l] = 0;
  447. m_allocatedNames.push_back(newName);
  448. return newName;
  449. }
  450. return 0;
  451. }
  452. void btWorldImporter::convertConstraintBackwardsCompatible281(btTypedConstraintData* constraintData, btRigidBody* rbA, btRigidBody* rbB, int fileVersion)
  453. {
  454. btTypedConstraint* constraint = 0;
  455. switch (constraintData->m_objectType)
  456. {
  457. case POINT2POINT_CONSTRAINT_TYPE:
  458. {
  459. btPoint2PointConstraintDoubleData* p2pData = (btPoint2PointConstraintDoubleData*)constraintData;
  460. if (rbA && rbB)
  461. {
  462. btVector3 pivotInA,pivotInB;
  463. pivotInA.deSerializeDouble(p2pData->m_pivotInA);
  464. pivotInB.deSerializeDouble(p2pData->m_pivotInB);
  465. constraint = createPoint2PointConstraint(*rbA,*rbB,pivotInA,pivotInB);
  466. } else
  467. {
  468. btVector3 pivotInA;
  469. pivotInA.deSerializeDouble(p2pData->m_pivotInA);
  470. constraint = createPoint2PointConstraint(*rbA,pivotInA);
  471. }
  472. break;
  473. }
  474. case HINGE_CONSTRAINT_TYPE:
  475. {
  476. btHingeConstraint* hinge = 0;
  477. btHingeConstraintDoubleData* hingeData = (btHingeConstraintDoubleData*)constraintData;
  478. if (rbA&& rbB)
  479. {
  480. btTransform rbAFrame,rbBFrame;
  481. rbAFrame.deSerializeDouble(hingeData->m_rbAFrame);
  482. rbBFrame.deSerializeDouble(hingeData->m_rbBFrame);
  483. hinge = createHingeConstraint(*rbA,*rbB,rbAFrame,rbBFrame,hingeData->m_useReferenceFrameA!=0);
  484. } else
  485. {
  486. btTransform rbAFrame;
  487. rbAFrame.deSerializeDouble(hingeData->m_rbAFrame);
  488. hinge = createHingeConstraint(*rbA,rbAFrame,hingeData->m_useReferenceFrameA!=0);
  489. }
  490. if (hingeData->m_enableAngularMotor)
  491. {
  492. hinge->enableAngularMotor(true,(btScalar)hingeData->m_motorTargetVelocity,(btScalar)hingeData->m_maxMotorImpulse);
  493. }
  494. hinge->setAngularOnly(hingeData->m_angularOnly!=0);
  495. hinge->setLimit(btScalar(hingeData->m_lowerLimit),btScalar(hingeData->m_upperLimit),btScalar(hingeData->m_limitSoftness),btScalar(hingeData->m_biasFactor),btScalar(hingeData->m_relaxationFactor));
  496. constraint = hinge;
  497. break;
  498. }
  499. case CONETWIST_CONSTRAINT_TYPE:
  500. {
  501. btConeTwistConstraintData* coneData = (btConeTwistConstraintData*)constraintData;
  502. btConeTwistConstraint* coneTwist = 0;
  503. if (rbA&& rbB)
  504. {
  505. btTransform rbAFrame,rbBFrame;
  506. rbAFrame.deSerializeFloat(coneData->m_rbAFrame);
  507. rbBFrame.deSerializeFloat(coneData->m_rbBFrame);
  508. coneTwist = createConeTwistConstraint(*rbA,*rbB,rbAFrame,rbBFrame);
  509. } else
  510. {
  511. btTransform rbAFrame;
  512. rbAFrame.deSerializeFloat(coneData->m_rbAFrame);
  513. coneTwist = createConeTwistConstraint(*rbA,rbAFrame);
  514. }
  515. coneTwist->setLimit((btScalar)coneData->m_swingSpan1,(btScalar)coneData->m_swingSpan2,(btScalar)coneData->m_twistSpan,(btScalar)coneData->m_limitSoftness,
  516. (btScalar)coneData->m_biasFactor,(btScalar)coneData->m_relaxationFactor);
  517. coneTwist->setDamping((btScalar)coneData->m_damping);
  518. constraint = coneTwist;
  519. break;
  520. }
  521. case D6_SPRING_CONSTRAINT_TYPE:
  522. {
  523. btGeneric6DofSpringConstraintData* dofData = (btGeneric6DofSpringConstraintData*)constraintData;
  524. // int sz = sizeof(btGeneric6DofSpringConstraintData);
  525. btGeneric6DofSpringConstraint* dof = 0;
  526. if (rbA && rbB)
  527. {
  528. btTransform rbAFrame,rbBFrame;
  529. rbAFrame.deSerializeFloat(dofData->m_6dofData.m_rbAFrame);
  530. rbBFrame.deSerializeFloat(dofData->m_6dofData.m_rbBFrame);
  531. dof = createGeneric6DofSpringConstraint(*rbA,*rbB,rbAFrame,rbBFrame,dofData->m_6dofData.m_useLinearReferenceFrameA!=0);
  532. } else
  533. {
  534. printf("Error in btWorldImporter::createGeneric6DofSpringConstraint: requires rbA && rbB\n");
  535. }
  536. if (dof)
  537. {
  538. btVector3 angLowerLimit,angUpperLimit, linLowerLimit,linUpperlimit;
  539. angLowerLimit.deSerializeFloat(dofData->m_6dofData.m_angularLowerLimit);
  540. angUpperLimit.deSerializeFloat(dofData->m_6dofData.m_angularUpperLimit);
  541. linLowerLimit.deSerializeFloat(dofData->m_6dofData.m_linearLowerLimit);
  542. linUpperlimit.deSerializeFloat(dofData->m_6dofData.m_linearUpperLimit);
  543. angLowerLimit.setW(0.f);
  544. dof->setAngularLowerLimit(angLowerLimit);
  545. dof->setAngularUpperLimit(angUpperLimit);
  546. dof->setLinearLowerLimit(linLowerLimit);
  547. dof->setLinearUpperLimit(linUpperlimit);
  548. int i;
  549. if (fileVersion>280)
  550. {
  551. for (i=0;i<6;i++)
  552. {
  553. dof->setStiffness(i,(btScalar)dofData->m_springStiffness[i]);
  554. dof->setEquilibriumPoint(i,(btScalar)dofData->m_equilibriumPoint[i]);
  555. dof->enableSpring(i,dofData->m_springEnabled[i]!=0);
  556. dof->setDamping(i,(btScalar)dofData->m_springDamping[i]);
  557. }
  558. }
  559. }
  560. constraint = dof;
  561. break;
  562. }
  563. case D6_CONSTRAINT_TYPE:
  564. {
  565. btGeneric6DofConstraintData* dofData = (btGeneric6DofConstraintData*)constraintData;
  566. btGeneric6DofConstraint* dof = 0;
  567. if (rbA&& rbB)
  568. {
  569. btTransform rbAFrame,rbBFrame;
  570. rbAFrame.deSerializeFloat(dofData->m_rbAFrame);
  571. rbBFrame.deSerializeFloat(dofData->m_rbBFrame);
  572. dof = createGeneric6DofConstraint(*rbA,*rbB,rbAFrame,rbBFrame,dofData->m_useLinearReferenceFrameA!=0);
  573. } else
  574. {
  575. if (rbB)
  576. {
  577. btTransform rbBFrame;
  578. rbBFrame.deSerializeFloat(dofData->m_rbBFrame);
  579. dof = createGeneric6DofConstraint(*rbB,rbBFrame,dofData->m_useLinearReferenceFrameA!=0);
  580. } else
  581. {
  582. printf("Error in btWorldImporter::createGeneric6DofConstraint: missing rbB\n");
  583. }
  584. }
  585. if (dof)
  586. {
  587. btVector3 angLowerLimit,angUpperLimit, linLowerLimit,linUpperlimit;
  588. angLowerLimit.deSerializeFloat(dofData->m_angularLowerLimit);
  589. angUpperLimit.deSerializeFloat(dofData->m_angularUpperLimit);
  590. linLowerLimit.deSerializeFloat(dofData->m_linearLowerLimit);
  591. linUpperlimit.deSerializeFloat(dofData->m_linearUpperLimit);
  592. dof->setAngularLowerLimit(angLowerLimit);
  593. dof->setAngularUpperLimit(angUpperLimit);
  594. dof->setLinearLowerLimit(linLowerLimit);
  595. dof->setLinearUpperLimit(linUpperlimit);
  596. }
  597. constraint = dof;
  598. break;
  599. }
  600. case SLIDER_CONSTRAINT_TYPE:
  601. {
  602. btSliderConstraintData* sliderData = (btSliderConstraintData*)constraintData;
  603. btSliderConstraint* slider = 0;
  604. if (rbA&& rbB)
  605. {
  606. btTransform rbAFrame,rbBFrame;
  607. rbAFrame.deSerializeFloat(sliderData->m_rbAFrame);
  608. rbBFrame.deSerializeFloat(sliderData->m_rbBFrame);
  609. slider = createSliderConstraint(*rbA,*rbB,rbAFrame,rbBFrame,sliderData->m_useLinearReferenceFrameA!=0);
  610. } else
  611. {
  612. btTransform rbBFrame;
  613. rbBFrame.deSerializeFloat(sliderData->m_rbBFrame);
  614. slider = createSliderConstraint(*rbB,rbBFrame,sliderData->m_useLinearReferenceFrameA!=0);
  615. }
  616. slider->setLowerLinLimit((btScalar)sliderData->m_linearLowerLimit);
  617. slider->setUpperLinLimit((btScalar)sliderData->m_linearUpperLimit);
  618. slider->setLowerAngLimit((btScalar)sliderData->m_angularLowerLimit);
  619. slider->setUpperAngLimit((btScalar)sliderData->m_angularUpperLimit);
  620. slider->setUseFrameOffset(sliderData->m_useOffsetForConstraintFrame!=0);
  621. constraint = slider;
  622. break;
  623. }
  624. default:
  625. {
  626. printf("unknown constraint type\n");
  627. }
  628. };
  629. if (constraint)
  630. {
  631. constraint->setDbgDrawSize((btScalar)constraintData->m_dbgDrawSize);
  632. ///those fields didn't exist and set to zero for pre-280 versions, so do a check here
  633. if (fileVersion>=280)
  634. {
  635. constraint->setBreakingImpulseThreshold((btScalar)constraintData->m_breakingImpulseThreshold);
  636. constraint->setEnabled(constraintData->m_isEnabled!=0);
  637. constraint->setOverrideNumSolverIterations(constraintData->m_overrideNumSolverIterations);
  638. }
  639. if (constraintData->m_name)
  640. {
  641. char* newname = duplicateName(constraintData->m_name);
  642. m_nameConstraintMap.insert(newname,constraint);
  643. m_objectNameMap.insert(constraint,newname);
  644. }
  645. if(m_dynamicsWorld)
  646. m_dynamicsWorld->addConstraint(constraint,constraintData->m_disableCollisionsBetweenLinkedBodies!=0);
  647. }
  648. }
  649. void btWorldImporter::convertConstraintFloat(btTypedConstraintFloatData* constraintData, btRigidBody* rbA, btRigidBody* rbB, int fileVersion)
  650. {
  651. btTypedConstraint* constraint = 0;
  652. switch (constraintData->m_objectType)
  653. {
  654. case POINT2POINT_CONSTRAINT_TYPE:
  655. {
  656. btPoint2PointConstraintFloatData* p2pData = (btPoint2PointConstraintFloatData*)constraintData;
  657. if (rbA&& rbB)
  658. {
  659. btVector3 pivotInA,pivotInB;
  660. pivotInA.deSerializeFloat(p2pData->m_pivotInA);
  661. pivotInB.deSerializeFloat(p2pData->m_pivotInB);
  662. constraint = createPoint2PointConstraint(*rbA,*rbB,pivotInA,pivotInB);
  663. } else
  664. {
  665. btVector3 pivotInA;
  666. pivotInA.deSerializeFloat(p2pData->m_pivotInA);
  667. constraint = createPoint2PointConstraint(*rbA,pivotInA);
  668. }
  669. break;
  670. }
  671. case HINGE_CONSTRAINT_TYPE:
  672. {
  673. btHingeConstraint* hinge = 0;
  674. btHingeConstraintFloatData* hingeData = (btHingeConstraintFloatData*)constraintData;
  675. if (rbA&& rbB)
  676. {
  677. btTransform rbAFrame,rbBFrame;
  678. rbAFrame.deSerializeFloat(hingeData->m_rbAFrame);
  679. rbBFrame.deSerializeFloat(hingeData->m_rbBFrame);
  680. hinge = createHingeConstraint(*rbA,*rbB,rbAFrame,rbBFrame,hingeData->m_useReferenceFrameA!=0);
  681. } else
  682. {
  683. btTransform rbAFrame;
  684. rbAFrame.deSerializeFloat(hingeData->m_rbAFrame);
  685. hinge = createHingeConstraint(*rbA,rbAFrame,hingeData->m_useReferenceFrameA!=0);
  686. }
  687. if (hingeData->m_enableAngularMotor)
  688. {
  689. hinge->enableAngularMotor(true,hingeData->m_motorTargetVelocity,hingeData->m_maxMotorImpulse);
  690. }
  691. hinge->setAngularOnly(hingeData->m_angularOnly!=0);
  692. hinge->setLimit(btScalar(hingeData->m_lowerLimit),btScalar(hingeData->m_upperLimit),btScalar(hingeData->m_limitSoftness),btScalar(hingeData->m_biasFactor),btScalar(hingeData->m_relaxationFactor));
  693. constraint = hinge;
  694. break;
  695. }
  696. case CONETWIST_CONSTRAINT_TYPE:
  697. {
  698. btConeTwistConstraintData* coneData = (btConeTwistConstraintData*)constraintData;
  699. btConeTwistConstraint* coneTwist = 0;
  700. if (rbA&& rbB)
  701. {
  702. btTransform rbAFrame,rbBFrame;
  703. rbAFrame.deSerializeFloat(coneData->m_rbAFrame);
  704. rbBFrame.deSerializeFloat(coneData->m_rbBFrame);
  705. coneTwist = createConeTwistConstraint(*rbA,*rbB,rbAFrame,rbBFrame);
  706. } else
  707. {
  708. btTransform rbAFrame;
  709. rbAFrame.deSerializeFloat(coneData->m_rbAFrame);
  710. coneTwist = createConeTwistConstraint(*rbA,rbAFrame);
  711. }
  712. coneTwist->setLimit(coneData->m_swingSpan1,coneData->m_swingSpan2,coneData->m_twistSpan,coneData->m_limitSoftness,coneData->m_biasFactor,coneData->m_relaxationFactor);
  713. coneTwist->setDamping(coneData->m_damping);
  714. constraint = coneTwist;
  715. break;
  716. }
  717. case D6_SPRING_CONSTRAINT_TYPE:
  718. {
  719. btGeneric6DofSpringConstraintData* dofData = (btGeneric6DofSpringConstraintData*)constraintData;
  720. // int sz = sizeof(btGeneric6DofSpringConstraintData);
  721. btGeneric6DofSpringConstraint* dof = 0;
  722. if (rbA && rbB)
  723. {
  724. btTransform rbAFrame,rbBFrame;
  725. rbAFrame.deSerializeFloat(dofData->m_6dofData.m_rbAFrame);
  726. rbBFrame.deSerializeFloat(dofData->m_6dofData.m_rbBFrame);
  727. dof = createGeneric6DofSpringConstraint(*rbA,*rbB,rbAFrame,rbBFrame,dofData->m_6dofData.m_useLinearReferenceFrameA!=0);
  728. } else
  729. {
  730. printf("Error in btWorldImporter::createGeneric6DofSpringConstraint: requires rbA && rbB\n");
  731. }
  732. if (dof)
  733. {
  734. btVector3 angLowerLimit,angUpperLimit, linLowerLimit,linUpperlimit;
  735. angLowerLimit.deSerializeFloat(dofData->m_6dofData.m_angularLowerLimit);
  736. angUpperLimit.deSerializeFloat(dofData->m_6dofData.m_angularUpperLimit);
  737. linLowerLimit.deSerializeFloat(dofData->m_6dofData.m_linearLowerLimit);
  738. linUpperlimit.deSerializeFloat(dofData->m_6dofData.m_linearUpperLimit);
  739. angLowerLimit.setW(0.f);
  740. dof->setAngularLowerLimit(angLowerLimit);
  741. dof->setAngularUpperLimit(angUpperLimit);
  742. dof->setLinearLowerLimit(linLowerLimit);
  743. dof->setLinearUpperLimit(linUpperlimit);
  744. int i;
  745. if (fileVersion>280)
  746. {
  747. for (i=0;i<6;i++)
  748. {
  749. dof->setStiffness(i,dofData->m_springStiffness[i]);
  750. dof->setEquilibriumPoint(i,dofData->m_equilibriumPoint[i]);
  751. dof->enableSpring(i,dofData->m_springEnabled[i]!=0);
  752. dof->setDamping(i,dofData->m_springDamping[i]);
  753. }
  754. }
  755. }
  756. constraint = dof;
  757. break;
  758. }
  759. case D6_CONSTRAINT_TYPE:
  760. {
  761. btGeneric6DofConstraintData* dofData = (btGeneric6DofConstraintData*)constraintData;
  762. btGeneric6DofConstraint* dof = 0;
  763. if (rbA&& rbB)
  764. {
  765. btTransform rbAFrame,rbBFrame;
  766. rbAFrame.deSerializeFloat(dofData->m_rbAFrame);
  767. rbBFrame.deSerializeFloat(dofData->m_rbBFrame);
  768. dof = createGeneric6DofConstraint(*rbA,*rbB,rbAFrame,rbBFrame,dofData->m_useLinearReferenceFrameA!=0);
  769. } else
  770. {
  771. if (rbB)
  772. {
  773. btTransform rbBFrame;
  774. rbBFrame.deSerializeFloat(dofData->m_rbBFrame);
  775. dof = createGeneric6DofConstraint(*rbB,rbBFrame,dofData->m_useLinearReferenceFrameA!=0);
  776. } else
  777. {
  778. printf("Error in btWorldImporter::createGeneric6DofConstraint: missing rbB\n");
  779. }
  780. }
  781. if (dof)
  782. {
  783. btVector3 angLowerLimit,angUpperLimit, linLowerLimit,linUpperlimit;
  784. angLowerLimit.deSerializeFloat(dofData->m_angularLowerLimit);
  785. angUpperLimit.deSerializeFloat(dofData->m_angularUpperLimit);
  786. linLowerLimit.deSerializeFloat(dofData->m_linearLowerLimit);
  787. linUpperlimit.deSerializeFloat(dofData->m_linearUpperLimit);
  788. dof->setAngularLowerLimit(angLowerLimit);
  789. dof->setAngularUpperLimit(angUpperLimit);
  790. dof->setLinearLowerLimit(linLowerLimit);
  791. dof->setLinearUpperLimit(linUpperlimit);
  792. }
  793. constraint = dof;
  794. break;
  795. }
  796. case SLIDER_CONSTRAINT_TYPE:
  797. {
  798. btSliderConstraintData* sliderData = (btSliderConstraintData*)constraintData;
  799. btSliderConstraint* slider = 0;
  800. if (rbA&& rbB)
  801. {
  802. btTransform rbAFrame,rbBFrame;
  803. rbAFrame.deSerializeFloat(sliderData->m_rbAFrame);
  804. rbBFrame.deSerializeFloat(sliderData->m_rbBFrame);
  805. slider = createSliderConstraint(*rbA,*rbB,rbAFrame,rbBFrame,sliderData->m_useLinearReferenceFrameA!=0);
  806. } else
  807. {
  808. btTransform rbBFrame;
  809. rbBFrame.deSerializeFloat(sliderData->m_rbBFrame);
  810. slider = createSliderConstraint(*rbB,rbBFrame,sliderData->m_useLinearReferenceFrameA!=0);
  811. }
  812. slider->setLowerLinLimit(sliderData->m_linearLowerLimit);
  813. slider->setUpperLinLimit(sliderData->m_linearUpperLimit);
  814. slider->setLowerAngLimit(sliderData->m_angularLowerLimit);
  815. slider->setUpperAngLimit(sliderData->m_angularUpperLimit);
  816. slider->setUseFrameOffset(sliderData->m_useOffsetForConstraintFrame!=0);
  817. constraint = slider;
  818. break;
  819. }
  820. case GEAR_CONSTRAINT_TYPE:
  821. {
  822. btGearConstraintFloatData* gearData = (btGearConstraintFloatData*) constraintData;
  823. btGearConstraint* gear = 0;
  824. if (rbA&&rbB)
  825. {
  826. btVector3 axisInA,axisInB;
  827. axisInA.deSerializeFloat(gearData->m_axisInA);
  828. axisInB.deSerializeFloat(gearData->m_axisInB);
  829. gear = createGearConstraint(*rbA, *rbB, axisInA,axisInB, gearData->m_ratio);
  830. } else
  831. {
  832. btAssert(0);
  833. //perhaps a gear against a 'fixed' body, while the 'fixed' body is not serialized?
  834. //btGearConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& axisInA,const btVector3& axisInB, btScalar ratio=1.f);
  835. }
  836. constraint = gear;
  837. break;
  838. }
  839. case D6_SPRING_2_CONSTRAINT_TYPE:
  840. {
  841. btGeneric6DofSpring2ConstraintData* dofData = (btGeneric6DofSpring2ConstraintData*)constraintData;
  842. btGeneric6DofSpring2Constraint* dof = 0;
  843. if (rbA && rbB)
  844. {
  845. btTransform rbAFrame,rbBFrame;
  846. rbAFrame.deSerializeFloat(dofData->m_rbAFrame);
  847. rbBFrame.deSerializeFloat(dofData->m_rbBFrame);
  848. dof = createGeneric6DofSpring2Constraint(*rbA,*rbB,rbAFrame,rbBFrame, dofData->m_rotateOrder);
  849. } else
  850. {
  851. printf("Error in btWorldImporter::createGeneric6DofSpring2Constraint: requires rbA && rbB\n");
  852. }
  853. if (dof)
  854. {
  855. btVector3 angLowerLimit,angUpperLimit, linLowerLimit,linUpperlimit;
  856. angLowerLimit.deSerializeFloat(dofData->m_angularLowerLimit);
  857. angUpperLimit.deSerializeFloat(dofData->m_angularUpperLimit);
  858. linLowerLimit.deSerializeFloat(dofData->m_linearLowerLimit);
  859. linUpperlimit.deSerializeFloat(dofData->m_linearUpperLimit);
  860. angLowerLimit.setW(0.f);
  861. dof->setAngularLowerLimit(angLowerLimit);
  862. dof->setAngularUpperLimit(angUpperLimit);
  863. dof->setLinearLowerLimit(linLowerLimit);
  864. dof->setLinearUpperLimit(linUpperlimit);
  865. int i;
  866. if (fileVersion>280)
  867. {
  868. //6-dof: 3 linear followed by 3 angular
  869. for (i=0;i<3;i++)
  870. {
  871. dof->setStiffness(i,dofData->m_linearSpringStiffness.m_floats[i],dofData->m_linearSpringStiffnessLimited[i]!=0);
  872. dof->setEquilibriumPoint(i,dofData->m_linearEquilibriumPoint.m_floats[i]);
  873. dof->enableSpring(i,dofData->m_linearEnableSpring[i]!=0);
  874. dof->setDamping(i,dofData->m_linearSpringDamping.m_floats[i],(dofData->m_linearSpringDampingLimited[i]!=0));
  875. }
  876. for (i=0;i<3;i++)
  877. {
  878. dof->setStiffness(i+3,dofData->m_angularSpringStiffness.m_floats[i],(dofData->m_angularSpringStiffnessLimited[i]!=0));
  879. dof->setEquilibriumPoint(i+3,dofData->m_angularEquilibriumPoint.m_floats[i]);
  880. dof->enableSpring(i+3,dofData->m_angularEnableSpring[i]!=0);
  881. dof->setDamping(i+3,dofData->m_angularSpringDamping.m_floats[i],dofData->m_angularSpringDampingLimited[i]);
  882. }
  883. }
  884. }
  885. constraint = dof;
  886. break;
  887. }
  888. case FIXED_CONSTRAINT_TYPE:
  889. {
  890. btGeneric6DofSpring2Constraint* dof = 0;
  891. if (rbA && rbB)
  892. {
  893. btTransform rbAFrame,rbBFrame;
  894. //compute a shared world frame, and compute frameInA, frameInB relative to this
  895. btTransform sharedFrame;
  896. sharedFrame.setIdentity();
  897. btVector3 centerPos = btScalar(0.5)*(rbA->getWorldTransform().getOrigin()+
  898. rbB->getWorldTransform().getOrigin());
  899. sharedFrame.setOrigin(centerPos);
  900. rbAFrame = rbA->getWorldTransform().inverse()*sharedFrame;
  901. rbBFrame = rbB->getWorldTransform().inverse()*sharedFrame;
  902. dof = createGeneric6DofSpring2Constraint(*rbA,*rbB,rbAFrame,rbBFrame, RO_XYZ);
  903. dof->setLinearUpperLimit(btVector3(0,0,0));
  904. dof->setLinearLowerLimit(btVector3(0,0,0));
  905. dof->setAngularUpperLimit(btVector3(0,0,0));
  906. dof->setAngularLowerLimit(btVector3(0,0,0));
  907. } else
  908. {
  909. printf("Error in btWorldImporter::createGeneric6DofSpring2Constraint: requires rbA && rbB\n");
  910. }
  911. constraint = dof;
  912. break;
  913. }
  914. default:
  915. {
  916. printf("unknown constraint type\n");
  917. }
  918. };
  919. if (constraint)
  920. {
  921. constraint->setDbgDrawSize(constraintData->m_dbgDrawSize);
  922. ///those fields didn't exist and set to zero for pre-280 versions, so do a check here
  923. if (fileVersion>=280)
  924. {
  925. constraint->setBreakingImpulseThreshold(constraintData->m_breakingImpulseThreshold);
  926. constraint->setEnabled(constraintData->m_isEnabled!=0);
  927. constraint->setOverrideNumSolverIterations(constraintData->m_overrideNumSolverIterations);
  928. }
  929. if (constraintData->m_name)
  930. {
  931. char* newname = duplicateName(constraintData->m_name);
  932. m_nameConstraintMap.insert(newname,constraint);
  933. m_objectNameMap.insert(constraint,newname);
  934. }
  935. if(m_dynamicsWorld)
  936. m_dynamicsWorld->addConstraint(constraint,constraintData->m_disableCollisionsBetweenLinkedBodies!=0);
  937. }
  938. }
  939. void btWorldImporter::convertConstraintDouble(btTypedConstraintDoubleData* constraintData, btRigidBody* rbA, btRigidBody* rbB, int fileVersion)
  940. {
  941. btTypedConstraint* constraint = 0;
  942. switch (constraintData->m_objectType)
  943. {
  944. case POINT2POINT_CONSTRAINT_TYPE:
  945. {
  946. btPoint2PointConstraintDoubleData2* p2pData = (btPoint2PointConstraintDoubleData2*)constraintData;
  947. if (rbA && rbB)
  948. {
  949. btVector3 pivotInA,pivotInB;
  950. pivotInA.deSerializeDouble(p2pData->m_pivotInA);
  951. pivotInB.deSerializeDouble(p2pData->m_pivotInB);
  952. constraint = createPoint2PointConstraint(*rbA,*rbB,pivotInA,pivotInB);
  953. } else
  954. {
  955. btVector3 pivotInA;
  956. pivotInA.deSerializeDouble(p2pData->m_pivotInA);
  957. constraint = createPoint2PointConstraint(*rbA,pivotInA);
  958. }
  959. break;
  960. }
  961. case HINGE_CONSTRAINT_TYPE:
  962. {
  963. btHingeConstraint* hinge = 0;
  964. btHingeConstraintDoubleData2* hingeData = (btHingeConstraintDoubleData2*)constraintData;
  965. if (rbA&& rbB)
  966. {
  967. btTransform rbAFrame,rbBFrame;
  968. rbAFrame.deSerializeDouble(hingeData->m_rbAFrame);
  969. rbBFrame.deSerializeDouble(hingeData->m_rbBFrame);
  970. hinge = createHingeConstraint(*rbA,*rbB,rbAFrame,rbBFrame,hingeData->m_useReferenceFrameA!=0);
  971. } else
  972. {
  973. btTransform rbAFrame;
  974. rbAFrame.deSerializeDouble(hingeData->m_rbAFrame);
  975. hinge = createHingeConstraint(*rbA,rbAFrame,hingeData->m_useReferenceFrameA!=0);
  976. }
  977. if (hingeData->m_enableAngularMotor)
  978. {
  979. hinge->enableAngularMotor(true,(btScalar)hingeData->m_motorTargetVelocity,(btScalar)hingeData->m_maxMotorImpulse);
  980. }
  981. hinge->setAngularOnly(hingeData->m_angularOnly!=0);
  982. hinge->setLimit(btScalar(hingeData->m_lowerLimit),btScalar(hingeData->m_upperLimit),btScalar(hingeData->m_limitSoftness),btScalar(hingeData->m_biasFactor),btScalar(hingeData->m_relaxationFactor));
  983. constraint = hinge;
  984. break;
  985. }
  986. case CONETWIST_CONSTRAINT_TYPE:
  987. {
  988. btConeTwistConstraintDoubleData* coneData = (btConeTwistConstraintDoubleData*)constraintData;
  989. btConeTwistConstraint* coneTwist = 0;
  990. if (rbA&& rbB)
  991. {
  992. btTransform rbAFrame,rbBFrame;
  993. rbAFrame.deSerializeDouble(coneData->m_rbAFrame);
  994. rbBFrame.deSerializeDouble(coneData->m_rbBFrame);
  995. coneTwist = createConeTwistConstraint(*rbA,*rbB,rbAFrame,rbBFrame);
  996. } else
  997. {
  998. btTransform rbAFrame;
  999. rbAFrame.deSerializeDouble(coneData->m_rbAFrame);
  1000. coneTwist = createConeTwistConstraint(*rbA,rbAFrame);
  1001. }
  1002. coneTwist->setLimit((btScalar)coneData->m_swingSpan1,(btScalar)coneData->m_swingSpan2,(btScalar)coneData->m_twistSpan,(btScalar)coneData->m_limitSoftness,
  1003. (btScalar)coneData->m_biasFactor,(btScalar)coneData->m_relaxationFactor);
  1004. coneTwist->setDamping((btScalar)coneData->m_damping);
  1005. constraint = coneTwist;
  1006. break;
  1007. }
  1008. case D6_SPRING_CONSTRAINT_TYPE:
  1009. {
  1010. btGeneric6DofSpringConstraintDoubleData2* dofData = (btGeneric6DofSpringConstraintDoubleData2*)constraintData;
  1011. // int sz = sizeof(btGeneric6DofSpringConstraintData);
  1012. btGeneric6DofSpringConstraint* dof = 0;
  1013. if (rbA && rbB)
  1014. {
  1015. btTransform rbAFrame,rbBFrame;
  1016. rbAFrame.deSerializeDouble(dofData->m_6dofData.m_rbAFrame);
  1017. rbBFrame.deSerializeDouble(dofData->m_6dofData.m_rbBFrame);
  1018. dof = createGeneric6DofSpringConstraint(*rbA,*rbB,rbAFrame,rbBFrame,dofData->m_6dofData.m_useLinearReferenceFrameA!=0);
  1019. } else
  1020. {
  1021. printf("Error in btWorldImporter::createGeneric6DofSpringConstraint: requires rbA && rbB\n");
  1022. }
  1023. if (dof)
  1024. {
  1025. btVector3 angLowerLimit,angUpperLimit, linLowerLimit,linUpperlimit;
  1026. angLowerLimit.deSerializeDouble(dofData->m_6dofData.m_angularLowerLimit);
  1027. angUpperLimit.deSerializeDouble(dofData->m_6dofData.m_angularUpperLimit);
  1028. linLowerLimit.deSerializeDouble(dofData->m_6dofData.m_linearLowerLimit);
  1029. linUpperlimit.deSerializeDouble(dofData->m_6dofData.m_linearUpperLimit);
  1030. angLowerLimit.setW(0.f);
  1031. dof->setAngularLowerLimit(angLowerLimit);
  1032. dof->setAngularUpperLimit(angUpperLimit);
  1033. dof->setLinearLowerLimit(linLowerLimit);
  1034. dof->setLinearUpperLimit(linUpperlimit);
  1035. int i;
  1036. if (fileVersion>280)
  1037. {
  1038. for (i=0;i<6;i++)
  1039. {
  1040. dof->setStiffness(i,(btScalar)dofData->m_springStiffness[i]);
  1041. dof->setEquilibriumPoint(i,(btScalar)dofData->m_equilibriumPoint[i]);
  1042. dof->enableSpring(i,dofData->m_springEnabled[i]!=0);
  1043. dof->setDamping(i,(btScalar)dofData->m_springDamping[i]);
  1044. }
  1045. }
  1046. }
  1047. constraint = dof;
  1048. break;
  1049. }
  1050. case D6_CONSTRAINT_TYPE:
  1051. {
  1052. btGeneric6DofConstraintDoubleData2* dofData = (btGeneric6DofConstraintDoubleData2*)constraintData;
  1053. btGeneric6DofConstraint* dof = 0;
  1054. if (rbA&& rbB)
  1055. {
  1056. btTransform rbAFrame,rbBFrame;
  1057. rbAFrame.deSerializeDouble(dofData->m_rbAFrame);
  1058. rbBFrame.deSerializeDouble(dofData->m_rbBFrame);
  1059. dof = createGeneric6DofConstraint(*rbA,*rbB,rbAFrame,rbBFrame,dofData->m_useLinearReferenceFrameA!=0);
  1060. } else
  1061. {
  1062. if (rbB)
  1063. {
  1064. btTransform rbBFrame;
  1065. rbBFrame.deSerializeDouble(dofData->m_rbBFrame);
  1066. dof = createGeneric6DofConstraint(*rbB,rbBFrame,dofData->m_useLinearReferenceFrameA!=0);
  1067. } else
  1068. {
  1069. printf("Error in btWorldImporter::createGeneric6DofConstraint: missing rbB\n");
  1070. }
  1071. }
  1072. if (dof)
  1073. {
  1074. btVector3 angLowerLimit,angUpperLimit, linLowerLimit,linUpperlimit;
  1075. angLowerLimit.deSerializeDouble(dofData->m_angularLowerLimit);
  1076. angUpperLimit.deSerializeDouble(dofData->m_angularUpperLimit);
  1077. linLowerLimit.deSerializeDouble(dofData->m_linearLowerLimit);
  1078. linUpperlimit.deSerializeDouble(dofData->m_linearUpperLimit);
  1079. dof->setAngularLowerLimit(angLowerLimit);
  1080. dof->setAngularUpperLimit(angUpperLimit);
  1081. dof->setLinearLowerLimit(linLowerLimit);
  1082. dof->setLinearUpperLimit(linUpperlimit);
  1083. }
  1084. constraint = dof;
  1085. break;
  1086. }
  1087. case SLIDER_CONSTRAINT_TYPE:
  1088. {
  1089. btSliderConstraintDoubleData* sliderData = (btSliderConstraintDoubleData*)constraintData;
  1090. btSliderConstraint* slider = 0;
  1091. if (rbA&& rbB)
  1092. {
  1093. btTransform rbAFrame,rbBFrame;
  1094. rbAFrame.deSerializeDouble(sliderData->m_rbAFrame);
  1095. rbBFrame.deSerializeDouble(sliderData->m_rbBFrame);
  1096. slider = createSliderConstraint(*rbA,*rbB,rbAFrame,rbBFrame,sliderData->m_useLinearReferenceFrameA!=0);
  1097. } else
  1098. {
  1099. btTransform rbBFrame;
  1100. rbBFrame.deSerializeDouble(sliderData->m_rbBFrame);
  1101. slider = createSliderConstraint(*rbB,rbBFrame,sliderData->m_useLinearReferenceFrameA!=0);
  1102. }
  1103. slider->setLowerLinLimit((btScalar)sliderData->m_linearLowerLimit);
  1104. slider->setUpperLinLimit((btScalar)sliderData->m_linearUpperLimit);
  1105. slider->setLowerAngLimit((btScalar)sliderData->m_angularLowerLimit);
  1106. slider->setUpperAngLimit((btScalar)sliderData->m_angularUpperLimit);
  1107. slider->setUseFrameOffset(sliderData->m_useOffsetForConstraintFrame!=0);
  1108. constraint = slider;
  1109. break;
  1110. }
  1111. case GEAR_CONSTRAINT_TYPE:
  1112. {
  1113. btGearConstraintDoubleData* gearData = (btGearConstraintDoubleData*) constraintData;
  1114. btGearConstraint* gear = 0;
  1115. if (rbA&&rbB)
  1116. {
  1117. btVector3 axisInA,axisInB;
  1118. axisInA.deSerializeDouble(gearData->m_axisInA);
  1119. axisInB.deSerializeDouble(gearData->m_axisInB);
  1120. gear = createGearConstraint(*rbA, *rbB, axisInA,axisInB, gearData->m_ratio);
  1121. } else
  1122. {
  1123. btAssert(0);
  1124. //perhaps a gear against a 'fixed' body, while the 'fixed' body is not serialized?
  1125. //btGearConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& axisInA,const btVector3& axisInB, btScalar ratio=1.f);
  1126. }
  1127. constraint = gear;
  1128. break;
  1129. }
  1130. case D6_SPRING_2_CONSTRAINT_TYPE:
  1131. {
  1132. btGeneric6DofSpring2ConstraintDoubleData2* dofData = (btGeneric6DofSpring2ConstraintDoubleData2*)constraintData;
  1133. btGeneric6DofSpring2Constraint* dof = 0;
  1134. if (rbA && rbB)
  1135. {
  1136. btTransform rbAFrame,rbBFrame;
  1137. rbAFrame.deSerializeDouble(dofData->m_rbAFrame);
  1138. rbBFrame.deSerializeDouble(dofData->m_rbBFrame);
  1139. dof = createGeneric6DofSpring2Constraint(*rbA,*rbB,rbAFrame,rbBFrame, dofData->m_rotateOrder);
  1140. } else
  1141. {
  1142. printf("Error in btWorldImporter::createGeneric6DofSpring2Constraint: requires rbA && rbB\n");
  1143. }
  1144. if (dof)
  1145. {
  1146. btVector3 angLowerLimit,angUpperLimit, linLowerLimit,linUpperlimit;
  1147. angLowerLimit.deSerializeDouble(dofData->m_angularLowerLimit);
  1148. angUpperLimit.deSerializeDouble(dofData->m_angularUpperLimit);
  1149. linLowerLimit.deSerializeDouble(dofData->m_linearLowerLimit);
  1150. linUpperlimit.deSerializeDouble(dofData->m_linearUpperLimit);
  1151. angLowerLimit.setW(0.f);
  1152. dof->setAngularLowerLimit(angLowerLimit);
  1153. dof->setAngularUpperLimit(angUpperLimit);
  1154. dof->setLinearLowerLimit(linLowerLimit);
  1155. dof->setLinearUpperLimit(linUpperlimit);
  1156. int i;
  1157. if (fileVersion>280)
  1158. {
  1159. //6-dof: 3 linear followed by 3 angular
  1160. for (i=0;i<3;i++)
  1161. {
  1162. dof->setStiffness(i,dofData->m_linearSpringStiffness.m_floats[i],dofData->m_linearSpringStiffnessLimited[i]);
  1163. dof->setEquilibriumPoint(i,dofData->m_linearEquilibriumPoint.m_floats[i]);
  1164. dof->enableSpring(i,dofData->m_linearEnableSpring[i]!=0);
  1165. dof->setDamping(i,dofData->m_linearSpringDamping.m_floats[i],(dofData->m_linearSpringDampingLimited[i]!=0));
  1166. }
  1167. for (i=0;i<3;i++)
  1168. {
  1169. dof->setStiffness(i+3,dofData->m_angularSpringStiffness.m_floats[i],(dofData->m_angularSpringStiffnessLimited[i]!=0));
  1170. dof->setEquilibriumPoint(i+3,dofData->m_angularEquilibriumPoint.m_floats[i]);
  1171. dof->enableSpring(i+3,dofData->m_angularEnableSpring[i]!=0);
  1172. dof->setDamping(i+3,dofData->m_angularSpringDamping.m_floats[i],(dofData->m_angularSpringDampingLimited[i]!=0));
  1173. }
  1174. }
  1175. }
  1176. constraint = dof;
  1177. break;
  1178. }
  1179. case FIXED_CONSTRAINT_TYPE:
  1180. {
  1181. btGeneric6DofSpring2Constraint* dof = 0;
  1182. if (rbA && rbB)
  1183. {
  1184. btTransform rbAFrame,rbBFrame;
  1185. //compute a shared world frame, and compute frameInA, frameInB relative to this
  1186. btTransform sharedFrame;
  1187. sharedFrame.setIdentity();
  1188. btVector3 centerPos = btScalar(0.5)*(rbA->getWorldTransform().getOrigin()+
  1189. rbB->getWorldTransform().getOrigin());
  1190. sharedFrame.setOrigin(centerPos);
  1191. rbAFrame = rbA->getWorldTransform().inverse()*sharedFrame;
  1192. rbBFrame = rbB->getWorldTransform().inverse()*sharedFrame;
  1193. dof = createGeneric6DofSpring2Constraint(*rbA,*rbB,rbAFrame,rbBFrame, RO_XYZ);
  1194. dof->setLinearUpperLimit(btVector3(0,0,0));
  1195. dof->setLinearLowerLimit(btVector3(0,0,0));
  1196. dof->setAngularUpperLimit(btVector3(0,0,0));
  1197. dof->setAngularLowerLimit(btVector3(0,0,0));
  1198. } else
  1199. {
  1200. printf("Error in btWorldImporter::createGeneric6DofSpring2Constraint: requires rbA && rbB\n");
  1201. }
  1202. constraint = dof;
  1203. break;
  1204. }
  1205. default:
  1206. {
  1207. printf("unknown constraint type\n");
  1208. }
  1209. };
  1210. if (constraint)
  1211. {
  1212. constraint->setDbgDrawSize((btScalar)constraintData->m_dbgDrawSize);
  1213. ///those fields didn't exist and set to zero for pre-280 versions, so do a check here
  1214. if (fileVersion>=280)
  1215. {
  1216. constraint->setBreakingImpulseThreshold((btScalar)constraintData->m_breakingImpulseThreshold);
  1217. constraint->setEnabled(constraintData->m_isEnabled!=0);
  1218. constraint->setOverrideNumSolverIterations(constraintData->m_overrideNumSolverIterations);
  1219. }
  1220. if (constraintData->m_name)
  1221. {
  1222. char* newname = duplicateName(constraintData->m_name);
  1223. m_nameConstraintMap.insert(newname,constraint);
  1224. m_objectNameMap.insert(constraint,newname);
  1225. }
  1226. if(m_dynamicsWorld)
  1227. m_dynamicsWorld->addConstraint(constraint,constraintData->m_disableCollisionsBetweenLinkedBodies!=0);
  1228. }
  1229. }
  1230. btTriangleIndexVertexArray* btWorldImporter::createMeshInterface(btStridingMeshInterfaceData& meshData)
  1231. {
  1232. btTriangleIndexVertexArray* meshInterface = createTriangleMeshContainer();
  1233. for (int i=0;i<meshData.m_numMeshParts;i++)
  1234. {
  1235. btIndexedMesh meshPart;
  1236. meshPart.m_numTriangles = meshData.m_meshPartsPtr[i].m_numTriangles;
  1237. meshPart.m_numVertices = meshData.m_meshPartsPtr[i].m_numVertices;
  1238. if (meshData.m_meshPartsPtr[i].m_indices32)
  1239. {
  1240. meshPart.m_indexType = PHY_INTEGER;
  1241. meshPart.m_triangleIndexStride = 3*sizeof(int);
  1242. int* indexArray = (int*)btAlignedAlloc(sizeof(int)*3*meshPart.m_numTriangles,16);
  1243. m_indexArrays.push_back(indexArray);
  1244. for (int j=0;j<3*meshPart.m_numTriangles;j++)
  1245. {
  1246. indexArray[j] = meshData.m_meshPartsPtr[i].m_indices32[j].m_value;
  1247. }
  1248. meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
  1249. } else
  1250. {
  1251. if (meshData.m_meshPartsPtr[i].m_3indices16)
  1252. {
  1253. meshPart.m_indexType = PHY_SHORT;
  1254. meshPart.m_triangleIndexStride = sizeof(short int)*3;//sizeof(btShortIntIndexTripletData);
  1255. short int* indexArray = (short int*)btAlignedAlloc(sizeof(short int)*3*meshPart.m_numTriangles,16);
  1256. m_shortIndexArrays.push_back(indexArray);
  1257. for (int j=0;j<meshPart.m_numTriangles;j++)
  1258. {
  1259. indexArray[3*j] = meshData.m_meshPartsPtr[i].m_3indices16[j].m_values[0];
  1260. indexArray[3*j+1] = meshData.m_meshPartsPtr[i].m_3indices16[j].m_values[1];
  1261. indexArray[3*j+2] = meshData.m_meshPartsPtr[i].m_3indices16[j].m_values[2];
  1262. }
  1263. meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
  1264. }
  1265. if (meshData.m_meshPartsPtr[i].m_indices16)
  1266. {
  1267. meshPart.m_indexType = PHY_SHORT;
  1268. meshPart.m_triangleIndexStride = 3*sizeof(short int);
  1269. short int* indexArray = (short int*)btAlignedAlloc(sizeof(short int)*3*meshPart.m_numTriangles,16);
  1270. m_shortIndexArrays.push_back(indexArray);
  1271. for (int j=0;j<3*meshPart.m_numTriangles;j++)
  1272. {
  1273. indexArray[j] = meshData.m_meshPartsPtr[i].m_indices16[j].m_value;
  1274. }
  1275. meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
  1276. }
  1277. if (meshData.m_meshPartsPtr[i].m_3indices8)
  1278. {
  1279. meshPart.m_indexType = PHY_UCHAR;
  1280. meshPart.m_triangleIndexStride = sizeof(unsigned char)*3;
  1281. unsigned char* indexArray = (unsigned char*)btAlignedAlloc(sizeof(unsigned char)*3*meshPart.m_numTriangles,16);
  1282. m_charIndexArrays.push_back(indexArray);
  1283. for (int j=0;j<meshPart.m_numTriangles;j++)
  1284. {
  1285. indexArray[3*j] = meshData.m_meshPartsPtr[i].m_3indices8[j].m_values[0];
  1286. indexArray[3*j+1] = meshData.m_meshPartsPtr[i].m_3indices8[j].m_values[1];
  1287. indexArray[3*j+2] = meshData.m_meshPartsPtr[i].m_3indices8[j].m_values[2];
  1288. }
  1289. meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
  1290. }
  1291. }
  1292. if (meshData.m_meshPartsPtr[i].m_vertices3f)
  1293. {
  1294. meshPart.m_vertexType = PHY_FLOAT;
  1295. meshPart.m_vertexStride = sizeof(btVector3FloatData);
  1296. btVector3FloatData* vertices = (btVector3FloatData*) btAlignedAlloc(sizeof(btVector3FloatData)*meshPart.m_numVertices,16);
  1297. m_floatVertexArrays.push_back(vertices);
  1298. for (int j=0;j<meshPart.m_numVertices;j++)
  1299. {
  1300. vertices[j].m_floats[0] = meshData.m_meshPartsPtr[i].m_vertices3f[j].m_floats[0];
  1301. vertices[j].m_floats[1] = meshData.m_meshPartsPtr[i].m_vertices3f[j].m_floats[1];
  1302. vertices[j].m_floats[2] = meshData.m_meshPartsPtr[i].m_vertices3f[j].m_floats[2];
  1303. vertices[j].m_floats[3] = meshData.m_meshPartsPtr[i].m_vertices3f[j].m_floats[3];
  1304. }
  1305. meshPart.m_vertexBase = (const unsigned char*)vertices;
  1306. } else
  1307. {
  1308. meshPart.m_vertexType = PHY_DOUBLE;
  1309. meshPart.m_vertexStride = sizeof(btVector3DoubleData);
  1310. btVector3DoubleData* vertices = (btVector3DoubleData*) btAlignedAlloc(sizeof(btVector3DoubleData)*meshPart.m_numVertices,16);
  1311. m_doubleVertexArrays.push_back(vertices);
  1312. for (int j=0;j<meshPart.m_numVertices;j++)
  1313. {
  1314. vertices[j].m_floats[0] = meshData.m_meshPartsPtr[i].m_vertices3d[j].m_floats[0];
  1315. vertices[j].m_floats[1] = meshData.m_meshPartsPtr[i].m_vertices3d[j].m_floats[1];
  1316. vertices[j].m_floats[2] = meshData.m_meshPartsPtr[i].m_vertices3d[j].m_floats[2];
  1317. vertices[j].m_floats[3] = meshData.m_meshPartsPtr[i].m_vertices3d[j].m_floats[3];
  1318. }
  1319. meshPart.m_vertexBase = (const unsigned char*)vertices;
  1320. }
  1321. if (meshPart.m_triangleIndexBase && meshPart.m_vertexBase)
  1322. {
  1323. meshInterface->addIndexedMesh(meshPart,meshPart.m_indexType);
  1324. }
  1325. }
  1326. return meshInterface;
  1327. }
  1328. btStridingMeshInterfaceData* btWorldImporter::createStridingMeshInterfaceData(btStridingMeshInterfaceData* interfaceData)
  1329. {
  1330. //create a new btStridingMeshInterfaceData that is an exact copy of shapedata and store it in the WorldImporter
  1331. btStridingMeshInterfaceData* newData = new btStridingMeshInterfaceData;
  1332. newData->m_scaling = interfaceData->m_scaling;
  1333. newData->m_numMeshParts = interfaceData->m_numMeshParts;
  1334. newData->m_meshPartsPtr = new btMeshPartData[newData->m_numMeshParts];
  1335. for(int i = 0;i < newData->m_numMeshParts;i++)
  1336. {
  1337. btMeshPartData* curPart = &interfaceData->m_meshPartsPtr[i];
  1338. btMeshPartData* curNewPart = &newData->m_meshPartsPtr[i];
  1339. curNewPart->m_numTriangles = curPart->m_numTriangles;
  1340. curNewPart->m_numVertices = curPart->m_numVertices;
  1341. if(curPart->m_vertices3f)
  1342. {
  1343. curNewPart->m_vertices3f = new btVector3FloatData[curNewPart->m_numVertices];
  1344. memcpy(curNewPart->m_vertices3f,curPart->m_vertices3f,sizeof(btVector3FloatData) * curNewPart->m_numVertices);
  1345. }
  1346. else
  1347. curNewPart->m_vertices3f = NULL;
  1348. if(curPart->m_vertices3d)
  1349. {
  1350. curNewPart->m_vertices3d = new btVector3DoubleData[curNewPart->m_numVertices];
  1351. memcpy(curNewPart->m_vertices3d,curPart->m_vertices3d,sizeof(btVector3DoubleData) * curNewPart->m_numVertices);
  1352. }
  1353. else
  1354. curNewPart->m_vertices3d = NULL;
  1355. int numIndices = curNewPart->m_numTriangles * 3;
  1356. ///the m_3indices8 was not initialized in some Bullet versions, this can cause crashes at loading time
  1357. ///we catch it by only dealing with m_3indices8 if none of the other indices are initialized
  1358. bool uninitialized3indices8Workaround =false;
  1359. if(curPart->m_indices32)
  1360. {
  1361. uninitialized3indices8Workaround=true;
  1362. curNewPart->m_indices32 = new btIntIndexData[numIndices];
  1363. memcpy(curNewPart->m_indices32,curPart->m_indices32,sizeof(btIntIndexData) * numIndices);
  1364. }
  1365. else
  1366. curNewPart->m_indices32 = NULL;
  1367. if(curPart->m_3indices16)
  1368. {
  1369. uninitialized3indices8Workaround=true;
  1370. curNewPart->m_3indices16 = new btShortIntIndexTripletData[curNewPart->m_numTriangles];
  1371. memcpy(curNewPart->m_3indices16,curPart->m_3indices16,sizeof(btShortIntIndexTripletData) * curNewPart->m_numTriangles);
  1372. }
  1373. else
  1374. curNewPart->m_3indices16 = NULL;
  1375. if(curPart->m_indices16)
  1376. {
  1377. uninitialized3indices8Workaround=true;
  1378. curNewPart->m_indices16 = new btShortIntIndexData[numIndices];
  1379. memcpy(curNewPart->m_indices16,curPart->m_indices16,sizeof(btShortIntIndexData) * numIndices);
  1380. }
  1381. else
  1382. curNewPart->m_indices16 = NULL;
  1383. if(!uninitialized3indices8Workaround && curPart->m_3indices8)
  1384. {
  1385. curNewPart->m_3indices8 = new btCharIndexTripletData[curNewPart->m_numTriangles];
  1386. memcpy(curNewPart->m_3indices8,curPart->m_3indices8,sizeof(btCharIndexTripletData) * curNewPart->m_numTriangles);
  1387. }
  1388. else
  1389. curNewPart->m_3indices8 = NULL;
  1390. }
  1391. m_allocatedbtStridingMeshInterfaceDatas.push_back(newData);
  1392. return(newData);
  1393. }
  1394. #ifdef USE_INTERNAL_EDGE_UTILITY
  1395. extern ContactAddedCallback gContactAddedCallback;
  1396. static bool btAdjustInternalEdgeContactsCallback(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1)
  1397. {
  1398. btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1);
  1399. //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_BACKFACE_MODE);
  1400. //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_DOUBLE_SIDED+BT_TRIANGLE_CONCAVE_DOUBLE_SIDED);
  1401. return true;
  1402. }
  1403. #endif //USE_INTERNAL_EDGE_UTILITY
  1404. btCollisionObject* btWorldImporter::createCollisionObject(const btTransform& startTransform,btCollisionShape* shape, const char* bodyName)
  1405. {
  1406. return createRigidBody(false,0,startTransform,shape,bodyName);
  1407. }
  1408. void btWorldImporter::setDynamicsWorldInfo(const btVector3& gravity, const btContactSolverInfo& solverInfo)
  1409. {
  1410. if (m_dynamicsWorld)
  1411. {
  1412. m_dynamicsWorld->setGravity(gravity);
  1413. m_dynamicsWorld->getSolverInfo() = solverInfo;
  1414. }
  1415. }
  1416. btRigidBody* btWorldImporter::createRigidBody(bool isDynamic, btScalar mass, const btTransform& startTransform,btCollisionShape* shape,const char* bodyName)
  1417. {
  1418. btVector3 localInertia;
  1419. localInertia.setZero();
  1420. if (mass)
  1421. shape->calculateLocalInertia(mass,localInertia);
  1422. btRigidBody* body = new btRigidBody(mass,0,shape,localInertia);
  1423. body->setWorldTransform(startTransform);
  1424. if (m_dynamicsWorld)
  1425. m_dynamicsWorld->addRigidBody(body);
  1426. if (bodyName)
  1427. {
  1428. char* newname = duplicateName(bodyName);
  1429. m_objectNameMap.insert(body,newname);
  1430. m_nameBodyMap.insert(newname,body);
  1431. }
  1432. m_allocatedRigidBodies.push_back(body);
  1433. return body;
  1434. }
  1435. btCollisionShape* btWorldImporter::createPlaneShape(const btVector3& planeNormal,btScalar planeConstant)
  1436. {
  1437. btStaticPlaneShape* shape = new btStaticPlaneShape(planeNormal,planeConstant);
  1438. m_allocatedCollisionShapes.push_back(shape);
  1439. return shape;
  1440. }
  1441. btCollisionShape* btWorldImporter::createBoxShape(const btVector3& halfExtents)
  1442. {
  1443. btBoxShape* shape = new btBoxShape(halfExtents);
  1444. m_allocatedCollisionShapes.push_back(shape);
  1445. return shape;
  1446. }
  1447. btCollisionShape* btWorldImporter::createSphereShape(btScalar radius)
  1448. {
  1449. btSphereShape* shape = new btSphereShape(radius);
  1450. m_allocatedCollisionShapes.push_back(shape);
  1451. return shape;
  1452. }
  1453. btCollisionShape* btWorldImporter::createCapsuleShapeX(btScalar radius, btScalar height)
  1454. {
  1455. btCapsuleShapeX* shape = new btCapsuleShapeX(radius,height);
  1456. m_allocatedCollisionShapes.push_back(shape);
  1457. return shape;
  1458. }
  1459. btCollisionShape* btWorldImporter::createCapsuleShapeY(btScalar radius, btScalar height)
  1460. {
  1461. btCapsuleShape* shape = new btCapsuleShape(radius,height);
  1462. m_allocatedCollisionShapes.push_back(shape);
  1463. return shape;
  1464. }
  1465. btCollisionShape* btWorldImporter::createCapsuleShapeZ(btScalar radius, btScalar height)
  1466. {
  1467. btCapsuleShapeZ* shape = new btCapsuleShapeZ(radius,height);
  1468. m_allocatedCollisionShapes.push_back(shape);
  1469. return shape;
  1470. }
  1471. btCollisionShape* btWorldImporter::createCylinderShapeX(btScalar radius,btScalar height)
  1472. {
  1473. btCylinderShapeX* shape = new btCylinderShapeX(btVector3(height,radius,radius));
  1474. m_allocatedCollisionShapes.push_back(shape);
  1475. return shape;
  1476. }
  1477. btCollisionShape* btWorldImporter::createCylinderShapeY(btScalar radius,btScalar height)
  1478. {
  1479. btCylinderShape* shape = new btCylinderShape(btVector3(radius,height,radius));
  1480. m_allocatedCollisionShapes.push_back(shape);
  1481. return shape;
  1482. }
  1483. btCollisionShape* btWorldImporter::createCylinderShapeZ(btScalar radius,btScalar height)
  1484. {
  1485. btCylinderShapeZ* shape = new btCylinderShapeZ(btVector3(radius,radius,height));
  1486. m_allocatedCollisionShapes.push_back(shape);
  1487. return shape;
  1488. }
  1489. btCollisionShape* btWorldImporter::createConeShapeX(btScalar radius,btScalar height)
  1490. {
  1491. btConeShapeX* shape = new btConeShapeX(radius,height);
  1492. m_allocatedCollisionShapes.push_back(shape);
  1493. return shape;
  1494. }
  1495. btCollisionShape* btWorldImporter::createConeShapeY(btScalar radius,btScalar height)
  1496. {
  1497. btConeShape* shape = new btConeShape(radius,height);
  1498. m_allocatedCollisionShapes.push_back(shape);
  1499. return shape;
  1500. }
  1501. btCollisionShape* btWorldImporter::createConeShapeZ(btScalar radius,btScalar height)
  1502. {
  1503. btConeShapeZ* shape = new btConeShapeZ(radius,height);
  1504. m_allocatedCollisionShapes.push_back(shape);
  1505. return shape;
  1506. }
  1507. btTriangleIndexVertexArray* btWorldImporter::createTriangleMeshContainer()
  1508. {
  1509. btTriangleIndexVertexArray* in = new btTriangleIndexVertexArray();
  1510. m_allocatedTriangleIndexArrays.push_back(in);
  1511. return in;
  1512. }
  1513. btOptimizedBvh* btWorldImporter::createOptimizedBvh()
  1514. {
  1515. btOptimizedBvh* bvh = new btOptimizedBvh();
  1516. m_allocatedBvhs.push_back(bvh);
  1517. return bvh;
  1518. }
  1519. btTriangleInfoMap* btWorldImporter::createTriangleInfoMap()
  1520. {
  1521. btTriangleInfoMap* tim = new btTriangleInfoMap();
  1522. m_allocatedTriangleInfoMaps.push_back(tim);
  1523. return tim;
  1524. }
  1525. btBvhTriangleMeshShape* btWorldImporter::createBvhTriangleMeshShape(btStridingMeshInterface* trimesh, btOptimizedBvh* bvh)
  1526. {
  1527. if (bvh)
  1528. {
  1529. btBvhTriangleMeshShape* bvhTriMesh = new btBvhTriangleMeshShape(trimesh,bvh->isQuantized(), false);
  1530. bvhTriMesh->setOptimizedBvh(bvh);
  1531. m_allocatedCollisionShapes.push_back(bvhTriMesh);
  1532. return bvhTriMesh;
  1533. }
  1534. btBvhTriangleMeshShape* ts = new btBvhTriangleMeshShape(trimesh,true);
  1535. m_allocatedCollisionShapes.push_back(ts);
  1536. return ts;
  1537. }
  1538. btCollisionShape* btWorldImporter::createConvexTriangleMeshShape(btStridingMeshInterface* trimesh)
  1539. {
  1540. return 0;
  1541. }
  1542. btGImpactMeshShape* btWorldImporter::createGimpactShape(btStridingMeshInterface* trimesh)
  1543. {
  1544. #ifdef USE_GIMPACT
  1545. btGImpactMeshShape* shape = new btGImpactMeshShape(trimesh);
  1546. m_allocatedCollisionShapes.push_back(shape);
  1547. return shape;
  1548. #else
  1549. return 0;
  1550. #endif
  1551. }
  1552. btConvexHullShape* btWorldImporter::createConvexHullShape()
  1553. {
  1554. btConvexHullShape* shape = new btConvexHullShape();
  1555. m_allocatedCollisionShapes.push_back(shape);
  1556. return shape;
  1557. }
  1558. btCompoundShape* btWorldImporter::createCompoundShape()
  1559. {
  1560. btCompoundShape* shape = new btCompoundShape();
  1561. m_allocatedCollisionShapes.push_back(shape);
  1562. return shape;
  1563. }
  1564. btScaledBvhTriangleMeshShape* btWorldImporter::createScaledTrangleMeshShape(btBvhTriangleMeshShape* meshShape,const btVector3& localScaling)
  1565. {
  1566. btScaledBvhTriangleMeshShape* shape = new btScaledBvhTriangleMeshShape(meshShape,localScaling);
  1567. m_allocatedCollisionShapes.push_back(shape);
  1568. return shape;
  1569. }
  1570. btMultiSphereShape* btWorldImporter::createMultiSphereShape(const btVector3* positions,const btScalar* radi,int numSpheres)
  1571. {
  1572. btMultiSphereShape* shape = new btMultiSphereShape(positions, radi, numSpheres);
  1573. m_allocatedCollisionShapes.push_back(shape);
  1574. return shape;
  1575. }
  1576. btRigidBody& btWorldImporter::getFixedBody()
  1577. {
  1578. static btRigidBody s_fixed(0, 0,0);
  1579. s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.)));
  1580. return s_fixed;
  1581. }
  1582. btPoint2PointConstraint* btWorldImporter::createPoint2PointConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB)
  1583. {
  1584. btPoint2PointConstraint* p2p = new btPoint2PointConstraint(rbA,rbB,pivotInA,pivotInB);
  1585. m_allocatedConstraints.push_back(p2p);
  1586. return p2p;
  1587. }
  1588. btPoint2PointConstraint* btWorldImporter::createPoint2PointConstraint(btRigidBody& rbA,const btVector3& pivotInA)
  1589. {
  1590. btPoint2PointConstraint* p2p = new btPoint2PointConstraint(rbA,pivotInA);
  1591. m_allocatedConstraints.push_back(p2p);
  1592. return p2p;
  1593. }
  1594. btHingeConstraint* btWorldImporter::createHingeConstraint(btRigidBody& rbA,btRigidBody& rbB, const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA)
  1595. {
  1596. btHingeConstraint* hinge = new btHingeConstraint(rbA,rbB,rbAFrame,rbBFrame,useReferenceFrameA);
  1597. m_allocatedConstraints.push_back(hinge);
  1598. return hinge;
  1599. }
  1600. btHingeConstraint* btWorldImporter::createHingeConstraint(btRigidBody& rbA,const btTransform& rbAFrame, bool useReferenceFrameA)
  1601. {
  1602. btHingeConstraint* hinge = new btHingeConstraint(rbA,rbAFrame,useReferenceFrameA);
  1603. m_allocatedConstraints.push_back(hinge);
  1604. return hinge;
  1605. }
  1606. btConeTwistConstraint* btWorldImporter::createConeTwistConstraint(btRigidBody& rbA,btRigidBody& rbB,const btTransform& rbAFrame, const btTransform& rbBFrame)
  1607. {
  1608. btConeTwistConstraint* cone = new btConeTwistConstraint(rbA,rbB,rbAFrame,rbBFrame);
  1609. m_allocatedConstraints.push_back(cone);
  1610. return cone;
  1611. }
  1612. btConeTwistConstraint* btWorldImporter::createConeTwistConstraint(btRigidBody& rbA,const btTransform& rbAFrame)
  1613. {
  1614. btConeTwistConstraint* cone = new btConeTwistConstraint(rbA,rbAFrame);
  1615. m_allocatedConstraints.push_back(cone);
  1616. return cone;
  1617. }
  1618. btGeneric6DofConstraint* btWorldImporter::createGeneric6DofConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA)
  1619. {
  1620. btGeneric6DofConstraint* dof = new btGeneric6DofConstraint(rbA,rbB,frameInA,frameInB,useLinearReferenceFrameA);
  1621. m_allocatedConstraints.push_back(dof);
  1622. return dof;
  1623. }
  1624. btGeneric6DofConstraint* btWorldImporter::createGeneric6DofConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameB)
  1625. {
  1626. btGeneric6DofConstraint* dof = new btGeneric6DofConstraint(rbB,frameInB,useLinearReferenceFrameB);
  1627. m_allocatedConstraints.push_back(dof);
  1628. return dof;
  1629. }
  1630. btGeneric6DofSpring2Constraint* btWorldImporter::createGeneric6DofSpring2Constraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB, int rotateOrder)
  1631. {
  1632. btGeneric6DofSpring2Constraint* dof = new btGeneric6DofSpring2Constraint(rbA,rbB,frameInA,frameInB, (RotateOrder)rotateOrder);
  1633. m_allocatedConstraints.push_back(dof);
  1634. return dof;
  1635. }
  1636. btGeneric6DofSpringConstraint* btWorldImporter::createGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA)
  1637. {
  1638. btGeneric6DofSpringConstraint* dof = new btGeneric6DofSpringConstraint(rbA,rbB,frameInA,frameInB,useLinearReferenceFrameA);
  1639. m_allocatedConstraints.push_back(dof);
  1640. return dof;
  1641. }
  1642. btSliderConstraint* btWorldImporter::createSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA)
  1643. {
  1644. btSliderConstraint* slider = new btSliderConstraint(rbA,rbB,frameInA,frameInB,useLinearReferenceFrameA);
  1645. m_allocatedConstraints.push_back(slider);
  1646. return slider;
  1647. }
  1648. btSliderConstraint* btWorldImporter::createSliderConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameA)
  1649. {
  1650. btSliderConstraint* slider = new btSliderConstraint(rbB,frameInB,useLinearReferenceFrameA);
  1651. m_allocatedConstraints.push_back(slider);
  1652. return slider;
  1653. }
  1654. btGearConstraint* btWorldImporter::createGearConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& axisInA,const btVector3& axisInB, btScalar ratio)
  1655. {
  1656. btGearConstraint* gear = new btGearConstraint(rbA,rbB,axisInA,axisInB,ratio);
  1657. m_allocatedConstraints.push_back(gear);
  1658. return gear;
  1659. }
  1660. // query for data
  1661. int btWorldImporter::getNumCollisionShapes() const
  1662. {
  1663. return m_allocatedCollisionShapes.size();
  1664. }
  1665. btCollisionShape* btWorldImporter::getCollisionShapeByIndex(int index)
  1666. {
  1667. return m_allocatedCollisionShapes[index];
  1668. }
  1669. btCollisionShape* btWorldImporter::getCollisionShapeByName(const char* name)
  1670. {
  1671. btCollisionShape** shapePtr = m_nameShapeMap.find(name);
  1672. if (shapePtr&& *shapePtr)
  1673. {
  1674. return *shapePtr;
  1675. }
  1676. return 0;
  1677. }
  1678. btRigidBody* btWorldImporter::getRigidBodyByName(const char* name)
  1679. {
  1680. btRigidBody** bodyPtr = m_nameBodyMap.find(name);
  1681. if (bodyPtr && *bodyPtr)
  1682. {
  1683. return *bodyPtr;
  1684. }
  1685. return 0;
  1686. }
  1687. btTypedConstraint* btWorldImporter::getConstraintByName(const char* name)
  1688. {
  1689. btTypedConstraint** constraintPtr = m_nameConstraintMap.find(name);
  1690. if (constraintPtr && *constraintPtr)
  1691. {
  1692. return *constraintPtr;
  1693. }
  1694. return 0;
  1695. }
  1696. const char* btWorldImporter::getNameForPointer(const void* ptr) const
  1697. {
  1698. const char*const * namePtr = m_objectNameMap.find(ptr);
  1699. if (namePtr && *namePtr)
  1700. return *namePtr;
  1701. return 0;
  1702. }
  1703. int btWorldImporter::getNumRigidBodies() const
  1704. {
  1705. return m_allocatedRigidBodies.size();
  1706. }
  1707. btCollisionObject* btWorldImporter::getRigidBodyByIndex(int index) const
  1708. {
  1709. return m_allocatedRigidBodies[index];
  1710. }
  1711. int btWorldImporter::getNumConstraints() const
  1712. {
  1713. return m_allocatedConstraints.size();
  1714. }
  1715. btTypedConstraint* btWorldImporter::getConstraintByIndex(int index) const
  1716. {
  1717. return m_allocatedConstraints[index];
  1718. }
  1719. int btWorldImporter::getNumBvhs() const
  1720. {
  1721. return m_allocatedBvhs.size();
  1722. }
  1723. btOptimizedBvh* btWorldImporter::getBvhByIndex(int index) const
  1724. {
  1725. return m_allocatedBvhs[index];
  1726. }
  1727. int btWorldImporter::getNumTriangleInfoMaps() const
  1728. {
  1729. return m_allocatedTriangleInfoMaps.size();
  1730. }
  1731. btTriangleInfoMap* btWorldImporter::getTriangleInfoMapByIndex(int index) const
  1732. {
  1733. return m_allocatedTriangleInfoMaps[index];
  1734. }
  1735. void btWorldImporter::convertRigidBodyFloat( btRigidBodyFloatData* colObjData)
  1736. {
  1737. btScalar mass = btScalar(colObjData->m_inverseMass? 1.f/colObjData->m_inverseMass : 0.f);
  1738. btVector3 localInertia;
  1739. localInertia.setZero();
  1740. btCollisionShape** shapePtr = m_shapeMap.find(colObjData->m_collisionObjectData.m_collisionShape);
  1741. if (shapePtr && *shapePtr)
  1742. {
  1743. btTransform startTransform;
  1744. colObjData->m_collisionObjectData.m_worldTransform.m_origin.m_floats[3] = 0.f;
  1745. startTransform.deSerializeFloat(colObjData->m_collisionObjectData.m_worldTransform);
  1746. // startTransform.setBasis(btMatrix3x3::getIdentity());
  1747. btCollisionShape* shape = (btCollisionShape*)*shapePtr;
  1748. if (shape->isNonMoving())
  1749. {
  1750. mass = 0.f;
  1751. }
  1752. if (mass)
  1753. {
  1754. shape->calculateLocalInertia(mass,localInertia);
  1755. }
  1756. bool isDynamic = mass!=0.f;
  1757. btRigidBody* body = createRigidBody(isDynamic,mass,startTransform,shape,colObjData->m_collisionObjectData.m_name);
  1758. body->setFriction(colObjData->m_collisionObjectData.m_friction);
  1759. body->setRestitution(colObjData->m_collisionObjectData.m_restitution);
  1760. btVector3 linearFactor,angularFactor;
  1761. linearFactor.deSerializeFloat(colObjData->m_linearFactor);
  1762. angularFactor.deSerializeFloat(colObjData->m_angularFactor);
  1763. body->setLinearFactor(linearFactor);
  1764. body->setAngularFactor(angularFactor);
  1765. #ifdef USE_INTERNAL_EDGE_UTILITY
  1766. if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
  1767. {
  1768. btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape;
  1769. if (trimesh->getTriangleInfoMap())
  1770. {
  1771. body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK);
  1772. }
  1773. }
  1774. #endif //USE_INTERNAL_EDGE_UTILITY
  1775. m_bodyMap.insert(colObjData,body);
  1776. } else
  1777. {
  1778. printf("error: no shape found\n");
  1779. }
  1780. }
  1781. void btWorldImporter::convertRigidBodyDouble( btRigidBodyDoubleData* colObjData)
  1782. {
  1783. btScalar mass = btScalar(colObjData->m_inverseMass? 1.f/colObjData->m_inverseMass : 0.f);
  1784. btVector3 localInertia;
  1785. localInertia.setZero();
  1786. btCollisionShape** shapePtr = m_shapeMap.find(colObjData->m_collisionObjectData.m_collisionShape);
  1787. if (shapePtr && *shapePtr)
  1788. {
  1789. btTransform startTransform;
  1790. colObjData->m_collisionObjectData.m_worldTransform.m_origin.m_floats[3] = 0.f;
  1791. startTransform.deSerializeDouble(colObjData->m_collisionObjectData.m_worldTransform);
  1792. // startTransform.setBasis(btMatrix3x3::getIdentity());
  1793. btCollisionShape* shape = (btCollisionShape*)*shapePtr;
  1794. if (shape->isNonMoving())
  1795. {
  1796. mass = 0.f;
  1797. }
  1798. if (mass)
  1799. {
  1800. shape->calculateLocalInertia(mass,localInertia);
  1801. }
  1802. bool isDynamic = mass!=0.f;
  1803. btRigidBody* body = createRigidBody(isDynamic,mass,startTransform,shape,colObjData->m_collisionObjectData.m_name);
  1804. body->setFriction(btScalar(colObjData->m_collisionObjectData.m_friction));
  1805. body->setRestitution(btScalar(colObjData->m_collisionObjectData.m_restitution));
  1806. btVector3 linearFactor,angularFactor;
  1807. linearFactor.deSerializeDouble(colObjData->m_linearFactor);
  1808. angularFactor.deSerializeDouble(colObjData->m_angularFactor);
  1809. body->setLinearFactor(linearFactor);
  1810. body->setAngularFactor(angularFactor);
  1811. #ifdef USE_INTERNAL_EDGE_UTILITY
  1812. if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
  1813. {
  1814. btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape;
  1815. if (trimesh->getTriangleInfoMap())
  1816. {
  1817. body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK);
  1818. }
  1819. }
  1820. #endif //USE_INTERNAL_EDGE_UTILITY
  1821. m_bodyMap.insert(colObjData,body);
  1822. } else
  1823. {
  1824. printf("error: no shape found\n");
  1825. }
  1826. }