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;
243 #ifdef DEBUG_INTERNAL_EDGE
244 if ((computedNormalB-normalB).
length()>0.0001)
246 printf(
"warning: normals not identical\n");
248 #endif//DEBUG_INTERNAL_EDGE
261 if (computedNormalB.
dot(normalB)<0)
267 #ifdef DEBUG_INTERNAL_EDGE
268 if ((computedNormalB-normalB).length()>0.0001)
270 printf(
"warning: normals not identical\n");
272 #endif //DEBUG_INTERNAL_EDGE
283 if (computedNormalB.
dot(normalB)<0)
288 #ifdef DEBUG_INTERNAL_EDGE
289 if ((computedNormalB-normalB).length()>0.0001)
291 printf(
"warning: normals not identical\n");
293 #endif //DEBUG_INTERNAL_EDGE
326 for (
int partId = 0; partId< meshInterface->
getNumSubParts();partId++)
328 const unsigned char *vertexbase = 0;
332 const unsigned char *indexbase = 0;
342 for (
int triangleIndex = 0 ; triangleIndex < numfaces;triangleIndex++)
344 unsigned int* gfxbase = (
unsigned int*)(indexbase+triangleIndex*indexstride);
346 for (
int j=2;j>=0;j--)
349 int graphicsindex = indicestype==
PHY_SHORT?((
unsigned short*)gfxbase)[j]:gfxbase[j];
352 float* graphicsbase = (
float*)(vertexbase+graphicsindex*stride);
354 graphicsbase[0]*meshScaling.
getX(),
355 graphicsbase[1]*meshScaling.
getY(),
356 graphicsbase[2]*meshScaling.
getZ());
360 double* graphicsbase = (
double*)(vertexbase+graphicsindex*stride);
366 aabbMin.
setMin(triangleVerts[0]);
367 aabbMax.
setMax(triangleVerts[0]);
368 aabbMin.
setMin(triangleVerts[1]);
369 aabbMax.
setMax(triangleVerts[1]);
370 aabbMin.
setMin(triangleVerts[2]);
371 aabbMax.
setMax(triangleVerts[2]);
374 connectivityProcessor.
m_partIdA = partId;
398 nearestPoint = line0;
402 btScalar delta = (point-line0).
dot(lineDelta) / (lineDelta).
dot(lineDelta);
407 else if ( delta > 1 )
410 nearestPoint = line0 + lineDelta*delta;
426 if (correctedEdgeAngle<0)
428 if (curAngle < correctedEdgeAngle)
430 btScalar diffAngle = correctedEdgeAngle-curAngle;
432 clampedLocalNormal =
btMatrix3x3(rotation)*localContactNormalOnB;
437 if (correctedEdgeAngle>=0)
439 if (curAngle > correctedEdgeAngle)
441 btScalar diffAngle = correctedEdgeAngle-curAngle;
443 clampedLocalNormal =
btMatrix3x3(rotation)*localContactNormalOnB;
467 if (!triangleInfoMapPtr)
487 btVector3 red(1,0,0), green(0,1,0),blue(0,0,1),white(1,1,1),black(0,0,0);
496 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
497 const btTransform& tr = colObj0->getWorldTransform();
499 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
503 bool isNearEdge =
false;
505 int numConcaveEdgeHits = 0;
506 int numConvexEdgeHits = 0;
522 if( len < disttobestedge )
535 if( len < disttobestedge )
548 if( len < disttobestedge )
555 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
557 btDebugDrawLine(tr * v0 + upfix, tr * v1 + upfix, red );
561 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
565 if(len<triangleInfoMapPtr->m_edgeDistanceThreshold)
568 btVector3 edge(v0-v1);
573 numConcaveEdgeHits++;
579 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
580 btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white);
581 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
583 btVector3 nA = swapFactor * tri_normal;
586 btVector3 computedNormalB =
quatRotate(orn,tri_normal);
589 btVector3 nB = swapFactor*computedNormalB;
591 btScalar NdotA = localContactNormalOnB.
dot(nA);
592 btScalar NdotB = localContactNormalOnB.
dot(nB);
593 bool backFacingNormal = (NdotA< triangleInfoMapPtr->
m_convexEpsilon) && (NdotB<triangleInfoMapPtr->m_convexEpsilon);
595 #ifdef DEBUG_INTERNAL_EDGE
600 #endif //DEBUG_INTERNAL_EDGE
603 if (backFacingNormal)
605 numConcaveEdgeHits++;
610 btVector3 clampedLocalNormal;
631 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
633 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
635 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
636 btDebugDrawLine(tr * v1 + upfix, tr * v2 + upfix , green );
641 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
643 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
648 if(len<triangleInfoMapPtr->m_edgeDistanceThreshold)
652 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
653 btDebugDrawLine(tr*nearest,tr*(nearest+tri_normal*10),white);
654 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
656 btVector3 edge(v1-v2);
662 numConcaveEdgeHits++;
667 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
668 btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white);
669 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
671 btVector3 nA = swapFactor * tri_normal;
674 btVector3 computedNormalB =
quatRotate(orn,tri_normal);
677 btVector3 nB = swapFactor*computedNormalB;
679 #ifdef DEBUG_INTERNAL_EDGE
683 #endif //DEBUG_INTERNAL_EDGE
686 btScalar NdotA = localContactNormalOnB.
dot(nA);
687 btScalar NdotB = localContactNormalOnB.
dot(nB);
688 bool backFacingNormal = (NdotA< triangleInfoMapPtr->
m_convexEpsilon) && (NdotB<triangleInfoMapPtr->m_convexEpsilon);
690 if (backFacingNormal)
692 numConcaveEdgeHits++;
698 btVector3 clampedLocalNormal;
718 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
720 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
721 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
722 btDebugDrawLine(tr * v2 + upfix, tr * v0 + upfix , blue );
728 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
730 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
733 if(len<triangleInfoMapPtr->m_edgeDistanceThreshold)
737 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
738 btDebugDrawLine(tr*nearest,tr*(nearest+tri_normal*10),white);
739 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
741 btVector3 edge(v2-v0);
745 numConcaveEdgeHits++;
751 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
752 btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white);
753 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
755 btVector3 nA = swapFactor * tri_normal;
757 btVector3 computedNormalB =
quatRotate(orn,tri_normal);
760 btVector3 nB = swapFactor*computedNormalB;
762 #ifdef DEBUG_INTERNAL_EDGE
766 #endif //DEBUG_INTERNAL_EDGE
768 btScalar NdotA = localContactNormalOnB.
dot(nA);
769 btScalar NdotB = localContactNormalOnB.
dot(nB);
770 bool backFacingNormal = (NdotA< triangleInfoMapPtr->
m_convexEpsilon) && (NdotB<triangleInfoMapPtr->m_convexEpsilon);
772 if (backFacingNormal)
774 numConcaveEdgeHits++;
783 btVector3 clampedLocalNormal;
804 #ifdef DEBUG_INTERNAL_EDGE
806 btVector3 color(0,1,1);
809 #endif //DEBUG_INTERNAL_EDGE
814 if (numConcaveEdgeHits>0)
819 if (tri_normal.
dot(localContactNormalOnB) < 0)
826 btVector3 newNormal = tri_normal *frontFacing;
828 btScalar d = newNormal.
dot(localContactNormalOnB) ;