15#ifdef DEBUG_INTERNAL_EDGE
19#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
24 gDebugDrawer = debugDrawer;
30 gDebugDrawer->
drawLine(from, to, color);
68 int sharedVertsA[3] = {-1, -1, -1};
69 int sharedVertsB[3] = {-1, -1, -1};
72 btScalar crossBSqr = ((triangle[1] - triangle[0]).cross(triangle[2] - triangle[0])).length2();
73 if (crossBSqr < m_triangleInfoMap->m_equalVertexThreshold)
78 if (crossASqr < m_triangleInfoMap->m_equalVertexThreshold)
82 printf(
"triangle A[0] = (%f,%f,%f)\ntriangle A[1] = (%f,%f,%f)\ntriangle A[2] = (%f,%f,%f)\n",
87 printf(
"partId=%d, triangleIndex=%d\n",partId,triangleIndex);
88 printf(
"triangle B[0] = (%f,%f,%f)\ntriangle B[1] = (%f,%f,%f)\ntriangle B[2] = (%f,%f,%f)\n",
89 triangle[0].getX(),triangle[0].getY(),triangle[0].getZ(),
90 triangle[1].getX(),triangle[1].getY(),triangle[1].getZ(),
91 triangle[2].getX(),triangle[2].getY(),triangle[2].getZ());
94 for (
int i = 0; i < 3; i++)
96 for (
int j = 0; j < 3; j++)
100 sharedVertsA[numshared] = i;
101 sharedVertsB[numshared] = j;
127 if (sharedVertsA[0] == 0 && sharedVertsA[1] == 2)
131 int tmp = sharedVertsB[1];
132 sharedVertsB[1] = sharedVertsB[0];
133 sharedVertsB[0] = tmp;
146 int sumvertsA = sharedVertsA[0] + sharedVertsA[1];
147 int otherIndexA = 3 - sumvertsA;
152 int otherIndexB = 3 - (sharedVertsB[0] + sharedVertsB[1]);
154 btTriangleShape tB(triangle[sharedVertsB[1]], triangle[sharedVertsB[0]], triangle[otherIndexB]);
166 if (edgeCrossA.
dot(tmp) < 0)
175 btVector3 tmp = triangle[otherIndexB] - triangle[sharedVertsB[0]];
176 if (edgeCrossB.
dot(tmp) < 0)
190 bool isConvex =
false;
192 if (len2 < m_triangleInfoMap->m_planarEpsilon)
202 angle2 =
btGetAngle(calculatedNormalA, edgeCrossA, edgeCrossB);
206 isConvex = (dotA < 0.);
208 correctedAngle = isConvex ? ang4 : -ang4;
224 computedNormalB *= -1;
227#ifdef DEBUG_INTERNAL_EDGE
228 if ((computedNormalB - normalB).
length() > 0.0001)
230 printf(
"warning: normals not identical\n");
245 if (computedNormalB.
dot(normalB) < 0)
247 computedNormalB *= -1;
251#ifdef DEBUG_INTERNAL_EDGE
252 if ((computedNormalB - normalB).
length() > 0.0001)
254 printf(
"warning: normals not identical\n");
267 if (computedNormalB.
dot(normalB) < 0)
270 computedNormalB *= -1;
272#ifdef DEBUG_INTERNAL_EDGE
273 if ((computedNormalB - normalB).
length() > 0.0001)
275 printf(
"warning: normals not identical\n");
311 connectivityProcessor.
m_partIdA = partId;
318 aabbMin.
setMin(triangle[0]);
319 aabbMax.
setMax(triangle[0]);
320 aabbMin.
setMin(triangle[1]);
321 aabbMax.
setMax(triangle[1]);
322 aabbMin.
setMin(triangle[2]);
323 aabbMax.
setMax(triangle[2]);
342 for (
int partId = 0; partId < meshInterface->
getNumSubParts(); partId++)
344 const unsigned char* vertexbase = 0;
348 const unsigned char* indexbase = 0;
358 for (
int triangleIndex = 0; triangleIndex < numfaces; triangleIndex++)
360 unsigned int* gfxbase = (
unsigned int*)(indexbase + triangleIndex * indexstride);
362 for (
int j = 2; j >= 0; j--)
365 switch (indicestype) {
366 case PHY_INTEGER: graphicsindex = gfxbase[j];
break;
367 case PHY_SHORT: graphicsindex = ((
unsigned short*)gfxbase)[j];
break;
368 case PHY_UCHAR: graphicsindex = ((
unsigned char*)gfxbase)[j];
break;
373 float* graphicsbase = (
float*)(vertexbase + graphicsindex * stride);
375 graphicsbase[0] * meshScaling.
getX(),
376 graphicsbase[1] * meshScaling.
getY(),
377 graphicsbase[2] * meshScaling.
getZ());
381 double* graphicsbase = (
double*)(vertexbase + graphicsindex * stride);
387 aabbMin.
setMin(triangleVerts[0]);
388 aabbMax.
setMax(triangleVerts[0]);
389 aabbMin.
setMin(triangleVerts[1]);
390 aabbMax.
setMax(triangleVerts[1]);
391 aabbMin.
setMin(triangleVerts[2]);
392 aabbMax.
setMax(triangleVerts[2]);
395 connectivityProcessor.
m_partIdA = partId;
436 nearestPoint = line0;
440 btScalar delta = (point - line0).
dot(lineDelta) / (lineDelta).
dot(lineDelta);
448 nearestPoint = line0 + lineDelta * delta;
461 if (correctedEdgeAngle < 0)
463 if (curAngle < correctedEdgeAngle)
465 btScalar diffAngle = correctedEdgeAngle - curAngle;
467 clampedLocalNormal =
btMatrix3x3(rotation) * localContactNormalOnB;
472 if (correctedEdgeAngle >= 0)
474 if (curAngle > correctedEdgeAngle)
476 btScalar diffAngle = correctedEdgeAngle - curAngle;
478 clampedLocalNormal =
btMatrix3x3(rotation) * localContactNormalOnB;
501#ifdef USE_HEIGHTFIELD_TRIANGLES
507 newNormal = tri_normal;
537 if (!triangleInfoMapPtr)
556 btVector3 red(1, 0, 0), green(0, 1, 0), blue(0, 0, 1), white(1, 1, 1), black(0, 0, 0);
565#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
566 const btTransform& tr = colObj0->getWorldTransform();
570 bool isNearEdge =
false;
572 int numConcaveEdgeHits = 0;
573 int numConvexEdgeHits = 0;
589 if (len < disttobestedge)
592 disttobestedge = len;
602 if (len < disttobestedge)
605 disttobestedge = len;
615 if (len < disttobestedge)
618 disttobestedge = len;
622#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
624 btDebugDrawLine(tr * v0 + upfix, tr * v1 + upfix, red);
628#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
629 btDebugDrawLine(tr * contact, tr * (contact + cp.
m_normalWorldOnB * 10), black);
632 if (len < triangleInfoMapPtr->m_edgeDistanceThreshold)
640 numConcaveEdgeHits++;
646#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
647 btDebugDrawLine(tr * nearest, tr * (nearest + swapFactor * tri_normal * 10), white);
655 computedNormalB *= -1;
656 btVector3 nB = swapFactor * computedNormalB;
660 bool backFacingNormal = (NdotA < triangleInfoMapPtr->
m_convexEpsilon) && (NdotB < triangleInfoMapPtr->m_convexEpsilon);
662#ifdef DEBUG_INTERNAL_EDGE
668 if (backFacingNormal)
670 numConcaveEdgeHits++;
695#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
699#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
700 btDebugDrawLine(tr * v1 + upfix, tr * v2 + upfix, green);
705#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
706 btDebugDrawLine(tr * contact, tr * (contact + cp.
m_normalWorldOnB * 10), black);
710 if (len < triangleInfoMapPtr->m_edgeDistanceThreshold)
714#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
715 btDebugDrawLine(tr * nearest, tr * (nearest + tri_normal * 10), white);
724 numConcaveEdgeHits++;
730#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
731 btDebugDrawLine(tr * nearest, tr * (nearest + swapFactor * tri_normal * 10), white);
739 computedNormalB *= -1;
740 btVector3 nB = swapFactor * computedNormalB;
742#ifdef DEBUG_INTERNAL_EDGE
750 bool backFacingNormal = (NdotA < triangleInfoMapPtr->
m_convexEpsilon) && (NdotB < triangleInfoMapPtr->m_convexEpsilon);
752 if (backFacingNormal)
754 numConcaveEdgeHits++;
780#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
783#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
784 btDebugDrawLine(tr * v2 + upfix, tr * v0 + upfix, blue);
789#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
790 btDebugDrawLine(tr * contact, tr * (contact + cp.
m_normalWorldOnB * 10), black);
794 if (len < triangleInfoMapPtr->m_edgeDistanceThreshold)
798#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
799 btDebugDrawLine(tr * nearest, tr * (nearest + tri_normal * 10), white);
806 numConcaveEdgeHits++;
812#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
813 btDebugDrawLine(tr * nearest, tr * (nearest + swapFactor * tri_normal * 10), white);
820 computedNormalB *= -1;
821 btVector3 nB = swapFactor * computedNormalB;
823#ifdef DEBUG_INTERNAL_EDGE
831 bool backFacingNormal = (NdotA < triangleInfoMapPtr->
m_convexEpsilon) && (NdotB < triangleInfoMapPtr->m_convexEpsilon);
833 if (backFacingNormal)
835 numConcaveEdgeHits++;
862#ifdef DEBUG_INTERNAL_EDGE
871 if (numConcaveEdgeHits > 0)
876 if (tri_normal.
dot(localContactNormalOnB) < 0)
884 btVector3 newNormal = tri_normal * frontFacing;
@ SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE
@ TRIANGLE_SHAPE_PROXYTYPE
@ TRIANGLE_MESH_SHAPE_PROXYTYPE
@ TERRAIN_SHAPE_PROXYTYPE
PHY_ScalarType
PHY_ScalarType enumerates possible scalar types.
static btScalar btGetAngle(const btVector3 &edgeA, const btVector3 &normalA, const btVector3 &normalB)
bool btClampNormal(const btVector3 &edge, const btVector3 &tri_normal_org, const btVector3 &localContactNormalOnB, btScalar correctedEdgeAngle, btVector3 &clampedLocalNormal)
void btAdjustInternalEdgeContacts(btManifoldPoint &cp, const btCollisionObjectWrapper *colObj0Wrap, const btCollisionObjectWrapper *colObj1Wrap, int partId0, int index0, int normalAdjustFlags)
Changes a btManifoldPoint collision normal to the normal from the mesh.
static int btGetHash(int partId, int triangleIndex)
void btGenerateInternalEdgeInfo(btBvhTriangleMeshShape *trimeshShape, btTriangleInfoMap *triangleInfoMap)
Call btGenerateInternalEdgeInfo to create triangle info, store in the shape 'userInfo'.
void btNearestPointInLineSegment(const btVector3 &point, const btVector3 &line0, const btVector3 &line1, btVector3 &nearestPoint)
@ BT_TRIANGLE_CONVEX_DOUBLE_SIDED
@ BT_TRIANGLE_CONVEX_BACKFACE_MODE
@ BT_TRIANGLE_CONCAVE_DOUBLE_SIDED
#define MAX_NUM_PARTS_IN_BITS
btScalar dot(const btQuaternion &q1, const btQuaternion &q2)
Calculate the dot product between two quaternions.
btVector3 quatRotate(const btQuaternion &rotation, const btVector3 &v)
btScalar length(const btQuaternion &q)
Return the length of a quaternion.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btScalar btAtan2(btScalar x, btScalar y)
btScalar btFabs(btScalar x)
#define TRI_INFO_V1V2_CONVEX
#define TRI_INFO_V0V1_CONVEX
for btTriangleInfo m_flags
#define TRI_INFO_V2V0_CONVEX
#define TRI_INFO_V2V0_SWAP_NORMALB
#define TRI_INFO_V1V2_SWAP_NORMALB
#define TRI_INFO_V0V1_SWAP_NORMALB
The btBvhTriangleMeshShape is a static-triangle mesh shape, it can only be used for fixed/non-moving ...
virtual void processAllTriangles(btTriangleCallback *callback, const btVector3 &aabbMin, const btVector3 &aabbMax) const
const btTriangleInfoMap * getTriangleInfoMap() const
void setTriangleInfoMap(btTriangleInfoMap *triangleInfoMap)
const btCollisionShape * getCollisionShape() const
void insert(const Key &key, const Value &value)
const Value * find(const Key &key) const
btHeightfieldTerrainShape simulates a 2D heightfield terrain
const struct btTriangleInfoMap * getTriangleInfoMap() const
virtual void processAllTriangles(btTriangleCallback *callback, const btVector3 &aabbMin, const btVector3 &aabbMax) const
process all triangles within the provided axis-aligned bounding box
void setTriangleInfoMap(btTriangleInfoMap *map)
The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations.
virtual void drawLine(const btVector3 &from, const btVector3 &to, const btVector3 &color)=0
ManifoldContactPoint collects and maintains persistent contactpoints.
btVector3 m_positionWorldOnA
m_positionWorldOnA is redundant information, see getPositionWorldOnA(), but for clarity
const btVector3 & getPositionWorldOnB() const
btVector3 m_normalWorldOnB
btVector3 m_positionWorldOnB
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
btMatrix3x3 transpose() const
Return the transpose of the matrix.
The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatr...
The btScaledBvhTriangleMeshShape allows to instance a scaled version of an existing btBvhTriangleMesh...
The btStridingMeshInterface is the interface class for high performance generic access to triangle me...
const btVector3 & getScaling() const
virtual void getLockedReadOnlyVertexIndexBase(const unsigned char **vertexbase, int &numverts, PHY_ScalarType &type, int &stride, const unsigned char **indexbase, int &indexstride, int &numfaces, PHY_ScalarType &indicestype, int subpart=0) const =0
virtual int getNumSubParts() const =0
getNumSubParts returns the number of separate subparts each subpart has a continuous array of vertice...
The btTriangleCallback provides a callback for each overlapping triangle when calling processAllTrian...
btStridingMeshInterface * getMeshInterface()
virtual void getVertex(int index, btVector3 &vert) const
void calcNormal(btVector3 &normal) const
btVector3 can be used to represent 3D points and vectors.
const btScalar & getZ() const
Return the z value.
void setMax(const btVector3 &other)
Set each element to the max of the current values and the values of another btVector3.
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)
btScalar length2() const
Return the length of the vector squared.
const btScalar & getY() const
Return the y value.
void setMin(const btVector3 &other)
Set each element to the min of the current values and the values of another btVector3.
btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
const btScalar & getX() const
Return the x value.
virtual void processTriangle(btVector3 *triangle, int partId, int triangleIndex)
b3ProcessAllTrianglesHeightfield(btHeightfieldTerrainShape *heightFieldShape, btTriangleInfoMap *triangleInfoMap)
btHeightfieldTerrainShape * m_heightfieldShape
btTriangleInfoMap * m_triangleInfoMap
const btCollisionShape * getCollisionShape() const
const btCollisionObject * getCollisionObject() const
const btTransform & getWorldTransform() const
btTriangleInfoMap * m_triangleInfoMap
btVector3 * m_triangleVerticesA
virtual void processTriangle(btVector3 *triangle, int partId, int triangleIndex)
The btTriangleInfoMap stores edge angle information for some triangles. You can compute this informat...
btScalar m_maxEdgeAngleThreshold
used to determine edge contacts: if the closest distance between a contact point and an edge is small...
btScalar m_equalVertexThreshold
used to determine if a triangle edge is planar with zero angle
The btTriangleInfo structure stores information to adjust collision normals to avoid collisions again...