diff --git a/demo/gpudemo/GpuDemo.h b/demo/gpudemo/GpuDemo.h index 019177c4d..d33556e98 100644 --- a/demo/gpudemo/GpuDemo.h +++ b/demo/gpudemo/GpuDemo.h @@ -38,9 +38,9 @@ public: :useOpenCL(true), preferredOpenCLPlatformIndex(-1), preferredOpenCLDeviceIndex(-1), - arraySizeX(1), - arraySizeY(1), - arraySizeZ(1), + arraySizeX(10), + arraySizeY(31), + arraySizeZ(10), m_useConcaveMesh(false), gapX(14.3), gapY(14.0), diff --git a/demo/gpudemo/rigidbody/GpuConvexScene.cpp b/demo/gpudemo/rigidbody/GpuConvexScene.cpp index 5c0f0afb7..85894a794 100644 --- a/demo/gpudemo/rigidbody/GpuConvexScene.cpp +++ b/demo/gpudemo/rigidbody/GpuConvexScene.cpp @@ -59,7 +59,8 @@ void GpuConvexScene::setupScene(const ConstructionInfo& ci) { float mass = 1.f; - btVector3 position((j&1)+i*2.2,2+j*2.,(j&1)+k*2.2); + btVector3 position((j&1)+i*2.2,1+j*2.,(j&1)+k*2.2); + //btVector3 position(i*2.2,1+j*2.,k*2.2); btQuaternion orn(0,0,0,1); @@ -125,7 +126,7 @@ void GpuConvexPlaneScene::createStaticEnvironment(const ConstructionInfo& ci) btQuaternion orn(0,0,0,1); // btQuaternion orn(btVector3(1,0,0),0.3); btVector4 color(0,0,1,1); - btVector4 scaling(100,0.0001,100,1); + btVector4 scaling(100,0.1,100,1); int strideInBytes = 9*sizeof(float); int numVertices = sizeof(cube_vertices)/strideInBytes; int numIndices = sizeof(cube_indices)/sizeof(int); diff --git a/opencl/gpu_rigidbody/host/btGpuBatchingPgsSolver.cpp b/opencl/gpu_rigidbody/host/btGpuBatchingPgsSolver.cpp index eef0b1706..d971f55cf 100644 --- a/opencl/gpu_rigidbody/host/btGpuBatchingPgsSolver.cpp +++ b/opencl/gpu_rigidbody/host/btGpuBatchingPgsSolver.cpp @@ -672,10 +672,11 @@ void btGpuBatchingPgsSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem if (1) { - BT_PROFILE("GPU solveContactConstraint"); m_data->m_solverGPU->m_nIterations = 4;//10 if (gpuSolveConstraint) { + BT_PROFILE("GPU solveContactConstraint"); + m_data->m_solverGPU->solveContactConstraint( m_data->m_bodyBufferGPU, m_data->m_inertiaBufferGPU, @@ -685,6 +686,8 @@ void btGpuBatchingPgsSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem } else { + BT_PROFILE("Host solveContactConstraint"); + m_data->m_solverGPU->solveContactConstraintHost(m_data->m_bodyBufferGPU, m_data->m_inertiaBufferGPU, m_data->m_contactCGPU,0, nContactOut ,maxNumBatches); } diff --git a/opencl/gpu_sat/host/ConvexHullContact.cpp b/opencl/gpu_sat/host/ConvexHullContact.cpp index 0e1da0936..a80af7663 100644 --- a/opencl/gpu_sat/host/ConvexHullContact.cpp +++ b/opencl/gpu_sat/host/ConvexHullContact.cpp @@ -131,7 +131,7 @@ m_totalContactsOut(m_context, m_queue) { const char* primitiveContactsSrc = primitiveContactsKernelsCL; - cl_program primitiveContactsProg = btOpenCLUtils::compileCLProgramFromString(m_context,m_device,primitiveContactsSrc,&errNum,"","opencl/gpu_sat/kernels/primitiveContacts.cl"); + cl_program primitiveContactsProg = btOpenCLUtils::compileCLProgramFromString(m_context,m_device,primitiveContactsSrc,&errNum,"","opencl/gpu_sat/kernels/primitiveContacts.cl",true); btAssert(errNum==CL_SUCCESS); m_primitiveContactsKernel = btOpenCLUtils::compileCLKernelFromString(m_context, m_device,primitiveContactsSrc, "primitiveContactsKernel",&errNum,primitiveContactsProg,""); @@ -291,6 +291,102 @@ inline bool IsPointInPolygon(const float4& p, return true; } +#define normalize3(a) (a.normalize()) + + +int extractManifoldSequentialGlobal( const float4* p, int nPoints, const float4& nearNormal, btInt4* contactIdx) +{ + if( nPoints == 0 ) + return 0; + + if (nPoints <=4) + return nPoints; + + + if (nPoints >64) + nPoints = 64; + + float4 center = make_float4(0,0,0,0); + { + + for (int i=0;im_numVertices;i++) { btVector3 vtx = convexVertices[hullB->m_vertexOffset+i]; float curDot = vtx.dot(planeNormalInConvex); + + if (curDot>maxDot) { hitVertex=i; maxDot=curDot; hitVtx = vtx; + //make sure the deepest points is always included + if (numPoints==MAX_PLANE_CONVEX_POINTS) + numPoints--; } + + if (numPoints4) + { + numReducedPoints = extractManifoldSequentialGlobal( contactPoints, numPoints, planeNormalInConvex, &contactIdx); + } int dstIdx; // dstIdx = nGlobalContactsOut++;//AppendInc( nGlobalContactsOut, dstIdx ); - if (nGlobalContactsOut < maxContactCapacity) + if (numReducedPoints>0) { - dstIdx=nGlobalContactsOut; - nGlobalContactsOut++; - - btContact4* c = &globalContactsOut[dstIdx]; - c->m_worldNormal = -planeNormalInConvex; - c->setFrictionCoeff(0.7); - c->setRestituitionCoeff(0.f); - - c->m_batchIdx = pairIndex; - c->m_bodyAPtrAndSignBit = rigidBodies[bodyIndexA].m_invMass==0?-bodyIndexA:bodyIndexA; - c->m_bodyBPtrAndSignBit = rigidBodies[bodyIndexB].m_invMass==0?-bodyIndexB:bodyIndexB; - btVector3 pOnB1 = hitVtxWorld; - pOnB1[3] = -0.01f; - c->m_worldPos[0] = pOnB1; - int numPoints = 1; - c->m_worldNormal[3] = numPoints; - }//if (dstIdx < numPairs) - - /* - - int closestFaceB=-1; - float dmax = -FLT_MAX; - - { - for(int face=0;facem_numFaces;face++) + if (nGlobalContactsOut < maxContactCapacity) { - const float4 Normal = make_float4(faces[hullB->m_faceOffset+face].m_plane.x, - faces[hullB->m_faceOffset+face].m_plane.y, faces[hullB->m_faceOffset+face].m_plane.z,0.f); - const float4 WorldNormal = quatRotate(ornB, Normal); - float d = dot3F4(WorldNormal,separatingNormal); - if (d > dmax) + dstIdx=nGlobalContactsOut; + nGlobalContactsOut++; + + btContact4* c = &globalContactsOut[dstIdx]; + c->m_worldNormal = planeNormalWorld; + c->setFrictionCoeff(0.7); + c->setRestituitionCoeff(0.f); + + c->m_batchIdx = pairIndex; + c->m_bodyAPtrAndSignBit = rigidBodies[bodyIndexA].m_invMass==0?-bodyIndexA:bodyIndexA; + c->m_bodyBPtrAndSignBit = rigidBodies[bodyIndexB].m_invMass==0?-bodyIndexB:bodyIndexB; + for (int i=0;im_worldPos[i] = pOnB1; } - } - } - - { - const btGpuFace polyB = faces[hullB->m_faceOffset+closestFaceB]; - const int numVertices = polyB.m_numIndices; - for(int e0=0;e0m_vertexOffset+indices[polyB.m_indexOffset+e0]]; - worldVertsB1[pairIndex*capacityWorldVerts+numWorldVertsB1++] = transform(b,posB,ornB); - } - } + c->m_worldNormal[3] = numReducedPoints; + }//if (dstIdx < numPairs) + } + - */ - - - - printf("computeContactPlaneConvex\n"); +// printf("computeContactPlaneConvex\n"); } void computeContactSphereConvex(int pairIndex, @@ -597,7 +703,7 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( const btOpenCLArray hostAabbs; clAabbsWS.copyToHost(hostAabbs); @@ -666,7 +772,7 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( const btOpenCLArraym_numVertices;i++) + { + float4 vtx = convexVertices[hullB->m_vertexOffset+i]; + float curDot = dot(vtx,planeNormalInConvex); + + + if (curDot>maxDot) + { + hitVertex=i; + maxDot=curDot; + hitVtx = vtx; + //make sure the deepest points is always included + if (numPoints==MAX_PLANE_CONVEX_POINTS) + numPoints--; + } + + if (numPoints4) + //{ +// numReducedPoints = extractManifoldSequentialGlobal( contactPoints, numPoints, planeNormalInConvex, &contactIdx); + //} + + if (numReducedPoints>0) + { + int dstIdx; + AppendInc( nGlobalContactsOut, dstIdx ); + + if (dstIdx < maxContactCapacity) + { + __global Contact4* c = &globalContactsOut[dstIdx]; + c->m_worldNormal = planeNormalWorld; + //c->setFrictionCoeff(0.7); + //c->setRestituitionCoeff(0.f); + c->m_coeffs = (u32)(0.f*0xffff) | ((u32)(0.7f*0xffff)<<16); + c->m_batchIdx = pairIndex; + c->m_bodyAPtrAndSignBit = rigidBodies[bodyIndexA].m_invMass==0?-bodyIndexA:bodyIndexA; + c->m_bodyBPtrAndSignBit = rigidBodies[bodyIndexB].m_invMass==0?-bodyIndexB:bodyIndexB; + + switch (numReducedPoints) + { + case 4: + c->m_worldPos[3] = contactPoints[contactIdx.w]; + case 3: + c->m_worldPos[2] = contactPoints[contactIdx.z]; + case 2: + c->m_worldPos[1] = contactPoints[contactIdx.y]; + case 1: + c->m_worldPos[0] = contactPoints[contactIdx.x]; + default: + { + } + }; + + GET_NPOINTS(*c) = numReducedPoints; + }//if (dstIdx < numPairs) + } +} + + +void computeContactPlaneSphere(int pairIndex, int bodyIndexA, int bodyIndexB, int collidableIndexA, int collidableIndexB, __global const BodyData* rigidBodies, @@ -557,8 +698,6 @@ void computeContactPlaneConvex(int pairIndex, } - - __kernel void primitiveContactsKernel( __global const int2* pairs, __global const BodyData* rigidBodies, __global const btCollidableGpu* collidables, @@ -594,27 +733,51 @@ __kernel void primitiveContactsKernel( __global const int2* pairs, int collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx; int collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx; + if (collidables[collidableIndexA].m_shapeType == SHAPE_PLANE && + collidables[collidableIndexB].m_shapeType == SHAPE_CONVEX_HULL) + { + computeContactPlaneConvex(pairIndex, bodyIndexA, bodyIndexB, collidableIndexA, collidableIndexB, + rigidBodies,collidables,convexShapes,vertices,indices, + faces, globalContactsOut, nGlobalContactsOut,maxContactCapacity); + return; + } - if (collidables[collidableIndexA].m_shapeType == SHAPE_SPHERE && + + if (collidables[collidableIndexA].m_shapeType == SHAPE_CONVEX_HULL && collidables[collidableIndexB].m_shapeType == SHAPE_PLANE) { computeContactPlaneConvex( pairIndex, bodyIndexB,bodyIndexA, collidableIndexB,collidableIndexA, - rigidBodies,collidables,faces, globalContactsOut, nGlobalContactsOut,maxContactCapacity); + rigidBodies,collidables,convexShapes,vertices,indices, + faces, globalContactsOut, nGlobalContactsOut,maxContactCapacity); + return; } if (collidables[collidableIndexA].m_shapeType == SHAPE_PLANE && collidables[collidableIndexB].m_shapeType == SHAPE_SPHERE) { - - - computeContactPlaneConvex(pairIndex, bodyIndexA, bodyIndexB, collidableIndexA, collidableIndexB, - rigidBodies,collidables,faces, globalContactsOut, nGlobalContactsOut,maxContactCapacity); + computeContactPlaneSphere(pairIndex, bodyIndexA, bodyIndexB, collidableIndexA, collidableIndexB, + rigidBodies,collidables,faces, globalContactsOut, nGlobalContactsOut,maxContactCapacity); return; - } + + + if (collidables[collidableIndexA].m_shapeType == SHAPE_SPHERE && + collidables[collidableIndexB].m_shapeType == SHAPE_PLANE) + { + + + computeContactPlaneSphere( pairIndex, bodyIndexB,bodyIndexA, collidableIndexB,collidableIndexA, + rigidBodies,collidables, + faces, globalContactsOut, nGlobalContactsOut,maxContactCapacity); + + return; + } + + + if (collidables[collidableIndexA].m_shapeType == SHAPE_SPHERE && collidables[collidableIndexB].m_shapeType == SHAPE_CONVEX_HULL) @@ -649,6 +812,7 @@ __kernel void primitiveContactsKernel( __global const int2* pairs, + if (collidables[collidableIndexA].m_shapeType == SHAPE_SPHERE &&