Bug fixes.
This commit is contained in:
parent
69de92a4e0
commit
d47b4076a9
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user