From 9a92eecf10db2305d6e8a96c1124718e20f3baab Mon Sep 17 00:00:00 2001 From: erwincoumans Date: Mon, 17 Jun 2013 17:05:01 -0700 Subject: [PATCH] allow larger amount of rigid bodies, dynamically increase b3Config limits avoid crashes in instancing renderer if instance maximum is exceeded. --- Demos3/BasicGpuDemo/BasicGpuDemo.cpp | 10 ++--- Demos3/GpuDemos/main_opengl3core.cpp | 4 +- .../GpuDemos/rigidbody/GpuRigidBodyDemo.cpp | 21 +++++++++- btgui/OpenGLWindow/GLInstancingRenderer.cpp | 42 +++++++++++-------- btgui/OpenGLWindow/GLInstancingRenderer.h | 4 ++ .../RigidBody/b3GpuRigidBodyPipeline.cpp | 1 + 6 files changed, 57 insertions(+), 25 deletions(-) diff --git a/Demos3/BasicGpuDemo/BasicGpuDemo.cpp b/Demos3/BasicGpuDemo/BasicGpuDemo.cpp index 1d8f8fc43..881dae722 100644 --- a/Demos3/BasicGpuDemo/BasicGpuDemo.cpp +++ b/Demos3/BasicGpuDemo/BasicGpuDemo.cpp @@ -15,9 +15,9 @@ subject to the following restrictions: ///create 125 (5x5x5) dynamic object -#define ARRAY_SIZE_X 1//25 -#define ARRAY_SIZE_Y 20//20 -#define ARRAY_SIZE_Z 1//25 +#define ARRAY_SIZE_X 25 +#define ARRAY_SIZE_Y 20 +#define ARRAY_SIZE_Z 25 //maximum number of objects (and allow user to shoot additional boxes) #define MAX_PROXIES (ARRAY_SIZE_X*ARRAY_SIZE_Y*ARRAY_SIZE_Z + 1024) @@ -284,9 +284,9 @@ void BasicGpuDemo::initPhysics() //create a few dynamic rigidbodies // Re-using the same collision is better for memory usage and performance - //btBoxShape* colShape = new btBoxShape(btVector3(SCALING*1,SCALING*1,SCALING*1)); + btBoxShape* colShape = new btBoxShape(btVector3(SCALING*1,SCALING*1,SCALING*1)); - btCollisionShape* colShape = new btSphereShape(btScalar(SCALING*1.f)); + //btCollisionShape* colShape = new btSphereShape(btScalar(SCALING*1.f)); m_collisionShapes.push_back(colShape); /// Create Dynamic Objects diff --git a/Demos3/GpuDemos/main_opengl3core.cpp b/Demos3/GpuDemos/main_opengl3core.cpp index c1a3a8ba3..c6745cbe4 100644 --- a/Demos3/GpuDemos/main_opengl3core.cpp +++ b/Demos3/GpuDemos/main_opengl3core.cpp @@ -606,8 +606,10 @@ int main(int argc, char* argv[]) // demo->myinit(); bool useGpu = false; - + int maxObjectCapacity=128*1024; + maxObjectCapacity = b3Max(maxObjectCapacity,ci.arraySizeX*ci.arraySizeX*ci.arraySizeX+10); + ci.m_instancingRenderer = new GLInstancingRenderer(maxObjectCapacity);//render.getInstancingRenderer(); ci.m_window = window; diff --git a/Demos3/GpuDemos/rigidbody/GpuRigidBodyDemo.cpp b/Demos3/GpuDemos/rigidbody/GpuRigidBodyDemo.cpp index e66b96358..3f8cc9a63 100644 --- a/Demos3/GpuDemos/rigidbody/GpuRigidBodyDemo.cpp +++ b/Demos3/GpuDemos/rigidbody/GpuRigidBodyDemo.cpp @@ -108,6 +108,12 @@ void GpuRigidBodyDemo::initPhysics(const ConstructionInfo& ci) m_data->m_copyTransformsToVBOKernel = b3OpenCLUtils::compileCLKernelFromString(m_clData->m_clContext,m_clData->m_clDevice,s_rigidBodyKernelString,"copyTransformsToVBOKernel",&errNum,rbProg); b3Config config; + config.m_maxConvexBodies = b3Max(config.m_maxConvexBodies,ci.arraySizeX*ci.arraySizeY*ci.arraySizeZ+10); + config.m_maxConvexShapes = config.m_maxConvexBodies; + config.m_maxBroadphasePairs = 8*config.m_maxConvexBodies; + config.m_maxContactCapacity = config.m_maxBroadphasePairs; + + b3GpuNarrowPhase* np = new b3GpuNarrowPhase(m_clData->m_clContext,m_clData->m_clDevice,m_clData->m_clQueue,config); b3GpuSapBroadphase* bp = new b3GpuSapBroadphase(m_clData->m_clContext,m_clData->m_clDevice,m_clData->m_clQueue); m_data->m_np = np; @@ -157,7 +163,18 @@ void GpuRigidBodyDemo::clientMoveAndDisplay() { bool animate=true; int numObjects= m_data->m_rigidBodyPipeline->getNumBodies(); -//m_instancingRenderer->getInternalData()->m_totalNumInstances; + if (numObjects > m_instancingRenderer->getInstanceCapacity()) + { + static bool once = true; + if (once) + { + once=false; + b3Assert(0); + b3Error("m_instancingRenderer out-of-memory\n"); + } + numObjects = m_instancingRenderer->getInstanceCapacity(); + } + b3Vector4* positions = 0; if (animate && numObjects) { @@ -205,7 +222,9 @@ void GpuRigidBodyDemo::clientMoveAndDisplay() GLint err = glGetError(); assert(err==GL_NO_ERROR); GLuint vbo = m_instancingRenderer->getInternalData()->m_vbo; + int arraySizeInBytes = numObjects * (3)*sizeof(b3Vector4); + glBindBuffer(GL_ARRAY_BUFFER, vbo); cl_bool blocking= CL_TRUE; positions= (b3Vector4*)glMapBufferRange( GL_ARRAY_BUFFER,m_instancingRenderer->getMaxShapeCapacity(),arraySizeInBytes, GL_MAP_WRITE_BIT );//GL_READ_WRITE);//GL_WRITE_ONLY diff --git a/btgui/OpenGLWindow/GLInstancingRenderer.cpp b/btgui/OpenGLWindow/GLInstancingRenderer.cpp index eb715b880..26b670c1b 100644 --- a/btgui/OpenGLWindow/GLInstancingRenderer.cpp +++ b/btgui/OpenGLWindow/GLInstancingRenderer.cpp @@ -669,28 +669,34 @@ int GLInstancingRenderer::registerGraphicsInstance(int shapeIndex, const float* int index = gfxObj->m_numGraphicsInstances + gfxObj->m_instanceOffset; + int maxElements = m_data->m_instance_positions_ptr.size(); + if (index*4m_instance_positions_ptr[index*4]=position[0]; + m_data->m_instance_positions_ptr[index*4+1]=position[1]; + m_data->m_instance_positions_ptr[index*4+2]=position[2]; + m_data->m_instance_positions_ptr[index*4+3]=1; + m_data->m_instance_quaternion_ptr[index*4]=quaternion[0]; + m_data->m_instance_quaternion_ptr[index*4+1]=quaternion[1]; + m_data->m_instance_quaternion_ptr[index*4+2]=quaternion[2]; + m_data->m_instance_quaternion_ptr[index*4+3]=quaternion[3]; - m_data->m_instance_positions_ptr[index*4]=position[0]; - m_data->m_instance_positions_ptr[index*4+1]=position[1]; - m_data->m_instance_positions_ptr[index*4+2]=position[2]; - m_data->m_instance_positions_ptr[index*4+3]=1; + m_data->m_instance_colors_ptr[index*4]=color[0]; + m_data->m_instance_colors_ptr[index*4+1]=color[1]; + m_data->m_instance_colors_ptr[index*4+2]=color[2]; + m_data->m_instance_colors_ptr[index*4+3]=color[3]; - m_data->m_instance_quaternion_ptr[index*4]=quaternion[0]; - m_data->m_instance_quaternion_ptr[index*4+1]=quaternion[1]; - m_data->m_instance_quaternion_ptr[index*4+2]=quaternion[2]; - m_data->m_instance_quaternion_ptr[index*4+3]=quaternion[3]; + m_data->m_instance_scale_ptr[index*3] = scaling[0]; + m_data->m_instance_scale_ptr[index*3+1] = scaling[1]; + m_data->m_instance_scale_ptr[index*3+2] = scaling[2]; - m_data->m_instance_colors_ptr[index*4]=color[0]; - m_data->m_instance_colors_ptr[index*4+1]=color[1]; - m_data->m_instance_colors_ptr[index*4+2]=color[2]; - m_data->m_instance_colors_ptr[index*4+3]=color[3]; - - m_data->m_instance_scale_ptr[index*3] = scaling[0]; - m_data->m_instance_scale_ptr[index*3+1] = scaling[1]; - m_data->m_instance_scale_ptr[index*3+2] = scaling[2]; - - gfxObj->m_numGraphicsInstances++; + gfxObj->m_numGraphicsInstances++; + } else + { + b3Error("registerGraphicsInstance out of range, %d\n", maxElements); + return -1; + } return gfxObj->m_numGraphicsInstances; } diff --git a/btgui/OpenGLWindow/GLInstancingRenderer.h b/btgui/OpenGLWindow/GLInstancingRenderer.h index ba75d0e6a..199585d53 100644 --- a/btgui/OpenGLWindow/GLInstancingRenderer.h +++ b/btgui/OpenGLWindow/GLInstancingRenderer.h @@ -105,6 +105,10 @@ public: { return m_maxShapeCapacityInBytes; } + int getInstanceCapacity() const + { + return m_maxNumObjectCapacity; + } }; #endif //GL_INSTANCING_RENDERER_H diff --git a/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp b/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp index 296881e6f..29f4358ab 100644 --- a/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp +++ b/src/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp @@ -40,6 +40,7 @@ bool dumpContactStats = false; b3GpuRigidBodyPipeline::b3GpuRigidBodyPipeline(cl_context ctx,cl_device_id device, cl_command_queue q,class b3GpuNarrowPhase* narrowphase, class b3GpuSapBroadphase* broadphaseSap , struct b3DynamicBvhBroadphase* broadphaseDbvt, const b3Config& config) { m_data = new b3GpuRigidBodyPipelineInternalData; + m_data->m_config = config; m_data->m_context = ctx; m_data->m_device = device; m_data->m_queue = q;