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

@@ -1,7 +1,7 @@
function stringifyKernel(filenameIn, filenameOut, kernelMethod) function stringifyKernel(filenameIn, filenameOut, kernelMethod)
local BUFSIZE = 1024*1024 -- 1MB local BUFSIZE = 10*1024*1024 -- 10MB
local f = io.open(filenameIn,"r"); local f = io.open(filenameIn,"r");
local fw = io.open(filenameOut,"w"); local fw = io.open(filenameOut,"w");
fw:write("//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project\n") fw:write("//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project\n")

View File

@@ -36,9 +36,9 @@ B3_ATTRIBUTE_ALIGNED16(struct) b3Contact4 : public b3Contact4Data
void setFrictionCoeff( float c ) { b3Assert( c >= 0.f && c <= 1.f ); m_frictionCoeffCmp = (unsigned short)(c*0xffff); } void setFrictionCoeff( float c ) { b3Assert( c >= 0.f && c <= 1.f ); m_frictionCoeffCmp = (unsigned short)(c*0xffff); }
//float& getNPoints() { return m_worldNormal[3]; } //float& getNPoints() { return m_worldNormal[3]; }
int getNPoints() const { return (int) m_worldNormal[3]; } int getNPoints() const { return (int) m_worldNormalOnB[3]; }
float getPenetration(int idx) const { return m_worldPos[idx][3]; } float getPenetration(int idx) const { return m_worldPosB[idx][3]; }
bool isInvalid() const { return (getBodyA()==0 || getBodyB()==0); } bool isInvalid() const { return (getBodyA()==0 || getBodyB()==0); }
}; };

View File

@@ -7,9 +7,10 @@ typedef struct b3Contact4Data b3Contact4Data_t;
struct b3Contact4Data struct b3Contact4Data
{ {
b3Float4 m_worldPos[4]; b3Float4 m_worldPosB[4];
// b3Float4 m_localPosA[4];
// b3Float4 m_localPosB[4]; // b3Float4 m_localPosB[4];
b3Float4 m_worldNormal; // w: m_nPoints b3Float4 m_worldNormalOnB; // w: m_nPoints
unsigned short m_restituitionCoeffCmp; unsigned short m_restituitionCoeffCmp;
unsigned short m_frictionCoeffCmp; unsigned short m_frictionCoeffCmp;
int m_batchIdx; int m_batchIdx;
@@ -21,17 +22,17 @@ struct b3Contact4Data
int m_unused1; int m_unused1;
int m_unused2; int m_unused2;
// b3Float4 m_localPosA;
}; };
inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact) inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)
{ {
return (int)contact->m_worldNormal.w; return (int)contact->m_worldNormalOnB.w;
}; };
inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints) inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)
{ {
contact->m_worldNormal.w = (float)numPoints; contact->m_worldNormalOnB.w = (float)numPoints;
}; };

View File

@@ -118,9 +118,8 @@ void getContactPoint(b3Contact4* contact, int contactIndex, b3ContactPoint& poin
pointOut.m_contactMotion1 = 0.f; pointOut.m_contactMotion1 = 0.f;
pointOut.m_contactMotion2 = 0.f; pointOut.m_contactMotion2 = 0.f;
pointOut.m_distance = contact->getPenetration(contactIndex);//??0.01f pointOut.m_distance = contact->getPenetration(contactIndex);//??0.01f
b3Vector3 n = contact->m_worldNormal; b3Vector3 normalOnB = contact->m_worldNormalOnB;
b3Vector3 normalOnB(-n); normalOnB.normalize();//is this needed?
normalOnB.normalize();
b3Vector3 l1,l2; b3Vector3 l1,l2;
b3PlaneSpace1(normalOnB,l1,l2); b3PlaneSpace1(normalOnB,l1,l2);
@@ -132,7 +131,7 @@ void getContactPoint(b3Contact4* contact, int contactIndex, b3ContactPoint& poin
pointOut.m_lateralFrictionInitialized = true; pointOut.m_lateralFrictionInitialized = true;
b3Vector3 worldPosB = contact->m_worldPos[contactIndex]; b3Vector3 worldPosB = contact->m_worldPosB[contactIndex];
pointOut.m_positionWorldOnB = worldPosB; pointOut.m_positionWorldOnB = worldPosB;
pointOut.m_positionWorldOnA = worldPosB+normalOnB*pointOut.m_distance; pointOut.m_positionWorldOnA = worldPosB+normalOnB*pointOut.m_distance;
} }

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -31,9 +31,10 @@ static const char* batchingKernelsCL= \
"typedef struct b3Contact4Data b3Contact4Data_t;\n" "typedef struct b3Contact4Data b3Contact4Data_t;\n"
"struct b3Contact4Data\n" "struct b3Contact4Data\n"
"{\n" "{\n"
" b3Float4 m_worldPos[4];\n" " b3Float4 m_worldPosB[4];\n"
"// b3Float4 m_localPosA[4];\n"
"// b3Float4 m_localPosB[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_restituitionCoeffCmp;\n"
" unsigned short m_frictionCoeffCmp;\n" " unsigned short m_frictionCoeffCmp;\n"
" int m_batchIdx;\n" " int m_batchIdx;\n"
@@ -43,15 +44,14 @@ static const char* batchingKernelsCL= \
" int m_childIndexB;\n" " int m_childIndexB;\n"
" int m_unused1;\n" " int m_unused1;\n"
" int m_unused2;\n" " int m_unused2;\n"
"// b3Float4 m_localPosA;\n"
"};\n" "};\n"
"inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n" "inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n"
"{\n" "{\n"
" return (int)contact->m_worldNormal.w;\n" " return (int)contact->m_worldNormalOnB.w;\n"
"};\n" "};\n"
"inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n" "inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n"
"{\n" "{\n"
" contact->m_worldNormal.w = (float)numPoints;\n" " contact->m_worldNormalOnB.w = (float)numPoints;\n"
"};\n" "};\n"
"#endif //B3_CONTACT4DATA_H\n" "#endif //B3_CONTACT4DATA_H\n"
"#pragma OPENCL EXTENSION cl_amd_printf : enable\n" "#pragma OPENCL EXTENSION cl_amd_printf : enable\n"

View File

@@ -31,9 +31,10 @@ static const char* batchingKernelsNewCL= \
"typedef struct b3Contact4Data b3Contact4Data_t;\n" "typedef struct b3Contact4Data b3Contact4Data_t;\n"
"struct b3Contact4Data\n" "struct b3Contact4Data\n"
"{\n" "{\n"
" b3Float4 m_worldPos[4];\n" " b3Float4 m_worldPosB[4];\n"
"// b3Float4 m_localPosA[4];\n"
"// b3Float4 m_localPosB[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_restituitionCoeffCmp;\n"
" unsigned short m_frictionCoeffCmp;\n" " unsigned short m_frictionCoeffCmp;\n"
" int m_batchIdx;\n" " int m_batchIdx;\n"
@@ -43,15 +44,14 @@ static const char* batchingKernelsNewCL= \
" int m_childIndexB;\n" " int m_childIndexB;\n"
" int m_unused1;\n" " int m_unused1;\n"
" int m_unused2;\n" " int m_unused2;\n"
"// b3Float4 m_localPosA;\n"
"};\n" "};\n"
"inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n" "inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n"
"{\n" "{\n"
" return (int)contact->m_worldNormal.w;\n" " return (int)contact->m_worldNormalOnB.w;\n"
"};\n" "};\n"
"inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n" "inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n"
"{\n" "{\n"
" contact->m_worldNormal.w = (float)numPoints;\n" " contact->m_worldNormalOnB.w = (float)numPoints;\n"
"};\n" "};\n"
"#endif //B3_CONTACT4DATA_H\n" "#endif //B3_CONTACT4DATA_H\n"
"#pragma OPENCL EXTENSION cl_amd_printf : enable\n" "#pragma OPENCL EXTENSION cl_amd_printf : enable\n"

View File

@@ -427,9 +427,9 @@ typedef struct
void setLinearAndAngular( float4 n, float4 r0, float4 r1, float4* linear, float4* angular0, float4* angular1) void setLinearAndAngular( float4 n, float4 r0, float4 r1, float4* linear, float4* angular0, float4* angular1)
{ {
*linear = make_float4(-n.xyz,0.f); *linear = make_float4(n.xyz,0.f);
*angular0 = -cross3(r0, n); *angular0 = cross3(r0, n);
*angular1 = cross3(r1, n); *angular1 = -cross3(r1, n);
} }
@@ -525,14 +525,14 @@ void setConstraint4( const float4 posA, const float4 linVelA, const float4 angVe
dstC->m_fJacCoeffInv[0] = dstC->m_fJacCoeffInv[1] = 0.f; dstC->m_fJacCoeffInv[0] = dstC->m_fJacCoeffInv[1] = 0.f;
dstC->m_linear = -src->m_worldNormal; dstC->m_linear = src->m_worldNormalOnB;
dstC->m_linear.w = 0.7f ;//src->getFrictionCoeff() ); dstC->m_linear.w = 0.7f ;//src->getFrictionCoeff() );
for(int ic=0; ic<4; ic++) for(int ic=0; ic<4; ic++)
{ {
float4 r0 = src->m_worldPos[ic] - posA; float4 r0 = src->m_worldPosB[ic] - posA;
float4 r1 = src->m_worldPos[ic] - posB; float4 r1 = src->m_worldPosB[ic] - posB;
if( ic >= src->m_worldNormal.w )//npoints if( ic >= src->m_worldNormalOnB.w )//npoints
{ {
dstC->m_jacCoeffInv[ic] = 0.f; dstC->m_jacCoeffInv[ic] = 0.f;
continue; continue;
@@ -541,7 +541,7 @@ void setConstraint4( const float4 posA, const float4 linVelA, const float4 angVe
float relVelN; float relVelN;
{ {
float4 linear, angular0, angular1; float4 linear, angular0, angular1;
setLinearAndAngular(src->m_worldNormal, r0, r1, &linear, &angular0, &angular1); setLinearAndAngular(src->m_worldNormalOnB, r0, r1, &linear, &angular0, &angular1);
dstC->m_jacCoeffInv[ic] = calcJacCoeff(linear, -linear, angular0, angular1, dstC->m_jacCoeffInv[ic] = calcJacCoeff(linear, -linear, angular0, angular1,
invMassA, &invInertiaA, invMassB, &invInertiaB ); invMassA, &invInertiaA, invMassB, &invInertiaB );
@@ -553,21 +553,21 @@ void setConstraint4( const float4 posA, const float4 linVelA, const float4 angVe
if( relVelN*relVelN < 0.004f ) e = 0.f; if( relVelN*relVelN < 0.004f ) e = 0.f;
dstC->m_b[ic] = e*relVelN; dstC->m_b[ic] = e*relVelN;
//float penetration = src->m_worldPos[ic].w; //float penetration = src->m_worldPosB[ic].w;
dstC->m_b[ic] += (src->m_worldPos[ic].w + positionDrift)*positionConstraintCoeff*dtInv; dstC->m_b[ic] += (src->m_worldPosB[ic].w + positionDrift)*positionConstraintCoeff*dtInv;
dstC->m_appliedRambdaDt[ic] = 0.f; dstC->m_appliedRambdaDt[ic] = 0.f;
} }
} }
if( src->m_worldNormal.w > 0 )//npoints if( src->m_worldNormalOnB.w > 0 )//npoints
{ // prepare friction { // prepare friction
float4 center = make_float4(0.f); float4 center = make_float4(0.f);
for(int i=0; i<src->m_worldNormal.w; i++) for(int i=0; i<src->m_worldNormalOnB.w; i++)
center += src->m_worldPos[i]; center += src->m_worldPosB[i];
center /= (float)src->m_worldNormal.w; center /= (float)src->m_worldNormalOnB.w;
float4 tangent[2]; float4 tangent[2];
btPlaneSpace1(src->m_worldNormal,&tangent[0],&tangent[1]); btPlaneSpace1(src->m_worldNormalOnB,&tangent[0],&tangent[1]);
float4 r[2]; float4 r[2];
r[0] = center - posA; r[0] = center - posA;
@@ -587,9 +587,9 @@ void setConstraint4( const float4 posA, const float4 linVelA, const float4 angVe
for(int i=0; i<4; i++) for(int i=0; i<4; i++)
{ {
if( i<src->m_worldNormal.w ) if( i<src->m_worldNormalOnB.w )
{ {
dstC->m_worldPos[i] = src->m_worldPos[i]; dstC->m_worldPos[i] = src->m_worldPosB[i];
} }
else else
{ {

View File

@@ -31,9 +31,10 @@ static const char* solverSetupCL= \
"typedef struct b3Contact4Data b3Contact4Data_t;\n" "typedef struct b3Contact4Data b3Contact4Data_t;\n"
"struct b3Contact4Data\n" "struct b3Contact4Data\n"
"{\n" "{\n"
" b3Float4 m_worldPos[4];\n" " b3Float4 m_worldPosB[4];\n"
"// b3Float4 m_localPosA[4];\n"
"// b3Float4 m_localPosB[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_restituitionCoeffCmp;\n"
" unsigned short m_frictionCoeffCmp;\n" " unsigned short m_frictionCoeffCmp;\n"
" int m_batchIdx;\n" " int m_batchIdx;\n"
@@ -43,15 +44,14 @@ static const char* solverSetupCL= \
" int m_childIndexB;\n" " int m_childIndexB;\n"
" int m_unused1;\n" " int m_unused1;\n"
" int m_unused2;\n" " int m_unused2;\n"
"// b3Float4 m_localPosA;\n"
"};\n" "};\n"
"inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n" "inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n"
"{\n" "{\n"
" return (int)contact->m_worldNormal.w;\n" " return (int)contact->m_worldNormalOnB.w;\n"
"};\n" "};\n"
"inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n" "inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n"
"{\n" "{\n"
" contact->m_worldNormal.w = (float)numPoints;\n" " contact->m_worldNormalOnB.w = (float)numPoints;\n"
"};\n" "};\n"
"#endif //B3_CONTACT4DATA_H\n" "#endif //B3_CONTACT4DATA_H\n"
"#pragma OPENCL EXTENSION cl_amd_printf : enable\n" "#pragma OPENCL EXTENSION cl_amd_printf : enable\n"
@@ -389,9 +389,9 @@ static const char* solverSetupCL= \
"} ConstBufferBatchSolve;\n" "} ConstBufferBatchSolve;\n"
"void setLinearAndAngular( float4 n, float4 r0, float4 r1, float4* linear, float4* angular0, float4* angular1)\n" "void setLinearAndAngular( float4 n, float4 r0, float4 r1, float4* linear, float4* angular0, float4* angular1)\n"
"{\n" "{\n"
" *linear = make_float4(-n.xyz,0.f);\n" " *linear = make_float4(n.xyz,0.f);\n"
" *angular0 = -cross3(r0, n);\n" " *angular0 = cross3(r0, n);\n"
" *angular1 = cross3(r1, n);\n" " *angular1 = -cross3(r1, n);\n"
"}\n" "}\n"
"float calcRelVel( float4 l0, float4 l1, float4 a0, float4 a1, float4 linVel0, float4 angVel0, float4 linVel1, float4 angVel1 )\n" "float calcRelVel( float4 l0, float4 l1, float4 a0, float4 a1, float4 linVel0, float4 angVel0, float4 linVel1, float4 angVel1 )\n"
"{\n" "{\n"
@@ -467,13 +467,13 @@ static const char* solverSetupCL= \
" dstC->m_appliedRambdaDt[ic] = 0.f;\n" " dstC->m_appliedRambdaDt[ic] = 0.f;\n"
" }\n" " }\n"
" dstC->m_fJacCoeffInv[0] = dstC->m_fJacCoeffInv[1] = 0.f;\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" " dstC->m_linear.w = 0.7f ;//src->getFrictionCoeff() );\n"
" for(int ic=0; ic<4; ic++)\n" " for(int ic=0; ic<4; ic++)\n"
" {\n" " {\n"
" float4 r0 = src->m_worldPos[ic] - posA;\n" " float4 r0 = src->m_worldPosB[ic] - posA;\n"
" float4 r1 = src->m_worldPos[ic] - posB;\n" " float4 r1 = src->m_worldPosB[ic] - posB;\n"
" if( ic >= src->m_worldNormal.w )//npoints\n" " if( ic >= src->m_worldNormalOnB.w )//npoints\n"
" {\n" " {\n"
" dstC->m_jacCoeffInv[ic] = 0.f;\n" " dstC->m_jacCoeffInv[ic] = 0.f;\n"
" continue;\n" " continue;\n"
@@ -481,7 +481,7 @@ static const char* solverSetupCL= \
" float relVelN;\n" " float relVelN;\n"
" {\n" " {\n"
" float4 linear, angular0, angular1;\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" " dstC->m_jacCoeffInv[ic] = calcJacCoeff(linear, -linear, angular0, angular1,\n"
" invMassA, &invInertiaA, invMassB, &invInertiaB );\n" " invMassA, &invInertiaA, invMassB, &invInertiaB );\n"
" relVelN = calcRelVel(linear, -linear, angular0, angular1,\n" " relVelN = calcRelVel(linear, -linear, angular0, angular1,\n"
@@ -489,19 +489,19 @@ static const char* solverSetupCL= \
" float e = 0.f;//src->getRestituitionCoeff();\n" " float e = 0.f;//src->getRestituitionCoeff();\n"
" if( relVelN*relVelN < 0.004f ) e = 0.f;\n" " if( relVelN*relVelN < 0.004f ) e = 0.f;\n"
" dstC->m_b[ic] = e*relVelN;\n" " dstC->m_b[ic] = e*relVelN;\n"
" //float penetration = src->m_worldPos[ic].w;\n" " //float penetration = src->m_worldPosB[ic].w;\n"
" dstC->m_b[ic] += (src->m_worldPos[ic].w + positionDrift)*positionConstraintCoeff*dtInv;\n" " dstC->m_b[ic] += (src->m_worldPosB[ic].w + positionDrift)*positionConstraintCoeff*dtInv;\n"
" dstC->m_appliedRambdaDt[ic] = 0.f;\n" " dstC->m_appliedRambdaDt[ic] = 0.f;\n"
" }\n" " }\n"
" }\n" " }\n"
" if( src->m_worldNormal.w > 0 )//npoints\n" " if( src->m_worldNormalOnB.w > 0 )//npoints\n"
" { // prepare friction\n" " { // prepare friction\n"
" float4 center = make_float4(0.f);\n" " float4 center = make_float4(0.f);\n"
" for(int i=0; i<src->m_worldNormal.w; i++) \n" " for(int i=0; i<src->m_worldNormalOnB.w; i++) \n"
" center += src->m_worldPos[i];\n" " center += src->m_worldPosB[i];\n"
" center /= (float)src->m_worldNormal.w;\n" " center /= (float)src->m_worldNormalOnB.w;\n"
" float4 tangent[2];\n" " float4 tangent[2];\n"
" btPlaneSpace1(src->m_worldNormal,&tangent[0],&tangent[1]);\n" " btPlaneSpace1(src->m_worldNormalOnB,&tangent[0],&tangent[1]);\n"
" \n" " \n"
" float4 r[2];\n" " float4 r[2];\n"
" r[0] = center - posA;\n" " r[0] = center - posA;\n"
@@ -518,9 +518,9 @@ static const char* solverSetupCL= \
" }\n" " }\n"
" for(int i=0; i<4; i++)\n" " for(int i=0; i<4; i++)\n"
" {\n" " {\n"
" if( i<src->m_worldNormal.w )\n" " if( i<src->m_worldNormalOnB.w )\n"
" {\n" " {\n"
" dstC->m_worldPos[i] = src->m_worldPos[i];\n" " dstC->m_worldPos[i] = src->m_worldPosB[i];\n"
" }\n" " }\n"
" else\n" " else\n"
" {\n" " {\n"

View File

@@ -31,9 +31,10 @@ static const char* solverSetup2CL= \
"typedef struct b3Contact4Data b3Contact4Data_t;\n" "typedef struct b3Contact4Data b3Contact4Data_t;\n"
"struct b3Contact4Data\n" "struct b3Contact4Data\n"
"{\n" "{\n"
" b3Float4 m_worldPos[4];\n" " b3Float4 m_worldPosB[4];\n"
"// b3Float4 m_localPosA[4];\n"
"// b3Float4 m_localPosB[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_restituitionCoeffCmp;\n"
" unsigned short m_frictionCoeffCmp;\n" " unsigned short m_frictionCoeffCmp;\n"
" int m_batchIdx;\n" " int m_batchIdx;\n"
@@ -43,15 +44,14 @@ static const char* solverSetup2CL= \
" int m_childIndexB;\n" " int m_childIndexB;\n"
" int m_unused1;\n" " int m_unused1;\n"
" int m_unused2;\n" " int m_unused2;\n"
"// b3Float4 m_localPosA;\n"
"};\n" "};\n"
"inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n" "inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)\n"
"{\n" "{\n"
" return (int)contact->m_worldNormal.w;\n" " return (int)contact->m_worldNormalOnB.w;\n"
"};\n" "};\n"
"inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n" "inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numPoints)\n"
"{\n" "{\n"
" contact->m_worldNormal.w = (float)numPoints;\n" " contact->m_worldNormalOnB.w = (float)numPoints;\n"
"};\n" "};\n"
"#endif //B3_CONTACT4DATA_H\n" "#endif //B3_CONTACT4DATA_H\n"
"#pragma OPENCL EXTENSION cl_amd_printf : enable\n" "#pragma OPENCL EXTENSION cl_amd_printf : enable\n"

View File

@@ -455,9 +455,9 @@ __global float4* deltaLinearVelocities, __global float4* deltaAngularVelocities,
void setLinearAndAngular( float4 n, float4 r0, float4 r1, float4* linear, float4* angular0, float4* angular1) void setLinearAndAngular( float4 n, float4 r0, float4 r1, float4* linear, float4* angular0, float4* angular1)
{ {
*linear = make_float4(-n.xyz,0.f); *linear = make_float4(n.xyz,0.f);
*angular0 = -cross3(r0, n); *angular0 = cross3(r0, n);
*angular1 = cross3(r1, n); *angular1 = -cross3(r1, n);
} }
@@ -845,14 +845,14 @@ void setConstraint4( const float4 posA, const float4 linVelA, const float4 angVe
dstC->m_fJacCoeffInv[0] = dstC->m_fJacCoeffInv[1] = 0.f; dstC->m_fJacCoeffInv[0] = dstC->m_fJacCoeffInv[1] = 0.f;
dstC->m_linear = -src->m_worldNormal; dstC->m_linear = src->m_worldNormalOnB;
dstC->m_linear.w = 0.7f ;//src->getFrictionCoeff() ); dstC->m_linear.w = 0.7f ;//src->getFrictionCoeff() );
for(int ic=0; ic<4; ic++) for(int ic=0; ic<4; ic++)
{ {
float4 r0 = src->m_worldPos[ic] - posA; float4 r0 = src->m_worldPosB[ic] - posA;
float4 r1 = src->m_worldPos[ic] - posB; float4 r1 = src->m_worldPosB[ic] - posB;
if( ic >= src->m_worldNormal.w )//npoints if( ic >= src->m_worldNormalOnB.w )//npoints
{ {
dstC->m_jacCoeffInv[ic] = 0.f; dstC->m_jacCoeffInv[ic] = 0.f;
continue; continue;
@@ -861,7 +861,7 @@ void setConstraint4( const float4 posA, const float4 linVelA, const float4 angVe
float relVelN; float relVelN;
{ {
float4 linear, angular0, angular1; float4 linear, angular0, angular1;
setLinearAndAngular(src->m_worldNormal, r0, r1, &linear, &angular0, &angular1); setLinearAndAngular(src->m_worldNormalOnB, r0, r1, &linear, &angular0, &angular1);
dstC->m_jacCoeffInv[ic] = calcJacCoeff(linear, -linear, angular0, angular1, dstC->m_jacCoeffInv[ic] = calcJacCoeff(linear, -linear, angular0, angular1,
invMassA, &invInertiaA, invMassB, &invInertiaB , countA, countB); invMassA, &invInertiaA, invMassB, &invInertiaB , countA, countB);
@@ -873,21 +873,21 @@ void setConstraint4( const float4 posA, const float4 linVelA, const float4 angVe
if( relVelN*relVelN < 0.004f ) e = 0.f; if( relVelN*relVelN < 0.004f ) e = 0.f;
dstC->m_b[ic] = e*relVelN; dstC->m_b[ic] = e*relVelN;
//float penetration = src->m_worldPos[ic].w; //float penetration = src->m_worldPosB[ic].w;
dstC->m_b[ic] += (src->m_worldPos[ic].w + positionDrift)*positionConstraintCoeff*dtInv; dstC->m_b[ic] += (src->m_worldPosB[ic].w + positionDrift)*positionConstraintCoeff*dtInv;
dstC->m_appliedRambdaDt[ic] = 0.f; dstC->m_appliedRambdaDt[ic] = 0.f;
} }
} }
if( src->m_worldNormal.w > 0 )//npoints if( src->m_worldNormalOnB.w > 0 )//npoints
{ // prepare friction { // prepare friction
float4 center = make_float4(0.f); float4 center = make_float4(0.f);
for(int i=0; i<src->m_worldNormal.w; i++) for(int i=0; i<src->m_worldNormalOnB.w; i++)
center += src->m_worldPos[i]; center += src->m_worldPosB[i];
center /= (float)src->m_worldNormal.w; center /= (float)src->m_worldNormalOnB.w;
float4 tangent[2]; float4 tangent[2];
btPlaneSpace1(src->m_worldNormal,&tangent[0],&tangent[1]); btPlaneSpace1(-src->m_worldNormalOnB,&tangent[0],&tangent[1]);
float4 r[2]; float4 r[2];
r[0] = center - posA; r[0] = center - posA;
@@ -907,9 +907,9 @@ void setConstraint4( const float4 posA, const float4 linVelA, const float4 angVe
for(int i=0; i<4; i++) for(int i=0; i<4; i++)
{ {
if( i<src->m_worldNormal.w ) if( i<src->m_worldNormalOnB.w )
{ {
dstC->m_worldPos[i] = src->m_worldPos[i]; dstC->m_worldPos[i] = src->m_worldPosB[i];
} }
else else
{ {

View File

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