contact normal should point from B to A (to be consistent with Bullet 2.x)

stringify: pre-allocate bigger buffer (10MB, workaround)
This commit is contained in:
erwincoumans
2013-08-10 12:08:15 -07:00
parent d158507c03
commit ac23dbc4be
17 changed files with 220 additions and 209 deletions

View File

@@ -194,12 +194,13 @@ void b3ContactCache::removeContactPoint(struct b3Contact4Data& newContactCache,i
{
b3Swap(newContactCache.m_localPosA[i],newContactCache.m_localPosA[numContacts-1]);
b3Swap(newContactCache.m_localPosB[i],newContactCache.m_localPosB[numContacts-1]);
b3Swap(newContactCache.m_worldPos[i],newContactCache.m_worldPos[numContacts-1]);
b3Swap(newContactCache.m_worldPosB[i],newContactCache.m_worldPosB[numContacts-1]);
}
b3Contact4Data_setNumPoints(&newContactCache,numContacts-1);
}
void b3ContactCache::refreshContactPoints(const b3Transform& trA,const b3Transform& trB, struct b3Contact4Data& contacts)
{
@@ -212,9 +213,9 @@ void b3ContactCache::refreshContactPoints(const b3Transform& trA,const b3Transfo
{
b3Vector3 worldPosA = trA( contacts.m_localPosA[i]);
b3Vector3 worldPosB = trB( contacts.m_localPosB[i]);
contacts.m_worldPos[i] = worldPosB;
float distance = (worldPosA - worldPosB).dot(contacts.m_worldNormal);
contacts.m_worldPos[i].w = distance;
contacts.m_worldPosB[i] = worldPosB;
float distance = (worldPosA - worldPosB).dot(contacts.m_worldNormalOnB);
contacts.m_worldPosB[i].w = distance;
}
/// then
@@ -224,7 +225,7 @@ void b3ContactCache::refreshContactPoints(const b3Transform& trA,const b3Transfo
{
b3Vector3 worldPosA = trA( contacts.m_localPosA[i]);
b3Vector3 worldPosB = trB( contacts.m_localPosB[i]);
b3Vector3&pt = contacts.m_worldPos[i];
b3Vector3&pt = contacts.m_worldPosB[i];
//contact becomes invalid when signed distance exceeds margin (projected on contactnormal direction)
if (!validContactDistance(pt))
{
@@ -232,8 +233,8 @@ void b3ContactCache::refreshContactPoints(const b3Transform& trA,const b3Transfo
} else
{
//contact also becomes invalid when relative movement orthogonal to normal exceeds margin
projectedPoint = contacts.m_worldPos[i] - contacts.m_worldNormal * contacts.m_worldPos[i].w;
projectedDifference = contacts.m_worldPos[i] - projectedPoint;
projectedPoint = worldPosA - contacts.m_worldNormalOnB * contacts.m_worldPosB[i].w;
projectedDifference = contacts.m_worldPosB[i] - projectedPoint;
distance2d = projectedDifference.dot(projectedDifference);
if (distance2d > gContactBreakingThreshold*gContactBreakingThreshold )
{

View File

@@ -530,7 +530,7 @@ void computeContactPlaneConvex(int pairIndex,
nGlobalContactsOut++;
b3Contact4* c = &globalContactsOut[dstIdx];
c->m_worldNormal = planeNormalWorld;
c->m_worldNormalOnB = -planeNormalWorld;
c->setFrictionCoeff(0.7);
c->setRestituitionCoeff(0.f);
@@ -540,9 +540,9 @@ void computeContactPlaneConvex(int pairIndex,
for (int i=0;i<numReducedPoints;i++)
{
b3Vector3 pOnB1 = contactPoints[contactIdx.s[i]];
c->m_worldPos[i] = pOnB1;
c->m_worldPosB[i] = pOnB1;
}
c->m_worldNormal[3] = (b3Scalar)numReducedPoints;
c->m_worldNormalOnB[3] = (b3Scalar)numReducedPoints;
}//if (dstIdx < numPairs)
}
@@ -668,7 +668,7 @@ void computeContactPlaneCompound(int pairIndex,
nGlobalContactsOut++;
b3Contact4* c = &globalContactsOut[dstIdx];
c->m_worldNormal = planeNormalWorld;
c->m_worldNormalOnB = -planeNormalWorld;
c->setFrictionCoeff(0.7);
c->setRestituitionCoeff(0.f);
@@ -678,9 +678,9 @@ void computeContactPlaneCompound(int pairIndex,
for (int i=0;i<numReducedPoints;i++)
{
b3Vector3 pOnB1 = contactPoints[contactIdx.s[i]];
c->m_worldPos[i] = pOnB1;
c->m_worldPosB[i] = pOnB1;
}
c->m_worldNormal[3] = (b3Scalar)numReducedPoints;
c->m_worldNormalOnB[3] = (b3Scalar)numReducedPoints;
}//if (dstIdx < numPairs)
}
@@ -811,7 +811,7 @@ void computeContactSphereConvex(int pairIndex,
if (bCollide && minDist > -10000)
{
float4 normalOnSurfaceB1 = tr.getBasis()*-localHitNormal;//-hitNormalWorld;
float4 normalOnSurfaceB1 = tr.getBasis()*localHitNormal;//-hitNormalWorld;
float4 pOnB1 = tr(closestPnt);
//printf("dist ,%f,",minDist);
float actualDepth = minDist-radius;
@@ -831,16 +831,16 @@ void computeContactSphereConvex(int pairIndex,
nGlobalContactsOut++;
b3Contact4* c = &globalContactsOut[dstIdx];
c->m_worldNormal = normalOnSurfaceB1;
c->m_worldNormalOnB = normalOnSurfaceB1;
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;
c->m_worldPos[0] = pOnB1;
c->m_worldPosB[0] = pOnB1;
int numPoints = 1;
c->m_worldNormal[3] = (b3Scalar)numPoints;
c->m_worldNormalOnB[3] = (b3Scalar)numPoints;
}//if (dstIdx < numPairs)
}
}//if (hasCollision)
@@ -1520,7 +1520,7 @@ int clipHullHullSingle(
{
B3_PROFILE("overlap");
float4 normalOnSurfaceB = -(float4&)hostNormal;
float4 normalOnSurfaceB = (float4&)hostNormal;
float4 centerOut;
b3Int4 contactIdx;
@@ -1553,11 +1553,11 @@ int clipHullHullSingle(
float distance = 0.f;
for (int p=0;p<numPoints;p++)
{
contact.m_worldPos[p] = contactsOut[contactIdx.s[p]];
contact.m_worldNormal = normalOnSurfaceB;
contact.m_worldPosB[p] = contactsOut[contactIdx.s[p]];//check if it is actually on B
contact.m_worldNormalOnB = normalOnSurfaceB;
}
//printf("bodyIndexA %d,bodyIndexB %d,normal=%f,%f,%f numPoints %d\n",bodyIndexA,bodyIndexB,normalOnSurfaceB.x,normalOnSurfaceB.y,normalOnSurfaceB.z,numPoints);
contact.m_worldNormal.w = (b3Scalar)numPoints;
contact.m_worldNormalOnB.w = (b3Scalar)numPoints;
nContacts++;
} else
{
@@ -1638,7 +1638,7 @@ int computeContactConvexConvex( b3AlignedObjectArray<b3Int4>& pairs,
int numPoints = 0;
if (0)//pairs[pairIndex].z>=0)
if (pairs[pairIndex].z>=0)
{
//printf("add existing points?\n");
//refresh
@@ -1647,7 +1647,9 @@ int computeContactConvexConvex( b3AlignedObjectArray<b3Int4>& pairs,
if (numOldPoints)
{
newContact = oldContacts[pairs[pairIndex].z];
//b3ContactCache::refreshContactPoints(transA,transB,newContact);
#ifdef CHECK_ON_HOST
b3ContactCache::refreshContactPoints(transA,transB,newContact);
#endif //CHECK_ON_HOST
}
numPoints = b3Contact4Data_getNumPoints(&newContact);
@@ -1666,20 +1668,28 @@ int computeContactConvexConvex( b3AlignedObjectArray<b3Int4>& pairs,
*/
int p=numPoints;
if (numPoints<3)
if (numPoints<4)
{
numPoints++;
} else
{
p=3;
}
{
resultPointOnBWorld.w = distance2;
newContact.m_worldPos[p] = resultPointOnBWorld;
newContact.m_worldPosB[p] = resultPointOnBWorld;
b3Vector3 resultPointOnAWorld = resultPointOnBWorld+distance2*sepAxis2;
//newContact.m_localPosA[p] = transA.inverse()*resultPointOnAWorld;
// newContact.m_localPosB[p] = transB.inverse()*resultPointOnBWorld;
newContact.m_worldNormal = sepAxis2;
#ifdef CHECK_ON_HOST
newContact.m_localPosA[p] = transA.inverse()*resultPointOnAWorld;
newContact.m_localPosB[p] = transB.inverse()*resultPointOnBWorld;
#endif
newContact.m_worldNormalOnB = sepAxis2;
}
//printf("bodyIndexA %d,bodyIndexB %d,normal=%f,%f,%f numPoints %d\n",bodyIndexA,bodyIndexB,normalOnSurfaceB.x,normalOnSurfaceB.y,normalOnSurfaceB.z,numPoints);
newContact.m_worldNormal.w = (b3Scalar)numPoints;
newContact.m_worldNormalOnB.w = (b3Scalar)numPoints;
nGlobalContactsOut++;
} else
{
@@ -1937,11 +1947,11 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
hostCollidables[collidableIndexB].m_shapeType == SHAPE_CONVEX_HULL)
{
//printf("hostPairs[i].z=%d\n",hostPairs[i].z);
int contactIndex = computeContactConvexConvex2(i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,hostBodyBuf,
hostCollidables,hostConvexData,hostVertices,hostUniqueEdges,hostIndices,hostFaces,hostContacts,nContacts,maxContactCapacity,oldHostContacts);
//int contactIndex = computeContactConvexConvex(hostPairs,i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,hostBodyBuf,
// hostCollidables,hostConvexData,hostVertices,hostUniqueEdges,hostIndices,hostFaces,hostContacts,nContacts,maxContactCapacity,
// oldHostContacts);
//int contactIndex = computeContactConvexConvex2(i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,hostBodyBuf,
// hostCollidables,hostConvexData,hostVertices,hostUniqueEdges,hostIndices,hostFaces,hostContacts,nContacts,maxContactCapacity,oldHostContacts);
int contactIndex = computeContactConvexConvex(hostPairs,i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,hostBodyBuf,
hostCollidables,hostConvexData,hostVertices,hostUniqueEdges,hostIndices,hostFaces,hostContacts,nContacts,maxContactCapacity,
oldHostContacts);
if (contactIndex>=0)

View File

@@ -77,7 +77,7 @@ typedef struct
int m_unused2;
} btGpuChildShape;
#define GET_NPOINTS(x) (x).m_worldNormal.w
#define GET_NPOINTS(x) (x).m_worldNormalOnB.w
typedef struct
{
@@ -467,12 +467,12 @@ void computeContactSphereConvex(int pairIndex,
if (1)//dstIdx < maxContactCapacity)
{
__global struct b3Contact4Data* c = &globalContactsOut[dstIdx];
c->m_worldNormal = normalOnSurfaceB1;
c->m_worldNormalOnB = -normalOnSurfaceB1;
c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);
c->m_batchIdx = pairIndex;
c->m_bodyAPtrAndSignBit = rigidBodies[bodyIndexA].m_invMass==0?-bodyIndexA:bodyIndexA;
c->m_bodyBPtrAndSignBit = rigidBodies[bodyIndexB].m_invMass==0?-bodyIndexB:bodyIndexB;
c->m_worldPos[0] = pOnB1;
c->m_worldPosB[0] = pOnB1;
c->m_childIndexA = -1;
c->m_childIndexB = -1;
@@ -693,7 +693,7 @@ int computeContactPlaneConvex(int pairIndex,
{
resultIndex = dstIdx;
__global struct b3Contact4Data* c = &globalContactsOut[dstIdx];
c->m_worldNormal = planeNormalWorld;
c->m_worldNormalOnB = -planeNormalWorld;
//c->setFrictionCoeff(0.7);
//c->setRestituitionCoeff(0.f);
c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);
@@ -706,13 +706,13 @@ int computeContactPlaneConvex(int pairIndex,
switch (numReducedPoints)
{
case 4:
c->m_worldPos[3] = contactPoints[contactIdx.w];
c->m_worldPosB[3] = contactPoints[contactIdx.w];
case 3:
c->m_worldPos[2] = contactPoints[contactIdx.z];
c->m_worldPosB[2] = contactPoints[contactIdx.z];
case 2:
c->m_worldPos[1] = contactPoints[contactIdx.y];
c->m_worldPosB[1] = contactPoints[contactIdx.y];
case 1:
c->m_worldPos[0] = contactPoints[contactIdx.x];
c->m_worldPosB[0] = contactPoints[contactIdx.x];
default:
{
}
@@ -776,12 +776,12 @@ void computeContactPlaneSphere(int pairIndex,
if (dstIdx < maxContactCapacity)
{
__global struct b3Contact4Data* c = &globalContactsOut[dstIdx];
c->m_worldNormal = normalOnSurfaceB1;
c->m_worldNormalOnB = -normalOnSurfaceB1;
c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);
c->m_batchIdx = pairIndex;
c->m_bodyAPtrAndSignBit = rigidBodies[bodyIndexA].m_invMass==0?-bodyIndexA:bodyIndexA;
c->m_bodyBPtrAndSignBit = rigidBodies[bodyIndexB].m_invMass==0?-bodyIndexB:bodyIndexB;
c->m_worldPos[0] = pOnB1;
c->m_worldPosB[0] = pOnB1;
c->m_childIndexA = -1;
c->m_childIndexB = -1;
GET_NPOINTS(*c) = 1;
@@ -954,14 +954,14 @@ __kernel void primitiveContactsKernel( __global int4* pairs,
if (dstIdx < maxContactCapacity)
{
__global struct b3Contact4Data* c = &globalContactsOut[dstIdx];
c->m_worldNormal = -normalOnSurfaceB;
c->m_worldNormalOnB = normalOnSurfaceB;
c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);
c->m_batchIdx = pairIndex;
int bodyA = pairs[pairIndex].x;
int bodyB = pairs[pairIndex].y;
c->m_bodyAPtrAndSignBit = rigidBodies[bodyA].m_invMass==0?-bodyA:bodyA;
c->m_bodyBPtrAndSignBit = rigidBodies[bodyB].m_invMass==0?-bodyB:bodyB;
c->m_worldPos[0] = contactPosB;
c->m_worldPosB[0] = contactPosB;
c->m_childIndexA = -1;
c->m_childIndexB = -1;
GET_NPOINTS(*c) = 1;
@@ -1294,12 +1294,12 @@ void computeContactSphereTriangle(int pairIndex,
if (dstIdx < maxContactCapacity)
{
__global struct b3Contact4Data* c = &globalContactsOut[dstIdx];
c->m_worldNormal = normalOnSurfaceB1;
c->m_worldNormalOnB = -normalOnSurfaceB1;
c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);
c->m_batchIdx = pairIndex;
c->m_bodyAPtrAndSignBit = rigidBodies[bodyIndexA].m_invMass==0?-bodyIndexA:bodyIndexA;
c->m_bodyBPtrAndSignBit = rigidBodies[bodyIndexB].m_invMass==0?-bodyIndexB:bodyIndexB;
c->m_worldPos[0] = pOnB1;
c->m_worldPosB[0] = pOnB1;
c->m_childIndexA = -1;
c->m_childIndexB = faceIndex;

View File

@@ -19,9 +19,10 @@ static const char* primitiveContactsKernelsCL= \
"typedef struct b3Contact4Data b3Contact4Data_t;\n"
"struct b3Contact4Data\n"
"{\n"
" b3Float4 m_worldPos[4];\n"
" b3Float4 m_worldPosB[4];\n"
"// b3Float4 m_localPosA[4];\n"
"// b3Float4 m_localPosB[4];\n"
" b3Float4 m_worldNormal; // w: m_nPoints\n"
" b3Float4 m_worldNormalOnB; // w: m_nPoints\n"
" unsigned short m_restituitionCoeffCmp;\n"
" unsigned short m_frictionCoeffCmp;\n"
" int m_batchIdx;\n"
@@ -31,15 +32,14 @@ static const char* primitiveContactsKernelsCL= \
" int m_childIndexB;\n"
" int m_unused1;\n"
" int m_unused2;\n"
"// b3Float4 m_localPosA;\n"
"};\n"
"inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n"
"{\n"
" return (int)contact->m_worldNormal.w;\n"
" return (int)contact->m_worldNormalOnB.w;\n"
"};\n"
"inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n"
"{\n"
" contact->m_worldNormal.w = (float)numPoints;\n"
" contact->m_worldNormalOnB.w = (float)numPoints;\n"
"};\n"
"#endif //B3_CONTACT4DATA_H\n"
"#define SHAPE_CONVEX_HULL 3\n"
@@ -106,7 +106,7 @@ static const char* primitiveContactsKernelsCL= \
" int m_unused1;\n"
" int m_unused2;\n"
"} btGpuChildShape;\n"
"#define GET_NPOINTS(x) (x).m_worldNormal.w\n"
"#define GET_NPOINTS(x) (x).m_worldNormalOnB.w\n"
"typedef struct\n"
"{\n"
" float4 m_pos;\n"
@@ -431,12 +431,12 @@ static const char* primitiveContactsKernelsCL= \
" if (1)//dstIdx < maxContactCapacity)\n"
" {\n"
" __global struct b3Contact4Data* c = &globalContactsOut[dstIdx];\n"
" c->m_worldNormal = normalOnSurfaceB1;\n"
" c->m_worldNormalOnB = -normalOnSurfaceB1;\n"
" c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n"
" c->m_batchIdx = pairIndex;\n"
" c->m_bodyAPtrAndSignBit = rigidBodies[bodyIndexA].m_invMass==0?-bodyIndexA:bodyIndexA;\n"
" c->m_bodyBPtrAndSignBit = rigidBodies[bodyIndexB].m_invMass==0?-bodyIndexB:bodyIndexB;\n"
" c->m_worldPos[0] = pOnB1;\n"
" c->m_worldPosB[0] = pOnB1;\n"
" c->m_childIndexA = -1;\n"
" c->m_childIndexB = -1;\n"
" GET_NPOINTS(*c) = 1;\n"
@@ -635,7 +635,7 @@ static const char* primitiveContactsKernelsCL= \
" {\n"
" resultIndex = dstIdx;\n"
" __global struct b3Contact4Data* c = &globalContactsOut[dstIdx];\n"
" c->m_worldNormal = planeNormalWorld;\n"
" c->m_worldNormalOnB = -planeNormalWorld;\n"
" //c->setFrictionCoeff(0.7);\n"
" //c->setRestituitionCoeff(0.f);\n"
" c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n"
@@ -647,13 +647,13 @@ static const char* primitiveContactsKernelsCL= \
" switch (numReducedPoints)\n"
" {\n"
" case 4:\n"
" c->m_worldPos[3] = contactPoints[contactIdx.w];\n"
" c->m_worldPosB[3] = contactPoints[contactIdx.w];\n"
" case 3:\n"
" c->m_worldPos[2] = contactPoints[contactIdx.z];\n"
" c->m_worldPosB[2] = contactPoints[contactIdx.z];\n"
" case 2:\n"
" c->m_worldPos[1] = contactPoints[contactIdx.y];\n"
" c->m_worldPosB[1] = contactPoints[contactIdx.y];\n"
" case 1:\n"
" c->m_worldPos[0] = contactPoints[contactIdx.x];\n"
" c->m_worldPosB[0] = contactPoints[contactIdx.x];\n"
" default:\n"
" {\n"
" }\n"
@@ -713,12 +713,12 @@ static const char* primitiveContactsKernelsCL= \
" if (dstIdx < maxContactCapacity)\n"
" {\n"
" __global struct b3Contact4Data* c = &globalContactsOut[dstIdx];\n"
" c->m_worldNormal = normalOnSurfaceB1;\n"
" c->m_worldNormalOnB = -normalOnSurfaceB1;\n"
" c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n"
" c->m_batchIdx = pairIndex;\n"
" c->m_bodyAPtrAndSignBit = rigidBodies[bodyIndexA].m_invMass==0?-bodyIndexA:bodyIndexA;\n"
" c->m_bodyBPtrAndSignBit = rigidBodies[bodyIndexB].m_invMass==0?-bodyIndexB:bodyIndexB;\n"
" c->m_worldPos[0] = pOnB1;\n"
" c->m_worldPosB[0] = pOnB1;\n"
" c->m_childIndexA = -1;\n"
" c->m_childIndexB = -1;\n"
" GET_NPOINTS(*c) = 1;\n"
@@ -863,14 +863,14 @@ static const char* primitiveContactsKernelsCL= \
" if (dstIdx < maxContactCapacity)\n"
" {\n"
" __global struct b3Contact4Data* c = &globalContactsOut[dstIdx];\n"
" c->m_worldNormal = -normalOnSurfaceB;\n"
" c->m_worldNormalOnB = normalOnSurfaceB;\n"
" c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n"
" c->m_batchIdx = pairIndex;\n"
" int bodyA = pairs[pairIndex].x;\n"
" int bodyB = pairs[pairIndex].y;\n"
" c->m_bodyAPtrAndSignBit = rigidBodies[bodyA].m_invMass==0?-bodyA:bodyA;\n"
" c->m_bodyBPtrAndSignBit = rigidBodies[bodyB].m_invMass==0?-bodyB:bodyB;\n"
" c->m_worldPos[0] = contactPosB;\n"
" c->m_worldPosB[0] = contactPosB;\n"
" c->m_childIndexA = -1;\n"
" c->m_childIndexB = -1;\n"
" GET_NPOINTS(*c) = 1;\n"
@@ -1161,12 +1161,12 @@ static const char* primitiveContactsKernelsCL= \
" if (dstIdx < maxContactCapacity)\n"
" {\n"
" __global struct b3Contact4Data* c = &globalContactsOut[dstIdx];\n"
" c->m_worldNormal = normalOnSurfaceB1;\n"
" c->m_worldNormalOnB = -normalOnSurfaceB1;\n"
" c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n"
" c->m_batchIdx = pairIndex;\n"
" c->m_bodyAPtrAndSignBit = rigidBodies[bodyIndexA].m_invMass==0?-bodyIndexA:bodyIndexA;\n"
" c->m_bodyBPtrAndSignBit = rigidBodies[bodyIndexB].m_invMass==0?-bodyIndexB:bodyIndexB;\n"
" c->m_worldPos[0] = pOnB1;\n"
" c->m_worldPosB[0] = pOnB1;\n"
" c->m_childIndexA = -1;\n"
" c->m_childIndexB = faceIndex;\n"
" GET_NPOINTS(*c) = 1;\n"

View File

@@ -64,7 +64,7 @@ typedef struct
int m_unused2;
} btGpuChildShape;
#define GET_NPOINTS(x) (x).m_worldNormal.w
#define GET_NPOINTS(x) (x).m_worldNormalOnB.w
typedef struct
{
@@ -908,7 +908,7 @@ __kernel void extractManifoldAndAddContactKernel(__global const int4* pairs,
//if ((dstIdx+nContacts) < capacity)
{
__global struct b3Contact4Data* c = contactsOut + dstIdx;
c->m_worldNormal = normal;
c->m_worldNormalOnB = -normal;
c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);
c->m_batchIdx = idx;
int bodyA = pairs[pairIndex].x;
@@ -919,7 +919,7 @@ __kernel void extractManifoldAndAddContactKernel(__global const int4* pairs,
c->m_childIndexB = -1;
for (int i=0;i<nContacts;i++)
{
c->m_worldPos[i] = localPoints[contactIdx[i]];
c->m_worldPosB[i] = localPoints[contactIdx[i]];
}
GET_NPOINTS(*c) = nContacts;
}
@@ -1023,7 +1023,7 @@ __kernel void clipHullHullKernel( __global int4* pairs,
pairs[pairIndex].z = dstIdx;
__global struct b3Contact4Data* c = globalContactsOut+ dstIdx;
c->m_worldNormal = normal;
c->m_worldNormalOnB = -normal;
c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);
c->m_batchIdx = pairIndex;
int bodyA = pairs[pairIndex].x;
@@ -1035,7 +1035,7 @@ __kernel void clipHullHullKernel( __global int4* pairs,
for (int i=0;i<nReducedContacts;i++)
{
c->m_worldPos[i] = pointsIn[contactIdx[i]];
c->m_worldPosB[i] = pointsIn[contactIdx[i]];
}
GET_NPOINTS(*c) = nReducedContacts;
}
@@ -1156,7 +1156,7 @@ __kernel void clipCompoundsHullHullKernel( __global const int4* gpuCompoundPai
if ((dstIdx+nReducedContacts) < maxContactCapacity)
{
__global struct b3Contact4Data* c = globalContactsOut+ dstIdx;
c->m_worldNormal = normal;
c->m_worldNormalOnB = -normal;
c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);
c->m_batchIdx = pairIndex;
int bodyA = gpuCompoundPairs[pairIndex].x;
@@ -1167,7 +1167,7 @@ __kernel void clipCompoundsHullHullKernel( __global const int4* gpuCompoundPai
c->m_childIndexB = childShapeIndexB;
for (int i=0;i<nReducedContacts;i++)
{
c->m_worldPos[i] = pointsIn[contactIdx[i]];
c->m_worldPosB[i] = pointsIn[contactIdx[i]];
}
GET_NPOINTS(*c) = nReducedContacts;
}
@@ -1232,14 +1232,14 @@ __kernel void sphereSphereCollisionKernel( __global const int4* pairs,
if (dstIdx < numPairs)
{
__global struct b3Contact4Data* c = &globalContactsOut[dstIdx];
c->m_worldNormal = normalOnSurfaceB;
c->m_worldNormalOnB = -normalOnSurfaceB;
c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);
c->m_batchIdx = pairIndex;
int bodyA = pairs[pairIndex].x;
int bodyB = pairs[pairIndex].y;
c->m_bodyAPtrAndSignBit = rigidBodies[bodyA].m_invMass==0?-bodyA:bodyA;
c->m_bodyBPtrAndSignBit = rigidBodies[bodyB].m_invMass==0?-bodyB:bodyB;
c->m_worldPos[0] = contactPosB;
c->m_worldPosB[0] = contactPosB;
c->m_childIndexA = -1;
c->m_childIndexB = -1;
@@ -1465,7 +1465,7 @@ __kernel void clipHullHullConcaveConvexKernel( __global int4* concavePairsIn,
//if ((dstIdx+nReducedContacts) < capacity)
{
__global struct b3Contact4Data* c = globalContactsOut+ dstIdx;
c->m_worldNormal = normal;
c->m_worldNormalOnB = -normal;
c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);
c->m_batchIdx = pairIndex;
int bodyA = concavePairsIn[pairIndex].x;
@@ -1476,7 +1476,7 @@ __kernel void clipHullHullConcaveConvexKernel( __global int4* concavePairsIn,
c->m_childIndexB = childShapeIndexB;
for (int i=0;i<nReducedContacts;i++)
{
c->m_worldPos[i] = pointsIn[contactIdx[i]];
c->m_worldPosB[i] = pointsIn[contactIdx[i]];
}
GET_NPOINTS(*c) = nReducedContacts;
}
@@ -1887,7 +1887,7 @@ __kernel void newContactReductionKernel( __global int4* pairs,
{
__global struct b3Contact4Data* c = &globalContactsOut[dstIdx];
c->m_worldNormal = normal;
c->m_worldNormalOnB = -normal;
c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);
c->m_batchIdx = pairIndex;
int bodyA = pairs[pairIndex].x;
@@ -1903,13 +1903,13 @@ __kernel void newContactReductionKernel( __global int4* pairs,
switch (nReducedContacts)
{
case 4:
c->m_worldPos[3] = pointsIn[contactIdx.w];
c->m_worldPosB[3] = pointsIn[contactIdx.w];
case 3:
c->m_worldPos[2] = pointsIn[contactIdx.z];
c->m_worldPosB[2] = pointsIn[contactIdx.z];
case 2:
c->m_worldPos[1] = pointsIn[contactIdx.y];
c->m_worldPosB[1] = pointsIn[contactIdx.y];
case 1:
c->m_worldPos[0] = pointsIn[contactIdx.x];
c->m_worldPosB[0] = pointsIn[contactIdx.x];
default:
{
}

View File

@@ -51,9 +51,10 @@ static const char* satClipKernelsCL= \
"typedef struct b3Contact4Data b3Contact4Data_t;\n"
"struct b3Contact4Data\n"
"{\n"
" b3Float4 m_worldPos[4];\n"
" b3Float4 m_worldPosB[4];\n"
"// b3Float4 m_localPosA[4];\n"
"// b3Float4 m_localPosB[4];\n"
" b3Float4 m_worldNormal; // w: m_nPoints\n"
" b3Float4 m_worldNormalOnB; // w: m_nPoints\n"
" unsigned short m_restituitionCoeffCmp;\n"
" unsigned short m_frictionCoeffCmp;\n"
" int m_batchIdx;\n"
@@ -63,15 +64,14 @@ static const char* satClipKernelsCL= \
" int m_childIndexB;\n"
" int m_unused1;\n"
" int m_unused2;\n"
"// b3Float4 m_localPosA;\n"
"};\n"
"inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n"
"{\n"
" return (int)contact->m_worldNormal.w;\n"
" return (int)contact->m_worldNormalOnB.w;\n"
"};\n"
"inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n"
"{\n"
" contact->m_worldNormal.w = (float)numPoints;\n"
" contact->m_worldNormalOnB.w = (float)numPoints;\n"
"};\n"
"#endif //B3_CONTACT4DATA_H\n"
"///keep this in sync with btCollidable.h\n"
@@ -92,7 +92,7 @@ static const char* satClipKernelsCL= \
" int m_unused1;\n"
" int m_unused2;\n"
"} btGpuChildShape;\n"
"#define GET_NPOINTS(x) (x).m_worldNormal.w\n"
"#define GET_NPOINTS(x) (x).m_worldNormalOnB.w\n"
"typedef struct\n"
"{\n"
" float4 m_pos;\n"
@@ -821,7 +821,7 @@ static const char* satClipKernelsCL= \
" //if ((dstIdx+nContacts) < capacity)\n"
" {\n"
" __global struct b3Contact4Data* c = contactsOut + dstIdx;\n"
" c->m_worldNormal = normal;\n"
" c->m_worldNormalOnB = -normal;\n"
" c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n"
" c->m_batchIdx = idx;\n"
" int bodyA = pairs[pairIndex].x;\n"
@@ -832,7 +832,7 @@ static const char* satClipKernelsCL= \
" c->m_childIndexB = -1;\n"
" for (int i=0;i<nContacts;i++)\n"
" {\n"
" c->m_worldPos[i] = localPoints[contactIdx[i]];\n"
" c->m_worldPosB[i] = localPoints[contactIdx[i]];\n"
" }\n"
" GET_NPOINTS(*c) = nContacts;\n"
" }\n"
@@ -919,7 +919,7 @@ static const char* satClipKernelsCL= \
" {\n"
" pairs[pairIndex].z = dstIdx;\n"
" __global struct b3Contact4Data* c = globalContactsOut+ dstIdx;\n"
" c->m_worldNormal = normal;\n"
" c->m_worldNormalOnB = -normal;\n"
" c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n"
" c->m_batchIdx = pairIndex;\n"
" int bodyA = pairs[pairIndex].x;\n"
@@ -930,7 +930,7 @@ static const char* satClipKernelsCL= \
" c->m_childIndexB = -1;\n"
" for (int i=0;i<nReducedContacts;i++)\n"
" {\n"
" c->m_worldPos[i] = pointsIn[contactIdx[i]];\n"
" c->m_worldPosB[i] = pointsIn[contactIdx[i]];\n"
" }\n"
" GET_NPOINTS(*c) = nReducedContacts;\n"
" }\n"
@@ -1042,7 +1042,7 @@ static const char* satClipKernelsCL= \
" if ((dstIdx+nReducedContacts) < maxContactCapacity)\n"
" {\n"
" __global struct b3Contact4Data* c = globalContactsOut+ dstIdx;\n"
" c->m_worldNormal = normal;\n"
" c->m_worldNormalOnB = -normal;\n"
" c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n"
" c->m_batchIdx = pairIndex;\n"
" int bodyA = gpuCompoundPairs[pairIndex].x;\n"
@@ -1053,7 +1053,7 @@ static const char* satClipKernelsCL= \
" c->m_childIndexB = childShapeIndexB;\n"
" for (int i=0;i<nReducedContacts;i++)\n"
" {\n"
" c->m_worldPos[i] = pointsIn[contactIdx[i]];\n"
" c->m_worldPosB[i] = pointsIn[contactIdx[i]];\n"
" }\n"
" GET_NPOINTS(*c) = nReducedContacts;\n"
" }\n"
@@ -1111,14 +1111,14 @@ static const char* satClipKernelsCL= \
" if (dstIdx < numPairs)\n"
" {\n"
" __global struct b3Contact4Data* c = &globalContactsOut[dstIdx];\n"
" c->m_worldNormal = normalOnSurfaceB;\n"
" c->m_worldNormalOnB = -normalOnSurfaceB;\n"
" c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n"
" c->m_batchIdx = pairIndex;\n"
" int bodyA = pairs[pairIndex].x;\n"
" int bodyB = pairs[pairIndex].y;\n"
" c->m_bodyAPtrAndSignBit = rigidBodies[bodyA].m_invMass==0?-bodyA:bodyA;\n"
" c->m_bodyBPtrAndSignBit = rigidBodies[bodyB].m_invMass==0?-bodyB:bodyB;\n"
" c->m_worldPos[0] = contactPosB;\n"
" c->m_worldPosB[0] = contactPosB;\n"
" c->m_childIndexA = -1;\n"
" c->m_childIndexB = -1;\n"
" GET_NPOINTS(*c) = 1;\n"
@@ -1323,7 +1323,7 @@ static const char* satClipKernelsCL= \
" //if ((dstIdx+nReducedContacts) < capacity)\n"
" {\n"
" __global struct b3Contact4Data* c = globalContactsOut+ dstIdx;\n"
" c->m_worldNormal = normal;\n"
" c->m_worldNormalOnB = -normal;\n"
" c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n"
" c->m_batchIdx = pairIndex;\n"
" int bodyA = concavePairsIn[pairIndex].x;\n"
@@ -1334,7 +1334,7 @@ static const char* satClipKernelsCL= \
" c->m_childIndexB = childShapeIndexB;\n"
" for (int i=0;i<nReducedContacts;i++)\n"
" {\n"
" c->m_worldPos[i] = pointsIn[contactIdx[i]];\n"
" c->m_worldPosB[i] = pointsIn[contactIdx[i]];\n"
" }\n"
" GET_NPOINTS(*c) = nReducedContacts;\n"
" }\n"
@@ -1714,7 +1714,7 @@ static const char* satClipKernelsCL= \
" if (dstIdx < numPairs)\n"
" {\n"
" __global struct b3Contact4Data* c = &globalContactsOut[dstIdx];\n"
" c->m_worldNormal = normal;\n"
" c->m_worldNormalOnB = -normal;\n"
" c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);\n"
" c->m_batchIdx = pairIndex;\n"
" int bodyA = pairs[pairIndex].x;\n"
@@ -1727,13 +1727,13 @@ static const char* satClipKernelsCL= \
" switch (nReducedContacts)\n"
" {\n"
" case 4:\n"
" c->m_worldPos[3] = pointsIn[contactIdx.w];\n"
" c->m_worldPosB[3] = pointsIn[contactIdx.w];\n"
" case 3:\n"
" c->m_worldPos[2] = pointsIn[contactIdx.z];\n"
" c->m_worldPosB[2] = pointsIn[contactIdx.z];\n"
" case 2:\n"
" c->m_worldPos[1] = pointsIn[contactIdx.y];\n"
" c->m_worldPosB[1] = pointsIn[contactIdx.y];\n"
" case 1:\n"
" c->m_worldPos[0] = pointsIn[contactIdx.x];\n"
" c->m_worldPosB[0] = pointsIn[contactIdx.x];\n"
" default:\n"
" {\n"
" }\n"