| 509 | //----------------------------------------------------------------------------- |
| 510 | |
| 511 | F32 mTriangleDistance( const Point3F &A, const Point3F &B, const Point3F &C, const Point3F &P, IntersectInfo* info ) |
| 512 | { |
| 513 | Point3F diff = A - P; |
| 514 | Point3F edge0 = B - A; |
| 515 | Point3F edge1 = C - A; |
| 516 | F32 a00 = edge0.lenSquared(); |
| 517 | F32 a01 = mDot( edge0, edge1 ); |
| 518 | F32 a11 = edge1.lenSquared(); |
| 519 | F32 b0 = mDot( diff, edge0 ); |
| 520 | F32 b1 = mDot( diff, edge1 ); |
| 521 | F32 c = diff.lenSquared(); |
| 522 | F32 det = mFabs(a00*a11-a01*a01); |
| 523 | F32 s = a01*b1-a11*b0; |
| 524 | F32 t = a01*b0-a00*b1; |
| 525 | F32 sqrDistance; |
| 526 | |
| 527 | if (s + t <= det) |
| 528 | { |
| 529 | if (s < 0.0f) |
| 530 | { |
| 531 | if (t < 0.0f) // region 4 |
| 532 | { |
| 533 | if (b0 < 0.0f) |
| 534 | { |
| 535 | t = 0.0f; |
| 536 | if (-b0 >= a00) |
| 537 | { |
| 538 | s = 1.0f; |
| 539 | sqrDistance = a00 + (2.0f)*b0 + c; |
| 540 | } |
| 541 | else |
| 542 | { |
| 543 | s = -b0/a00; |
| 544 | sqrDistance = b0*s + c; |
| 545 | } |
| 546 | } |
| 547 | else |
| 548 | { |
| 549 | s = 0.0f; |
| 550 | if (b1 >= 0.0f) |
| 551 | { |
| 552 | t = 0.0f; |
| 553 | sqrDistance = c; |
| 554 | } |
| 555 | else if (-b1 >= a11) |
| 556 | { |
| 557 | t = 1.0f; |
| 558 | sqrDistance = a11 + 2.0f*b1 + c; |
| 559 | } |
| 560 | else |
| 561 | { |
| 562 | t = -b1/a11; |
| 563 | sqrDistance = b1*t + c; |
| 564 | } |
| 565 | } |
| 566 | } |
| 567 | else // region 3 |
| 568 | { |
no test coverage detected