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

@@ -31,9 +31,10 @@ static const char* solverUtilsCL= \
"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"
@@ -43,15 +44,14 @@ static const char* solverUtilsCL= \
" 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"
"#pragma OPENCL EXTENSION cl_amd_printf : enable\n"
@@ -418,9 +418,9 @@ static const char* solverUtilsCL= \
"}\n"
"void setLinearAndAngular( float4 n, float4 r0, float4 r1, float4* linear, float4* angular0, float4* angular1)\n"
"{\n"
" *linear = make_float4(-n.xyz,0.f);\n"
" *angular0 = -cross3(r0, n);\n"
" *angular1 = cross3(r1, n);\n"
" *linear = make_float4(n.xyz,0.f);\n"
" *angular0 = cross3(r0, n);\n"
" *angular1 = -cross3(r1, n);\n"
"}\n"
"float calcRelVel( float4 l0, float4 l1, float4 a0, float4 a1, float4 linVel0, float4 angVel0, float4 linVel1, float4 angVel1 )\n"
"{\n"
@@ -746,13 +746,13 @@ static const char* solverUtilsCL= \
" dstC->m_appliedRambdaDt[ic] = 0.f;\n"
" }\n"
" dstC->m_fJacCoeffInv[0] = dstC->m_fJacCoeffInv[1] = 0.f;\n"
" dstC->m_linear = -src->m_worldNormal;\n"
" dstC->m_linear = src->m_worldNormalOnB;\n"
" dstC->m_linear.w = 0.7f ;//src->getFrictionCoeff() );\n"
" for(int ic=0; ic<4; ic++)\n"
" {\n"
" float4 r0 = src->m_worldPos[ic] - posA;\n"
" float4 r1 = src->m_worldPos[ic] - posB;\n"
" if( ic >= src->m_worldNormal.w )//npoints\n"
" float4 r0 = src->m_worldPosB[ic] - posA;\n"
" float4 r1 = src->m_worldPosB[ic] - posB;\n"
" if( ic >= src->m_worldNormalOnB.w )//npoints\n"
" {\n"
" dstC->m_jacCoeffInv[ic] = 0.f;\n"
" continue;\n"
@@ -760,7 +760,7 @@ static const char* solverUtilsCL= \
" float relVelN;\n"
" {\n"
" float4 linear, angular0, angular1;\n"
" setLinearAndAngular(src->m_worldNormal, r0, r1, &linear, &angular0, &angular1);\n"
" setLinearAndAngular(src->m_worldNormalOnB, r0, r1, &linear, &angular0, &angular1);\n"
" dstC->m_jacCoeffInv[ic] = calcJacCoeff(linear, -linear, angular0, angular1,\n"
" invMassA, &invInertiaA, invMassB, &invInertiaB , countA, countB);\n"
" relVelN = calcRelVel(linear, -linear, angular0, angular1,\n"
@@ -768,19 +768,19 @@ static const char* solverUtilsCL= \
" float e = 0.f;//src->getRestituitionCoeff();\n"
" if( relVelN*relVelN < 0.004f ) e = 0.f;\n"
" dstC->m_b[ic] = e*relVelN;\n"
" //float penetration = src->m_worldPos[ic].w;\n"
" dstC->m_b[ic] += (src->m_worldPos[ic].w + positionDrift)*positionConstraintCoeff*dtInv;\n"
" //float penetration = src->m_worldPosB[ic].w;\n"
" dstC->m_b[ic] += (src->m_worldPosB[ic].w + positionDrift)*positionConstraintCoeff*dtInv;\n"
" dstC->m_appliedRambdaDt[ic] = 0.f;\n"
" }\n"
" }\n"
" if( src->m_worldNormal.w > 0 )//npoints\n"
" if( src->m_worldNormalOnB.w > 0 )//npoints\n"
" { // prepare friction\n"
" float4 center = make_float4(0.f);\n"
" for(int i=0; i<src->m_worldNormal.w; i++) \n"
" center += src->m_worldPos[i];\n"
" center /= (float)src->m_worldNormal.w;\n"
" for(int i=0; i<src->m_worldNormalOnB.w; i++) \n"
" center += src->m_worldPosB[i];\n"
" center /= (float)src->m_worldNormalOnB.w;\n"
" float4 tangent[2];\n"
" btPlaneSpace1(src->m_worldNormal,&tangent[0],&tangent[1]);\n"
" btPlaneSpace1(-src->m_worldNormalOnB,&tangent[0],&tangent[1]);\n"
" \n"
" float4 r[2];\n"
" r[0] = center - posA;\n"
@@ -797,9 +797,9 @@ static const char* solverUtilsCL= \
" }\n"
" for(int i=0; i<4; i++)\n"
" {\n"
" if( i<src->m_worldNormal.w )\n"
" if( i<src->m_worldNormalOnB.w )\n"
" {\n"
" dstC->m_worldPos[i] = src->m_worldPos[i];\n"
" dstC->m_worldPos[i] = src->m_worldPosB[i];\n"
" }\n"
" else\n"
" {\n"