Bug fixes.

This commit is contained in:
THoehne 2024-07-21 19:15:52 +02:00
parent 69de92a4e0
commit d47b4076a9
4 changed files with 48 additions and 38 deletions

View File

@ -206,8 +206,10 @@ namespace Phanes::Core::Math::Detail
template<RealType T> template<RealType T>
struct compute_vec3_cross_p<T, false> struct compute_vec3_cross_p<T, false>
{ {
static constexpr void map(Phanes::Core::Math::TVector3<T, false>& r, const Phanes::Core::Math::TVector3<T, false>& v1, const Phanes::Core::Math::TVector3<T, false>& v2) static constexpr void map(Phanes::Core::Math::TVector3<T, false>& r, const Phanes::Core::Math::TVector3<T, false> v1, const Phanes::Core::Math::TVector3<T, false>& v2)
{ {
// V1 has to be copied, as otherwise changes to r affect calculation -> r is v1.
r.x = (v1.y * v2.z) - (v1.z * v2.y); r.x = (v1.y * v2.z) - (v1.z * v2.y);
r.y = (v1.z * v2.x) - (v1.x * v2.z); r.y = (v1.z * v2.x) - (v1.x * v2.z);
r.z = (v1.x * v2.y) - (v1.y * v2.x); r.z = (v1.x * v2.y) - (v1.y * v2.x);

View File

@ -533,14 +533,15 @@ namespace Phanes::Core::Math {
return v1; return v1;
} }
/**
* Calculates the cross product between two vectors. /// <summary>
* /// Calcualtes cross product of vectors
* @param(v1) Vector one /// </summary>
* @param(v2) Vector two /// <typeparam name="T"></typeparam>
* /// <typeparam name="S"></typeparam>
* @note result is stored in v1. /// <param name="v1"></param>
*/ /// <param name="v2"></param>
/// <returns>Copy of v1.</returns>
template<RealType T, bool S> template<RealType T, bool S>
TVector3<T, S> CrossPV(TVector3<T, S>& v1, const TVector3<T, S>& v2); TVector3<T, S> CrossPV(TVector3<T, S>& v1, const TVector3<T, S>& v2);
@ -620,6 +621,7 @@ namespace Phanes::Core::Math {
return v1; return v1;
} }
/** /**
* Projects vector v1 onto v2 * Projects vector v1 onto v2
* *
@ -701,15 +703,13 @@ namespace Phanes::Core::Math {
*/ */
template<RealType T> template<RealType T>
TVector3<T, false> ClampMagnitudeV(TVector3<T, false>& v1, T min, T max) TVector3<T, false> ClampToMagnitudeV(TVector3<T, false>& v1, T min, T max)
{ {
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 : PZeroVector3(T, false);
Clamp(magnitude, min, max); v1 *= Clamp(magnitude, min, max);
v1 *= magnitude;
return v1; return v1;
} }
@ -767,8 +767,7 @@ namespace Phanes::Core::Math {
T sinAngle = sin(angle); T sinAngle = sin(angle);
T cosAngle = cos(angle); T cosAngle = cos(angle);
v1 = ((T)1.0 - cosAngle) * DotP(axisNormal, v1) * axisNormal + cosAngle * v1 + sinAngle * CrossP(axisNormal, v1); v1 = (1 - cosAngle) * DotP(axisNormal, v1) * axisNormal + cosAngle * v1 + sinAngle * CrossP(v1, axisNormal);
return v1; return v1;
} }
@ -783,8 +782,8 @@ namespace Phanes::Core::Math {
template<RealType T> template<RealType T>
TVector3<T, false> ScaleToMagnitudeV(TVector3<T, false>& v1, T magnitude) TVector3<T, false> ScaleToMagnitudeV(TVector3<T, false>& v1, T magnitude)
{ {
NormalizeV(v1) *= magnitude; NormalizeV(v1);
v1 *= magnitude;
return v1; return v1;
} }
@ -818,7 +817,7 @@ namespace Phanes::Core::Math {
template<RealType T> template<RealType T>
T ScalarTriple(const TVector3<T, false>& v1, const TVector3<T, false>& v2, const TVector3<T, false>& v3) T ScalarTriple(const TVector3<T, false>& v1, const TVector3<T, false>& v2, const TVector3<T, false>& v3)
{ {
return CrossP(v1, v2) * v3; return DotP(CrossP(v1, v2), v3);
} }
/** /**
@ -992,9 +991,9 @@ namespace Phanes::Core::Math {
template<RealType T> template<RealType T>
TVector3<T, false> SignVector(const TVector3<T, false>& v1) TVector3<T, false> SignVector(const TVector3<T, false>& v1)
{ {
return TVector3<T, false>((v1.x >= 0) ? 1 : -1, return TVector3<T, false>((v1.x >= (T)0) ? (T)1 : (T)-1,
(v1.y >= 0) ? 1 : -1, (v1.y >= (T)0) ? (T)1 : (T)-1,
(v1.z >= 0) ? 1 : -1); (v1.z >= (T)0) ? (T)1 : (T)-1);
} }
/** /**
@ -1037,8 +1036,8 @@ namespace Phanes::Core::Math {
* @return Cross product of v1 and v2 * @return Cross product of v1 and v2
*/ */
template<RealType T> template<RealType T, bool S>
TVector3<T, false> CrossP(const TVector3<T, false>& v1, const TVector3<T, false>& v2); TVector3<T, S> CrossP(const TVector3<T, S>& v1, const TVector3<T, S>& v2);
/** /**
* Linearly interpolates between two vectors. * Linearly interpolates between two vectors.
@ -1053,8 +1052,8 @@ namespace Phanes::Core::Math {
template<RealType T> template<RealType T>
TVector3<T, false> Lerp(const TVector3<T, false>& start, const TVector3<T, false>& dest, T t) TVector3<T, false> Lerp(const TVector3<T, false>& start, const TVector3<T, false>& dest, T t)
{ {
t = Clamp(t, (T)0.0, (T), 1.0); t = Clamp(t, (T)0.0, (T)1.0);
return (1 - t) * start + t * dest; return ((1 - t) * start) + (t * dest);
} }
/** /**
@ -1148,7 +1147,7 @@ namespace Phanes::Core::Math {
*/ */
template<RealType T> template<RealType T>
TVector3<T, false> ClampMagnitude(const TVector3<T, false>& v1, T min, T max) TVector3<T, false> ClampToMagnitude(const TVector3<T, false>& v1, T min, T max)
{ {
T magnitude = Magnitude(v1); T magnitude = Magnitude(v1);
@ -1156,7 +1155,7 @@ namespace Phanes::Core::Math {
Clamp(magnitude, min, max); Clamp(magnitude, min, max);
return unitVec * magnitude; return unitVec * Clamp(magnitude, min, max);
} }
/** /**

View File

@ -226,4 +226,5 @@ namespace Phanes::Core::Math
Detail::compute_vec3_cross_p<T, S>::map(v1, v1, v2); Detail::compute_vec3_cross_p<T, S>::map(v1, v1, v2);
return v1; return v1;
} }
} }

View File

@ -10,6 +10,8 @@
#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)
namespace Phanes::Core::Math namespace Phanes::Core::Math
{ {
@ -680,11 +682,15 @@ namespace Phanes::Core::Math
/// <param name="s"></param> /// <param name="s"></param>
/// <returns>Vector with magnitude clamped to s.</returns> /// <returns>Vector with magnitude clamped to s.</returns>
template<RealType T> template<RealType T>
TVector4<T, false> ClampToMagnitude(const TVector4<T, false>& v1, T s) TVector4<T, false> ClampToMagnitude(const TVector4<T, false>& v1, T min, T max)
{ {
float vecNorm = Magnitude(v1); T magnitude = Magnitude(v1);
TVector4<T, false> newVec = (vecNorm > s) ? v1 : v1 / Magnitude(v1);
return newVec; const TVector3<T, false> unitVec = (magnitude > P_FLT_INAC) ? v1 / magnitude : PZeroVector3(T, false);
Clamp(magnitude, min, max);
return unitVec * magnitude;
} }
/// <summary> /// <summary>
@ -696,10 +702,14 @@ namespace Phanes::Core::Math
/// <param name="s">Magnitude</param> /// <param name="s">Magnitude</param>
/// <returns>Copy of v1.</returns> /// <returns>Copy of v1.</returns>
template<RealType T> template<RealType T>
TVector4<T, false> ClampToMagnitudeV(TVector4<T, false>& v1, T s) TVector4<T, false> ClampToMagnitudeV(TVector4<T, false>& v1, T min, T max)
{ {
float vecNorm = Magnitude(v1); T magnitude = Magnitude(v1);
v1 = (vecNorm > s) ? v1 : v1 / Magnitude(v1);
v1 = (magnitude > P_FLT_INAC) ? v1 / magnitude : PZeroVector3(T, false);
v1 *= Clamp(magnitude, min, max);
return v1; return v1;
} }
@ -714,8 +724,7 @@ namespace Phanes::Core::Math
template<RealType T> template<RealType T>
TVector4<T, false> ScaleToMagnitude(const TVector4<T, false>& v1, T s) TVector4<T, false> ScaleToMagnitude(const TVector4<T, false>& v1, T s)
{ {
TVector4<T, false> vecDir = v1 / Magnitude(v1); return Normalize(v1) * s;
return vecDir * s;
} }
/// <summary> /// <summary>
@ -729,8 +738,7 @@ 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)
{ {
v1 /= Magnitude(v1); NormalizeV(v1) *= s;
v1 *= s;
return v1; return v1;
} }