report when compound pair capacity is exceeded (and avoid crash)

add tetrahedron, reorganized demos
This commit is contained in:
erwincoumans
2013-07-30 17:00:50 -07:00
parent 2793a174c6
commit 1c0fc6bc2d
14 changed files with 69 additions and 23 deletions

View File

@@ -106,16 +106,12 @@ GpuDemo::CreateFunc* allDemos[]=
ConcaveScene::MyCreateFunc,
ConcaveSphereScene::MyCreateFunc, ConcaveSphereScene::MyCreateFunc,
ConcaveCompoundScene::MyCreateFunc, ConcaveCompoundScene::MyCreateFunc,
// GpuCompoundPlaneScene::MyCreateFunc, GpuCompoundPlaneScene::MyCreateFunc,
GpuConstraintsDemo::MyCreateFunc,
GpuTetraScene::MyCreateFunc, GpuTetraScene::MyCreateFunc,

View File

@@ -680,7 +680,7 @@ b3Vector3 childPositions[3] = {
{ {
float mass = 1;//j==0? 0.f : 1.f; float mass = 1;//j==0? 0.f : 1.f;
b3Vector3 position(i*ci.gapX,50+j*ci.gapY,k*ci.gapZ); b3Vector3 position((-ci.arraySizeX/2+i)*ci.gapX,50+j*ci.gapY,(-ci.arraySizeZ/2+k)*ci.gapZ);
//b3Quaternion orn(0,0,0,1); //b3Quaternion orn(0,0,0,1);
b3Quaternion orn(b3Vector3(1,0,0),0.7); b3Quaternion orn(b3Vector3(1,0,0),0.7);

View File

@@ -12,7 +12,7 @@ public:
virtual ~ConcaveScene(){} virtual ~ConcaveScene(){}
virtual const char* getName() virtual const char* getName()
{ {
return "GRBConcave"; return "BoxTrimesh";
} }
static GpuDemo* MyCreateFunc() static GpuDemo* MyCreateFunc()
@@ -38,7 +38,7 @@ public:
virtual ~ConcaveSphereScene(){} virtual ~ConcaveSphereScene(){}
virtual const char* getName() virtual const char* getName()
{ {
return "ConcaveSphere"; return "SphereTrimesh";
} }
static GpuDemo* MyCreateFunc() static GpuDemo* MyCreateFunc()
@@ -62,7 +62,7 @@ public:
virtual ~ConcaveCompoundScene(){} virtual ~ConcaveCompoundScene(){}
virtual const char* getName() virtual const char* getName()
{ {
return "GRBConcaveCompound"; return "CompoundConcave";
} }
static GpuDemo* MyCreateFunc() static GpuDemo* MyCreateFunc()

View File

@@ -11,7 +11,7 @@ public:
virtual ~GpuCompoundScene(){} virtual ~GpuCompoundScene(){}
virtual const char* getName() virtual const char* getName()
{ {
return "GpuCompound"; return "CompoundOnSphere";
} }
static GpuDemo* MyCreateFunc() static GpuDemo* MyCreateFunc()
@@ -35,7 +35,7 @@ public:
virtual ~GpuCompoundPlaneScene(){} virtual ~GpuCompoundPlaneScene(){}
virtual const char* getName() virtual const char* getName()
{ {
return "GpuCompoundPlane"; return "CompoundOnPlane";
} }
static GpuDemo* MyCreateFunc() static GpuDemo* MyCreateFunc()

View File

@@ -20,7 +20,7 @@ public:
virtual ~GpuConvexScene(){} virtual ~GpuConvexScene(){}
virtual const char* getName() virtual const char* getName()
{ {
return "GRBConvex"; return "Tetrahedra";
} }
static GpuDemo* MyCreateFunc() static GpuDemo* MyCreateFunc()
@@ -50,7 +50,7 @@ public:
virtual ~GpuConvexPlaneScene(){} virtual ~GpuConvexPlaneScene(){}
virtual const char* getName() virtual const char* getName()
{ {
return "GRBConvexPlane"; return "ConvexOnPlane";
} }
static GpuDemo* MyCreateFunc() static GpuDemo* MyCreateFunc()
@@ -72,7 +72,7 @@ public:
virtual ~GpuBoxPlaneScene(){} virtual ~GpuBoxPlaneScene(){}
virtual const char* getName() virtual const char* getName()
{ {
return "GRBBoxPlane"; return "BoxPlane";
} }
static GpuDemo* MyCreateFunc() static GpuDemo* MyCreateFunc()
@@ -97,7 +97,7 @@ void createFromTetGenData(const char* ele,
public: public:
virtual const char* getName() virtual const char* getName()
{ {
return "GpuTetraScene"; return "TetraBreakable";
} }
static GpuDemo* MyCreateFunc() static GpuDemo* MyCreateFunc()

View File

@@ -11,7 +11,7 @@ public:
virtual ~GpuSphereScene(){} virtual ~GpuSphereScene(){}
virtual const char* getName() virtual const char* getName()
{ {
return "GRBSphere"; return "BoxOnSphere";
} }
static GpuDemo* MyCreateFunc() static GpuDemo* MyCreateFunc()

View File

@@ -263,7 +263,7 @@ static const int quad_indices[]=
static const float tetra_vertices[] = static const float pyramid_vertices[] =
{ {
-1.f, 0, -1.f, 0.5f, 0, 1,0, 0,0, -1.f, 0, -1.f, 0.5f, 0, 1,0, 0,0,
-1.f, 0, 1.f, 0.5f, 0, 1,0, 1,0, -1.f, 0, 1.f, 0.5f, 0, 1,0, 1,0,
@@ -275,13 +275,35 @@ static const float tetra_vertices[] =
static const int tetra_indices[]= static const int pyramid_indices[]=
{ {
0,1,2,0,2,3,//ground face 0,1,2,0,2,3,//ground face
4,1,2,4,2,3, 4,1,2,4,2,3,
4,3,0,4,0,1 4,3,0,4,0,1
}; };
static const float tetra_vertices[] =
{
1.f, 1.f, 1.f, 0.5f, 0, 1,0, 0,0,
1.f, -1.f, -1.f, 0.5f, 0, 1,0, 1,0,
-1.f, 1.f, -1.f, 0.5f, 0, 1,0, 1,1,
-1.f, -1, 1.f, 0.5f, 0, 1,0, 0,1
};
static const int tetra_indices[]=
{
0,1,2,//ground face
3,1,2,
3,0,1,
3,2,0
};
static const float detailed_sphere_vertices[] = static const float detailed_sphere_vertices[] =
{ {
0.000000,-0.183479,-0.983024,0.000000,0.000000,-0.183479,-0.983024,0.500000,0.408260, 0.000000,-0.183479,-0.983024,0.000000,0.000000,-0.183479,-0.983024,0.500000,0.408260,

View File

@@ -99,10 +99,13 @@
language "C++" language "C++"
if not _OPTIONS["ios"] then
include "../Demos3/GpuDemos"
include "../Demos3/Wavefront" include "../Demos3/Wavefront"
include "../btgui/MultiThreading" include "../btgui/MultiThreading"
if not _OPTIONS["ios"] then
-- include "../demo/gpudemo" -- include "../demo/gpudemo"
-- include "../btgui/MidiTest" -- include "../btgui/MidiTest"
-- include "../opencl/vector_add_simplified" -- include "../opencl/vector_add_simplified"
@@ -126,7 +129,7 @@
include "../src/Bullet3Serialize/Bullet2FileLoader" include "../src/Bullet3Serialize/Bullet2FileLoader"
include "../src/Bullet3OpenCL" include "../src/Bullet3OpenCL"
include "../Demos3/GpuDemos"
-- include "../demo/gpu_initialize" -- include "../demo/gpu_initialize"

Binary file not shown.

Binary file not shown.

View File

@@ -1685,6 +1685,7 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( const b3OpenCLArray<b3I
const b3OpenCLArray<b3RigidBodyCL>* bodyBuf, const b3OpenCLArray<b3RigidBodyCL>* bodyBuf,
b3OpenCLArray<b3Contact4>* contactOut, int& nContacts, b3OpenCLArray<b3Contact4>* contactOut, int& nContacts,
int maxContactCapacity, int maxContactCapacity,
int compoundPairCapacity,
const b3OpenCLArray<b3ConvexPolyhedronCL>& convexData, const b3OpenCLArray<b3ConvexPolyhedronCL>& convexData,
const b3OpenCLArray<b3Vector3>& gpuVertices, const b3OpenCLArray<b3Vector3>& gpuVertices,
const b3OpenCLArray<b3Vector3>& gpuUniqueEdges, const b3OpenCLArray<b3Vector3>& gpuUniqueEdges,
@@ -1884,7 +1885,7 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( const b3OpenCLArray<b3I
m_numConcavePairsOut.resize(0); m_numConcavePairsOut.resize(0);
m_numConcavePairsOut.push_back(0); m_numConcavePairsOut.push_back(0);
int compoundPairCapacity=65536*10;
m_gpuCompoundPairs.resize(compoundPairCapacity); m_gpuCompoundPairs.resize(compoundPairCapacity);
m_gpuCompoundSepNormals.resize(compoundPairCapacity); m_gpuCompoundSepNormals.resize(compoundPairCapacity);
@@ -1965,7 +1966,7 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( const b3OpenCLArray<b3I
if (numConcavePairs > maxTriConvexPairCapacity) if (numConcavePairs > maxTriConvexPairCapacity)
{ {
static int exceeded_maxTriConvexPairCapacity_count = 0; static int exceeded_maxTriConvexPairCapacity_count = 0;
printf("Rxceeded %d times the maxTriConvexPairCapacity (found %d but max is %d)\n", exceeded_maxTriConvexPairCapacity_count++, b3Error("Rxceeded %d times the maxTriConvexPairCapacity (found %d but max is %d)\n", exceeded_maxTriConvexPairCapacity_count++,
numConcavePairs,maxTriConvexPairCapacity); numConcavePairs,maxTriConvexPairCapacity);
numConcavePairs = maxTriConvexPairCapacity; numConcavePairs = maxTriConvexPairCapacity;
} }
@@ -2043,7 +2044,10 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( const b3OpenCLArray<b3I
numCompoundPairs = m_numCompoundPairsOut.at(0); numCompoundPairs = m_numCompoundPairsOut.at(0);
//printf("numCompoundPairs =%d\n",numCompoundPairs ); //printf("numCompoundPairs =%d\n",numCompoundPairs );
if (numCompoundPairs > compoundPairCapacity) if (numCompoundPairs > compoundPairCapacity)
{
b3Error("Exceeded compound pair capacity (%d/%d)\n", numCompoundPairs, compoundPairCapacity);
numCompoundPairs = compoundPairCapacity; numCompoundPairs = compoundPairCapacity;
}
m_gpuCompoundPairs.resize(numCompoundPairs); m_gpuCompoundPairs.resize(numCompoundPairs);
m_gpuHasCompoundSepNormals.resize(numCompoundPairs); m_gpuHasCompoundSepNormals.resize(numCompoundPairs);
@@ -2079,6 +2083,12 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( const b3OpenCLArray<b3I
launcher.launch1D( num); launcher.launch1D( num);
clFinish(m_queue); clFinish(m_queue);
nContacts = m_totalContactsOut.at(0); nContacts = m_totalContactsOut.at(0);
if (nContacts>maxContactCapacity)
{
b3Error("Error: contacts exceeds capacity (%d/%d)\n", nContacts, maxContactCapacity);
nContacts = maxContactCapacity;
}
#endif #endif
} }
@@ -2159,6 +2169,11 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( const b3OpenCLArray<b3I
launcher.launch1D( num); launcher.launch1D( num);
clFinish(m_queue); clFinish(m_queue);
nContacts = m_totalContactsOut.at(0); nContacts = m_totalContactsOut.at(0);
if (nContacts >= maxContactCapacity)
{
b3Error("Error: contacts exceeds capacity (%d/%d)\n", nContacts, maxContactCapacity);
nContacts = maxContactCapacity;
}
} }
} }
@@ -2424,6 +2439,12 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( const b3OpenCLArray<b3I
clFinish(m_queue); clFinish(m_queue);
nContacts = m_totalContactsOut.at(0); nContacts = m_totalContactsOut.at(0);
if (nContacts>maxContactCapacity)
{
b3Error("Error: contacts exceeds capacity (%d/%d)\n", nContacts, maxContactCapacity);
nContacts = maxContactCapacity;
}
contactOut->resize(nContacts); contactOut->resize(nContacts);
} }
} }

View File

@@ -79,6 +79,7 @@ struct GpuSatCollision
const b3OpenCLArray<b3RigidBodyCL>* bodyBuf, const b3OpenCLArray<b3RigidBodyCL>* bodyBuf,
b3OpenCLArray<b3Contact4>* contactOut, int& nContacts, b3OpenCLArray<b3Contact4>* contactOut, int& nContacts,
int maxContactCapacity, int maxContactCapacity,
int compoundPairCapacity,
const b3OpenCLArray<b3ConvexPolyhedronCL>& hostConvexData, const b3OpenCLArray<b3ConvexPolyhedronCL>& hostConvexData,
const b3OpenCLArray<b3Vector3>& vertices, const b3OpenCLArray<b3Vector3>& vertices,
const b3OpenCLArray<b3Vector3>& uniqueEdges, const b3OpenCLArray<b3Vector3>& uniqueEdges,

View File

@@ -7,6 +7,7 @@ struct b3Config
int m_maxConvexShapes; int m_maxConvexShapes;
int m_maxBroadphasePairs; int m_maxBroadphasePairs;
int m_maxContactCapacity; int m_maxContactCapacity;
int m_compoundPairCapacity;
int m_maxVerticesPerFace; int m_maxVerticesPerFace;
int m_maxFacesPerShape; int m_maxFacesPerShape;
@@ -31,6 +32,7 @@ struct b3Config
m_maxConvexShapes = m_maxConvexBodies; m_maxConvexShapes = m_maxConvexBodies;
m_maxBroadphasePairs = 16*m_maxConvexBodies; m_maxBroadphasePairs = 16*m_maxConvexBodies;
m_maxContactCapacity = m_maxBroadphasePairs; m_maxContactCapacity = m_maxBroadphasePairs;
m_compoundPairCapacity = 1524*1024;
} }
}; };

View File

@@ -738,6 +738,7 @@ void b3GpuNarrowPhase::computeContacts(cl_mem broadphasePairs, int numBroadphase
m_data->m_pBufContactOutGPU, m_data->m_pBufContactOutGPU,
nContactOut, nContactOut,
m_data->m_config.m_maxContactCapacity, m_data->m_config.m_maxContactCapacity,
m_data->m_config.m_compoundPairCapacity,
*m_data->m_convexPolyhedraGPU, *m_data->m_convexPolyhedraGPU,
*m_data->m_convexVerticesGPU, *m_data->m_convexVerticesGPU,
*m_data->m_uniqueEdgesGPU, *m_data->m_uniqueEdgesGPU,