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

@@ -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"