| 48 | //----------------------------------------------------------------------------- |
| 49 | |
| 50 | bool Box3F::collideLine(const Point3F& start, const Point3F& end, F32* t, Point3F* n) const |
| 51 | { |
| 52 | // Collide against bounding box. Need at least this for the editor. |
| 53 | F32 st,et; |
| 54 | F32 fst = 0; |
| 55 | F32 fet = 1; |
| 56 | const F32* bmin = &minExtents.x; |
| 57 | const F32* bmax = &maxExtents.x; |
| 58 | const F32* si = &start.x; |
| 59 | const F32* ei = &end.x; |
| 60 | |
| 61 | static const Point3F na[3] = { Point3F(1.0f, 0.0f, 0.0f), Point3F(0.0f, 1.0f, 0.0f), Point3F(0.0f, 0.0f, 1.0f) }; |
| 62 | Point3F finalNormal(0.0f, 0.0f, 0.0f); |
| 63 | |
| 64 | for (S32 i = 0; i < 3; i++) { |
| 65 | bool n_neg = false; |
| 66 | if (si[i] < ei[i]) { |
| 67 | if (si[i] > bmax[i] || ei[i] < bmin[i]) |
| 68 | return false; |
| 69 | F32 di = ei[i] - si[i]; |
| 70 | st = (si[i] < bmin[i]) ? (bmin[i] - si[i]) / di : 0.0f; |
| 71 | et = (ei[i] > bmax[i]) ? (bmax[i] - si[i]) / di : 1.0f; |
| 72 | n_neg = true; |
| 73 | } |
| 74 | else { |
| 75 | if (ei[i] > bmax[i] || si[i] < bmin[i]) |
| 76 | return false; |
| 77 | F32 di = ei[i] - si[i]; |
| 78 | st = (si[i] > bmax[i]) ? (bmax[i] - si[i]) / di : 0.0f; |
| 79 | et = (ei[i] < bmin[i]) ? (bmin[i] - si[i]) / di : 1.0f; |
| 80 | } |
| 81 | if (st > fst) { |
| 82 | fst = st; |
| 83 | finalNormal = na[i]; |
| 84 | if ( n_neg ) |
| 85 | finalNormal.neg(); |
| 86 | } |
| 87 | if (et < fet) |
| 88 | fet = et; |
| 89 | |
| 90 | if (fet < fst) |
| 91 | return false; |
| 92 | } |
| 93 | |
| 94 | *t = fst; |
| 95 | *n = finalNormal; |
| 96 | return true; |
| 97 | } |
| 98 | |
| 99 | //----------------------------------------------------------------------------- |
| 100 |
no test coverage detected