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,
ConcaveCompoundScene::MyCreateFunc,
// GpuCompoundPlaneScene::MyCreateFunc,
GpuConstraintsDemo::MyCreateFunc,
GpuCompoundPlaneScene::MyCreateFunc,
GpuTetraScene::MyCreateFunc,

View File

@ -680,7 +680,7 @@ b3Vector3 childPositions[3] = {
{
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(b3Vector3(1,0,0),0.7);

View File

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

View File

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

View File

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

View File

@ -11,7 +11,7 @@ public:
virtual ~GpuSphereScene(){}
virtual const char* getName()
{
return "GRBSphere";
return "BoxOnSphere";
}
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, 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
4,1,2,4,2,3,
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[] =
{
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++"
if not _OPTIONS["ios"] then
include "../Demos3/GpuDemos"
include "../Demos3/Wavefront"
include "../btgui/MultiThreading"
if not _OPTIONS["ios"] then
-- include "../demo/gpudemo"
-- include "../btgui/MidiTest"
-- include "../opencl/vector_add_simplified"
@ -126,7 +129,7 @@
include "../src/Bullet3Serialize/Bullet2FileLoader"
include "../src/Bullet3OpenCL"
include "../Demos3/GpuDemos"
-- 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,
b3OpenCLArray<b3Contact4>* contactOut, int& nContacts,
int maxContactCapacity,
int compoundPairCapacity,
const b3OpenCLArray<b3ConvexPolyhedronCL>& convexData,
const b3OpenCLArray<b3Vector3>& gpuVertices,
const b3OpenCLArray<b3Vector3>& gpuUniqueEdges,
@ -1884,7 +1885,7 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( const b3OpenCLArray<b3I
m_numConcavePairsOut.resize(0);
m_numConcavePairsOut.push_back(0);
int compoundPairCapacity=65536*10;
m_gpuCompoundPairs.resize(compoundPairCapacity);
m_gpuCompoundSepNormals.resize(compoundPairCapacity);
@ -1965,7 +1966,7 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( const b3OpenCLArray<b3I
if (numConcavePairs > maxTriConvexPairCapacity)
{
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;
}
@ -2043,7 +2044,10 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( const b3OpenCLArray<b3I
numCompoundPairs = m_numCompoundPairsOut.at(0);
//printf("numCompoundPairs =%d\n",numCompoundPairs );
if (numCompoundPairs > compoundPairCapacity)
{
b3Error("Exceeded compound pair capacity (%d/%d)\n", numCompoundPairs, compoundPairCapacity);
numCompoundPairs = compoundPairCapacity;
}
m_gpuCompoundPairs.resize(numCompoundPairs);
m_gpuHasCompoundSepNormals.resize(numCompoundPairs);
@ -2079,6 +2083,12 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( const b3OpenCLArray<b3I
launcher.launch1D( num);
clFinish(m_queue);
nContacts = m_totalContactsOut.at(0);
if (nContacts>maxContactCapacity)
{
b3Error("Error: contacts exceeds capacity (%d/%d)\n", nContacts, maxContactCapacity);
nContacts = maxContactCapacity;
}
#endif
}
@ -2159,6 +2169,11 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( const b3OpenCLArray<b3I
launcher.launch1D( num);
clFinish(m_queue);
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);
nContacts = m_totalContactsOut.at(0);
if (nContacts>maxContactCapacity)
{
b3Error("Error: contacts exceeds capacity (%d/%d)\n", nContacts, maxContactCapacity);
nContacts = maxContactCapacity;
}
contactOut->resize(nContacts);
}
}

View File

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

View File

@ -7,6 +7,7 @@ struct b3Config
int m_maxConvexShapes;
int m_maxBroadphasePairs;
int m_maxContactCapacity;
int m_compoundPairCapacity;
int m_maxVerticesPerFace;
int m_maxFacesPerShape;
@ -31,6 +32,7 @@ struct b3Config
m_maxConvexShapes = m_maxConvexBodies;
m_maxBroadphasePairs = 16*m_maxConvexBodies;
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,
nContactOut,
m_data->m_config.m_maxContactCapacity,
m_data->m_config.m_compoundPairCapacity,
*m_data->m_convexPolyhedraGPU,
*m_data->m_convexVerticesGPU,
*m_data->m_uniqueEdgesGPU,