13 #ifdef DEBUG_INTERNAL_EDGE
15 #endif //DEBUG_INTERNAL_EDGE
18 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
23 gDebugDrawer = debugDrawer;
29 gDebugDrawer->
drawLine(from,to,color);
31 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
72 int sharedVertsA[3]={-1,-1,-1};
73 int sharedVertsB[3]={-1,-1,-1};
76 btScalar crossBSqr = ((triangle[1]-triangle[0]).cross(triangle[2]-triangle[0])).length2();
77 if (crossBSqr < m_triangleInfoMap->m_equalVertexThreshold)
83 if (crossASqr< m_triangleInfoMap->m_equalVertexThreshold)
87 printf(
"triangle A[0] = (%f,%f,%f)\ntriangle A[1] = (%f,%f,%f)\ntriangle A[2] = (%f,%f,%f)\n",
92 printf(
"partId=%d, triangleIndex=%d\n",partId,triangleIndex);
93 printf(
"triangle B[0] = (%f,%f,%f)\ntriangle B[1] = (%f,%f,%f)\ntriangle B[2] = (%f,%f,%f)\n",
94 triangle[0].getX(),triangle[0].getY(),triangle[0].getZ(),
95 triangle[1].getX(),triangle[1].getY(),triangle[1].getZ(),
96 triangle[2].getX(),triangle[2].getY(),triangle[2].getZ());
101 for (
int j=0;j<3;j++)
105 sharedVertsA[numshared] = i;
106 sharedVertsB[numshared] = j;
132 if (sharedVertsA[0] == 0 && sharedVertsA[1] == 2)
136 int tmp = sharedVertsB[1];
137 sharedVertsB[1] = sharedVertsB[0];
138 sharedVertsB[0] = tmp;
151 int sumvertsA = sharedVertsA[0]+sharedVertsA[1];
152 int otherIndexA = 3-sumvertsA;
158 int otherIndexB = 3-(sharedVertsB[0]+sharedVertsB[1]);
160 btTriangleShape tB(triangle[sharedVertsB[1]],triangle[sharedVertsB[0]],triangle[otherIndexB]);
172 if (edgeCrossA.
dot(tmp) < 0)
181 btVector3 tmp = triangle[otherIndexB]-triangle[sharedVertsB[0]];
182 if (edgeCrossB.
dot(tmp) < 0)
197 bool isConvex =
false;
199 if (len2<m_triangleInfoMap->m_planarEpsilon)
209 angle2 =
btGetAngle(calculatedNormalA,edgeCrossA,edgeCrossB);
213 isConvex = (dotA<0.);
215 correctedAngle = isConvex ? ang4 : -ang4;
239 #ifdef DEBUG_INTERNAL_EDGE
240 if ((computedNormalB-normalB).
length()>0.0001)
242 printf(
"warning: normals not identical\n");
244 #endif//DEBUG_INTERNAL_EDGE
257 if (computedNormalB.
dot(normalB)<0)
263 #ifdef DEBUG_INTERNAL_EDGE
264 if ((computedNormalB-normalB).
length()>0.0001)
266 printf(
"warning: normals not identical\n");
268 #endif //DEBUG_INTERNAL_EDGE
279 if (computedNormalB.
dot(normalB)<0)
284 #ifdef DEBUG_INTERNAL_EDGE
285 if ((computedNormalB-normalB).
length()>0.0001)
287 printf(
"warning: normals not identical\n");
289 #endif //DEBUG_INTERNAL_EDGE
322 for (
int partId = 0; partId< meshInterface->
getNumSubParts();partId++)
324 const unsigned char *vertexbase = 0;
328 const unsigned char *indexbase = 0;
338 for (
int triangleIndex = 0 ; triangleIndex < numfaces;triangleIndex++)
340 unsigned int* gfxbase = (
unsigned int*)(indexbase+triangleIndex*indexstride);
342 for (
int j=2;j>=0;j--)
345 int graphicsindex = indicestype==
PHY_SHORT?((
unsigned short*)gfxbase)[j]:gfxbase[j];
348 float* graphicsbase = (
float*)(vertexbase+graphicsindex*stride);
350 graphicsbase[0]*meshScaling.
getX(),
351 graphicsbase[1]*meshScaling.
getY(),
352 graphicsbase[2]*meshScaling.
getZ());
356 double* graphicsbase = (
double*)(vertexbase+graphicsindex*stride);
362 aabbMin.
setMin(triangleVerts[0]);
363 aabbMax.
setMax(triangleVerts[0]);
364 aabbMin.
setMin(triangleVerts[1]);
365 aabbMax.
setMax(triangleVerts[1]);
366 aabbMin.
setMin(triangleVerts[2]);
367 aabbMax.
setMax(triangleVerts[2]);
370 connectivityProcessor.
m_partIdA = partId;
394 nearestPoint = line0;
398 btScalar delta = (point-line0).
dot(lineDelta) / (lineDelta).
dot(lineDelta);
403 else if ( delta > 1 )
406 nearestPoint = line0 + lineDelta*delta;
422 if (correctedEdgeAngle<0)
424 if (curAngle < correctedEdgeAngle)
426 btScalar diffAngle = correctedEdgeAngle-curAngle;
428 clampedLocalNormal =
btMatrix3x3(rotation)*localContactNormalOnB;
433 if (correctedEdgeAngle>=0)
435 if (curAngle > correctedEdgeAngle)
437 btScalar diffAngle = correctedEdgeAngle-curAngle;
439 clampedLocalNormal =
btMatrix3x3(rotation)*localContactNormalOnB;
463 if (!triangleInfoMapPtr)
483 btVector3 red(1,0,0), green(0,1,0),blue(0,0,1),white(1,1,1),black(0,0,0);
492 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
493 const btTransform& tr = colObj0->getWorldTransform();
495 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
499 bool isNearEdge =
false;
501 int numConcaveEdgeHits = 0;
502 int numConvexEdgeHits = 0;
518 if( len < disttobestedge )
531 if( len < disttobestedge )
544 if( len < disttobestedge )
551 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
553 btDebugDrawLine(tr * v0 + upfix, tr * v1 + upfix, red );
557 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
561 if(len<triangleInfoMapPtr->m_edgeDistanceThreshold)
569 numConcaveEdgeHits++;
575 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
576 btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white);
577 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
585 btVector3 nB = swapFactor*computedNormalB;
589 bool backFacingNormal = (NdotA< triangleInfoMapPtr->
m_convexEpsilon) && (NdotB<triangleInfoMapPtr->m_convexEpsilon);
591 #ifdef DEBUG_INTERNAL_EDGE
596 #endif //DEBUG_INTERNAL_EDGE
599 if (backFacingNormal)
601 numConcaveEdgeHits++;
627 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
629 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
631 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
632 btDebugDrawLine(tr * v1 + upfix, tr * v2 + upfix , green );
637 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
639 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
644 if(len<triangleInfoMapPtr->m_edgeDistanceThreshold)
648 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
649 btDebugDrawLine(tr*nearest,tr*(nearest+tri_normal*10),white);
650 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
658 numConcaveEdgeHits++;
663 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
664 btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white);
665 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
673 btVector3 nB = swapFactor*computedNormalB;
675 #ifdef DEBUG_INTERNAL_EDGE
679 #endif //DEBUG_INTERNAL_EDGE
684 bool backFacingNormal = (NdotA< triangleInfoMapPtr->
m_convexEpsilon) && (NdotB<triangleInfoMapPtr->m_convexEpsilon);
686 if (backFacingNormal)
688 numConcaveEdgeHits++;
714 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
716 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
717 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
718 btDebugDrawLine(tr * v2 + upfix, tr * v0 + upfix , blue );
724 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
726 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
729 if(len<triangleInfoMapPtr->m_edgeDistanceThreshold)
733 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
734 btDebugDrawLine(tr*nearest,tr*(nearest+tri_normal*10),white);
735 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
741 numConcaveEdgeHits++;
747 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
748 btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white);
749 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
756 btVector3 nB = swapFactor*computedNormalB;
758 #ifdef DEBUG_INTERNAL_EDGE
762 #endif //DEBUG_INTERNAL_EDGE
766 bool backFacingNormal = (NdotA< triangleInfoMapPtr->
m_convexEpsilon) && (NdotB<triangleInfoMapPtr->m_convexEpsilon);
768 if (backFacingNormal)
770 numConcaveEdgeHits++;
800 #ifdef DEBUG_INTERNAL_EDGE
805 #endif //DEBUG_INTERNAL_EDGE
810 if (numConcaveEdgeHits>0)
815 if (tri_normal.
dot(localContactNormalOnB) < 0)
822 btVector3 newNormal = tri_normal *frontFacing;
824 btScalar d = newNormal.
dot(localContactNormalOnB) ;