bool MFCollision_TriTriTest(const MFVector& V0, const MFVector& V1, const MFVector& V2, const MFVector& U0, const MFVector& U1, const MFVector& U2) { MFVector E1, E2; MFVector N1, N2; MFVector D; float d1,d2; float du0,du1,du2,dv0,dv1,dv2; float isect1[2], isect2[2]; float du0du1,du0du2,dv0dv1,dv0dv2; short index; float vp0,vp1,vp2; float up0,up1,up2; float bb,cc,max; float a,b,c,x0,x1; float d,e,f,y0,y1; float xx,yy,xxyy,tmp; /* compute plane equation of triangle(V0,V1,V2) */ E1 = V1-V0; E2 = V2-V0; N1.Cross3(E1, E2); d1 = -N1.Dot3(V0); /* plane equation 1: N1.X+d1=0 */ /* put U0,U1,U2 into plane equation 1 to compute signed distances to the plane*/ du0 = N1.Dot3(U0) + d1; du1 = N1.Dot3(U1) + d1; du2 = N1.Dot3(U2) + d1; /* coplanarity robustness check */ if(fabsf(du0)<MFALMOST_ZERO) du0=0.0f; if(fabsf(du1)<MFALMOST_ZERO) du1=0.0f; if(fabsf(du2)<MFALMOST_ZERO) du2=0.0f; du0du1 = du0*du1; du0du2 = du0*du2; if(du0du1>0.0f && du0du2>0.0f) /* same sign on all of them + not equal 0 ? */ return false; /* no intersection occurs */ /* compute plane of triangle (U0,U1,U2) */ E1 = U1 - U0; E2 = U2 - U0; N2.Cross3(E1, E2); d2 = -N2.Dot3(U0); /* plane equation 2: N2.X+d2=0 */ /* put V0,V1,V2 into plane equation 2 */ dv0 = N2.Dot3(V0) + d2; dv1 = N2.Dot3(V1) + d2; dv2 = N2.Dot3(V2) + d2; if(fabsf(dv0)<MFALMOST_ZERO) dv0=0.0; if(fabsf(dv1)<MFALMOST_ZERO) dv1=0.0; if(fabsf(dv2)<MFALMOST_ZERO) dv2=0.0; dv0dv1 = dv0*dv1; dv0dv2 = dv0*dv2; if(dv0dv1>0.0f && dv0dv2>0.0f) /* same sign on all of them + not equal 0 ? */ return false; /* no intersection occurs */ /* compute direction of intersection line */ D.Cross3(N1, N2); /* compute and index to the largest component of D */ max = fabsf(D.x); index = 0; bb = fabsf(D.y); cc = fabsf(D.z); if(bb>max) max = bb, index = 1; if(cc>max) max = cc, index = 2; /* this is the simplified projection onto L*/ vp0 = V0[index]; vp1 = V1[index]; vp2 = V2[index]; up0 = U0[index]; up1 = U1[index]; up2 = U2[index]; /* compute interval for triangle 1 */ NEWCOMPUTE_INTERVALS(vp0,vp1,vp2,dv0,dv1,dv2,dv0dv1,dv0dv2,a,b,c,x0,x1); /* compute interval for triangle 2 */ NEWCOMPUTE_INTERVALS(up0,up1,up2,du0,du1,du2,du0du1,du0du2,d,e,f,y0,y1); xx=x0*x1; yy=y0*y1; xxyy=xx*yy; tmp=a*xxyy; isect1[0]=tmp+b*x1*yy; isect1[1]=tmp+c*x0*yy; tmp=d*xxyy; isect2[0]=tmp+e*xx*y1; isect2[1]=tmp+f*xx*y0; SORT(isect1[0],isect1[1]); SORT(isect2[0],isect2[1]); if(isect1[1]<isect2[0] || isect2[1]<isect1[0]) return false; return true; }