1 //this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project
2 static const char* bvhTraversalKernelCL =
3 "//keep this enum in sync with the CPU version (in btCollidable.h)\n"
4 "//written by Erwin Coumans\n"
5 "#define SHAPE_CONVEX_HULL 3\n"
6 "#define SHAPE_CONCAVE_TRIMESH 5\n"
7 "#define TRIANGLE_NUM_CONVEX_FACES 5\n"
8 "#define SHAPE_COMPOUND_OF_CONVEX_HULLS 6\n"
9 "#define SHAPE_SPHERE 7\n"
10 "typedef unsigned int u32;\n"
11 "#define MAX_NUM_PARTS_IN_BITS 10\n"
12 "///btQuantizedBvhNode is a compressed aabb node, 16 bytes.\n"
13 "///Node can be used for leafnode or internal node. Leafnodes can point to 32-bit triangle index (non-negative range).\n"
17 " unsigned short int m_quantizedAabbMin[3];\n"
18 " unsigned short int m_quantizedAabbMax[3];\n"
20 " int m_escapeIndexOrTriangleIndex;\n"
21 "} btQuantizedBvhNode;\n"
24 " float4 m_aabbMin;\n"
25 " float4 m_aabbMax;\n"
26 " float4 m_quantization;\n"
28 " int m_numSubTrees;\n"
29 " int m_nodeOffset;\n"
30 " int m_subTreeOffset;\n"
32 "int getTriangleIndex(const btQuantizedBvhNode* rootNode)\n"
34 " unsigned int x=0;\n"
35 " unsigned int y = (~(x&0))<<(31-MAX_NUM_PARTS_IN_BITS);\n"
36 " // Get only the lower bits where the triangle index is stored\n"
37 " return (rootNode->m_escapeIndexOrTriangleIndex&~(y));\n"
39 "int isLeaf(const btQuantizedBvhNode* rootNode)\n"
41 " //skipindex is negative (internal node), triangleindex >=0 (leafnode)\n"
42 " return (rootNode->m_escapeIndexOrTriangleIndex >= 0)? 1 : 0;\n"
45 "int getEscapeIndex(const btQuantizedBvhNode* rootNode)\n"
47 " return -rootNode->m_escapeIndexOrTriangleIndex;\n"
52 " unsigned short int m_quantizedAabbMin[3];\n"
53 " unsigned short int m_quantizedAabbMax[3];\n"
54 " //4 bytes, points to the root of the subtree\n"
55 " int m_rootNodeIndex;\n"
57 " int m_subtreeSize;\n"
58 " int m_padding[3];\n"
59 "} btBvhSubtreeInfo;\n"
60 "///keep this in sync with btCollidable.h\n"
63 " int m_numChildShapes;\n"
66 " int m_shapeIndex;\n"
68 "} btCollidableGpu;\n"
71 " float4 m_childPosition;\n"
72 " float4 m_childOrientation;\n"
73 " int m_shapeIndex;\n"
77 "} btGpuChildShape;\n"
84 " u32 m_collidableIdx;\n"
86 " float m_restituitionCoeff;\n"
87 " float m_frictionCoeff;\n"
94 " float m_minElems[4];\n"
95 " int m_minIndices[4];\n"
100 " float m_maxElems[4];\n"
101 " int m_maxIndices[4];\n"
104 "int testQuantizedAabbAgainstQuantizedAabb(\n"
105 " const unsigned short int* aabbMin1,\n"
106 " const unsigned short int* aabbMax1,\n"
107 " const unsigned short int* aabbMin2,\n"
108 " const unsigned short int* aabbMax2)\n"
110 " //int overlap = 1;\n"
111 " if (aabbMin1[0] > aabbMax2[0])\n"
113 " if (aabbMax1[0] < aabbMin2[0])\n"
115 " if (aabbMin1[1] > aabbMax2[1])\n"
117 " if (aabbMax1[1] < aabbMin2[1])\n"
119 " if (aabbMin1[2] > aabbMax2[2])\n"
121 " if (aabbMax1[2] < aabbMin2[2])\n"
124 " //overlap = ((aabbMin1[0] > aabbMax2[0]) || (aabbMax1[0] < aabbMin2[0])) ? 0 : overlap;\n"
125 " //overlap = ((aabbMin1[2] > aabbMax2[2]) || (aabbMax1[2] < aabbMin2[2])) ? 0 : overlap;\n"
126 " //overlap = ((aabbMin1[1] > aabbMax2[1]) || (aabbMax1[1] < aabbMin2[1])) ? 0 : overlap;\n"
127 " //return overlap;\n"
129 "void quantizeWithClamp(unsigned short* out, float4 point2,int isMax, float4 bvhAabbMin, float4 bvhAabbMax, float4 bvhQuantization)\n"
131 " float4 clampedPoint = max(point2,bvhAabbMin);\n"
132 " clampedPoint = min (clampedPoint, bvhAabbMax);\n"
133 " float4 v = (clampedPoint - bvhAabbMin) * bvhQuantization;\n"
136 " out[0] = (unsigned short) (((unsigned short)(v.x+1.f) | 1));\n"
137 " out[1] = (unsigned short) (((unsigned short)(v.y+1.f) | 1));\n"
138 " out[2] = (unsigned short) (((unsigned short)(v.z+1.f) | 1));\n"
141 " out[0] = (unsigned short) (((unsigned short)(v.x) & 0xfffe));\n"
142 " out[1] = (unsigned short) (((unsigned short)(v.y) & 0xfffe));\n"
143 " out[2] = (unsigned short) (((unsigned short)(v.z) & 0xfffe));\n"
146 "// work-in-progress\n"
147 "__kernel void bvhTraversalKernel( __global const int4* pairs, \n"
148 " __global const BodyData* rigidBodies, \n"
149 " __global const btCollidableGpu* collidables,\n"
150 " __global btAabbCL* aabbs,\n"
151 " __global int4* concavePairsOut,\n"
152 " __global volatile int* numConcavePairsOut,\n"
153 " __global const btBvhSubtreeInfo* subtreeHeadersRoot,\n"
154 " __global const btQuantizedBvhNode* quantizedNodesRoot,\n"
155 " __global const b3BvhInfo* bvhInfos,\n"
157 " int maxNumConcavePairsCapacity)\n"
159 " int id = get_global_id(0);\n"
160 " if (id>=numPairs)\n"
163 " int bodyIndexA = pairs[id].x;\n"
164 " int bodyIndexB = pairs[id].y;\n"
165 " int collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx;\n"
166 " int collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx;\n"
168 " //once the broadphase avoids static-static pairs, we can remove this test\n"
169 " if ((rigidBodies[bodyIndexA].m_invMass==0) &&(rigidBodies[bodyIndexB].m_invMass==0))\n"
174 " if (collidables[collidableIndexA].m_shapeType!=SHAPE_CONCAVE_TRIMESH)\n"
176 " int shapeTypeB = collidables[collidableIndexB].m_shapeType;\n"
178 " if (shapeTypeB!=SHAPE_CONVEX_HULL &&\n"
179 " shapeTypeB!=SHAPE_SPHERE &&\n"
180 " shapeTypeB!=SHAPE_COMPOUND_OF_CONVEX_HULLS\n"
183 " b3BvhInfo bvhInfo = bvhInfos[collidables[collidableIndexA].m_numChildShapes];\n"
184 " float4 bvhAabbMin = bvhInfo.m_aabbMin;\n"
185 " float4 bvhAabbMax = bvhInfo.m_aabbMax;\n"
186 " float4 bvhQuantization = bvhInfo.m_quantization;\n"
187 " int numSubtreeHeaders = bvhInfo.m_numSubTrees;\n"
188 " __global const btBvhSubtreeInfo* subtreeHeaders = &subtreeHeadersRoot[bvhInfo.m_subTreeOffset];\n"
189 " __global const btQuantizedBvhNode* quantizedNodes = &quantizedNodesRoot[bvhInfo.m_nodeOffset];\n"
191 " unsigned short int quantizedQueryAabbMin[3];\n"
192 " unsigned short int quantizedQueryAabbMax[3];\n"
193 " quantizeWithClamp(quantizedQueryAabbMin,aabbs[bodyIndexB].m_min,false,bvhAabbMin, bvhAabbMax,bvhQuantization);\n"
194 " quantizeWithClamp(quantizedQueryAabbMax,aabbs[bodyIndexB].m_max,true ,bvhAabbMin, bvhAabbMax,bvhQuantization);\n"
196 " for (int i=0;i<numSubtreeHeaders;i++)\n"
198 " btBvhSubtreeInfo subtree = subtreeHeaders[i];\n"
200 " int overlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,subtree.m_quantizedAabbMin,subtree.m_quantizedAabbMax);\n"
201 " if (overlap != 0)\n"
203 " int startNodeIndex = subtree.m_rootNodeIndex;\n"
204 " int endNodeIndex = subtree.m_rootNodeIndex+subtree.m_subtreeSize;\n"
205 " int curIndex = startNodeIndex;\n"
206 " int escapeIndex;\n"
208 " int aabbOverlap;\n"
209 " while (curIndex < endNodeIndex)\n"
211 " btQuantizedBvhNode rootNode = quantizedNodes[curIndex];\n"
212 " aabbOverlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,rootNode.m_quantizedAabbMin,rootNode.m_quantizedAabbMax);\n"
213 " isLeafNode = isLeaf(&rootNode);\n"
214 " if (aabbOverlap)\n"
218 " int triangleIndex = getTriangleIndex(&rootNode);\n"
219 " if (shapeTypeB==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
221 " int numChildrenB = collidables[collidableIndexB].m_numChildShapes;\n"
222 " int pairIdx = atomic_add(numConcavePairsOut,numChildrenB);\n"
223 " for (int b=0;b<numChildrenB;b++)\n"
225 " if ((pairIdx+b)<maxNumConcavePairsCapacity)\n"
227 " int childShapeIndexB = collidables[collidableIndexB].m_shapeIndex+b;\n"
228 " int4 newPair = (int4)(bodyIndexA,bodyIndexB,triangleIndex,childShapeIndexB);\n"
229 " concavePairsOut[pairIdx+b] = newPair;\n"
234 " int pairIdx = atomic_inc(numConcavePairsOut);\n"
235 " if (pairIdx<maxNumConcavePairsCapacity)\n"
237 " int4 newPair = (int4)(bodyIndexA,bodyIndexB,triangleIndex,0);\n"
238 " concavePairsOut[pairIdx] = newPair;\n"
250 " escapeIndex = getEscapeIndex(&rootNode);\n"
251 " curIndex += escapeIndex;\n"