Add the GPU rigid body pipeline from https://github.com/erwincoumans/experiments as a Bullet 3.x preview for Bullet 2.80
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
MSTRINGIFY(
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int bla;
|
||||
int numElem;
|
||||
} MyAabbConstDataCL ;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
float minfx;
|
||||
float minfy;
|
||||
float minfz;
|
||||
unsigned int index0;
|
||||
float maxfx;
|
||||
float maxfy;
|
||||
float maxfz;
|
||||
unsigned int index1;
|
||||
} btAabbCL;
|
||||
|
||||
|
||||
__kernel void computeAabb( __global btAabbCL* aabbs,__global float4* positions, MyAabbConstDataCL cb)
|
||||
{
|
||||
int nodeID = get_global_id(0);
|
||||
|
||||
if( nodeID < cb.numElem )
|
||||
{
|
||||
aabbs[nodeID].minfx = positions[nodeID].x -1.f;
|
||||
aabbs[nodeID].minfy = positions[nodeID].y -1.f;
|
||||
aabbs[nodeID].minfz = positions[nodeID].z -1.f;
|
||||
aabbs[nodeID].index0 = nodeID;
|
||||
aabbs[nodeID].maxfx = positions[nodeID].x +1.f;
|
||||
aabbs[nodeID].maxfy = positions[nodeID].y +1.f;
|
||||
aabbs[nodeID].maxfz = positions[nodeID].z +1.f;
|
||||
aabbs[nodeID].index1 = nodeID;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
__kernel void countOverlappingpairs( int numObjects,
|
||||
__global int* pPairBuff,
|
||||
__global int2* pPairBuffStartCurr,
|
||||
__global int* pPairScan,
|
||||
__global float4* pAABB )
|
||||
{
|
||||
int index = get_global_id(0);
|
||||
if(index >= numObjects)
|
||||
{
|
||||
return;
|
||||
}
|
||||
float4 bbMin = pAABB[index * 2];
|
||||
int handleIndex = as_int(bbMin.w);
|
||||
int2 start_curr = pPairBuffStartCurr[handleIndex];
|
||||
int start = start_curr.x;
|
||||
int curr = start_curr.y;
|
||||
__global int *pInp = pPairBuff + start;
|
||||
int num_changes = 0;
|
||||
for(int k = 0; k < curr; k++, pInp++)
|
||||
{
|
||||
if(((*pInp) & 0x60000000))//either new or existing pairs (ignore old non-overlapping pairs)
|
||||
{
|
||||
num_changes++;
|
||||
}
|
||||
}
|
||||
pPairScan[index+1] = num_changes;
|
||||
}
|
||||
|
||||
|
||||
__kernel void squeezePairCaches( int numObjects,
|
||||
__global int* pPairBuff,
|
||||
__global int2* pPairBuffStartCurr,
|
||||
__global int* pPairScan,
|
||||
__global int2* pPairOut,
|
||||
__global float4* pAABB )
|
||||
{
|
||||
int index = get_global_id(0);
|
||||
if(index >= numObjects)
|
||||
{
|
||||
return;
|
||||
}
|
||||
float4 bbMin = pAABB[index * 2];
|
||||
int handleIndex = as_int(bbMin.w);
|
||||
int2 start_curr = pPairBuffStartCurr[handleIndex];
|
||||
int start = start_curr.x;
|
||||
int curr = start_curr.y;
|
||||
__global int* pInp = pPairBuff + start;
|
||||
__global int2* pOut = pPairOut + pPairScan[index+1];
|
||||
__global int* pOut2 = pInp;
|
||||
int num = 0;
|
||||
for(int k = 0; k < curr; k++, pInp++)
|
||||
{
|
||||
if(((*pInp) & 0x60000000))
|
||||
{
|
||||
int2 newpair;
|
||||
newpair.x = handleIndex;
|
||||
newpair.y = (*pInp) & (~0x60000000);
|
||||
*pOut = newpair;
|
||||
pOut++;
|
||||
}
|
||||
if((*pInp) & 0x60000000)
|
||||
{
|
||||
*pOut2 = (*pInp) & (~0x60000000);
|
||||
pOut2++;
|
||||
num++;
|
||||
}
|
||||
}
|
||||
int2 newStartCurr;
|
||||
newStartCurr.x = start;
|
||||
newStartCurr.y = num;
|
||||
pPairBuffStartCurr[handleIndex] = newStartCurr;
|
||||
}
|
||||
);
|
||||
Reference in New Issue
Block a user