Big fixes.

This commit is contained in:
THoehne 2024-07-24 23:01:25 +02:00
parent 6f3fd9053d
commit 0fe66ad44a
6 changed files with 106 additions and 38 deletions

View File

@ -38,7 +38,10 @@ namespace Phanes::Core::Math::Detail
{ {
static constexpr void map(Phanes::Core::Math::TVector4<T, false>& v1, const TVector4<T, false>& v2) static constexpr void map(Phanes::Core::Math::TVector4<T, false>& v1, const TVector4<T, false>& v2)
{ {
memcpy(v1.data, v2.data, 4 * sizeof(T)); v1.x = v2.x;
v1.y = v2.y;
v1.z = v2.z;
v1.w = v2.w;
} }

View File

@ -86,6 +86,18 @@ namespace Phanes::Core::Math {
return "(" + ToString(v.x) + ", " + ToString(v.y) + ", " + ToString(v.z) + ")"; return "(" + ToString(v.x) + ", " + ToString(v.y) + ", " + ToString(v.z) + ")";
} }
template<RealType T, bool S>
std::string ToString(const TVector4<T, S>& v)
{
return "(" + ToString(v.x) + ", " + ToString(v.y) + ", " + ToString(v.z) + ", " + ToString(v.w) + ")";
}
template<IntType T, bool S>
std::string ToString(const TIntVector4<T, S>& v)
{
return "(" + ToString(v.x) + ", " + ToString(v.y) + ", " + ToString(v.z) + ", " + ToString(v.w) + ")";
}
//std::string toString(const Vector4& v); //std::string toString(const Vector4& v);

View File

@ -420,7 +420,7 @@ namespace Phanes::Core::Math {
TVector2<T, false> NormalizeV(TVector2<T, false>& v1) TVector2<T, false> NormalizeV(TVector2<T, false>& v1)
{ {
float vecNorm = Magnitude(v1); float vecNorm = Magnitude(v1);
v1 /= (vecNorm < P_FLT_INAC) ? 1 : vecNorm; v1 /= (vecNorm < P_FLT_INAC) ? (T)1.0 : vecNorm;
return v1; return v1;
} }
@ -953,7 +953,7 @@ namespace Phanes::Core::Math {
TVector2<T, false> Normalize(const TVector2<T, false>& v1) TVector2<T, false> Normalize(const TVector2<T, false>& v1)
{ {
float vecNorm = Magnitude(v1); float vecNorm = Magnitude(v1);
return (vecNorm < P_FLT_INAC) ? PZeroVector2(T, false) : (v1 / vecNorm); return (vecNorm < P_FLT_INAC) ? v1 : (v1 / vecNorm);
} }
/** /**

View File

@ -398,7 +398,7 @@ namespace Phanes::Core::Math {
TVector3<T, false> NormalizeV(TVector3<T, false>& v1) TVector3<T, false> NormalizeV(TVector3<T, false>& v1)
{ {
float vecNorm = Magnitude(v1); float vecNorm = Magnitude(v1);
v1 /= (vecNorm < P_FLT_INAC) ? 1 : vecNorm; v1 /= (vecNorm < P_FLT_INAC) ? (T)1.0 : vecNorm;
return v1; return v1;
} }
@ -914,7 +914,7 @@ namespace Phanes::Core::Math {
template<RealType T> template<RealType T>
inline bool IsNormalized(const TVector3<T, false>& v1, T threshold = P_FLT_INAC) inline bool IsNormalized(const TVector3<T, false>& v1, T threshold = P_FLT_INAC)
{ {
return (abs(SqrMagnitude(v1) - 1) < threshold); return (SqrMagnitude(v1) - 1 < threshold);
} }
/** /**
@ -962,7 +962,7 @@ namespace Phanes::Core::Math {
TVector3<T, false> Normalize(const TVector3<T, false>& v1) TVector3<T, false> Normalize(const TVector3<T, false>& v1)
{ {
float vecNorm = Magnitude(v1); float vecNorm = Magnitude(v1);
return (vecNorm < P_FLT_INAC) ? PZeroVector3(T, false) : v1 / vecNorm; return (vecNorm < P_FLT_INAC) ? v1 : v1 / vecNorm;
} }
/** /**

View File

@ -10,7 +10,7 @@
#include "Core/public/Math/Vector2.hpp" #include "Core/public/Math/Vector2.hpp"
#define PZeroVector4(type, aligned) Phanes::Core::Math::TVector4<##type, ##aligned>(0,0,0) #define PZeroVector4(type, aligned) Phanes::Core::Math::TVector4<##type, ##aligned>(0,0,0,0)
namespace Phanes::Core::Math namespace Phanes::Core::Math
{ {
@ -203,7 +203,7 @@ namespace Phanes::Core::Math
/// <param name="v2">Vector two</param> /// <param name="v2">Vector two</param>
/// <returns>Computed vector.</returns> /// <returns>Computed vector.</returns>
template<RealType T, bool A> template<RealType T, bool A>
TVector4<T, A> operator+ (TVector4<T, A>& v1, const TVector4<T, A>& v2); TVector4<T, A> operator+ (const TVector4<T, A>& v1, const TVector4<T, A>& v2);
/// <summary> /// <summary>
/// Vector - scalar addition. /// Vector - scalar addition.
@ -214,7 +214,7 @@ namespace Phanes::Core::Math
/// <param name="s">Scalar</param> /// <param name="s">Scalar</param>
/// <returns>Computed vector.</returns> /// <returns>Computed vector.</returns>
template<RealType T, bool A> template<RealType T, bool A>
TVector4<T, A> operator+ (TVector4<T, A>& v1, T s); TVector4<T, A> operator+ (const TVector4<T, A>& v1, T s);
/// <summary> /// <summary>
/// Vector substraction. /// Vector substraction.
@ -225,7 +225,7 @@ namespace Phanes::Core::Math
/// <param name="v2">Vector two</param> /// <param name="v2">Vector two</param>
/// <returns>Computed vector.</returns> /// <returns>Computed vector.</returns>
template<RealType T, bool A> template<RealType T, bool A>
TVector4<T, A> operator- (TVector4<T, A>& v1, const TVector4<T, A>& v2); TVector4<T, A> operator- (const TVector4<T, A>& v1, const TVector4<T, A>& v2);
/// <summary> /// <summary>
/// Vector - scalar substraction. /// Vector - scalar substraction.
@ -236,7 +236,7 @@ namespace Phanes::Core::Math
/// <param name="s">Scalar</param> /// <param name="s">Scalar</param>
/// <returns>Computed vector.</returns> /// <returns>Computed vector.</returns>
template<RealType T, bool A> template<RealType T, bool A>
TVector4<T, A> operator- (TVector4<T, A>& v1, T s); TVector4<T, A> operator- (const TVector4<T, A>& v1, T s);
/// <summary> /// <summary>
/// Vector - scalar multiplication. /// Vector - scalar multiplication.
@ -247,7 +247,10 @@ namespace Phanes::Core::Math
/// <param name="s">Scalar</param> /// <param name="s">Scalar</param>
/// <returns>Computed vector.</returns> /// <returns>Computed vector.</returns>
template<RealType T, bool A> template<RealType T, bool A>
TVector4<T, A> operator* (TVector4<T, A>& v1, T s); TVector4<T, A> operator* (const TVector4<T, A>& v1, T s);
template<RealType T, bool A>
FORCEINLINE TVector4<T, A> operator* (T s, const TVector4<T, A>& v1) { return v1 * s; };
/// <summary> /// <summary>
/// Scale vector by another vector componentwise. /// Scale vector by another vector componentwise.
@ -258,7 +261,7 @@ namespace Phanes::Core::Math
/// <param name="v2">Vector two</param> /// <param name="v2">Vector two</param>
/// <returns>Computed vector.</returns> /// <returns>Computed vector.</returns>
template<RealType T, bool A> template<RealType T, bool A>
TVector4<T, A> operator* (TVector4<T, A>& v1, const TVector4<T, A>& v2); TVector4<T, A> operator* (const TVector4<T, A>& v1, const TVector4<T, A>& v2);
/// <summary> /// <summary>
/// Vector - scalar division. /// Vector - scalar division.
@ -269,7 +272,10 @@ namespace Phanes::Core::Math
/// <param name="s">Scalar</param> /// <param name="s">Scalar</param>
/// <returns>Computed vector.</returns> /// <returns>Computed vector.</returns>
template<RealType T, bool A> template<RealType T, bool A>
TVector4<T, A> operator/ (TVector4<T, A>& v1, T s); TVector4<T, A> operator/ (const TVector4<T, A>& v1, T s);
template<RealType T, bool A>
FORCEINLINE TVector4<T, A> operator/ (T s, const TVector4<T, A>& v1) { return v1 / s; };
/// <summary> /// <summary>
/// Componentwise vector division. /// Componentwise vector division.
@ -280,7 +286,7 @@ namespace Phanes::Core::Math
/// <param name="v2">Vector two</param> /// <param name="v2">Vector two</param>
/// <returns>Computed vector.</returns> /// <returns>Computed vector.</returns>
template<RealType T, bool A> template<RealType T, bool A>
TVector4<T, A> operator/ (TVector4<T, A>& v1, const TVector4<T, A>& v2); TVector4<T, A> operator/ (const TVector4<T, A>& v1, const TVector4<T, A>& v2);
@ -460,9 +466,9 @@ namespace Phanes::Core::Math
{ {
T vecNorm = Magnitude(v1); T vecNorm = Magnitude(v1);
vecNorm = (vecNorm < P_FLT_INAC) ? Magnitude(v1) : (T)1.0; vecNorm = (vecNorm < P_FLT_INAC) ? (T)1.0 : vecNorm;
return v1 / vecNorm; return (v1 / vecNorm);
} }
/// <summary> /// <summary>
@ -477,7 +483,7 @@ namespace Phanes::Core::Math
{ {
T vecNorm = Magnitude(v1); T vecNorm = Magnitude(v1);
vecNorm = (vecNorm < P_FLT_INAC) ? Magnitude(v1) : (T)1.0; vecNorm = (vecNorm < P_FLT_INAC) ? (T)1.0 : vecNorm;
v1 /= vecNorm; v1 /= vecNorm;
@ -635,6 +641,8 @@ namespace Phanes::Core::Math
v1.y = -v1.y; v1.y = -v1.y;
v1.z = -v1.z; v1.z = -v1.z;
v1.w = -v1.w; v1.w = -v1.w;
return v1;
} }
/// <summary> /// <summary>
@ -686,7 +694,8 @@ namespace Phanes::Core::Math
{ {
T magnitude = Magnitude(v1); T magnitude = Magnitude(v1);
const TVector3<T, false> unitVec = (magnitude > P_FLT_INAC) ? v1 / magnitude : PZeroVector3(T, false); TVector4<T, false> unitVec;
unitVec = (magnitude > P_FLT_INAC) ? v1 / magnitude : PZeroVector4(T, false);
Clamp(magnitude, min, max); Clamp(magnitude, min, max);
@ -706,7 +715,7 @@ namespace Phanes::Core::Math
{ {
T magnitude = Magnitude(v1); T magnitude = Magnitude(v1);
v1 = (magnitude > P_FLT_INAC) ? v1 / magnitude : PZeroVector3(T, false); v1 = (magnitude > P_FLT_INAC) ? v1 / magnitude : PZeroVector4(T, false);
v1 *= Clamp(magnitude, min, max); v1 *= Clamp(magnitude, min, max);
@ -738,7 +747,8 @@ namespace Phanes::Core::Math
template<RealType T> template<RealType T>
TVector4<T, false> ScaleToMagnitudeV(TVector4<T, false>& v1, T s) TVector4<T, false> ScaleToMagnitudeV(TVector4<T, false>& v1, T s)
{ {
NormalizeV(v1) *= s; NormalizeV(v1);
v1 *= s;
return v1; return v1;
} }
@ -753,7 +763,7 @@ namespace Phanes::Core::Math
template<RealType T> template<RealType T>
TVector4<T, false> Reflect(const TVector4<T, false>& v1, const TVector4<T, false> normal) TVector4<T, false> Reflect(const TVector4<T, false>& v1, const TVector4<T, false> normal)
{ {
return v1 - (2 * DotP(v1, normal) * normal); return (2 * DotP(v1, normal) * normal) - v1;
} }
/// <summary> /// <summary>
@ -767,7 +777,7 @@ namespace Phanes::Core::Math
template<RealType T> template<RealType T>
TVector4<T, false> ReflectV(TVector4<T, false>& v1, const TVector4<T, false> normal) TVector4<T, false> ReflectV(TVector4<T, false>& v1, const TVector4<T, false> normal)
{ {
Set(v1, v1 - (2 * DotP(v1, normal) * normal)); v1 = (2 * DotP(v1, normal) * normal) - v1;
return v1; return v1;
} }
@ -794,9 +804,11 @@ namespace Phanes::Core::Math
/// <param name="v2">Vector to project on</param> /// <param name="v2">Vector to project on</param>
/// <returns>Copy of v1.</returns> /// <returns>Copy of v1.</returns>
template<RealType T> template<RealType T>
TVector4<T, false> ProjectV(const TVector4<T, false>& v1, const TVector4<T, false> v2) TVector4<T, false> ProjectV(TVector4<T, false>& v1, const TVector4<T, false> v2)
{ {
Set(v1, (DotP(v1, v2) / DotP(v2, v2)) * v2); v1 = (DotP(v1, v2) / DotP(v2, v2)) * v2;
return v1;
} }
/// <summary> /// <summary>
@ -822,9 +834,9 @@ namespace Phanes::Core::Math
/// <param name="v2">Vector to reject from</param> /// <param name="v2">Vector to reject from</param>
/// <returns>Copy of v1.</returns> /// <returns>Copy of v1.</returns>
template<RealType T> template<RealType T>
TVector4<T, false> RejectV(const TVector4<T, false>& v1, const TVector4<T, false> v2) TVector4<T, false> RejectV(TVector4<T, false>& v1, const TVector4<T, false> v2)
{ {
Set(v1, v1 - (DotP(v1, v2) / DotP(v2, v2)) * v2); v1 = v1 - (DotP(v1, v2) / DotP(v2, v2)) * v2;
return v1; return v1;
} }
@ -837,7 +849,7 @@ namespace Phanes::Core::Math
/// <param name="v1">Vector</param> /// <param name="v1">Vector</param>
/// <returns>Perspective divided vector.</returns> /// <returns>Perspective divided vector.</returns>
template<RealType T> template<RealType T>
TVector4<T, false> PrespectiveDivide(const TVector4<T, false>& v1) TVector4<T, false> PerspectiveDivide(const TVector4<T, false>& v1)
{ {
float _1_w = (T)1.0 / v1.w; float _1_w = (T)1.0 / v1.w;
return TVector4<T, false>( return TVector4<T, false>(
@ -856,7 +868,7 @@ namespace Phanes::Core::Math
/// <param name="v1">Vector</param> /// <param name="v1">Vector</param>
/// <returns>Copy of v1.</returns> /// <returns>Copy of v1.</returns>
template<RealType T> template<RealType T>
TVector4<T, false> PrespectiveDivideV(TVector4<T, false>& v1) TVector4<T, false> PerspectiveDivideV(TVector4<T, false>& v1)
{ {
float _1_w = (T)1.0 / v1.w; float _1_w = (T)1.0 / v1.w;
@ -867,6 +879,47 @@ namespace Phanes::Core::Math
return v1; return v1;
} }
/// <summary>
/// Tests if vector is normalized.
/// </summary>
/// <typeparam name="T">Type of vector</typeparam>
/// <param name="v1">Vector</param>
/// <param name="threshold">Threshold to vector magnitude of 1.0</param>
/// <returns>True if vector is normalized, false if not.</returns>
template<RealType T>
FORCEINLINE TVector4<T, false> IsNormalized(const TVector4<T, false>& v1, T threshold = P_FLT_INAC)
{
return (SqrMagnitude(v1) - (T)1.0) < threshold;
}
/// <summary>
/// Tests if vectors are parallel.
/// </summary>
/// <typeparam name="T">Type of vector</typeparam>
/// <param name="v1">Vector</param>
/// <param name="v2">Vector</param>
/// <param name="threshold">Allowed T inaccuracy from one (e.g. 0.98f)</param>
/// <returns>True if parallel, false if not.</returns>
template<RealType T>
inline bool IsParallel(const TVector4<T, false>& v1, const TVector4<T, false>& v2, T threshold = 1.0f - P_FLT_INAC)
{
return (abs(DotP(v1, v2)) > threshold);
}
/// <summary>
/// Tests whether two vectors are coincident (Parallel and point in same direction).
/// </summary>
/// <typeparam name="T">Type of vector</typeparam>
/// <param name="v1">Vector</param>
/// <param name="v2">Vector</param>
/// <param name="threshold">Allowed T inaccuracy from one (e.g. 0.98f)</param>
/// <returns>True if coincident, false if not.</returns>
template<RealType T>
inline bool IsCoincident(const TVector4<T, false>& v1, const TVector4<T, false>& v2, T threshold = 1.0f - P_FLT_INAC)
{
return (DotP(v1, v2) > threshold);
}
} }

View File

@ -98,7 +98,7 @@ namespace Phanes::Core::Math
} }
template<RealType T, bool S> template<RealType T, bool S>
TVector4<T, S> operator+(TVector4<T, S>& v1, const TVector4<T, S>& v2) TVector4<T, S> operator+(const TVector4<T, S>& v1, const TVector4<T, S>& v2)
{ {
TVector4<T, S> r; TVector4<T, S> r;
Detail::compute_vec4_add<T, S>::map(r, v1, v2); Detail::compute_vec4_add<T, S>::map(r, v1, v2);
@ -106,7 +106,7 @@ namespace Phanes::Core::Math
} }
template<RealType T, bool S> template<RealType T, bool S>
TVector4<T, S> operator+(TVector4<T, S>& v1, T s) TVector4<T, S> operator+(const TVector4<T, S>& v1, T s)
{ {
TVector4<T, S> r; TVector4<T, S> r;
Detail::compute_vec4_add<T, S>::map(r, v1, s); Detail::compute_vec4_add<T, S>::map(r, v1, s);
@ -114,7 +114,7 @@ namespace Phanes::Core::Math
} }
template<RealType T, bool S> template<RealType T, bool S>
TVector4<T, S> operator-(TVector4<T, S>& v1, const TVector4<T, S>& v2) TVector4<T, S> operator-(const TVector4<T, S>& v1, const TVector4<T, S>& v2)
{ {
TVector4<T, S> r; TVector4<T, S> r;
Detail::compute_vec4_sub<T, S>::map(r, v1, v2); Detail::compute_vec4_sub<T, S>::map(r, v1, v2);
@ -122,7 +122,7 @@ namespace Phanes::Core::Math
} }
template<RealType T, bool S> template<RealType T, bool S>
TVector4<T, S> operator-(TVector4<T, S>& v1, T s) TVector4<T, S> operator-(const TVector4<T, S>& v1, T s)
{ {
TVector4<T, S> r; TVector4<T, S> r;
Detail::compute_vec4_sub<T, S>::map(r, v1, s); Detail::compute_vec4_sub<T, S>::map(r, v1, s);
@ -130,7 +130,7 @@ namespace Phanes::Core::Math
} }
template<RealType T, bool S> template<RealType T, bool S>
TVector4<T, S> operator*(TVector4<T, S>& v1, const TVector4<T, S>& v2) TVector4<T, S> operator*(const TVector4<T, S>& v1, const TVector4<T, S>& v2)
{ {
TVector4<T, S> r; TVector4<T, S> r;
Detail::compute_vec4_mul<T, S>::map(r, v1, v2); Detail::compute_vec4_mul<T, S>::map(r, v1, v2);
@ -138,7 +138,7 @@ namespace Phanes::Core::Math
} }
template<RealType T, bool S> template<RealType T, bool S>
TVector4<T, S> operator*(TVector4<T, S>& v1, T s) TVector4<T, S> operator*(const TVector4<T, S>& v1, T s)
{ {
TVector4<T, S> r; TVector4<T, S> r;
Detail::compute_vec4_mul<T, S>::map(r, v1, s); Detail::compute_vec4_mul<T, S>::map(r, v1, s);
@ -146,7 +146,7 @@ namespace Phanes::Core::Math
} }
template<RealType T, bool S> template<RealType T, bool S>
TVector4<T, S> operator/(TVector4<T, S>& v1, const TVector4<T, S>& v2) TVector4<T, S> operator/(const TVector4<T, S>& v1, const TVector4<T, S>& v2)
{ {
TVector4<T, S> r; TVector4<T, S> r;
Detail::compute_vec4_div<T, S>::map(r, v1, v2); Detail::compute_vec4_div<T, S>::map(r, v1, v2);
@ -154,7 +154,7 @@ namespace Phanes::Core::Math
} }
template<RealType T, bool S> template<RealType T, bool S>
TVector4<T, S> operator/(TVector4<T, S>& v1, T s) TVector4<T, S> operator/(const TVector4<T, S>& v1, T s)
{ {
TVector4<T, S> r; TVector4<T, S> r;
Detail::compute_vec4_div<T, S>::map(r, v1, s); Detail::compute_vec4_div<T, S>::map(r, v1, s);