Skip to content

[GEN] Backport collision test related changes and fixes in WWMath from Zero Hour #772

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Apr 28, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@
* *
* Project Name : WWMath *
* *
* $Archive:: /VSS_Sync/wwmath/cardinalspline.cpp $*
* $Archive:: /Commando/Code/wwmath/cardinalspline.cpp $*
* *
* Author:: Greg Hjelstrom *
* *
* $Modtime:: 6/13/01 2:18p $*
* $Modtime:: 9/16/01 4:07p $*
* *
* $Revision:: 5 $*
* $Revision:: 6 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
Expand Down Expand Up @@ -108,6 +108,7 @@ void CardinalSpline3DClass::Update_Tangents(void)
Tangents[0].InTangent.Set(0,0,0);
Tangents[0].OutTangent.Set(0,0,0);
}
return;
}

// First and Last Key:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@
* *
* Author:: Greg Hjelstrom *
* *
* $Modtime:: 11/14/00 2:46p $*
* $Modtime:: 8/30/01 7:40p $*
* *
* $Revision:: 21 $*
* $Revision:: 22 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
Expand Down Expand Up @@ -583,10 +583,11 @@ bool CollisionMath::Collide(const AABoxClass & box,const Vector3 & move,const AA

result->Fraction = context.MaxFrac;
result->Normal.Set(0,0,0);
result->Normal[context.AxisId] = context.Side;
result->Normal[context.AxisId] = -context.Side;

if (result->ComputeContactPoint) {
WWASSERT(0); // TODO
//WWASSERT(0); // TODO
WWDEBUG_SAY(("AABox-AABox collision does not currently support contact point computation\r\n"));
}

return true;
Expand Down
15 changes: 8 additions & 7 deletions Generals/Code/Libraries/Source/WWVegas/WWMath/colmathaabtri.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@
* *
* Author:: Greg Hjelstrom *
* *
* $Modtime:: 5/08/01 9:52a $*
* $Modtime:: 1/15/02 2:46p $*
* *
* $Revision:: 17 $*
* $Revision:: 19 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
Expand Down Expand Up @@ -503,10 +503,11 @@ static inline void aabtri_compute_contact_normal
switch(CollisionContext.AxisId)
{
case INTERSECTION:
set_norm = *CollisionContext.Tri->N;
set_norm = CollisionContext.N;
set_norm.Normalize();
break;
case AXIS_N:
set_norm = -CollisionContext.Side * *CollisionContext.Tri->N;
set_norm = -CollisionContext.Side * CollisionContext.N;
set_norm.Normalize();
break;
case AXIS_A0:
Expand Down Expand Up @@ -559,7 +560,8 @@ static inline void aabtri_compute_contact_normal
WWASSERT(set_norm.Length2() > 0.0f);

#else
set_norm = *CollisionContext.Tri.N;
set_norm = *CollisionContext.N;
set_norm.Normalize();
if (Vector3::Dot_Product(set_norm,CollisionContext.Move) > 0.0f) {
set_norm = -(set_norm);
}
Expand Down Expand Up @@ -832,8 +834,7 @@ bool CollisionMath::Collide
(Vector3::Dot_Product(tmp_norm,move) < Vector3::Dot_Product(result->Normal,move)))
{
result->Normal = tmp_norm;
#pragma message("fatal assert disabled for demo")
//WWASSERT(WWMath::Fabs(result->Normal.Length() - 1.0f) < WWMATH_EPSILON);
WWASSERT(WWMath::Fabs(result->Normal.Length() - 1.0f) < WWMATH_EPSILON);
}

result->Fraction = CollisionContext.MaxFrac;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@
* *
* Author:: Greg Hjelstrom *
* *
* $Modtime:: 5/04/01 8:37p $*
* $Modtime:: 1/04/02 6:29p $*
* *
* $Revision:: 14 $*
* $Revision:: 15 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
Expand Down Expand Up @@ -593,7 +593,7 @@ static inline bool obb_separation_test
if ( u1 > rsum ) {
context.MaxFrac = 1.0f;
return true;
} else {
} else if (WWMath::Fabs(u1-u0) > 0.0f) {
tmp = (rsum-u0)/(u1-u0);
if ( tmp > context.MaxFrac ) {
context.MaxFrac = tmp;
Expand All @@ -606,7 +606,7 @@ static inline bool obb_separation_test
if ( u1 < -rsum ) {
context.MaxFrac = 1.0f;
return true;
} else {
} else if (WWMath::Fabs(u1-u0) > 0.0f) {
tmp = (-rsum-u0)/(u1-u0);
if ( tmp > context.MaxFrac ) {
context.MaxFrac = tmp;
Expand Down
59 changes: 31 additions & 28 deletions Generals/Code/Libraries/Source/WWVegas/WWMath/colmathobbtri.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@
* *
* Author:: Greg Hjelstrom *
* *
* $Modtime:: 5/04/01 8:37p $*
* $Modtime:: 11/28/01 5:56p $*
* *
* $Revision:: 15 $*
* $Revision:: 16 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
Expand Down Expand Up @@ -527,7 +527,7 @@ static inline float eval_side(float val,int side)
static inline void obbtri_compute_contact_normal
(
const BTCollisionStruct & context,
CastResultStruct * result
Vector3 * set_normal
)
{
switch(context.AxisId)
Expand All @@ -536,55 +536,55 @@ static inline void obbtri_compute_contact_normal
// WWASSERT(0);
break;
case AXIS_N:
result->Normal = -context.Side * *context.Tri.N;
*set_normal = -context.Side * *context.Tri.N;
break;
case AXIS_A0:
result->Normal = -context.Side * context.A[0];
*set_normal = -context.Side * context.A[0];
break;
case AXIS_A1:
result->Normal = -context.Side * context.A[1];
*set_normal = -context.Side * context.A[1];
break;
case AXIS_A2:
result->Normal = -context.Side * context.A[2];
*set_normal = -context.Side * context.A[2];
break;
case AXIS_A0E0:
result->Normal = -context.Side * context.AxE[0][0];
result->Normal.Normalize();
*set_normal = -context.Side * context.AxE[0][0];
set_normal->Normalize();
break;
case AXIS_A1E0:
result->Normal = -context.Side * context.AxE[1][0];
result->Normal.Normalize();
*set_normal = -context.Side * context.AxE[1][0];
set_normal->Normalize();
break;
case AXIS_A2E0:
result->Normal = -context.Side * context.AxE[2][0];
result->Normal.Normalize();
*set_normal = -context.Side * context.AxE[2][0];
set_normal->Normalize();
break;
case AXIS_A0E1:
result->Normal = -context.Side * context.AxE[0][1];
result->Normal.Normalize();
*set_normal = -context.Side * context.AxE[0][1];
set_normal->Normalize();
break;
case AXIS_A1E1:
result->Normal = -context.Side * context.AxE[1][1];
result->Normal.Normalize();
*set_normal = -context.Side * context.AxE[1][1];
set_normal->Normalize();
break;
case AXIS_A2E1:
result->Normal = -context.Side * context.AxE[2][1];
result->Normal.Normalize();
*set_normal = -context.Side * context.AxE[2][1];
set_normal->Normalize();
break;
case AXIS_A0E2:
result->Normal = -context.Side * context.AxE[0][2];
result->Normal.Normalize();
*set_normal = -context.Side * context.AxE[0][2];
set_normal->Normalize();
break;
case AXIS_A1E2:
result->Normal = -context.Side * context.AxE[1][2];
result->Normal.Normalize();
*set_normal = -context.Side * context.AxE[1][2];
set_normal->Normalize();
break;
case AXIS_A2E2:
result->Normal = -context.Side * context.AxE[2][2];
result->Normal.Normalize();
*set_normal = -context.Side * context.AxE[2][2];
set_normal->Normalize();
break;
}
WWASSERT(result->Normal.Length2() > 0.0f);
WWASSERT(set_normal->Length2() > 0.0f);
}


Expand Down Expand Up @@ -1095,10 +1095,13 @@ bool CollisionMath::Collide

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

Vector3 normal;
obbtri_compute_contact_normal(context,&normal);

if ( (WWMath::Fabs(context.MaxFrac - result->Fraction) > WWMATH_EPSILON) ||
(Vector3::Dot_Product(*(tri.N),move) < Vector3::Dot_Product(result->Normal,move)) )
(Vector3::Dot_Product(normal,move) < Vector3::Dot_Product(result->Normal,move)) )
{
obbtri_compute_contact_normal(context,result);
result->Normal = normal; //obbtri_compute_contact_normal(context,result);
}

result->Fraction = context.MaxFrac;
Expand Down
Loading