Skip to content

Commit 3e55f5c

Browse files
committed
[GEN] Backport changes to normal value calculation in CollisionMath::Collide for OBBox-Tri collision from Zero Hour (#772)
1 parent d7a57cc commit 3e55f5c

File tree

1 file changed

+31
-28
lines changed

1 file changed

+31
-28
lines changed

Generals/Code/Libraries/Source/WWVegas/WWMath/colmathobbtri.cpp

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626
* *
2727
* Author:: Greg Hjelstrom *
2828
* *
29-
* $Modtime:: 5/04/01 8:37p $*
29+
* $Modtime:: 11/28/01 5:56p $*
3030
* *
31-
* $Revision:: 15 $*
31+
* $Revision:: 16 $*
3232
* *
3333
*---------------------------------------------------------------------------------------------*
3434
* Functions: *
@@ -527,7 +527,7 @@ static inline float eval_side(float val,int side)
527527
static inline void obbtri_compute_contact_normal
528528
(
529529
const BTCollisionStruct & context,
530-
CastResultStruct * result
530+
Vector3 * set_normal
531531
)
532532
{
533533
switch(context.AxisId)
@@ -536,55 +536,55 @@ static inline void obbtri_compute_contact_normal
536536
// WWASSERT(0);
537537
break;
538538
case AXIS_N:
539-
result->Normal = -context.Side * *context.Tri.N;
539+
*set_normal = -context.Side * *context.Tri.N;
540540
break;
541541
case AXIS_A0:
542-
result->Normal = -context.Side * context.A[0];
542+
*set_normal = -context.Side * context.A[0];
543543
break;
544544
case AXIS_A1:
545-
result->Normal = -context.Side * context.A[1];
545+
*set_normal = -context.Side * context.A[1];
546546
break;
547547
case AXIS_A2:
548-
result->Normal = -context.Side * context.A[2];
548+
*set_normal = -context.Side * context.A[2];
549549
break;
550550
case AXIS_A0E0:
551-
result->Normal = -context.Side * context.AxE[0][0];
552-
result->Normal.Normalize();
551+
*set_normal = -context.Side * context.AxE[0][0];
552+
set_normal->Normalize();
553553
break;
554554
case AXIS_A1E0:
555-
result->Normal = -context.Side * context.AxE[1][0];
556-
result->Normal.Normalize();
555+
*set_normal = -context.Side * context.AxE[1][0];
556+
set_normal->Normalize();
557557
break;
558558
case AXIS_A2E0:
559-
result->Normal = -context.Side * context.AxE[2][0];
560-
result->Normal.Normalize();
559+
*set_normal = -context.Side * context.AxE[2][0];
560+
set_normal->Normalize();
561561
break;
562562
case AXIS_A0E1:
563-
result->Normal = -context.Side * context.AxE[0][1];
564-
result->Normal.Normalize();
563+
*set_normal = -context.Side * context.AxE[0][1];
564+
set_normal->Normalize();
565565
break;
566566
case AXIS_A1E1:
567-
result->Normal = -context.Side * context.AxE[1][1];
568-
result->Normal.Normalize();
567+
*set_normal = -context.Side * context.AxE[1][1];
568+
set_normal->Normalize();
569569
break;
570570
case AXIS_A2E1:
571-
result->Normal = -context.Side * context.AxE[2][1];
572-
result->Normal.Normalize();
571+
*set_normal = -context.Side * context.AxE[2][1];
572+
set_normal->Normalize();
573573
break;
574574
case AXIS_A0E2:
575-
result->Normal = -context.Side * context.AxE[0][2];
576-
result->Normal.Normalize();
575+
*set_normal = -context.Side * context.AxE[0][2];
576+
set_normal->Normalize();
577577
break;
578578
case AXIS_A1E2:
579-
result->Normal = -context.Side * context.AxE[1][2];
580-
result->Normal.Normalize();
579+
*set_normal = -context.Side * context.AxE[1][2];
580+
set_normal->Normalize();
581581
break;
582582
case AXIS_A2E2:
583-
result->Normal = -context.Side * context.AxE[2][2];
584-
result->Normal.Normalize();
583+
*set_normal = -context.Side * context.AxE[2][2];
584+
set_normal->Normalize();
585585
break;
586586
}
587-
WWASSERT(result->Normal.Length2() > 0.0f);
587+
WWASSERT(set_normal->Length2() > 0.0f);
588588
}
589589

590590

@@ -1095,10 +1095,13 @@ bool CollisionMath::Collide
10951095

10961096
if ((context.MaxFrac < 1.0f) && (context.MaxFrac <= result->Fraction)) {
10971097

1098+
Vector3 normal;
1099+
obbtri_compute_contact_normal(context,&normal);
1100+
10981101
if ( (WWMath::Fabs(context.MaxFrac - result->Fraction) > WWMATH_EPSILON) ||
1099-
(Vector3::Dot_Product(*(tri.N),move) < Vector3::Dot_Product(result->Normal,move)) )
1102+
(Vector3::Dot_Product(normal,move) < Vector3::Dot_Product(result->Normal,move)) )
11001103
{
1101-
obbtri_compute_contact_normal(context,result);
1104+
result->Normal = normal; //obbtri_compute_contact_normal(context,result);
11021105
}
11031106

11041107
result->Fraction = context.MaxFrac;

0 commit comments

Comments
 (0)