mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2024-11-15 01:01:43 +00:00
New fixed math functions - ClosestPointOnVector, and Strength.
Normal also returns length now, since it is free.
This commit is contained in:
parent
7176490d5e
commit
9d5622c0bc
2 changed files with 140 additions and 103 deletions
|
@ -458,6 +458,20 @@ vector3_t *FV3_ClosestPointOnLine(const vector3_t *Line, const vector3_t *p, vec
|
|||
return FV3_AddEx(&Line[0], &V, out);
|
||||
}
|
||||
|
||||
//
|
||||
// ClosestPointOnVector
|
||||
//
|
||||
// Similar to ClosestPointOnLine, but uses a vector instead of two points.
|
||||
//
|
||||
void FV3_ClosestPointOnVector(const vector3_t *dir, const vector3_t *p, vector3_t *out)
|
||||
{
|
||||
fixed_t t = FV3_Dot(dir, p);
|
||||
|
||||
// Return the point on the line closest
|
||||
FV3_MulEx(dir, t, out);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// ClosestPointOnTriangle
|
||||
//
|
||||
|
@ -519,7 +533,7 @@ vector3_t *FV3_Point2Vec (const vector3_t *point1, const vector3_t *point2, vect
|
|||
//
|
||||
// Calculates the normal of a polygon.
|
||||
//
|
||||
void FV3_Normal (const vector3_t *a_triangle, vector3_t *a_normal)
|
||||
fixed_t FV3_Normal(const vector3_t *a_triangle, vector3_t *a_normal)
|
||||
{
|
||||
vector3_t a_1;
|
||||
vector3_t a_2;
|
||||
|
@ -529,7 +543,28 @@ void FV3_Normal (const vector3_t *a_triangle, vector3_t *a_normal)
|
|||
|
||||
FV3_Cross(&a_1, &a_2, a_normal);
|
||||
|
||||
FV3_NormalizeEx(a_normal, a_normal);
|
||||
return FV3_NormalizeEx(a_normal, a_normal);
|
||||
}
|
||||
|
||||
//
|
||||
// Strength
|
||||
//
|
||||
// Measures the 'strength' of a vector in a particular direction.
|
||||
//
|
||||
fixed_t FV3_Strength(const vector3_t *a_1, const vector3_t *dir)
|
||||
{
|
||||
vector3_t normal;
|
||||
fixed_t dist = FV3_NormalizeEx(a_1, &normal);
|
||||
fixed_t dot = FV3_Dot(&normal, dir);
|
||||
|
||||
FV3_ClosestPointOnVector(dir, a_1, &normal);
|
||||
|
||||
dist = FV3_Magnitude(&normal);
|
||||
|
||||
if (dot < 0) // Not facing same direction, so negate result.
|
||||
dist = -dist;
|
||||
|
||||
return dist;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -394,9 +394,11 @@ boolean FV3_Equal(const vector3_t *a_1, const vector3_t *a_2);
|
|||
fixed_t FV3_Dot(const vector3_t *a_1, const vector3_t *a_2);
|
||||
vector3_t *FV3_Cross(const vector3_t *a_1, const vector3_t *a_2, vector3_t *a_o);
|
||||
vector3_t *FV3_ClosestPointOnLine(const vector3_t *Line, const vector3_t *p, vector3_t *out);
|
||||
void FV3_ClosestPointOnVector(const vector3_t *dir, const vector3_t *p, vector3_t *out);
|
||||
void FV3_ClosestPointOnTriangle(const vector3_t *tri, const vector3_t *point, vector3_t *result);
|
||||
vector3_t *FV3_Point2Vec(const vector3_t *point1, const vector3_t *point2, vector3_t *a_o);
|
||||
void FV3_Normal(const vector3_t *a_triangle, vector3_t *a_normal);
|
||||
fixed_t FV3_Normal(const vector3_t *a_triangle, vector3_t *a_normal);
|
||||
fixed_t FV3_Strength(const vector3_t *a_1, const vector3_t *dir);
|
||||
fixed_t FV3_PlaneDistance(const vector3_t *a_normal, const vector3_t *a_point);
|
||||
boolean FV3_IntersectedPlane(const vector3_t *a_triangle, const vector3_t *a_line, vector3_t *a_normal, fixed_t *originDistance);
|
||||
fixed_t FV3_PlaneIntersection(const vector3_t *pOrigin, const vector3_t *pNormal, const vector3_t *rOrigin, const vector3_t *rVector);
|
||||
|
|
Loading…
Reference in a new issue