b3GpuNarrowPhase.cpp 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014
  1. #include "b3GpuNarrowPhase.h"
  2. #include "Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h"
  3. #include "Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h"
  4. #include "Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.h"
  5. #include "Bullet3OpenCL/BroadphaseCollision/b3SapAabb.h"
  6. #include <string.h>
  7. #include "Bullet3Collision/NarrowPhaseCollision/b3Config.h"
  8. #include "Bullet3OpenCL/NarrowphaseCollision/b3OptimizedBvh.h"
  9. #include "Bullet3OpenCL/NarrowphaseCollision/b3TriangleIndexVertexArray.h"
  10. #include "Bullet3Geometry/b3AabbUtil.h"
  11. #include "Bullet3OpenCL/NarrowphaseCollision/b3BvhInfo.h"
  12. #include "b3GpuNarrowPhaseInternalData.h"
  13. #include "Bullet3OpenCL/NarrowphaseCollision/b3QuantizedBvh.h"
  14. #include "Bullet3Collision/NarrowPhaseCollision/b3ConvexUtility.h"
  15. b3GpuNarrowPhase::b3GpuNarrowPhase(cl_context ctx, cl_device_id device, cl_command_queue queue, const b3Config& config)
  16. : m_data(0), m_planeBodyIndex(-1), m_static0Index(-1), m_context(ctx), m_device(device), m_queue(queue)
  17. {
  18. m_data = new b3GpuNarrowPhaseInternalData();
  19. m_data->m_currentContactBuffer = 0;
  20. memset(m_data, 0, sizeof(b3GpuNarrowPhaseInternalData));
  21. m_data->m_config = config;
  22. m_data->m_gpuSatCollision = new GpuSatCollision(ctx, device, queue);
  23. m_data->m_triangleConvexPairs = new b3OpenCLArray<b3Int4>(m_context, m_queue, config.m_maxTriConvexPairCapacity);
  24. //m_data->m_convexPairsOutGPU = new b3OpenCLArray<b3Int2>(ctx,queue,config.m_maxBroadphasePairs,false);
  25. //m_data->m_planePairs = new b3OpenCLArray<b3Int2>(ctx,queue,config.m_maxBroadphasePairs,false);
  26. m_data->m_pBufContactOutCPU = new b3AlignedObjectArray<b3Contact4>();
  27. m_data->m_pBufContactOutCPU->resize(config.m_maxBroadphasePairs);
  28. m_data->m_bodyBufferCPU = new b3AlignedObjectArray<b3RigidBodyData>();
  29. m_data->m_bodyBufferCPU->resize(config.m_maxConvexBodies);
  30. m_data->m_inertiaBufferCPU = new b3AlignedObjectArray<b3InertiaData>();
  31. m_data->m_inertiaBufferCPU->resize(config.m_maxConvexBodies);
  32. m_data->m_pBufContactBuffersGPU[0] = new b3OpenCLArray<b3Contact4>(ctx, queue, config.m_maxContactCapacity, true);
  33. m_data->m_pBufContactBuffersGPU[1] = new b3OpenCLArray<b3Contact4>(ctx, queue, config.m_maxContactCapacity, true);
  34. m_data->m_inertiaBufferGPU = new b3OpenCLArray<b3InertiaData>(ctx, queue, config.m_maxConvexBodies, false);
  35. m_data->m_collidablesGPU = new b3OpenCLArray<b3Collidable>(ctx, queue, config.m_maxConvexShapes);
  36. m_data->m_collidablesCPU.reserve(config.m_maxConvexShapes);
  37. m_data->m_localShapeAABBCPU = new b3AlignedObjectArray<b3SapAabb>;
  38. m_data->m_localShapeAABBGPU = new b3OpenCLArray<b3SapAabb>(ctx, queue, config.m_maxConvexShapes);
  39. //m_data->m_solverDataGPU = adl::Solver<adl::TYPE_CL>::allocate(ctx,queue, config.m_maxBroadphasePairs,false);
  40. m_data->m_bodyBufferGPU = new b3OpenCLArray<b3RigidBodyData>(ctx, queue, config.m_maxConvexBodies, false);
  41. m_data->m_convexFacesGPU = new b3OpenCLArray<b3GpuFace>(ctx, queue, config.m_maxConvexShapes * config.m_maxFacesPerShape, false);
  42. m_data->m_convexFaces.reserve(config.m_maxConvexShapes * config.m_maxFacesPerShape);
  43. m_data->m_gpuChildShapes = new b3OpenCLArray<b3GpuChildShape>(ctx, queue, config.m_maxCompoundChildShapes, false);
  44. m_data->m_convexPolyhedraGPU = new b3OpenCLArray<b3ConvexPolyhedronData>(ctx, queue, config.m_maxConvexShapes, false);
  45. m_data->m_convexPolyhedra.reserve(config.m_maxConvexShapes);
  46. m_data->m_uniqueEdgesGPU = new b3OpenCLArray<b3Vector3>(ctx, queue, config.m_maxConvexUniqueEdges, true);
  47. m_data->m_uniqueEdges.reserve(config.m_maxConvexUniqueEdges);
  48. m_data->m_convexVerticesGPU = new b3OpenCLArray<b3Vector3>(ctx, queue, config.m_maxConvexVertices, true);
  49. m_data->m_convexVertices.reserve(config.m_maxConvexVertices);
  50. m_data->m_convexIndicesGPU = new b3OpenCLArray<int>(ctx, queue, config.m_maxConvexIndices, true);
  51. m_data->m_convexIndices.reserve(config.m_maxConvexIndices);
  52. m_data->m_worldVertsB1GPU = new b3OpenCLArray<b3Vector3>(ctx, queue, config.m_maxConvexBodies * config.m_maxVerticesPerFace);
  53. m_data->m_clippingFacesOutGPU = new b3OpenCLArray<b3Int4>(ctx, queue, config.m_maxConvexBodies);
  54. m_data->m_worldNormalsAGPU = new b3OpenCLArray<b3Vector3>(ctx, queue, config.m_maxConvexBodies);
  55. m_data->m_worldVertsA1GPU = new b3OpenCLArray<b3Vector3>(ctx, queue, config.m_maxConvexBodies * config.m_maxVerticesPerFace);
  56. m_data->m_worldVertsB2GPU = new b3OpenCLArray<b3Vector3>(ctx, queue, config.m_maxConvexBodies * config.m_maxVerticesPerFace);
  57. m_data->m_convexData = new b3AlignedObjectArray<b3ConvexUtility*>();
  58. m_data->m_convexData->resize(config.m_maxConvexShapes);
  59. m_data->m_convexPolyhedra.resize(config.m_maxConvexShapes);
  60. m_data->m_numAcceleratedShapes = 0;
  61. m_data->m_numAcceleratedRigidBodies = 0;
  62. m_data->m_subTreesGPU = new b3OpenCLArray<b3BvhSubtreeInfo>(this->m_context, this->m_queue);
  63. m_data->m_treeNodesGPU = new b3OpenCLArray<b3QuantizedBvhNode>(this->m_context, this->m_queue);
  64. m_data->m_bvhInfoGPU = new b3OpenCLArray<b3BvhInfo>(this->m_context, this->m_queue);
  65. //m_data->m_contactCGPU = new b3OpenCLArray<Constraint4>(ctx,queue,config.m_maxBroadphasePairs,false);
  66. //m_data->m_frictionCGPU = new b3OpenCLArray<adl::Solver<adl::TYPE_CL>::allocateFrictionConstraint( m_data->m_deviceCL, config.m_maxBroadphasePairs);
  67. }
  68. b3GpuNarrowPhase::~b3GpuNarrowPhase()
  69. {
  70. delete m_data->m_gpuSatCollision;
  71. delete m_data->m_triangleConvexPairs;
  72. //delete m_data->m_convexPairsOutGPU;
  73. //delete m_data->m_planePairs;
  74. delete m_data->m_pBufContactOutCPU;
  75. delete m_data->m_bodyBufferCPU;
  76. delete m_data->m_inertiaBufferCPU;
  77. delete m_data->m_pBufContactBuffersGPU[0];
  78. delete m_data->m_pBufContactBuffersGPU[1];
  79. delete m_data->m_inertiaBufferGPU;
  80. delete m_data->m_collidablesGPU;
  81. delete m_data->m_localShapeAABBCPU;
  82. delete m_data->m_localShapeAABBGPU;
  83. delete m_data->m_bodyBufferGPU;
  84. delete m_data->m_convexFacesGPU;
  85. delete m_data->m_gpuChildShapes;
  86. delete m_data->m_convexPolyhedraGPU;
  87. delete m_data->m_uniqueEdgesGPU;
  88. delete m_data->m_convexVerticesGPU;
  89. delete m_data->m_convexIndicesGPU;
  90. delete m_data->m_worldVertsB1GPU;
  91. delete m_data->m_clippingFacesOutGPU;
  92. delete m_data->m_worldNormalsAGPU;
  93. delete m_data->m_worldVertsA1GPU;
  94. delete m_data->m_worldVertsB2GPU;
  95. delete m_data->m_bvhInfoGPU;
  96. for (int i = 0; i < m_data->m_bvhData.size(); i++)
  97. {
  98. delete m_data->m_bvhData[i];
  99. }
  100. for (int i = 0; i < m_data->m_meshInterfaces.size(); i++)
  101. {
  102. delete m_data->m_meshInterfaces[i];
  103. }
  104. m_data->m_meshInterfaces.clear();
  105. m_data->m_bvhData.clear();
  106. delete m_data->m_treeNodesGPU;
  107. delete m_data->m_subTreesGPU;
  108. delete m_data->m_convexData;
  109. delete m_data;
  110. }
  111. int b3GpuNarrowPhase::allocateCollidable()
  112. {
  113. int curSize = m_data->m_collidablesCPU.size();
  114. if (curSize < m_data->m_config.m_maxConvexShapes)
  115. {
  116. m_data->m_collidablesCPU.expand();
  117. return curSize;
  118. }
  119. else
  120. {
  121. b3Error("allocateCollidable out-of-range %d\n", m_data->m_config.m_maxConvexShapes);
  122. }
  123. return -1;
  124. }
  125. int b3GpuNarrowPhase::registerSphereShape(float radius)
  126. {
  127. int collidableIndex = allocateCollidable();
  128. if (collidableIndex < 0)
  129. return collidableIndex;
  130. b3Collidable& col = getCollidableCpu(collidableIndex);
  131. col.m_shapeType = SHAPE_SPHERE;
  132. col.m_shapeIndex = 0;
  133. col.m_radius = radius;
  134. if (col.m_shapeIndex >= 0)
  135. {
  136. b3SapAabb aabb;
  137. b3Vector3 myAabbMin = b3MakeVector3(-radius, -radius, -radius);
  138. b3Vector3 myAabbMax = b3MakeVector3(radius, radius, radius);
  139. aabb.m_min[0] = myAabbMin[0]; //s_convexHeightField->m_aabb.m_min.x;
  140. aabb.m_min[1] = myAabbMin[1]; //s_convexHeightField->m_aabb.m_min.y;
  141. aabb.m_min[2] = myAabbMin[2]; //s_convexHeightField->m_aabb.m_min.z;
  142. aabb.m_minIndices[3] = 0;
  143. aabb.m_max[0] = myAabbMax[0]; //s_convexHeightField->m_aabb.m_max.x;
  144. aabb.m_max[1] = myAabbMax[1]; //s_convexHeightField->m_aabb.m_max.y;
  145. aabb.m_max[2] = myAabbMax[2]; //s_convexHeightField->m_aabb.m_max.z;
  146. aabb.m_signedMaxIndices[3] = 0;
  147. m_data->m_localShapeAABBCPU->push_back(aabb);
  148. // m_data->m_localShapeAABBGPU->push_back(aabb);
  149. clFinish(m_queue);
  150. }
  151. return collidableIndex;
  152. }
  153. int b3GpuNarrowPhase::registerFace(const b3Vector3& faceNormal, float faceConstant)
  154. {
  155. int faceOffset = m_data->m_convexFaces.size();
  156. b3GpuFace& face = m_data->m_convexFaces.expand();
  157. face.m_plane = b3MakeVector3(faceNormal.x, faceNormal.y, faceNormal.z, faceConstant);
  158. return faceOffset;
  159. }
  160. int b3GpuNarrowPhase::registerPlaneShape(const b3Vector3& planeNormal, float planeConstant)
  161. {
  162. int collidableIndex = allocateCollidable();
  163. if (collidableIndex < 0)
  164. return collidableIndex;
  165. b3Collidable& col = getCollidableCpu(collidableIndex);
  166. col.m_shapeType = SHAPE_PLANE;
  167. col.m_shapeIndex = registerFace(planeNormal, planeConstant);
  168. col.m_radius = planeConstant;
  169. if (col.m_shapeIndex >= 0)
  170. {
  171. b3SapAabb aabb;
  172. aabb.m_min[0] = -1e30f;
  173. aabb.m_min[1] = -1e30f;
  174. aabb.m_min[2] = -1e30f;
  175. aabb.m_minIndices[3] = 0;
  176. aabb.m_max[0] = 1e30f;
  177. aabb.m_max[1] = 1e30f;
  178. aabb.m_max[2] = 1e30f;
  179. aabb.m_signedMaxIndices[3] = 0;
  180. m_data->m_localShapeAABBCPU->push_back(aabb);
  181. // m_data->m_localShapeAABBGPU->push_back(aabb);
  182. clFinish(m_queue);
  183. }
  184. return collidableIndex;
  185. }
  186. int b3GpuNarrowPhase::registerConvexHullShapeInternal(b3ConvexUtility* convexPtr, b3Collidable& col)
  187. {
  188. m_data->m_convexData->resize(m_data->m_numAcceleratedShapes + 1);
  189. m_data->m_convexPolyhedra.resize(m_data->m_numAcceleratedShapes + 1);
  190. b3ConvexPolyhedronData& convex = m_data->m_convexPolyhedra.at(m_data->m_convexPolyhedra.size() - 1);
  191. convex.mC = convexPtr->mC;
  192. convex.mE = convexPtr->mE;
  193. convex.m_extents = convexPtr->m_extents;
  194. convex.m_localCenter = convexPtr->m_localCenter;
  195. convex.m_radius = convexPtr->m_radius;
  196. convex.m_numUniqueEdges = convexPtr->m_uniqueEdges.size();
  197. int edgeOffset = m_data->m_uniqueEdges.size();
  198. convex.m_uniqueEdgesOffset = edgeOffset;
  199. m_data->m_uniqueEdges.resize(edgeOffset + convex.m_numUniqueEdges);
  200. //convex data here
  201. int i;
  202. for (i = 0; i < convexPtr->m_uniqueEdges.size(); i++)
  203. {
  204. m_data->m_uniqueEdges[edgeOffset + i] = convexPtr->m_uniqueEdges[i];
  205. }
  206. int faceOffset = m_data->m_convexFaces.size();
  207. convex.m_faceOffset = faceOffset;
  208. convex.m_numFaces = convexPtr->m_faces.size();
  209. m_data->m_convexFaces.resize(faceOffset + convex.m_numFaces);
  210. for (i = 0; i < convexPtr->m_faces.size(); i++)
  211. {
  212. m_data->m_convexFaces[convex.m_faceOffset + i].m_plane = b3MakeVector3(convexPtr->m_faces[i].m_plane[0],
  213. convexPtr->m_faces[i].m_plane[1],
  214. convexPtr->m_faces[i].m_plane[2],
  215. convexPtr->m_faces[i].m_plane[3]);
  216. int indexOffset = m_data->m_convexIndices.size();
  217. int numIndices = convexPtr->m_faces[i].m_indices.size();
  218. m_data->m_convexFaces[convex.m_faceOffset + i].m_numIndices = numIndices;
  219. m_data->m_convexFaces[convex.m_faceOffset + i].m_indexOffset = indexOffset;
  220. m_data->m_convexIndices.resize(indexOffset + numIndices);
  221. for (int p = 0; p < numIndices; p++)
  222. {
  223. m_data->m_convexIndices[indexOffset + p] = convexPtr->m_faces[i].m_indices[p];
  224. }
  225. }
  226. convex.m_numVertices = convexPtr->m_vertices.size();
  227. int vertexOffset = m_data->m_convexVertices.size();
  228. convex.m_vertexOffset = vertexOffset;
  229. m_data->m_convexVertices.resize(vertexOffset + convex.m_numVertices);
  230. for (int i = 0; i < convexPtr->m_vertices.size(); i++)
  231. {
  232. m_data->m_convexVertices[vertexOffset + i] = convexPtr->m_vertices[i];
  233. }
  234. (*m_data->m_convexData)[m_data->m_numAcceleratedShapes] = convexPtr;
  235. return m_data->m_numAcceleratedShapes++;
  236. }
  237. int b3GpuNarrowPhase::registerConvexHullShape(const float* vertices, int strideInBytes, int numVertices, const float* scaling)
  238. {
  239. b3AlignedObjectArray<b3Vector3> verts;
  240. unsigned char* vts = (unsigned char*)vertices;
  241. for (int i = 0; i < numVertices; i++)
  242. {
  243. float* vertex = (float*)&vts[i * strideInBytes];
  244. verts.push_back(b3MakeVector3(vertex[0] * scaling[0], vertex[1] * scaling[1], vertex[2] * scaling[2]));
  245. }
  246. b3ConvexUtility* utilPtr = new b3ConvexUtility();
  247. bool merge = true;
  248. if (numVertices)
  249. {
  250. utilPtr->initializePolyhedralFeatures(&verts[0], verts.size(), merge);
  251. }
  252. int collidableIndex = registerConvexHullShape(utilPtr);
  253. delete utilPtr;
  254. return collidableIndex;
  255. }
  256. int b3GpuNarrowPhase::registerConvexHullShape(b3ConvexUtility* utilPtr)
  257. {
  258. int collidableIndex = allocateCollidable();
  259. if (collidableIndex < 0)
  260. return collidableIndex;
  261. b3Collidable& col = getCollidableCpu(collidableIndex);
  262. col.m_shapeType = SHAPE_CONVEX_HULL;
  263. col.m_shapeIndex = -1;
  264. {
  265. b3Vector3 localCenter = b3MakeVector3(0, 0, 0);
  266. for (int i = 0; i < utilPtr->m_vertices.size(); i++)
  267. localCenter += utilPtr->m_vertices[i];
  268. localCenter *= (1.f / utilPtr->m_vertices.size());
  269. utilPtr->m_localCenter = localCenter;
  270. col.m_shapeIndex = registerConvexHullShapeInternal(utilPtr, col);
  271. }
  272. if (col.m_shapeIndex >= 0)
  273. {
  274. b3SapAabb aabb;
  275. b3Vector3 myAabbMin = b3MakeVector3(1e30f, 1e30f, 1e30f);
  276. b3Vector3 myAabbMax = b3MakeVector3(-1e30f, -1e30f, -1e30f);
  277. for (int i = 0; i < utilPtr->m_vertices.size(); i++)
  278. {
  279. myAabbMin.setMin(utilPtr->m_vertices[i]);
  280. myAabbMax.setMax(utilPtr->m_vertices[i]);
  281. }
  282. aabb.m_min[0] = myAabbMin[0];
  283. aabb.m_min[1] = myAabbMin[1];
  284. aabb.m_min[2] = myAabbMin[2];
  285. aabb.m_minIndices[3] = 0;
  286. aabb.m_max[0] = myAabbMax[0];
  287. aabb.m_max[1] = myAabbMax[1];
  288. aabb.m_max[2] = myAabbMax[2];
  289. aabb.m_signedMaxIndices[3] = 0;
  290. m_data->m_localShapeAABBCPU->push_back(aabb);
  291. // m_data->m_localShapeAABBGPU->push_back(aabb);
  292. }
  293. return collidableIndex;
  294. }
  295. int b3GpuNarrowPhase::registerCompoundShape(b3AlignedObjectArray<b3GpuChildShape>* childShapes)
  296. {
  297. int collidableIndex = allocateCollidable();
  298. if (collidableIndex < 0)
  299. return collidableIndex;
  300. b3Collidable& col = getCollidableCpu(collidableIndex);
  301. col.m_shapeType = SHAPE_COMPOUND_OF_CONVEX_HULLS;
  302. col.m_shapeIndex = m_data->m_cpuChildShapes.size();
  303. col.m_compoundBvhIndex = m_data->m_bvhInfoCPU.size();
  304. {
  305. b3Assert(col.m_shapeIndex + childShapes->size() < m_data->m_config.m_maxCompoundChildShapes);
  306. for (int i = 0; i < childShapes->size(); i++)
  307. {
  308. m_data->m_cpuChildShapes.push_back(childShapes->at(i));
  309. }
  310. }
  311. col.m_numChildShapes = childShapes->size();
  312. b3SapAabb aabbLocalSpace;
  313. b3Vector3 myAabbMin = b3MakeVector3(1e30f, 1e30f, 1e30f);
  314. b3Vector3 myAabbMax = b3MakeVector3(-1e30f, -1e30f, -1e30f);
  315. b3AlignedObjectArray<b3Aabb> childLocalAabbs;
  316. childLocalAabbs.resize(childShapes->size());
  317. //compute local AABB of the compound of all children
  318. for (int i = 0; i < childShapes->size(); i++)
  319. {
  320. int childColIndex = childShapes->at(i).m_shapeIndex;
  321. //b3Collidable& childCol = getCollidableCpu(childColIndex);
  322. b3SapAabb aabbLoc = m_data->m_localShapeAABBCPU->at(childColIndex);
  323. b3Vector3 childLocalAabbMin = b3MakeVector3(aabbLoc.m_min[0], aabbLoc.m_min[1], aabbLoc.m_min[2]);
  324. b3Vector3 childLocalAabbMax = b3MakeVector3(aabbLoc.m_max[0], aabbLoc.m_max[1], aabbLoc.m_max[2]);
  325. b3Vector3 aMin, aMax;
  326. b3Scalar margin(0.f);
  327. b3Transform childTr;
  328. childTr.setIdentity();
  329. childTr.setOrigin(childShapes->at(i).m_childPosition);
  330. childTr.setRotation(b3Quaternion(childShapes->at(i).m_childOrientation));
  331. b3TransformAabb(childLocalAabbMin, childLocalAabbMax, margin, childTr, aMin, aMax);
  332. myAabbMin.setMin(aMin);
  333. myAabbMax.setMax(aMax);
  334. childLocalAabbs[i].m_min[0] = aMin[0];
  335. childLocalAabbs[i].m_min[1] = aMin[1];
  336. childLocalAabbs[i].m_min[2] = aMin[2];
  337. childLocalAabbs[i].m_min[3] = 0;
  338. childLocalAabbs[i].m_max[0] = aMax[0];
  339. childLocalAabbs[i].m_max[1] = aMax[1];
  340. childLocalAabbs[i].m_max[2] = aMax[2];
  341. childLocalAabbs[i].m_max[3] = 0;
  342. }
  343. aabbLocalSpace.m_min[0] = myAabbMin[0]; //s_convexHeightField->m_aabb.m_min.x;
  344. aabbLocalSpace.m_min[1] = myAabbMin[1]; //s_convexHeightField->m_aabb.m_min.y;
  345. aabbLocalSpace.m_min[2] = myAabbMin[2]; //s_convexHeightField->m_aabb.m_min.z;
  346. aabbLocalSpace.m_minIndices[3] = 0;
  347. aabbLocalSpace.m_max[0] = myAabbMax[0]; //s_convexHeightField->m_aabb.m_max.x;
  348. aabbLocalSpace.m_max[1] = myAabbMax[1]; //s_convexHeightField->m_aabb.m_max.y;
  349. aabbLocalSpace.m_max[2] = myAabbMax[2]; //s_convexHeightField->m_aabb.m_max.z;
  350. aabbLocalSpace.m_signedMaxIndices[3] = 0;
  351. m_data->m_localShapeAABBCPU->push_back(aabbLocalSpace);
  352. b3QuantizedBvh* bvh = new b3QuantizedBvh;
  353. bvh->setQuantizationValues(myAabbMin, myAabbMax);
  354. QuantizedNodeArray& nodes = bvh->getLeafNodeArray();
  355. int numNodes = childShapes->size();
  356. for (int i = 0; i < numNodes; i++)
  357. {
  358. b3QuantizedBvhNode node;
  359. b3Vector3 aabbMin, aabbMax;
  360. aabbMin = (b3Vector3&)childLocalAabbs[i].m_min;
  361. aabbMax = (b3Vector3&)childLocalAabbs[i].m_max;
  362. bvh->quantize(&node.m_quantizedAabbMin[0], aabbMin, 0);
  363. bvh->quantize(&node.m_quantizedAabbMax[0], aabbMax, 1);
  364. int partId = 0;
  365. node.m_escapeIndexOrTriangleIndex = (partId << (31 - MAX_NUM_PARTS_IN_BITS)) | i;
  366. nodes.push_back(node);
  367. }
  368. bvh->buildInternal();
  369. int numSubTrees = bvh->getSubtreeInfoArray().size();
  370. //void setQuantizationValues(const b3Vector3& bvhAabbMin,const b3Vector3& bvhAabbMax,b3Scalar quantizationMargin=b3Scalar(1.0));
  371. //QuantizedNodeArray& getLeafNodeArray() { return m_quantizedLeafNodes; }
  372. ///buildInternal is expert use only: assumes that setQuantizationValues and LeafNodeArray are initialized
  373. //void buildInternal();
  374. b3BvhInfo bvhInfo;
  375. bvhInfo.m_aabbMin = bvh->m_bvhAabbMin;
  376. bvhInfo.m_aabbMax = bvh->m_bvhAabbMax;
  377. bvhInfo.m_quantization = bvh->m_bvhQuantization;
  378. bvhInfo.m_numNodes = numNodes;
  379. bvhInfo.m_numSubTrees = numSubTrees;
  380. bvhInfo.m_nodeOffset = m_data->m_treeNodesCPU.size();
  381. bvhInfo.m_subTreeOffset = m_data->m_subTreesCPU.size();
  382. int numNewNodes = bvh->getQuantizedNodeArray().size();
  383. for (int i = 0; i < numNewNodes - 1; i++)
  384. {
  385. if (bvh->getQuantizedNodeArray()[i].isLeafNode())
  386. {
  387. int orgIndex = bvh->getQuantizedNodeArray()[i].getTriangleIndex();
  388. b3Vector3 nodeMinVec = bvh->unQuantize(bvh->getQuantizedNodeArray()[i].m_quantizedAabbMin);
  389. b3Vector3 nodeMaxVec = bvh->unQuantize(bvh->getQuantizedNodeArray()[i].m_quantizedAabbMax);
  390. for (int c = 0; c < 3; c++)
  391. {
  392. if (childLocalAabbs[orgIndex].m_min[c] < nodeMinVec[c])
  393. {
  394. printf("min org (%f) and new (%f) ? at i:%d,c:%d\n", childLocalAabbs[i].m_min[c], nodeMinVec[c], i, c);
  395. }
  396. if (childLocalAabbs[orgIndex].m_max[c] > nodeMaxVec[c])
  397. {
  398. printf("max org (%f) and new (%f) ? at i:%d,c:%d\n", childLocalAabbs[i].m_max[c], nodeMaxVec[c], i, c);
  399. }
  400. }
  401. }
  402. }
  403. m_data->m_bvhInfoCPU.push_back(bvhInfo);
  404. int numNewSubtrees = bvh->getSubtreeInfoArray().size();
  405. m_data->m_subTreesCPU.reserve(m_data->m_subTreesCPU.size() + numNewSubtrees);
  406. for (int i = 0; i < numNewSubtrees; i++)
  407. {
  408. m_data->m_subTreesCPU.push_back(bvh->getSubtreeInfoArray()[i]);
  409. }
  410. int numNewTreeNodes = bvh->getQuantizedNodeArray().size();
  411. for (int i = 0; i < numNewTreeNodes; i++)
  412. {
  413. m_data->m_treeNodesCPU.push_back(bvh->getQuantizedNodeArray()[i]);
  414. }
  415. // m_data->m_localShapeAABBGPU->push_back(aabbWS);
  416. clFinish(m_queue);
  417. return collidableIndex;
  418. }
  419. int b3GpuNarrowPhase::registerConcaveMesh(b3AlignedObjectArray<b3Vector3>* vertices, b3AlignedObjectArray<int>* indices, const float* scaling1)
  420. {
  421. b3Vector3 scaling = b3MakeVector3(scaling1[0], scaling1[1], scaling1[2]);
  422. int collidableIndex = allocateCollidable();
  423. if (collidableIndex < 0)
  424. return collidableIndex;
  425. b3Collidable& col = getCollidableCpu(collidableIndex);
  426. col.m_shapeType = SHAPE_CONCAVE_TRIMESH;
  427. col.m_shapeIndex = registerConcaveMeshShape(vertices, indices, col, scaling);
  428. col.m_bvhIndex = m_data->m_bvhInfoCPU.size();
  429. b3SapAabb aabb;
  430. b3Vector3 myAabbMin = b3MakeVector3(1e30f, 1e30f, 1e30f);
  431. b3Vector3 myAabbMax = b3MakeVector3(-1e30f, -1e30f, -1e30f);
  432. for (int i = 0; i < vertices->size(); i++)
  433. {
  434. b3Vector3 vtx(vertices->at(i) * scaling);
  435. myAabbMin.setMin(vtx);
  436. myAabbMax.setMax(vtx);
  437. }
  438. aabb.m_min[0] = myAabbMin[0];
  439. aabb.m_min[1] = myAabbMin[1];
  440. aabb.m_min[2] = myAabbMin[2];
  441. aabb.m_minIndices[3] = 0;
  442. aabb.m_max[0] = myAabbMax[0];
  443. aabb.m_max[1] = myAabbMax[1];
  444. aabb.m_max[2] = myAabbMax[2];
  445. aabb.m_signedMaxIndices[3] = 0;
  446. m_data->m_localShapeAABBCPU->push_back(aabb);
  447. // m_data->m_localShapeAABBGPU->push_back(aabb);
  448. b3OptimizedBvh* bvh = new b3OptimizedBvh();
  449. //void b3OptimizedBvh::build(b3StridingMeshInterface* triangles, bool useQuantizedAabbCompression, const b3Vector3& bvhAabbMin, const b3Vector3& bvhAabbMax)
  450. bool useQuantizedAabbCompression = true;
  451. b3TriangleIndexVertexArray* meshInterface = new b3TriangleIndexVertexArray();
  452. m_data->m_meshInterfaces.push_back(meshInterface);
  453. b3IndexedMesh mesh;
  454. mesh.m_numTriangles = indices->size() / 3;
  455. mesh.m_numVertices = vertices->size();
  456. mesh.m_vertexBase = (const unsigned char*)&vertices->at(0).x;
  457. mesh.m_vertexStride = sizeof(b3Vector3);
  458. mesh.m_triangleIndexStride = 3 * sizeof(int); // or sizeof(int)
  459. mesh.m_triangleIndexBase = (const unsigned char*)&indices->at(0);
  460. meshInterface->addIndexedMesh(mesh);
  461. bvh->build(meshInterface, useQuantizedAabbCompression, (b3Vector3&)aabb.m_min, (b3Vector3&)aabb.m_max);
  462. m_data->m_bvhData.push_back(bvh);
  463. int numNodes = bvh->getQuantizedNodeArray().size();
  464. //b3OpenCLArray<b3QuantizedBvhNode>* treeNodesGPU = new b3OpenCLArray<b3QuantizedBvhNode>(this->m_context,this->m_queue,numNodes);
  465. int numSubTrees = bvh->getSubtreeInfoArray().size();
  466. b3BvhInfo bvhInfo;
  467. bvhInfo.m_aabbMin = bvh->m_bvhAabbMin;
  468. bvhInfo.m_aabbMax = bvh->m_bvhAabbMax;
  469. bvhInfo.m_quantization = bvh->m_bvhQuantization;
  470. bvhInfo.m_numNodes = numNodes;
  471. bvhInfo.m_numSubTrees = numSubTrees;
  472. bvhInfo.m_nodeOffset = m_data->m_treeNodesCPU.size();
  473. bvhInfo.m_subTreeOffset = m_data->m_subTreesCPU.size();
  474. m_data->m_bvhInfoCPU.push_back(bvhInfo);
  475. int numNewSubtrees = bvh->getSubtreeInfoArray().size();
  476. m_data->m_subTreesCPU.reserve(m_data->m_subTreesCPU.size() + numNewSubtrees);
  477. for (int i = 0; i < numNewSubtrees; i++)
  478. {
  479. m_data->m_subTreesCPU.push_back(bvh->getSubtreeInfoArray()[i]);
  480. }
  481. int numNewTreeNodes = bvh->getQuantizedNodeArray().size();
  482. for (int i = 0; i < numNewTreeNodes; i++)
  483. {
  484. m_data->m_treeNodesCPU.push_back(bvh->getQuantizedNodeArray()[i]);
  485. }
  486. return collidableIndex;
  487. }
  488. int b3GpuNarrowPhase::registerConcaveMeshShape(b3AlignedObjectArray<b3Vector3>* vertices, b3AlignedObjectArray<int>* indices, b3Collidable& col, const float* scaling1)
  489. {
  490. b3Vector3 scaling = b3MakeVector3(scaling1[0], scaling1[1], scaling1[2]);
  491. m_data->m_convexData->resize(m_data->m_numAcceleratedShapes + 1);
  492. m_data->m_convexPolyhedra.resize(m_data->m_numAcceleratedShapes + 1);
  493. b3ConvexPolyhedronData& convex = m_data->m_convexPolyhedra.at(m_data->m_convexPolyhedra.size() - 1);
  494. convex.mC = b3MakeVector3(0, 0, 0);
  495. convex.mE = b3MakeVector3(0, 0, 0);
  496. convex.m_extents = b3MakeVector3(0, 0, 0);
  497. convex.m_localCenter = b3MakeVector3(0, 0, 0);
  498. convex.m_radius = 0.f;
  499. convex.m_numUniqueEdges = 0;
  500. int edgeOffset = m_data->m_uniqueEdges.size();
  501. convex.m_uniqueEdgesOffset = edgeOffset;
  502. int faceOffset = m_data->m_convexFaces.size();
  503. convex.m_faceOffset = faceOffset;
  504. convex.m_numFaces = indices->size() / 3;
  505. m_data->m_convexFaces.resize(faceOffset + convex.m_numFaces);
  506. m_data->m_convexIndices.reserve(convex.m_numFaces * 3);
  507. for (int i = 0; i < convex.m_numFaces; i++)
  508. {
  509. if (i % 256 == 0)
  510. {
  511. //printf("i=%d out of %d", i,convex.m_numFaces);
  512. }
  513. b3Vector3 vert0(vertices->at(indices->at(i * 3)) * scaling);
  514. b3Vector3 vert1(vertices->at(indices->at(i * 3 + 1)) * scaling);
  515. b3Vector3 vert2(vertices->at(indices->at(i * 3 + 2)) * scaling);
  516. b3Vector3 normal = ((vert1 - vert0).cross(vert2 - vert0)).normalize();
  517. b3Scalar c = -(normal.dot(vert0));
  518. m_data->m_convexFaces[convex.m_faceOffset + i].m_plane = b3MakeVector4(normal.x, normal.y, normal.z, c);
  519. int indexOffset = m_data->m_convexIndices.size();
  520. int numIndices = 3;
  521. m_data->m_convexFaces[convex.m_faceOffset + i].m_numIndices = numIndices;
  522. m_data->m_convexFaces[convex.m_faceOffset + i].m_indexOffset = indexOffset;
  523. m_data->m_convexIndices.resize(indexOffset + numIndices);
  524. for (int p = 0; p < numIndices; p++)
  525. {
  526. int vi = indices->at(i * 3 + p);
  527. m_data->m_convexIndices[indexOffset + p] = vi; //convexPtr->m_faces[i].m_indices[p];
  528. }
  529. }
  530. convex.m_numVertices = vertices->size();
  531. int vertexOffset = m_data->m_convexVertices.size();
  532. convex.m_vertexOffset = vertexOffset;
  533. m_data->m_convexVertices.resize(vertexOffset + convex.m_numVertices);
  534. for (int i = 0; i < vertices->size(); i++)
  535. {
  536. m_data->m_convexVertices[vertexOffset + i] = vertices->at(i) * scaling;
  537. }
  538. (*m_data->m_convexData)[m_data->m_numAcceleratedShapes] = 0;
  539. return m_data->m_numAcceleratedShapes++;
  540. }
  541. cl_mem b3GpuNarrowPhase::getBodiesGpu()
  542. {
  543. return (cl_mem)m_data->m_bodyBufferGPU->getBufferCL();
  544. }
  545. const struct b3RigidBodyData* b3GpuNarrowPhase::getBodiesCpu() const
  546. {
  547. return &m_data->m_bodyBufferCPU->at(0);
  548. };
  549. int b3GpuNarrowPhase::getNumBodiesGpu() const
  550. {
  551. return m_data->m_bodyBufferGPU->size();
  552. }
  553. cl_mem b3GpuNarrowPhase::getBodyInertiasGpu()
  554. {
  555. return (cl_mem)m_data->m_inertiaBufferGPU->getBufferCL();
  556. }
  557. int b3GpuNarrowPhase::getNumBodyInertiasGpu() const
  558. {
  559. return m_data->m_inertiaBufferGPU->size();
  560. }
  561. b3Collidable& b3GpuNarrowPhase::getCollidableCpu(int collidableIndex)
  562. {
  563. return m_data->m_collidablesCPU[collidableIndex];
  564. }
  565. const b3Collidable& b3GpuNarrowPhase::getCollidableCpu(int collidableIndex) const
  566. {
  567. return m_data->m_collidablesCPU[collidableIndex];
  568. }
  569. cl_mem b3GpuNarrowPhase::getCollidablesGpu()
  570. {
  571. return m_data->m_collidablesGPU->getBufferCL();
  572. }
  573. const struct b3Collidable* b3GpuNarrowPhase::getCollidablesCpu() const
  574. {
  575. if (m_data->m_collidablesCPU.size())
  576. return &m_data->m_collidablesCPU[0];
  577. return 0;
  578. }
  579. const struct b3SapAabb* b3GpuNarrowPhase::getLocalSpaceAabbsCpu() const
  580. {
  581. if (m_data->m_localShapeAABBCPU->size())
  582. {
  583. return &m_data->m_localShapeAABBCPU->at(0);
  584. }
  585. return 0;
  586. }
  587. cl_mem b3GpuNarrowPhase::getAabbLocalSpaceBufferGpu()
  588. {
  589. return m_data->m_localShapeAABBGPU->getBufferCL();
  590. }
  591. int b3GpuNarrowPhase::getNumCollidablesGpu() const
  592. {
  593. return m_data->m_collidablesGPU->size();
  594. }
  595. int b3GpuNarrowPhase::getNumContactsGpu() const
  596. {
  597. return m_data->m_pBufContactBuffersGPU[m_data->m_currentContactBuffer]->size();
  598. }
  599. cl_mem b3GpuNarrowPhase::getContactsGpu()
  600. {
  601. return m_data->m_pBufContactBuffersGPU[m_data->m_currentContactBuffer]->getBufferCL();
  602. }
  603. const b3Contact4* b3GpuNarrowPhase::getContactsCPU() const
  604. {
  605. m_data->m_pBufContactBuffersGPU[m_data->m_currentContactBuffer]->copyToHost(*m_data->m_pBufContactOutCPU);
  606. return &m_data->m_pBufContactOutCPU->at(0);
  607. }
  608. void b3GpuNarrowPhase::computeContacts(cl_mem broadphasePairs, int numBroadphasePairs, cl_mem aabbsWorldSpace, int numObjects)
  609. {
  610. cl_mem aabbsLocalSpace = m_data->m_localShapeAABBGPU->getBufferCL();
  611. int nContactOut = 0;
  612. //swap buffer
  613. m_data->m_currentContactBuffer = 1 - m_data->m_currentContactBuffer;
  614. //int curSize = m_data->m_pBufContactBuffersGPU[m_data->m_currentContactBuffer]->size();
  615. int maxTriConvexPairCapacity = m_data->m_config.m_maxTriConvexPairCapacity;
  616. int numTriConvexPairsOut = 0;
  617. b3OpenCLArray<b3Int4> broadphasePairsGPU(m_context, m_queue);
  618. broadphasePairsGPU.setFromOpenCLBuffer(broadphasePairs, numBroadphasePairs);
  619. b3OpenCLArray<b3Aabb> clAabbArrayWorldSpace(this->m_context, this->m_queue);
  620. clAabbArrayWorldSpace.setFromOpenCLBuffer(aabbsWorldSpace, numObjects);
  621. b3OpenCLArray<b3Aabb> clAabbArrayLocalSpace(this->m_context, this->m_queue);
  622. clAabbArrayLocalSpace.setFromOpenCLBuffer(aabbsLocalSpace, numObjects);
  623. m_data->m_gpuSatCollision->computeConvexConvexContactsGPUSAT(
  624. &broadphasePairsGPU, numBroadphasePairs,
  625. m_data->m_bodyBufferGPU,
  626. m_data->m_pBufContactBuffersGPU[m_data->m_currentContactBuffer],
  627. nContactOut,
  628. m_data->m_pBufContactBuffersGPU[1 - m_data->m_currentContactBuffer],
  629. m_data->m_config.m_maxContactCapacity,
  630. m_data->m_config.m_compoundPairCapacity,
  631. *m_data->m_convexPolyhedraGPU,
  632. *m_data->m_convexVerticesGPU,
  633. *m_data->m_uniqueEdgesGPU,
  634. *m_data->m_convexFacesGPU,
  635. *m_data->m_convexIndicesGPU,
  636. *m_data->m_collidablesGPU,
  637. *m_data->m_gpuChildShapes,
  638. clAabbArrayWorldSpace,
  639. clAabbArrayLocalSpace,
  640. *m_data->m_worldVertsB1GPU,
  641. *m_data->m_clippingFacesOutGPU,
  642. *m_data->m_worldNormalsAGPU,
  643. *m_data->m_worldVertsA1GPU,
  644. *m_data->m_worldVertsB2GPU,
  645. m_data->m_bvhData,
  646. m_data->m_treeNodesGPU,
  647. m_data->m_subTreesGPU,
  648. m_data->m_bvhInfoGPU,
  649. numObjects,
  650. maxTriConvexPairCapacity,
  651. *m_data->m_triangleConvexPairs,
  652. numTriConvexPairsOut);
  653. /*b3AlignedObjectArray<b3Int4> broadphasePairsCPU;
  654. broadphasePairsGPU.copyToHost(broadphasePairsCPU);
  655. printf("checking pairs\n");
  656. */
  657. }
  658. const b3SapAabb& b3GpuNarrowPhase::getLocalSpaceAabb(int collidableIndex) const
  659. {
  660. return m_data->m_localShapeAABBCPU->at(collidableIndex);
  661. }
  662. int b3GpuNarrowPhase::registerRigidBody(int collidableIndex, float mass, const float* position, const float* orientation, const float* aabbMinPtr, const float* aabbMaxPtr, bool writeToGpu)
  663. {
  664. b3Vector3 aabbMin = b3MakeVector3(aabbMinPtr[0], aabbMinPtr[1], aabbMinPtr[2]);
  665. b3Vector3 aabbMax = b3MakeVector3(aabbMaxPtr[0], aabbMaxPtr[1], aabbMaxPtr[2]);
  666. if (m_data->m_numAcceleratedRigidBodies >= (m_data->m_config.m_maxConvexBodies))
  667. {
  668. b3Error("registerRigidBody: exceeding the number of rigid bodies, %d > %d \n", m_data->m_numAcceleratedRigidBodies, m_data->m_config.m_maxConvexBodies);
  669. return -1;
  670. }
  671. m_data->m_bodyBufferCPU->resize(m_data->m_numAcceleratedRigidBodies + 1);
  672. b3RigidBodyData& body = m_data->m_bodyBufferCPU->at(m_data->m_numAcceleratedRigidBodies);
  673. float friction = 1.f;
  674. float restitution = 0.f;
  675. body.m_frictionCoeff = friction;
  676. body.m_restituitionCoeff = restitution;
  677. body.m_angVel = b3MakeVector3(0, 0, 0);
  678. body.m_linVel = b3MakeVector3(0, 0, 0); //.setZero();
  679. body.m_pos = b3MakeVector3(position[0], position[1], position[2]);
  680. body.m_quat.setValue(orientation[0], orientation[1], orientation[2], orientation[3]);
  681. body.m_collidableIdx = collidableIndex;
  682. if (collidableIndex >= 0)
  683. {
  684. // body.m_shapeType = m_data->m_collidablesCPU.at(collidableIndex).m_shapeType;
  685. }
  686. else
  687. {
  688. // body.m_shapeType = CollisionShape::SHAPE_PLANE;
  689. m_planeBodyIndex = m_data->m_numAcceleratedRigidBodies;
  690. }
  691. //body.m_shapeType = shapeType;
  692. body.m_invMass = mass ? 1.f / mass : 0.f;
  693. if (writeToGpu)
  694. {
  695. m_data->m_bodyBufferGPU->copyFromHostPointer(&body, 1, m_data->m_numAcceleratedRigidBodies);
  696. }
  697. b3InertiaData& shapeInfo = m_data->m_inertiaBufferCPU->at(m_data->m_numAcceleratedRigidBodies);
  698. if (mass == 0.f)
  699. {
  700. if (m_data->m_numAcceleratedRigidBodies == 0)
  701. m_static0Index = 0;
  702. shapeInfo.m_initInvInertia.setValue(0, 0, 0, 0, 0, 0, 0, 0, 0);
  703. shapeInfo.m_invInertiaWorld.setValue(0, 0, 0, 0, 0, 0, 0, 0, 0);
  704. }
  705. else
  706. {
  707. b3Assert(body.m_collidableIdx >= 0);
  708. //approximate using the aabb of the shape
  709. //Aabb aabb = (*m_data->m_shapePointers)[shapeIndex]->m_aabb;
  710. b3Vector3 halfExtents = (aabbMax - aabbMin); //*0.5f;//fake larger inertia makes demos more stable ;-)
  711. b3Vector3 localInertia;
  712. float lx = 2.f * halfExtents[0];
  713. float ly = 2.f * halfExtents[1];
  714. float lz = 2.f * halfExtents[2];
  715. localInertia.setValue((mass / 12.0f) * (ly * ly + lz * lz),
  716. (mass / 12.0f) * (lx * lx + lz * lz),
  717. (mass / 12.0f) * (lx * lx + ly * ly));
  718. b3Vector3 invLocalInertia;
  719. invLocalInertia[0] = 1.f / localInertia[0];
  720. invLocalInertia[1] = 1.f / localInertia[1];
  721. invLocalInertia[2] = 1.f / localInertia[2];
  722. invLocalInertia[3] = 0.f;
  723. shapeInfo.m_initInvInertia.setValue(
  724. invLocalInertia[0], 0, 0,
  725. 0, invLocalInertia[1], 0,
  726. 0, 0, invLocalInertia[2]);
  727. b3Matrix3x3 m(body.m_quat);
  728. shapeInfo.m_invInertiaWorld = m.scaled(invLocalInertia) * m.transpose();
  729. }
  730. if (writeToGpu)
  731. m_data->m_inertiaBufferGPU->copyFromHostPointer(&shapeInfo, 1, m_data->m_numAcceleratedRigidBodies);
  732. return m_data->m_numAcceleratedRigidBodies++;
  733. }
  734. int b3GpuNarrowPhase::getNumRigidBodies() const
  735. {
  736. return m_data->m_numAcceleratedRigidBodies;
  737. }
  738. void b3GpuNarrowPhase::writeAllBodiesToGpu()
  739. {
  740. if (m_data->m_localShapeAABBCPU->size())
  741. {
  742. m_data->m_localShapeAABBGPU->copyFromHost(*m_data->m_localShapeAABBCPU);
  743. }
  744. m_data->m_gpuChildShapes->copyFromHost(m_data->m_cpuChildShapes);
  745. m_data->m_convexFacesGPU->copyFromHost(m_data->m_convexFaces);
  746. m_data->m_convexPolyhedraGPU->copyFromHost(m_data->m_convexPolyhedra);
  747. m_data->m_uniqueEdgesGPU->copyFromHost(m_data->m_uniqueEdges);
  748. m_data->m_convexVerticesGPU->copyFromHost(m_data->m_convexVertices);
  749. m_data->m_convexIndicesGPU->copyFromHost(m_data->m_convexIndices);
  750. m_data->m_bvhInfoGPU->copyFromHost(m_data->m_bvhInfoCPU);
  751. m_data->m_treeNodesGPU->copyFromHost(m_data->m_treeNodesCPU);
  752. m_data->m_subTreesGPU->copyFromHost(m_data->m_subTreesCPU);
  753. m_data->m_bodyBufferGPU->resize(m_data->m_numAcceleratedRigidBodies);
  754. m_data->m_inertiaBufferGPU->resize(m_data->m_numAcceleratedRigidBodies);
  755. if (m_data->m_numAcceleratedRigidBodies)
  756. {
  757. m_data->m_bodyBufferGPU->copyFromHostPointer(&m_data->m_bodyBufferCPU->at(0), m_data->m_numAcceleratedRigidBodies);
  758. m_data->m_inertiaBufferGPU->copyFromHostPointer(&m_data->m_inertiaBufferCPU->at(0), m_data->m_numAcceleratedRigidBodies);
  759. }
  760. if (m_data->m_collidablesCPU.size())
  761. {
  762. m_data->m_collidablesGPU->copyFromHost(m_data->m_collidablesCPU);
  763. }
  764. }
  765. void b3GpuNarrowPhase::reset()
  766. {
  767. m_data->m_numAcceleratedShapes = 0;
  768. m_data->m_numAcceleratedRigidBodies = 0;
  769. this->m_static0Index = -1;
  770. m_data->m_uniqueEdges.resize(0);
  771. m_data->m_convexVertices.resize(0);
  772. m_data->m_convexPolyhedra.resize(0);
  773. m_data->m_convexIndices.resize(0);
  774. m_data->m_cpuChildShapes.resize(0);
  775. m_data->m_convexFaces.resize(0);
  776. m_data->m_collidablesCPU.resize(0);
  777. m_data->m_localShapeAABBCPU->resize(0);
  778. m_data->m_bvhData.resize(0);
  779. m_data->m_treeNodesCPU.resize(0);
  780. m_data->m_subTreesCPU.resize(0);
  781. m_data->m_bvhInfoCPU.resize(0);
  782. }
  783. void b3GpuNarrowPhase::readbackAllBodiesToCpu()
  784. {
  785. m_data->m_bodyBufferGPU->copyToHostPointer(&m_data->m_bodyBufferCPU->at(0), m_data->m_numAcceleratedRigidBodies);
  786. }
  787. void b3GpuNarrowPhase::setObjectTransformCpu(float* position, float* orientation, int bodyIndex)
  788. {
  789. if (bodyIndex >= 0 && bodyIndex < m_data->m_bodyBufferCPU->size())
  790. {
  791. m_data->m_bodyBufferCPU->at(bodyIndex).m_pos = b3MakeVector3(position[0], position[1], position[2]);
  792. m_data->m_bodyBufferCPU->at(bodyIndex).m_quat.setValue(orientation[0], orientation[1], orientation[2], orientation[3]);
  793. }
  794. else
  795. {
  796. b3Warning("setObjectVelocityCpu out of range.\n");
  797. }
  798. }
  799. void b3GpuNarrowPhase::setObjectVelocityCpu(float* linVel, float* angVel, int bodyIndex)
  800. {
  801. if (bodyIndex >= 0 && bodyIndex < m_data->m_bodyBufferCPU->size())
  802. {
  803. m_data->m_bodyBufferCPU->at(bodyIndex).m_linVel = b3MakeVector3(linVel[0], linVel[1], linVel[2]);
  804. m_data->m_bodyBufferCPU->at(bodyIndex).m_angVel = b3MakeVector3(angVel[0], angVel[1], angVel[2]);
  805. }
  806. else
  807. {
  808. b3Warning("setObjectVelocityCpu out of range.\n");
  809. }
  810. }
  811. bool b3GpuNarrowPhase::getObjectTransformFromCpu(float* position, float* orientation, int bodyIndex) const
  812. {
  813. if (bodyIndex >= 0 && bodyIndex < m_data->m_bodyBufferCPU->size())
  814. {
  815. position[0] = m_data->m_bodyBufferCPU->at(bodyIndex).m_pos.x;
  816. position[1] = m_data->m_bodyBufferCPU->at(bodyIndex).m_pos.y;
  817. position[2] = m_data->m_bodyBufferCPU->at(bodyIndex).m_pos.z;
  818. position[3] = 1.f; //or 1
  819. orientation[0] = m_data->m_bodyBufferCPU->at(bodyIndex).m_quat.x;
  820. orientation[1] = m_data->m_bodyBufferCPU->at(bodyIndex).m_quat.y;
  821. orientation[2] = m_data->m_bodyBufferCPU->at(bodyIndex).m_quat.z;
  822. orientation[3] = m_data->m_bodyBufferCPU->at(bodyIndex).m_quat.w;
  823. return true;
  824. }
  825. b3Warning("getObjectTransformFromCpu out of range.\n");
  826. return false;
  827. }