b3Solver -> pass pointer to source instead of 0 (was left over from a debugging session), thanks to David for the report
Break up clipHullHullConcaveConvexKernel into multiple stages, so it might 'fit' in Apple's OpenCL implementation Implemented bvhTraversalKernel and findConcaveSeparatingAxis on CPU (debugging, possible future CPU version)
This commit is contained in:
@@ -154,6 +154,7 @@ static const char* satKernelsCL= \
|
||||
"#ifdef __cplusplus\n"
|
||||
"#else\n"
|
||||
"#define b3AtomicInc atomic_inc\n"
|
||||
"#define b3AtomicAdd atomic_add\n"
|
||||
"#define b3Fabs fabs\n"
|
||||
"#define b3Sqrt native_sqrt\n"
|
||||
"#define b3Sin native_sin\n"
|
||||
@@ -177,6 +178,9 @@ static const char* satKernelsCL= \
|
||||
" float4 b1 = b3MakeFloat4(v1.xyz,0.f);\n"
|
||||
" return cross(a1, b1);\n"
|
||||
" }\n"
|
||||
" #define b3MinFloat4 min\n"
|
||||
" #define b3MaxFloat4 max\n"
|
||||
" #define b3Normalized(a) normalize(a)\n"
|
||||
"#endif \n"
|
||||
" \n"
|
||||
"inline bool b3IsAlmostZero(b3Float4ConstArg v)\n"
|
||||
@@ -633,7 +637,7 @@ static const char* satKernelsCL= \
|
||||
" float4* sep,\n"
|
||||
" float* dmin)\n"
|
||||
"{\n"
|
||||
" int i = get_global_id(0);\n"
|
||||
" \n"
|
||||
" float4 posA = posA1;\n"
|
||||
" posA.w = 0.f;\n"
|
||||
" float4 posB = posB1;\n"
|
||||
@@ -682,7 +686,6 @@ static const char* satKernelsCL= \
|
||||
" float4* sep,\n"
|
||||
" float* dmin)\n"
|
||||
"{\n"
|
||||
" int i = get_global_id(0);\n"
|
||||
" float4 posA = posA1;\n"
|
||||
" posA.w = 0.f;\n"
|
||||
" float4 posB = posB1;\n"
|
||||
@@ -731,7 +734,6 @@ static const char* satKernelsCL= \
|
||||
" float4* sep,\n"
|
||||
" float* dmin)\n"
|
||||
"{\n"
|
||||
" int i = get_global_id(0);\n"
|
||||
" float4 posA = posA1;\n"
|
||||
" posA.w = 0.f;\n"
|
||||
" float4 posB = posB1;\n"
|
||||
@@ -815,7 +817,7 @@ static const char* satKernelsCL= \
|
||||
" float4* sep,\n"
|
||||
" float* dmin)\n"
|
||||
"{\n"
|
||||
" int i = get_global_id(0);\n"
|
||||
" \n"
|
||||
" float4 posA = posA1;\n"
|
||||
" posA.w = 0.f;\n"
|
||||
" float4 posB = posB1;\n"
|
||||
@@ -866,7 +868,7 @@ static const char* satKernelsCL= \
|
||||
" float4* sep,\n"
|
||||
" float* dmin)\n"
|
||||
"{\n"
|
||||
" int i = get_global_id(0);\n"
|
||||
" \n"
|
||||
" float4 posA = posA1;\n"
|
||||
" posA.w = 0.f;\n"
|
||||
" float4 posB = posB1;\n"
|
||||
@@ -1470,6 +1472,92 @@ static const char* satKernelsCL= \
|
||||
" \n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"int findClippingFaces(const float4 separatingNormal,\n"
|
||||
" const ConvexPolyhedronCL* hullA, \n"
|
||||
" __global const ConvexPolyhedronCL* hullB,\n"
|
||||
" const float4 posA, const Quaternion ornA,const float4 posB, const Quaternion ornB,\n"
|
||||
" __global float4* worldVertsA1,\n"
|
||||
" __global float4* worldNormalsA1,\n"
|
||||
" __global float4* worldVertsB1,\n"
|
||||
" int capacityWorldVerts,\n"
|
||||
" const float minDist, float maxDist,\n"
|
||||
" const float4* verticesA,\n"
|
||||
" const btGpuFace* facesA,\n"
|
||||
" const int* indicesA,\n"
|
||||
" __global const float4* verticesB,\n"
|
||||
" __global const btGpuFace* facesB,\n"
|
||||
" __global const int* indicesB,\n"
|
||||
" __global int4* clippingFaces, int pairIndex)\n"
|
||||
"{\n"
|
||||
" int numContactsOut = 0;\n"
|
||||
" int numWorldVertsB1= 0;\n"
|
||||
" \n"
|
||||
" \n"
|
||||
" int closestFaceB=-1;\n"
|
||||
" float dmax = -FLT_MAX;\n"
|
||||
" \n"
|
||||
" {\n"
|
||||
" for(int face=0;face<hullB->m_numFaces;face++)\n"
|
||||
" {\n"
|
||||
" const float4 Normal = make_float4(facesB[hullB->m_faceOffset+face].m_plane.x,\n"
|
||||
" facesB[hullB->m_faceOffset+face].m_plane.y, facesB[hullB->m_faceOffset+face].m_plane.z,0.f);\n"
|
||||
" const float4 WorldNormal = qtRotate(ornB, Normal);\n"
|
||||
" float d = dot3F4(WorldNormal,separatingNormal);\n"
|
||||
" if (d > dmax)\n"
|
||||
" {\n"
|
||||
" dmax = d;\n"
|
||||
" closestFaceB = face;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
" \n"
|
||||
" {\n"
|
||||
" const btGpuFace polyB = facesB[hullB->m_faceOffset+closestFaceB];\n"
|
||||
" const int numVertices = polyB.m_numIndices;\n"
|
||||
" for(int e0=0;e0<numVertices;e0++)\n"
|
||||
" {\n"
|
||||
" const float4 b = verticesB[hullB->m_vertexOffset+indicesB[polyB.m_indexOffset+e0]];\n"
|
||||
" worldVertsB1[pairIndex*capacityWorldVerts+numWorldVertsB1++] = transform(&b,&posB,&ornB);\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
" \n"
|
||||
" int closestFaceA=-1;\n"
|
||||
" {\n"
|
||||
" float dmin = FLT_MAX;\n"
|
||||
" for(int face=0;face<hullA->m_numFaces;face++)\n"
|
||||
" {\n"
|
||||
" const float4 Normal = make_float4(\n"
|
||||
" facesA[hullA->m_faceOffset+face].m_plane.x,\n"
|
||||
" facesA[hullA->m_faceOffset+face].m_plane.y,\n"
|
||||
" facesA[hullA->m_faceOffset+face].m_plane.z,\n"
|
||||
" 0.f);\n"
|
||||
" const float4 faceANormalWS = qtRotate(ornA,Normal);\n"
|
||||
" \n"
|
||||
" float d = dot3F4(faceANormalWS,separatingNormal);\n"
|
||||
" if (d < dmin)\n"
|
||||
" {\n"
|
||||
" dmin = d;\n"
|
||||
" closestFaceA = face;\n"
|
||||
" worldNormalsA1[pairIndex] = faceANormalWS;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
" \n"
|
||||
" int numVerticesA = facesA[hullA->m_faceOffset+closestFaceA].m_numIndices;\n"
|
||||
" for(int e0=0;e0<numVerticesA;e0++)\n"
|
||||
" {\n"
|
||||
" const float4 a = verticesA[hullA->m_vertexOffset+indicesA[facesA[hullA->m_faceOffset+closestFaceA].m_indexOffset+e0]];\n"
|
||||
" worldVertsA1[pairIndex*capacityWorldVerts+e0] = transform(&a, &posA,&ornA);\n"
|
||||
" }\n"
|
||||
" \n"
|
||||
" clippingFaces[pairIndex].x = closestFaceA;\n"
|
||||
" clippingFaces[pairIndex].y = closestFaceB;\n"
|
||||
" clippingFaces[pairIndex].z = numVerticesA;\n"
|
||||
" clippingFaces[pairIndex].w = numWorldVertsB1;\n"
|
||||
" \n"
|
||||
" \n"
|
||||
" return numContactsOut;\n"
|
||||
"}\n"
|
||||
"// work-in-progress\n"
|
||||
"__kernel void findConcaveSeparatingAxisKernel( __global int4* concavePairs,\n"
|
||||
" __global const BodyData* rigidBodies,\n"
|
||||
@@ -1482,12 +1570,19 @@ static const char* satKernelsCL= \
|
||||
" __global const btGpuChildShape* gpuChildShapes,\n"
|
||||
" __global btAabbCL* aabbs,\n"
|
||||
" __global float4* concaveSeparatingNormalsOut,\n"
|
||||
" __global int* concaveHasSeparatingNormals,\n"
|
||||
" __global int4* clippingFacesOut,\n"
|
||||
" __global float4* worldVertsA1GPU,\n"
|
||||
" __global float4* worldNormalsAGPU,\n"
|
||||
" __global float4* worldVertsB1GPU,\n"
|
||||
" int vertexFaceCapacity,\n"
|
||||
" int numConcavePairs\n"
|
||||
" )\n"
|
||||
"{\n"
|
||||
" int i = get_global_id(0);\n"
|
||||
" if (i>=numConcavePairs)\n"
|
||||
" return;\n"
|
||||
" concaveHasSeparatingNormals[i] = 0;\n"
|
||||
" int pairIdx = i;\n"
|
||||
" int bodyIndexA = concavePairs[i].x;\n"
|
||||
" int bodyIndexB = concavePairs[i].y;\n"
|
||||
@@ -1691,6 +1786,27 @@ static const char* satKernelsCL= \
|
||||
" {\n"
|
||||
" sepAxis.w = dmin;\n"
|
||||
" concaveSeparatingNormalsOut[pairIdx]=sepAxis;\n"
|
||||
" concaveHasSeparatingNormals[i]=1;\n"
|
||||
" float minDist = -1e30f;\n"
|
||||
" float maxDist = 0.02f;\n"
|
||||
" \n"
|
||||
" findClippingFaces(sepAxis,\n"
|
||||
" &convexPolyhedronA,\n"
|
||||
" &convexShapes[shapeIndexB],\n"
|
||||
" posA,ornA,\n"
|
||||
" posB,ornB,\n"
|
||||
" worldVertsA1GPU,\n"
|
||||
" worldNormalsAGPU,\n"
|
||||
" worldVertsB1GPU,\n"
|
||||
" vertexFaceCapacity,\n"
|
||||
" minDist, maxDist,\n"
|
||||
" verticesA,\n"
|
||||
" facesA,\n"
|
||||
" indicesA,\n"
|
||||
" vertices,\n"
|
||||
" faces,\n"
|
||||
" indices,\n"
|
||||
" clippingFacesOut, pairIdx);\n"
|
||||
" } else\n"
|
||||
" { \n"
|
||||
" //mark this pair as in-active\n"
|
||||
|
||||
Reference in New Issue
Block a user