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>
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.y = (v1.z * v2.x) - (v1.x * v2.z);
r.z = (v1.x * v2.y) - (v1.y * v2.x);

View File

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

View File

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