From c8fcf779bbbe7aeb75696dc58728e9b453e2642b Mon Sep 17 00:00:00 2001 From: erwin coumans Date: Fri, 5 Apr 2013 18:29:58 -0700 Subject: [PATCH] add support for compound hulls against concave triangle mesh --- demo/gpudemo/GpuDemo.h | 6 +- demo/gpudemo/main_opengl3core.cpp | 6 +- demo/gpudemo/rigidbody/ConcaveScene.cpp | 129 +++++++++++++++++- demo/gpudemo/rigidbody/ConcaveScene.h | 25 ++++ opencl/gpu_rigidbody/host/btConfig.h | 2 +- opencl/gpu_sat/host/ConvexHullContact.cpp | 17 ++- opencl/gpu_sat/kernels/bvhTraversal.cl | 29 +++- opencl/gpu_sat/kernels/bvhTraversal.h | 29 +++- opencl/gpu_sat/kernels/sat.cl | 75 ++++++---- opencl/gpu_sat/kernels/satClipHullContacts.cl | 25 +++- opencl/gpu_sat/kernels/satClipHullContacts.h | 25 +++- opencl/gpu_sat/kernels/satKernels.h | 75 ++++++---- 12 files changed, 361 insertions(+), 82 deletions(-) diff --git a/demo/gpudemo/GpuDemo.h b/demo/gpudemo/GpuDemo.h index 77af3c89d..c62028709 100644 --- a/demo/gpudemo/GpuDemo.h +++ b/demo/gpudemo/GpuDemo.h @@ -38,9 +38,9 @@ public: :useOpenCL(true), preferredOpenCLPlatformIndex(-1), preferredOpenCLDeviceIndex(-1), - arraySizeX(41), - arraySizeY(41), - arraySizeZ(41), + arraySizeX(11), + arraySizeY(11), + arraySizeZ(11), m_useConcaveMesh(false), gapX(14.3), gapY(14.0), diff --git a/demo/gpudemo/main_opengl3core.cpp b/demo/gpudemo/main_opengl3core.cpp index 08c5fadd3..6f6e70834 100644 --- a/demo/gpudemo/main_opengl3core.cpp +++ b/demo/gpudemo/main_opengl3core.cpp @@ -65,14 +65,16 @@ btAlignedObjectArray demoNames; int selectedDemo = 0; GpuDemo::CreateFunc* allDemos[]= { + ConcaveCompoundScene::MyCreateFunc, + ConcaveSphereScene::MyCreateFunc, + + ConcaveScene::MyCreateFunc, GpuSphereScene::MyCreateFunc, GpuConvexScene::MyCreateFunc, - ConcaveScene::MyCreateFunc, - ConcaveCompoundScene::MyCreateFunc, GpuCompoundScene::MyCreateFunc, PairBench::MyCreateFunc, diff --git a/demo/gpudemo/rigidbody/ConcaveScene.cpp b/demo/gpudemo/rigidbody/ConcaveScene.cpp index 17962a411..7e1f03bac 100644 --- a/demo/gpudemo/rigidbody/ConcaveScene.cpp +++ b/demo/gpudemo/rigidbody/ConcaveScene.cpp @@ -17,7 +17,7 @@ #include "gpu_rigidbody/host/btConfig.h" #include "GpuRigidBodyDemoInternalData.h" #include"../../ObjLoader/objLoader.h" - +#include "BulletCommon/btTransform.h" #include "OpenGLWindow/GLInstanceGraphicsShape.h" #define CONCAVE_GAPX 16 @@ -328,6 +328,133 @@ void ConcaveCompoundScene::setupScene(const ConstructionInfo& ci) } void ConcaveCompoundScene::createDynamicObjects(const ConstructionInfo& ci) +{ + + int strideInBytes = 9*sizeof(float); + int numVertices = sizeof(cube_vertices)/strideInBytes; + int numIndices = sizeof(cube_indices)/sizeof(int); + + btAlignedObjectArray vertexArray; + btAlignedObjectArray indexArray; + + + //int shapeId = ci.m_instancingRenderer->registerShape(&cube_vertices[0],numVertices,cube_indices,numIndices); + int group=1; + int mask=1; + int index=0; + float scaling[4] = {1,1,1,1}; + int colIndex = 0; + + GLInstanceVertex* cubeVerts = (GLInstanceVertex*)&cube_vertices[0]; + int stride2 = sizeof(GLInstanceVertex); + btAssert(stride2 == strideInBytes); + + { + int childColIndex = m_data->m_np->registerConvexHullShape(&cube_vertices[0],strideInBytes,numVertices, scaling); + + + btVector3 childPositions[3] = { + btVector3(0,-2,0), + btVector3(0,0,0), + btVector3(0,2,0) + }; + + + btAlignedObjectArray childShapes; + int numChildShapes = 3; + for (int i=0;im_np->registerCompoundShape(&childShapes); + + } + + //int shapeId = ci.m_instancingRenderer->registerShape(&cube_vertices[0],numVertices,cube_indices,numIndices); + int shapeId = ci.m_instancingRenderer->registerShape(&vertexArray[0].xyzw[0],vertexArray.size(),&indexArray[0],indexArray.size()); + + btVector4 colors[4] = + { + btVector4(1,0,0,1), + btVector4(0,1,0,1), + btVector4(0,0,1,1), + btVector4(0,1,1,1), + }; + + int curColor = 0; + for (int i=0;iregisterGraphicsInstance(shapeId,position,orn,color,scaling); + int pid = m_data->m_rigidBodyPipeline->registerPhysicsInstance(mass,position,orn,colIndex,index); + + index++; + } + } + } +} + + +void ConcaveSphereScene::setupScene(const ConstructionInfo& ci) +{ + ConcaveScene::setupScene(ci); + + float camPos[4]={0,50,0,0};//65.5,4.5,65.5,0}; + //float camPos[4]={1,12.5,1.5,0}; + m_instancingRenderer->setCameraPitch(45); + m_instancingRenderer->setCameraTargetPosition(camPos); + m_instancingRenderer->setCameraDistance(40); + + +} + +void ConcaveSphereScene::createDynamicObjects(const ConstructionInfo& ci) { btVector4 colors[4] = { diff --git a/demo/gpudemo/rigidbody/ConcaveScene.h b/demo/gpudemo/rigidbody/ConcaveScene.h index 1fab1f74f..617cb5538 100644 --- a/demo/gpudemo/rigidbody/ConcaveScene.h +++ b/demo/gpudemo/rigidbody/ConcaveScene.h @@ -29,6 +29,31 @@ public: }; + +class ConcaveSphereScene : public ConcaveScene +{ +public: + + ConcaveSphereScene(){} + virtual ~ConcaveSphereScene(){} + virtual const char* getName() + { + return "ConcaveSphere"; + } + + static GpuDemo* MyCreateFunc() + { + GpuDemo* demo = new ConcaveSphereScene; + return demo; + } + + virtual void setupScene(const ConstructionInfo& ci); + + virtual void createDynamicObjects(const ConstructionInfo& ci); + +}; + + class ConcaveCompoundScene : public ConcaveScene { public: diff --git a/opencl/gpu_rigidbody/host/btConfig.h b/opencl/gpu_rigidbody/host/btConfig.h index 25ca1ad89..77ddec96b 100644 --- a/opencl/gpu_rigidbody/host/btConfig.h +++ b/opencl/gpu_rigidbody/host/btConfig.h @@ -19,7 +19,7 @@ struct btConfig int m_maxTriConvexPairCapacity; btConfig() - :m_maxConvexBodies(128*1024), + :m_maxConvexBodies(32*1024), m_maxConvexShapes(8192), m_maxVerticesPerFace(64), m_maxFacesPerShape(64), diff --git a/opencl/gpu_sat/host/ConvexHullContact.cpp b/opencl/gpu_sat/host/ConvexHullContact.cpp index 679b118f8..ca5d55610 100644 --- a/opencl/gpu_sat/host/ConvexHullContact.cpp +++ b/opencl/gpu_sat/host/ConvexHullContact.cpp @@ -58,7 +58,7 @@ m_totalContactsOut(m_context, m_queue) if (1) { const char* src = satKernelsCL; - cl_program satProg = btOpenCLUtils::compileCLProgramFromString(m_context,m_device,src,&errNum,"","opencl/gpu_sat/kernels/sat.cl"); + cl_program satProg = btOpenCLUtils::compileCLProgramFromString(m_context,m_device,src,&errNum,"","opencl/gpu_sat/kernels/sat.cl",true); btAssert(errNum==CL_SUCCESS); m_findSeparatingAxisKernel = btOpenCLUtils::compileCLKernelFromString(m_context, m_device,src, "findSeparatingAxisKernel",&errNum,satProg ); @@ -80,7 +80,7 @@ m_totalContactsOut(m_context, m_queue) if (1) { const char* srcClip = satClipKernelsCL; - cl_program satClipContactsProg = btOpenCLUtils::compileCLProgramFromString(m_context,m_device,srcClip,&errNum,"","opencl/gpu_sat/kernels/satClipHullContacts.cl"); + cl_program satClipContactsProg = btOpenCLUtils::compileCLProgramFromString(m_context,m_device,srcClip,&errNum,"","opencl/gpu_sat/kernels/satClipHullContacts.cl",true); btAssert(errNum==CL_SUCCESS); m_clipHullHullKernel = btOpenCLUtils::compileCLKernelFromString(m_context, m_device,srcClip, "clipHullHullKernel",&errNum,satClipContactsProg); @@ -120,7 +120,7 @@ m_totalContactsOut(m_context, m_queue) if (1) { const char* srcBvh = bvhTraversalKernelCL; - cl_program bvhTraversalProg = btOpenCLUtils::compileCLProgramFromString(m_context,m_device,srcBvh,&errNum,"","opencl/gpu_sat/kernels/bvhTraversal.cl"); + cl_program bvhTraversalProg = btOpenCLUtils::compileCLProgramFromString(m_context,m_device,srcBvh,&errNum,"","opencl/gpu_sat/kernels/bvhTraversal.cl",true); //cl_program bvhTraversalProg = btOpenCLUtils::compileCLProgramFromString(m_context,m_device,0,&errNum,"","opencl/gpu_sat/kernels/bvhTraversal.cl", true); btAssert(errNum==CL_SUCCESS); @@ -706,9 +706,8 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( const btOpenCLArraygetBufferCL()), btBufferInfoCL( m_totalContactsOut.getBufferCL()) @@ -918,6 +924,7 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( const btOpenCLArray