10static constexpr float JPH_PI = 3.14159265358979323846f;
13static constexpr float cLargeFloat = 1.0e15f;
18 return inV * (JPH_PI / 180.0f);
24 return inV * (180.0f / JPH_PI);
34 while (inV < -JPH_PI);
36 else if (inV > JPH_PI)
53 float err = std::fma(-inC, inD, cd);
54 float dop = std::fma(inA, inB, -cd);
57 return inA * inB - inC * inD;
63JPH_INLINE
constexpr T
Clamp(T inV, T inMin, T inMax)
65 return min(max(inV, inMin), inMax);
76JPH_INLINE
float Sqrt(
float inV)
79 return _mm_cvtss_f32(_mm_sqrt_ss(_mm_set_ss(inV)));
80#elif defined(JPH_USE_NEON)
81 return vget_lane_f32(vsqrt_f32(vdup_n_f32(inV)), 0);
82#elif defined(JPH_CPU_RISCV)
84 asm(
"fsqrt.s %0, %1" :
"=f"(res) :
"f"(inV));
87 return std::sqrt(inV);
92JPH_INLINE
double Sqrt(
double inV)
95 return _mm_cvtsd_f64(_mm_sqrt_sd(_mm_undefined_pd(), _mm_set_sd(inV)));
96#elif defined(JPH_USE_NEON)
97 return vget_lane_f64(vsqrt_f64(vdup_n_f64(inV)), 0);
98#elif defined(JPH_CPU_RISCV)
100 asm(
"fsqrt.d %0, %1" :
"=f"(res) :
"f"(inV));
103 return std::sqrt(inV);
111 return inV * inV * inV;
116JPH_INLINE
constexpr T
Sign(T inV)
118 return inV < 0? T(-1) : T(1);
125 return inV > 0 && (inV & (inV - 1)) == 0;
133 return T((
uint64(inV) + inAlignment - 1) & ~(inAlignment - 1));
141 return (
uint64(inV) & (inAlignment - 1)) == 0;
147#if defined(JPH_CPU_X86) || defined(JPH_CPU_WASM)
148 #if defined(JPH_USE_TZCNT)
149 return _tzcnt_u32(inValue);
150 #elif defined(JPH_COMPILER_MSVC)
153 unsigned long result;
154 _BitScanForward(&result, inValue);
159 return __builtin_ctz(inValue);
161#elif defined(JPH_CPU_ARM)
162 #if defined(JPH_COMPILER_MSVC)
165 unsigned long result;
166 _BitScanForward(&result, inValue);
171 return __builtin_ctz(inValue);
173#elif defined(JPH_CPU_E2K) || defined(JPH_CPU_RISCV) || defined(JPH_CPU_PPC) || defined(JPH_CPU_LOONGARCH)
174 return inValue ? __builtin_ctz(inValue) : 32;
183#if defined(JPH_CPU_X86) || defined(JPH_CPU_WASM)
184 #if defined(JPH_USE_LZCNT)
185 return _lzcnt_u32(inValue);
186 #elif defined(JPH_COMPILER_MSVC)
189 unsigned long result;
190 _BitScanReverse(&result, inValue);
195 return __builtin_clz(inValue);
197#elif defined(JPH_CPU_ARM)
198 #if defined(JPH_COMPILER_MSVC)
199 return _CountLeadingZeros(inValue);
201 return __builtin_clz(inValue);
203#elif defined(JPH_CPU_E2K) || defined(JPH_CPU_RISCV) || defined(JPH_CPU_PPC) || defined(JPH_CPU_LOONGARCH)
204 return inValue ? __builtin_clz(inValue) : 32;
213#if defined(JPH_COMPILER_CLANG) || defined(JPH_COMPILER_GCC)
214 return __builtin_popcount(inValue);
215#elif defined(JPH_COMPILER_MSVC)
216 #if defined(JPH_USE_SSE4_2)
217 return _mm_popcnt_u32(inValue);
218 #elif defined(JPH_USE_NEON) && (_MSC_VER >= 1930)
219 return _CountOneBits(inValue);
221 inValue = inValue - ((inValue >> 1) & 0x55555555);
222 inValue = (inValue & 0x33333333) + ((inValue >> 2) & 0x33333333);
223 inValue = (inValue + (inValue >> 4)) & 0x0F0F0F0F;
224 return (inValue * 0x01010101) >> 24;
238template <
class To,
class From>
241 static_assert(std::is_trivially_constructible_v<To>);
242 static_assert(
sizeof(From) ==
sizeof(To));
251 convert.mFrom = inValue;
std::uint64_t uint64
Definition Core.h:514
unsigned int uint
Definition Core.h:509
#define JPH_NAMESPACE_END
Definition Core.h:433
std::uint32_t uint32
Definition Core.h:512
#define JPH_NAMESPACE_BEGIN
Definition Core.h:427
#define JPH_ASSERT(...)
Definition IssueReporting.h:33
JPH_INLINE constexpr T Clamp(T inV, T inMin, T inMax)
Clamp a value between two values.
Definition Math.h:63
JPH_INLINE constexpr T Sign(T inV)
Get the sign of a value.
Definition Math.h:116
float CenterAngleAroundZero(float inV)
Convert angle in radians to the range .
Definition Math.h:28
constexpr bool IsPowerOf2(T inV)
Check if inV is a power of 2.
Definition Math.h:123
uint CountBits(uint32 inValue)
Count the number of 1 bits in a value.
Definition Math.h:211
JPH_INLINE constexpr T Square(T inV)
Square a value.
Definition Math.h:70
JPH_INLINE constexpr float DegreesToRadians(float inV)
Convert a value from degrees to radians.
Definition Math.h:16
JPH_INLINE constexpr T Cubed(T inV)
Returns .
Definition Math.h:109
JPH_INLINE constexpr float RadiansToDegrees(float inV)
Convert a value from radians to degrees.
Definition Math.h:22
JPH_INLINE float Sqrt(float inV)
Take the square root of a float value.
Definition Math.h:76
bool IsAligned(T inV, uint64 inAlignment)
Check if inV is inAlignment aligned.
Definition Math.h:138
uint CountTrailingZeros(uint32 inValue)
Compute number of trailing zero bits (how many low bits are zero)
Definition Math.h:145
JPH_INLINE To BitCast(const From &inValue)
Definition Math.h:239
uint CountLeadingZeros(uint32 inValue)
Compute the number of leading zero bits (how many high bits are zero)
Definition Math.h:181
JPH_INLINE float DifferenceOfProducts(float inA, float inB, float inC, float inD)
Definition Math.h:49
uint32 GetNextPowerOf2(uint32 inValue)
Get the next higher power of 2 of a value, or the value itself if the value is already a power of 2.
Definition Math.h:232
T AlignUp(T inV, uint64 inAlignment)
Align inV up to the next inAlignment bytes.
Definition Math.h:130