2 #ifndef B3_CONTACT_SPHERE_SPHERE_H
3 #define B3_CONTACT_SPHERE_SPHERE_H
5 void computeContactSphereConvex(int pairIndex,
6 int bodyIndexA, int bodyIndexB,
7 int collidableIndexA, int collidableIndexB,
8 const b3RigidBodyData* rigidBodies,
9 const b3Collidable* collidables,
10 const b3ConvexPolyhedronData* convexShapes,
11 const b3Vector3* convexVertices,
12 const int* convexIndices,
13 const b3GpuFace* faces,
14 b3Contact4* globalContactsOut,
15 int& nGlobalContactsOut,
16 int maxContactCapacity)
18 float radius = collidables[collidableIndexA].m_radius;
19 float4 spherePos1 = rigidBodies[bodyIndexA].m_pos;
20 b3Quaternion sphereOrn = rigidBodies[bodyIndexA].m_quat;
22 float4 pos = rigidBodies[bodyIndexB].m_pos;
24 b3Quaternion quat = rigidBodies[bodyIndexB].m_quat;
30 b3Transform trInv = tr.inverse();
32 float4 spherePos = trInv(spherePos1);
34 int collidableIndex = rigidBodies[bodyIndexB].m_collidableIdx;
35 int shapeIndex = collidables[collidableIndex].m_shapeIndex;
36 int numFaces = convexShapes[shapeIndex].m_numFaces;
37 float4 closestPnt = b3MakeVector3(0, 0, 0, 0);
38 float4 hitNormalWorld = b3MakeVector3(0, 0, 0, 0);
39 float minDist = -1000000.f; // TODO: What is the largest/smallest float?
42 float4 localHitNormal;
43 for (int f = 0; f < numFaces; f++)
45 b3GpuFace face = faces[convexShapes[shapeIndex].m_faceOffset + f];
47 float4 localPlaneNormal = b3MakeVector3(face.m_plane.x, face.m_plane.y, face.m_plane.z, 0.f);
48 float4 n1 = localPlaneNormal; //quatRotate(quat,localPlaneNormal);
50 planeEqn[3] = face.m_plane.w;
53 float dist = signedDistanceFromPointToPlane(spherePos, planeEqn, &pntReturn);
63 //might hit an edge or vertex
66 bool isInPoly = IsPointInPolygon(spherePos,
68 &convexVertices[convexShapes[shapeIndex].m_vertexOffset],
76 closestPnt = pntReturn;
77 localHitNormal = planeEqn;
83 b3Vector3 tmp = spherePos - out;
84 b3Scalar l2 = tmp.length2();
85 if (l2 < radius * radius)
92 localHitNormal = tmp / dist;
108 closestPnt = pntReturn;
109 localHitNormal = planeEqn;
114 static int numChecks = 0;
117 if (bCollide && minDist > -10000)
119 float4 normalOnSurfaceB1 = tr.getBasis() * localHitNormal; //-hitNormalWorld;
120 float4 pOnB1 = tr(closestPnt);
121 //printf("dist ,%f,",minDist);
122 float actualDepth = minDist - radius;
125 //printf("actualDepth = ,%f,", actualDepth);
126 //printf("normalOnSurfaceB1 = ,%f,%f,%f,", normalOnSurfaceB1.x,normalOnSurfaceB1.y,normalOnSurfaceB1.z);
127 //printf("region=,%d,\n", region);
128 pOnB1[3] = actualDepth;
131 // dstIdx = nGlobalContactsOut++;//AppendInc( nGlobalContactsOut, dstIdx );
133 if (nGlobalContactsOut < maxContactCapacity)
135 dstIdx = nGlobalContactsOut;
136 nGlobalContactsOut++;
138 b3Contact4* c = &globalContactsOut[dstIdx];
139 c->m_worldNormalOnB = normalOnSurfaceB1;
140 c->setFrictionCoeff(0.7);
141 c->setRestituitionCoeff(0.f);
143 c->m_batchIdx = pairIndex;
144 c->m_bodyAPtrAndSignBit = rigidBodies[bodyIndexA].m_invMass == 0 ? -bodyIndexA : bodyIndexA;
145 c->m_bodyBPtrAndSignBit = rigidBodies[bodyIndexB].m_invMass == 0 ? -bodyIndexB : bodyIndexB;
146 c->m_worldPosB[0] = pOnB1;
148 c->m_worldNormalOnB.w = (b3Scalar)numPoints;
149 } //if (dstIdx < numPairs)
151 } //if (hasCollision)
153 #endif //B3_CONTACT_SPHERE_SPHERE_H