34 int numVerts = pVtxIn.
size();
41 ds = planeNormalWS.
dot(firstVertex) + planeEqWS;
43 for (ve = 0; ve < numVerts; ve++)
45 endVertex = pVtxIn[ve];
47 de = planeNormalWS.
dot(endVertex) + planeEqWS;
71 firstVertex = endVertex;
83 hullA.
project(transA, sep_axis, Min0, Max0, witnesPtMinA, witnesPtMaxA);
84 hullB.
project(transB, sep_axis, Min1, Max1, witnesPtMinB, witnesPtMaxB);
86 if (Max0 < Min1 || Max1 < Min0)
96 witnessPointA = witnesPtMaxA;
97 witnessPointB = witnesPtMinB;
102 witnessPointA = witnesPtMinA;
103 witnessPointB = witnesPtMaxB;
117#ifdef TEST_INTERNAL_OBJECTS
125 p[0] = sv[0] < 0.0f ? -extents[0] : extents[0];
126 p[1] = sv[1] < 0.0f ? -extents[1] : extents[1];
127 p[2] = sv[2] < 0.0f ? -extents[2] : extents[2];
137 const btScalar x = r0.
x() * in.
x() + r1.
x() * in.
y() + r2.
x() * in.
z();
138 const btScalar y = r0.
y() * in.
x() + r1.
y() * in.
y() + r2.
y() * in.
z();
139 const btScalar z = r0.
z() * in.
x() + r1.
z() * in.
y() + r2.
z() * in.
z();
149 InverseTransformPoint3x3(localAxis0, axis, trans0);
151 InverseTransformPoint3x3(localAxis1, axis, trans1);
154 BoxSupport(convex0.
m_extents, localAxis0, p0);
156 BoxSupport(convex1.
m_extents, localAxis1, p1);
158 const btScalar Radius0 = p0[0] * localAxis0.
x() + p0[1] * localAxis0.
y() + p0[2] * localAxis0.
z();
159 const btScalar Radius1 = p1[0] * localAxis1.
x() + p1[1] * localAxis1.
y() + p1[2] * localAxis1.
z();
164 const btScalar MinMaxRadius = MaxRadius + MinRadius;
165 const btScalar d0 = MinMaxRadius + dp;
166 const btScalar d1 = MinMaxRadius - dp;
168 const btScalar depth = d0 < d1 ? d0 : d1;
190 btScalar denom = 1.0f - dirA_dot_dirB * dirA_dot_dirB;
198 tA = (dirA_dot_trans - dirB_dot_trans * dirA_dot_dirB) / denom;
205 tB = tA * dirA_dot_dirB - dirB_dot_trans;
210 tA = tB * dirA_dot_dirB + dirA_dot_trans;
220 tA = tB * dirA_dot_dirB + dirA_dot_trans;
233 ptsVector = translation - offsetA + offsetB;
247 int curPlaneTests = 0;
251 for (
int i = 0; i < numFacesA; i++)
255 if (DeltaC2.
dot(faceANormalWS) < 0)
256 faceANormalWS *= -1.f;
259#ifdef TEST_INTERNAL_OBJECTS
261 if (
gUseInternalObject && !TestInternalObjects(transA, transB, DeltaC2, faceANormalWS, hullA, hullB, dmin))
268 if (!
TestSepAxis(hullA, hullB, transA, transB, faceANormalWS, d, wA, wB))
280 for (
int i = 0; i < numFacesB; i++)
284 if (DeltaC2.
dot(WorldNormal) < 0)
288#ifdef TEST_INTERNAL_OBJECTS
290 if (
gUseInternalObject && !TestInternalObjects(transA, transB, DeltaC2, WorldNormal, hullA, hullB, dmin))
297 if (!
TestSepAxis(hullA, hullB, transA, transB, WorldNormal, d, wA, wB))
307 btVector3 edgeAstart, edgeAend, edgeBstart, edgeBend;
312 btVector3 witnessPointA(0, 0, 0), witnessPointB(0, 0, 0);
333#ifdef TEST_INTERNAL_OBJECTS
351 worldEdgeA = WorldEdge0;
352 worldEdgeB = WorldEdge1;
360 if (edgeA >= 0 && edgeB >= 0)
371 btVector3 translation = witnessPointB - witnessPointA;
388 ptsVector *= 1.f / nl;
389 if (ptsVector.
dot(DeltaC2) < 0.f)
393 btVector3 ptOnB = witnessPointB + offsetB;
399 if ((DeltaC2.
dot(sep)) < 0.0f)
412 int closestFaceA = -1;
415 for (
int face = 0; face < hullA.
m_faces.
size(); face++)
428 if (closestFaceA < 0)
435 for (
int e0 = 0; e0 < numVerticesA; e0++)
445 btScalar planeEqWS1 = -worldA1.
dot(planeNormalWS1);
449 int otherFace = polyA.m_connectedFaces[e0];
456 btVector3 planeNormalWS = planeNormalWS1;
462 clipFace(*pVtxIn, *pVtxOut, planeNormalWS, planeEqWS);
477 for (
int i = 0; i < pVtxIn->
size(); i++)
480 btScalar depth = planeNormalWS.
dot(vtx) + planeEqWS;
481 if (depth <= minDist)
487 if (depth <= maxDist)
490#ifdef ONLY_REPORT_DEEPEST_POINT
496 printf(
"error in btPolyhedralContactClipping depth = %f\n", depth);
497 printf(
"likely wrong separatingNormal passed in\n");
505#ifdef ONLY_REPORT_DEEPEST_POINT
506 if (curMaxDist < maxDist)
520 int closestFaceB = -1;
523 for (
int face = 0; face < hullB.
m_faces.
size(); face++)
539 for (
int e0 = 0; e0 < numVertices; e0++)
546 if (closestFaceB >= 0)
547 clipFaceAgainstHull(separatingNormal, hullA, transA, worldVertsB1, worldVertsB2, minDist, maxDist, resultOut);
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btScalar btSqrt(btScalar y)
btScalar btFabs(btScalar x)
#define SIMD_FORCE_INLINE
static btMatrix3x3 Cross(const btVector3 &v)
btScalar btDot(const btVector3 &v1, const btVector3 &v2)
Return the dot product between two vectors.
int size() const
return the number of elements in the array
void resize(int newsize, const T &fillData=T())
void push_back(const T &_Val)
const T & at(int n) const
void project(const btTransform &trans, const btVector3 &dir, btScalar &minProj, btScalar &maxProj, btVector3 &witnesPtMin, btVector3 &witnesPtMax) const
btAlignedObjectArray< btVector3 > m_vertices
btAlignedObjectArray< btFace > m_faces
btAlignedObjectArray< btVector3 > m_uniqueEdges
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
btVector3 can be used to represent 3D points and vectors.
const btScalar & z() const
Return the z value.
btVector3 cross(const btVector3 &v) const
Return the cross product between this and another vector.
btScalar dot(const btVector3 &v) const
Return the dot product.
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
btVector3 normalized() const
Return a normalized version of this vector.
btScalar length2() const
Return the length of the vector squared.
const btScalar & x() const
Return the x value.
btVector3 lerp(const btVector3 &v, const btScalar &t) const
Return the linear interpolation between this and another vector.
const btScalar & y() const
Return the y value.
virtual void addContactPoint(const btVector3 &normalOnBInWorld, const btVector3 &pointInWorld, btScalar depth)=0
btAlignedObjectArray< int > m_indices