| 522 | //----------------------------------------------------------------------------- |
| 523 | |
| 524 | F32 mTriangleDistance( const Point3F &A, const Point3F &B, const Point3F &C, const Point3F &P, IntersectInfo* info ) |
| 525 | { |
| 526 | Point3F diff = A - P; |
| 527 | Point3F edge0 = B - A; |
| 528 | Point3F edge1 = C - A; |
| 529 | F32 a00 = edge0.lenSquared(); |
| 530 | F32 a01 = mDot( edge0, edge1 ); |
| 531 | F32 a11 = edge1.lenSquared(); |
| 532 | F32 b0 = mDot( diff, edge0 ); |
| 533 | F32 b1 = mDot( diff, edge1 ); |
| 534 | F32 c = diff.lenSquared(); |
| 535 | F32 det = mFabs(a00*a11-a01*a01); |
| 536 | F32 s = a01*b1-a11*b0; |
| 537 | F32 t = a01*b0-a00*b1; |
| 538 | F32 sqrDistance; |
| 539 | |
| 540 | if (s + t <= det) |
| 541 | { |
| 542 | if (s < 0.0f) |
| 543 | { |
| 544 | if (t < 0.0f) // region 4 |
| 545 | { |
| 546 | if (b0 < 0.0f) |
| 547 | { |
| 548 | t = 0.0f; |
| 549 | if (-b0 >= a00) |
| 550 | { |
| 551 | s = 1.0f; |
| 552 | sqrDistance = a00 + (2.0f)*b0 + c; |
| 553 | } |
| 554 | else |
| 555 | { |
| 556 | s = -b0/a00; |
| 557 | sqrDistance = b0*s + c; |
| 558 | } |
| 559 | } |
| 560 | else |
| 561 | { |
| 562 | s = 0.0f; |
| 563 | if (b1 >= 0.0f) |
| 564 | { |
| 565 | t = 0.0f; |
| 566 | sqrDistance = c; |
| 567 | } |
| 568 | else if (-b1 >= a11) |
| 569 | { |
| 570 | t = 1.0f; |
| 571 | sqrDistance = a11 + 2.0f*b1 + c; |
| 572 | } |
| 573 | else |
| 574 | { |
| 575 | t = -b1/a11; |
| 576 | sqrDistance = b1*t + c; |
| 577 | } |
| 578 | } |
| 579 | } |
| 580 | else // region 3 |
| 581 | { |
no test coverage detected