Added math helpers for checking if a number is infinity or invalid
This commit is contained in:
parent
5a2401bec2
commit
9b2c5a1804
|
@ -105,6 +105,12 @@ namespace SHADE
|
||||||
template <IsFloatingPoint T = float>
|
template <IsFloatingPoint T = float>
|
||||||
[[nodiscard]] static bool CompareFloat (T lhs, T rhs, T absTolerance = EPSILON, T relTolerance = EPSILON);
|
[[nodiscard]] static bool CompareFloat (T lhs, T rhs, T absTolerance = EPSILON, T relTolerance = EPSILON);
|
||||||
|
|
||||||
|
template <IsArithmetic T>
|
||||||
|
[[nodiscard]] static bool IsInfinity (T value);
|
||||||
|
|
||||||
|
template <IsArithmetic T>
|
||||||
|
[[nodiscard]] static bool IsNaN (T value);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
/* Static Data Members */
|
/* Static Data Members */
|
||||||
|
|
|
@ -126,4 +126,21 @@ namespace SHADE
|
||||||
return std::fabs(lhs - rhs) <= Max(absTolerance, RTOL);
|
return std::fabs(lhs - rhs) <= Max(absTolerance, RTOL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <IsArithmetic T>
|
||||||
|
bool SHMath::IsInfinity(T value)
|
||||||
|
{
|
||||||
|
const float MAX_VALUE = std::numeric_limits<T>::max();
|
||||||
|
const float MIN_VALUE = std::numeric_limits<T>::min();
|
||||||
|
|
||||||
|
return !(MIN_VALUE <= value && value <= MAX_VALUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <IsArithmetic T>
|
||||||
|
bool SHMath::IsNaN(T value)
|
||||||
|
{
|
||||||
|
return value != value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace SHADE
|
} // namespace SHADE
|
|
@ -18,14 +18,6 @@
|
||||||
#include "Physics/SHPhysicsConstants.h"
|
#include "Physics/SHPhysicsConstants.h"
|
||||||
#include "Physics/Collision/Narrowphase/SHCollisionUtils.h"
|
#include "Physics/Collision/Narrowphase/SHCollisionUtils.h"
|
||||||
|
|
||||||
bool IsInfinity(float value)
|
|
||||||
{
|
|
||||||
const float MAX_VAL = std::numeric_limits<float>::max();
|
|
||||||
const float MIN_VAL = -MAX_VAL;
|
|
||||||
|
|
||||||
return !(MIN_VAL <= value && value <= MAX_VAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
@ -227,7 +219,7 @@ namespace SHADE
|
||||||
errorBias = -SHPHYSICS_BAUMGARTE * INV_DT * std::max(0.0f, contact.penetration - SHPHYSICS_LINEAR_SLOP);
|
errorBias = -SHPHYSICS_BAUMGARTE * INV_DT * std::max(0.0f, contact.penetration - SHPHYSICS_LINEAR_SLOP);
|
||||||
|
|
||||||
// TODO: This should never occur. Move this check into the ConvexVSConvex to find the error.
|
// TODO: This should never occur. Move this check into the ConvexVSConvex to find the error.
|
||||||
if (IsInfinity(errorBias))
|
if (SHMath::IsInfinity(errorBias))
|
||||||
errorBias = 0.0f;
|
errorBias = 0.0f;
|
||||||
|
|
||||||
// Warm starting
|
// Warm starting
|
||||||
|
|
Loading…
Reference in New Issue