31 #define _USE_MATH_DEFINES
55 #define NUMERIC_MAX(type) std::numeric_limits<type>::max()
56 #define NUMERIC_MIN(type) std::numeric_limits<type>::min()
58 #define AGX_BIT_MASK(bit) (1 << bit)
59 #define AGX_TEST_BIT(val, bit) (val & AGX_BIT_MASK(bit))
60 #define AGX_SET_BIT(val, bit) (val |= AGX_BIT_MASK(bit))
61 #define AGX_UNSET_BIT(val, bit) (val &= ~AGX_BIT_MASK(bit))
72 inline const Real Infinity = std::numeric_limits<Real>::infinity();
86 return !(bool)(val & 0x1);
95 if ( std::abs( x ) < nearZero )
97 return Real(1) - (x * x) /
Real(6) + (x * x * x * x) /
Real(120);
101 return std::sin( x ) / x;
113 return (lhs + epsilon >= rhs) && (lhs - epsilon <= rhs);
123 return _equivalent< float >(lhs, rhs, epsilon);
133 return _equivalent< double >(lhs, rhs, epsilon);
156 return _equivalent(lhs, rhs, (std::abs(lhs) + std::abs(rhs) + T(1)) * relativeEpsilon);
167 return _relativelyEquivalent< float >(lhs, rhs, epsilon);
178 return _relativelyEquivalent< double >(lhs, rhs, epsilon);
194#define INT_EQUALS_ZERO( T ) \
195 AGX_FORCE_INLINE bool equalsZero( T f ) \
200#define INT_IS_NAN( T ) \
201 AGX_FORCE_INLINE bool isNaN( T ) \
206#define INT_IS_INF( T ) \
207 AGX_FORCE_INLINE bool isInf( T ) \
212#define INT_IS_FINITE( T ) \
213 AGX_FORCE_INLINE bool isFinite( T ) \
218#define UINT_ABSOLUTE( T ) \
219 AGX_FORCE_INLINE T absolute( T v ) \
269#undef INT_EQUALS_ZERO
278 return ( f < eps && f > -eps );
284 return ( d < eps && d > -eps );
299 return std::isinf( v ) != 0;
305 return std::isnan( v );
311 return std::isfinite(v);
317 template<
typename T1,
typename T2,
typename T3>
320 return v < minimum ? minimum : v > maximum ? maximum : v;
330 return v < T(0) ? T(-1) : T(1);
344 return v < ( T )0 ? -v*v : v*v;
407 template <
typename T>
410 return (value & (value-1)) == 0;
416 value |= (value >> 1);
417 value |= (value >> 2);
418 value |= (value >> 4);
419 value |= (value >> 8);
420 value |= (value >> 16);
428 value |= (value >> 1);
429 value |= (value >> 2);
430 value |= (value >> 4);
431 value |= (value >> 8);
432 value |= (value >> 16);
441 value |= (value >> 1);
442 value |= (value >> 2);
443 value |= (value >> 4);
444 value |= (value >> 8);
445 value |= (value >> 16);
446 value |= (value >> 32);
454 value |= (value >> 1);
455 value |= (value >> 2);
456 value |= (value >> 4);
457 value |= (value >> 8);
458 value |= (value >> 16);
459 value |= (value >> 32);
465 template <
typename T>
469 return value > 0 ? (value + (alignment-1) - ((value-1) % alignment)) : 0;
472 template <
typename T1,
typename T2>
479 template <
typename T>
483 return value - (value % alignment);
486 template <
typename T1,
typename T2>
492 template <
typename T>
495 return value % alignment == 0;
498 template <
typename T1,
typename T2>
501 return isAligned((uintptr_t)ptr, (uintptr_t)alignment);
504 template <
typename T>
509 return ((value + tmp) & ~tmp);
512 template <
typename T1,
typename T2>
518 template <
typename T>
523 return (value & ~tmp);
526 template <
typename T1,
typename T2>
554 template <
typename T>
558 Real randEnd =
static_cast<Real>(RAND_MAX);
559 Real range_fraction = sample / randEnd;
561 T offset =
static_cast<T
>(range_fraction * range);
562 T value =
static_cast<T
>(
min + offset);
573 return fabsf( ( ( b -c ) ^ ( a - b ) )*( d - b ) );
579 const T& b1,
const T& b2,
const T& b3 )
589 template<
typename T1,
typename T2>
597 return static_cast<T1
>(a*(1-t) + b*t);
616 template<
typename T1,
typename T2>
625 return static_cast<T1
>(
agx::lerp(a, b, sqr / (2 * (sqr - t) + 1)));
637 template<
typename T1,
typename T2>
641 T1 lower = std::max(a, (T1)0);
642 T1 upper = std::max(b, (T1)0);
651 lower = std::max(a, (T1)std::numeric_limits<T1>::min());
652 upper = std::max(b, (T1)std::numeric_limits<T1>::min());
654 return (T1)(std::pow(upper, t) * std::pow(lower, 1 - t));
665 static const agx::UInt32 multiplyDeBruijnBitPosition2[ 32 ] =
667 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
668 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
671 return multiplyDeBruijnBitPosition2[ ( (
unsigned int)value * 0x077CB531U ) >> 27 ];
#define INT_EQUALS_ZERO(T)
T rand()
Returns random number between minValue and maxValue (from constructor).
The agx namespace contains the dynamics/math part of the AGX Dynamics API.
static constexpr Real PI_4
static constexpr Real GRAVITY_ACCELERATION
bool isPowerOfTwo(T value)
AGXCORE_EXPORT agx::UniformInt32Generator & getRandGenerator()
T absolute(T v)
return the absolute value.
T align_ceil(T value, T alignment)
T1 const logInterpolate(T1 const &a, T1 const &b, T2 const &t)
This function calculates a linear interpolation in a logarithmic space between two positive,...
AGXCORE_EXPORT float strtof(const char *nptr, char **endptr)
strtod ignoring global locale
bool geq(double a, double b, double eps=(double) AGX_EQUIVALENT_EPSILON)
AGXCORE_EXPORT const Real REAL_SQRT_EPSILON
T1 clamp(T1 v, T2 minimum, T3 maximum)
AGXCORE_EXPORT int nextPrime(int n)
AGXCORE_EXPORT Real normalizedAngle(Real angle, bool positiveRange=false)
Normalize an angle.
static constexpr Real RAD_TO_DEG
Real sinc(Real x, Real nearZero=Real(1E-4))
Sinc function.
constexpr Real radiansToDegrees(Real angle)
Vec3T< T > min(const Vec3T< T > &lhs, const Vec3T< T > &rhs)
AGXPHYSICS_EXPORT agx::Bool equalsZero(const agx::AddedMassInteraction::Matrix6x6 &matrix, agx::Real eps=agx::RealEpsilon)
int irandom(int min, int max)
T align_ceil2(T value, T alignment)
bool relativelyEquivalent(float lhs, float rhs, float epsilon=(float) AGX_EQUIVALENT_EPSILON)
Compare two values for relative equality.
Vec3T< T > max(const Vec3T< T > &lhs, const Vec3T< T > &rhs)
bool _equivalent(T lhs, T rhs, T epsilon=T(AGX_EQUIVALENT_EPSILON))
Compare two values for equality.
static constexpr Real PI_2
bool _relativelyEquivalent(T lhs, T rhs, T relativeEpsilon=T(AGX_EQUIVALENT_EPSILON))
Compare two values for relative equality.
UInt32 alignPowerOfTwo(UInt32 value)
agx::UInt8 highestBitToIndex(T n)
T1 const lerp(T1 const &a, T1 const &b, T2 t)
Linearly interpolate from a to b using t = {0..1}.
static constexpr Real DEG_TO_RAD
constexpr Real degreesToRadians(Real angle)
bool isAligned(T value, T alignment)
Real computeVolume(const T &a, const T &b, const T &c, const T &d)
a, b, c, d sides of the tetrahedron
bool leq(double a, double b, double eps=(double) AGX_EQUIVALENT_EPSILON)
static constexpr Real AGX_EQUIVALENT_EPSILON
T inverse(const T &value)
AGXCORE_EXPORT double strtod(const char *nptr, char **endptr)
strtod ignoring global locale
T1 const parametricBlend(T1 const &a, T1 const &b, T2 t)
Smooth interpolation from a to b using t = {0..1} The value returned will follow a ramp in/out and a ...
T align_floor(T value, T alignment)
T align_floor2(T value, T alignment)
AGXPHYSICS_EXPORT agx::Bool equivalent(const agx::AddedMassInteraction::Matrix6x6 &lhs, const agx::AddedMassInteraction::Matrix6x6 &rhs, agx::Real eps=agx::RealEpsilon)
agx::UInt32 pow2Exponent(T value)
Finds and returns n given value = 2^n.