Add only small AABBs to PLBVH, add large AABB support.
This commit is contained in:
@@ -76,6 +76,13 @@ static const char* parallelLinearBvhCL= \
|
||||
"{\n"
|
||||
" return interleaveBits(x) << 0 | interleaveBits(y) << 1 | interleaveBits(z) << 2;\n"
|
||||
"}\n"
|
||||
"__kernel void separateAabbs(__global b3AabbCL* unseparatedAabbs, __global int* aabbIndices, __global b3AabbCL* out_aabbs, int numAabbsToSeparate)\n"
|
||||
"{\n"
|
||||
" int separatedAabbIndex = get_global_id(0);\n"
|
||||
" if(separatedAabbIndex >= numAabbsToSeparate) return;\n"
|
||||
" int unseparatedAabbIndex = aabbIndices[separatedAabbIndex];\n"
|
||||
" out_aabbs[separatedAabbIndex] = unseparatedAabbs[unseparatedAabbIndex];\n"
|
||||
"}\n"
|
||||
"//Should replace with an optimized parallel reduction\n"
|
||||
"__kernel void findAllNodesMergedAabb(__global b3AabbCL* out_mergedAabb, int numAabbsNeedingMerge)\n"
|
||||
"{\n"
|
||||
@@ -481,4 +488,54 @@ static const char* parallelLinearBvhCL= \
|
||||
" }\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"__kernel void plbvhLargeAabbAabbTest(__global b3AabbCL* smallAabbs, __global b3AabbCL* largeAabbs, \n"
|
||||
" __global int* out_numPairs, __global int4* out_overlappingPairs, \n"
|
||||
" int maxPairs, int numLargeAabbRigids, int numSmallAabbRigids)\n"
|
||||
"{\n"
|
||||
" int smallAabbIndex = get_global_id(0);\n"
|
||||
" if(smallAabbIndex >= numSmallAabbRigids) return;\n"
|
||||
" \n"
|
||||
" b3AabbCL smallAabb = smallAabbs[smallAabbIndex];\n"
|
||||
" for(int i = 0; i < numLargeAabbRigids; ++i)\n"
|
||||
" {\n"
|
||||
" b3AabbCL largeAabb = largeAabbs[i];\n"
|
||||
" if( TestAabbAgainstAabb2(&smallAabb, &largeAabb) )\n"
|
||||
" {\n"
|
||||
" int4 pair;\n"
|
||||
" pair.x = smallAabb.m_minIndices[3];\n"
|
||||
" pair.y = largeAabb.m_minIndices[3];\n"
|
||||
" pair.z = NEW_PAIR_MARKER;\n"
|
||||
" pair.w = NEW_PAIR_MARKER;\n"
|
||||
" \n"
|
||||
" int pairIndex = atomic_inc(out_numPairs);\n"
|
||||
" if(pairIndex < maxPairs) out_overlappingPairs[pairIndex] = pair;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
"__kernel void plbvhLargeAabbRayTest(__global b3AabbCL* largeRigidAabbs, __global b3RayInfo* rays,\n"
|
||||
" __global int* out_numRayRigidPairs, __global int2* out_rayRigidPairs,\n"
|
||||
" int numLargeAabbRigids, int maxRayRigidPairs, int numRays)\n"
|
||||
"{\n"
|
||||
" int rayIndex = get_global_id(0);\n"
|
||||
" if(rayIndex >= numRays) return;\n"
|
||||
" \n"
|
||||
" b3Vector3 rayFrom = rays[rayIndex].m_from;\n"
|
||||
" b3Vector3 rayTo = rays[rayIndex].m_to;\n"
|
||||
" b3Vector3 rayNormalizedDirection = b3Vector3_normalize(rayTo - rayFrom);\n"
|
||||
" b3Scalar rayLength = b3Sqrt( b3Vector3_length2(rayTo - rayFrom) );\n"
|
||||
" \n"
|
||||
" for(int i = 0; i < numLargeAabbRigids; ++i)\n"
|
||||
" {\n"
|
||||
" b3AabbCL rigidAabb = largeRigidAabbs[i];\n"
|
||||
" if( rayIntersectsAabb(rayFrom, rayLength, rayNormalizedDirection, rigidAabb) )\n"
|
||||
" {\n"
|
||||
" int2 rayRigidPair;\n"
|
||||
" rayRigidPair.x = rayIndex;\n"
|
||||
" rayRigidPair.y = rigidAabb.m_minIndices[3];\n"
|
||||
" \n"
|
||||
" int pairIndex = atomic_inc(out_numRayRigidPairs);\n"
|
||||
" if(pairIndex < maxRayRigidPairs) out_rayRigidPairs[pairIndex] = rayRigidPair;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
"}\n"
|
||||
;
|
||||
|
||||
Reference in New Issue
Block a user