64#define AXISLEN_EPSILON2 WWMATH_EPSILON * WWMATH_EPSILON
163 A[0].Set(
Box.Basis[0][0],
Box.Basis[1][0],
Box.Basis[2][0]);
164 A[1].Set(
Box.Basis[0][1],
Box.Basis[1][1],
Box.Basis[2][1]);
165 A[2].Set(
Box.Basis[0][2],
Box.Basis[1][2],
Box.Basis[2][2]);
224static inline bool obbtri_collision_separation_test
227 float lp,
float leb0,
float leb1
244 if (lp - leb0 <= 0.0f) {
248 if (lp - leb0 > -eps) {
250 if (leb1 - leb0 > 0.0f) {
251 float frac = (lp-leb0)/(leb1-leb0);
308 axismove = -axismove;
319 leb1 = leb0 + axismove;
327 return obbtri_collision_separation_test(context,lp,leb0,leb1);
348static inline bool obbtri_check_collision_cross_axis
367 axismove = -axismove;
376 leb1 = leb0 + axismove;
380 if (dp < 0) { lp = dp; context.
TestPoint = dpi; }
383 return obbtri_collision_separation_test(context,lp,leb0,leb1);
404static inline bool obbtri_check_collision_basis_axis
423 axismove = -axismove;
433 leb1 = leb0 + axismove;
437 if (dp1 < lp) { lp = dp1; context.
TestPoint = 1; }
438 if (dp2 < lp) { lp = dp2; context.
TestPoint = 2; }
441 return obbtri_collision_separation_test(context,lp,leb0,leb1);
461static inline bool obbtri_check_collision_normal_axis(
BTCollisionStruct & context)
475 axismove = -axismove;
485 leb1 = leb0 + axismove;
489 return obbtri_collision_separation_test(context,lp,leb0,leb1);
504static inline float eval_side(
float val,
int side)
508 }
else if (val < 0.0f) {
527static inline void obbtri_compute_contact_normal
539 *set_normal = -context.
Side * *context.
Tri.
N;
542 *set_normal = -context.
Side * context.
A[0];
545 *set_normal = -context.
Side * context.
A[1];
548 *set_normal = -context.
Side * context.
A[2];
551 *set_normal = -context.
Side * context.
AxE[0][0];
555 *set_normal = -context.
Side * context.
AxE[1][0];
559 *set_normal = -context.
Side * context.
AxE[2][0];
563 *set_normal = -context.
Side * context.
AxE[0][1];
567 *set_normal = -context.
Side * context.
AxE[1][1];
571 *set_normal = -context.
Side * context.
AxE[2][1];
575 *set_normal = -context.
Side * context.
AxE[0][2];
579 *set_normal = -context.
Side * context.
AxE[1][2];
583 *set_normal = -context.
Side * context.
AxE[2][2];
603static inline void eval_A0_point(
const BTCollisionStruct & context,
float * x,
int edge)
608 x[1] = -eval_side(context.
AE[2][edge],context.
Side) * context.
Box.
Extent[1];
609 x[2] = eval_side(context.
AE[1][edge],context.
Side) * context.
Box.
Extent[2];
610 if (context.
Point == 0) { yval = 0.0f; }
else { yval = 1.0f; }
646static inline void eval_A1_point(
const BTCollisionStruct & context,
float * x,
int edge)
651 x[0] = eval_side(context.
AE[2][edge],context.
Side) * context.
Box.
Extent[0];
652 x[2] = -eval_side(context.
AE[0][edge],context.
Side) * context.
Box.
Extent[2];
653 if (context.
Point == 0) { yval = 0.0f; }
else { yval = 1.0f; }
688static inline void eval_A2_point(
const BTCollisionStruct & context,
float * x,
int edge)
693 x[0] = -eval_side(context.
AE[1][edge],context.
Side) * context.
Box.
Extent[0];
694 x[1] = eval_side(context.
AE[0][edge],context.
Side) * context.
Box.
Extent[1];
695 if (context.
Point == 0) { yval = 0.0f; }
else { yval = 1.0f; }
731static inline void obbtri_compute_contact_point
743 context.
FinalD = newv0 - newc;
755 for (i = 0; i < 3; i++) {
764 if (context.
Point == 0) {
766 }
else if (context.
Point == 1) {
775 eval_A0_point(context,x,0);
779 eval_A0_point(context,x,1);
783 eval_A0_point(context,x,2);
787 eval_A1_point(context,x,0);
791 eval_A1_point(context,x,1);
795 eval_A1_point(context,x,2);
799 eval_A2_point(context,x,0);
803 eval_A2_point(context,x,1);
807 eval_A2_point(context,x,2);
851 x[0]*context.
A[0].
X +
852 x[1]*context.
A[1].
X +
856 x[0]*context.
A[0].
Y +
857 x[1]*context.
A[1].
Y +
861 x[0]*context.
A[0].
Z +
862 x[1]*context.
A[1].
Z +
903 if (obbtri_check_collision_normal_axis(context))
goto exit;
912 if (obbtri_check_collision_basis_axis(context,box.
Extent.
X,context.
AE[0][0],context.
AE[0][1]))
goto exit;
921 if (obbtri_check_collision_basis_axis(context,box.
Extent.
Y,context.
AE[1][0],context.
AE[1][1]))
goto exit;
930 if (obbtri_check_collision_basis_axis(context,box.
Extent.
Z,context.
AE[2][0],context.
AE[2][1]))
goto exit;
941 if (obbtri_check_collision_cross_axis(context,dp,2,leb0))
goto exit;
953 if (obbtri_check_collision_cross_axis(context,dp,1,leb0))
goto exit;
967 if (obbtri_check_collision_cross_axis(context,dp,1,leb0))
goto exit;
979 if (obbtri_check_collision_cross_axis(context,dp,2,leb0))
goto exit;
991 if (obbtri_check_collision_cross_axis(context,dp,1,leb0))
goto exit;
1002 dp = -context.
AN[1];
1004 if (obbtri_check_collision_cross_axis(context,dp,1,leb0))
goto exit;
1016 if (obbtri_check_collision_cross_axis(context,dp,2,leb0))
goto exit;
1026 dp = -context.
AN[2];
1028 if (obbtri_check_collision_cross_axis(context,dp,1,leb0))
goto exit;
1038 dp = -context.
AN[2];
1040 if (obbtri_check_collision_cross_axis(context,dp,1,leb0))
goto exit;
1052 if (obbtri_check_collision_axis(context))
goto exit;
1056 if (obbtri_check_collision_axis(context))
goto exit;
1060 if (obbtri_check_collision_axis(context))
goto exit;
1066#pragma message ("(gth) disabling an assert in obb->tri collision, investigate later\n")
1099 obbtri_compute_contact_normal(context,&normal);
1110 obbtri_compute_contact_point(context,result);
1198static inline bool obbtri_intersection_separation_test
1211 if (lp - leb0 <= 0.0f) {
1215 return (lp - leb0 > -eps);
1234static inline bool obbtri_check_intersection_cross_axis
1255 if (dp < 0) { lp = dp; }
1258 return obbtri_intersection_separation_test(context,lp,leb0);
1277static inline bool obbtri_check_intersection_basis_axis
1300 if (dp1 < lp) { lp = dp1; }
1301 if (dp2 < lp) { lp = dp2; }
1304 return obbtri_intersection_separation_test(context,lp,leb0);
1323static inline bool obbtri_check_intersection_normal_axis
1345 return obbtri_intersection_separation_test(context,lp,leb0);
1378 if (obbtri_check_intersection_normal_axis(context))
return false;
1386 if (obbtri_check_intersection_basis_axis(context,box.
Extent.
X,context.
AE[0][0],context.
AE[0][1]))
return false;
1394 if (obbtri_check_intersection_basis_axis(context,box.
Extent.
Y,context.
AE[1][0],context.
AE[1][1]))
return false;
1402 if (obbtri_check_intersection_basis_axis(context,box.
Extent.
Z,context.
AE[2][0],context.
AE[2][1]))
return false;
1412 if (obbtri_check_intersection_cross_axis(context,dp,leb0))
return false;
1421 dp = -context.
AN[0];
1423 if (obbtri_check_intersection_cross_axis(context,dp,leb0))
return false;
1434 dp = -context.
AN[0];
1436 if (obbtri_check_intersection_cross_axis(context,dp,leb0))
return false;
1447 if (obbtri_check_intersection_cross_axis(context,dp,leb0))
return false;
1456 dp = -context.
AN[1];
1458 if (obbtri_check_intersection_cross_axis(context,dp,leb0))
return false;
1468 dp = -context.
AN[1];
1470 if (obbtri_check_intersection_cross_axis(context,dp,leb0))
return false;
1481 if (obbtri_check_intersection_cross_axis(context,dp,leb0))
return false;
1490 dp = -context.
AN[2];
1492 if (obbtri_check_intersection_cross_axis(context,dp,leb0))
return false;
1501 dp = -context.
AN[2];
1503 if (obbtri_check_intersection_cross_axis(context,dp,leb0))
return false;
static bool Collide(const LineSegClass &line, const AAPlaneClass &plane, CastResultStruct *result)
static bool Intersection_Test(const AABoxClass &box, const TriClass &tri)
static WWINLINE float Dot_Product(const Vector3 &a, const Vector3 &b)
WWINLINE float Length2(void) const
WWINLINE float Length(void) const
static WWINLINE void Subtract(const Vector3 &a, const Vector3 &b, Vector3 *c)
static WWINLINE void Add(const Vector3 &a, const Vector3 &b, Vector3 *c)
static WWINLINE void Cross_Product(const Vector3 &a, const Vector3 &b, Vector3 *result)
static WWINLINE float Fabs(float val)
#define TRACK_COLLISION_OBBOX_TRI
#define TRACK_COLLISION_OBBOX_TRI_HIT
const float COLLISION_EPSILON
BTCollisionStruct(const OBBoxClass &box, const Vector3 &move, const TriClass &tri, const Vector3 &trimove)
BTIntersectStruct(const OBBoxClass &box, const TriClass &tri)