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:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user