32#ifndef DVD_CORE_MATH_MATH_HELPER_INL_
33#define DVD_CORE_MATH_MATH_HELPER_INL_
42 template<
typename Engine>
45 thread_local std::random_device rnddev{};
51 template<
typename Engine>
54 detail::getEngine<Engine>().seed( seed );
57 template<
typename Engine>
60 std::random_device rnddev{};
61 srand<Engine>( rnddev() );
64 template<
typename T,
typename Engine,
typename Distribution>
requires std::is_arithmetic_v<T> && std::is_fundamental_v<T>
67 return static_cast<T
>(Distribution{ min, max }(detail::getEngine<Engine>()));
70 template<
typename T,
typename Engine,
typename Distribution>
requires std::is_arithmetic_v<T>
73 return rand<T, Engine, Distribution>( 0, std::numeric_limits<T>::max() );
77 template <
typename T,
typename Engine,
typename Distribution>
requires std::is_arithmetic_v<T>
80 if ( min > max ) [[unlikely]]
82 std::swap( min, max );
85 return customRNG::rand<T, Engine, Distribution>( min, max );
88 template <
typename T,
typename Engine,
typename Distribution>
requires std::is_arithmetic_v<T>
91 return Random<T, Engine, Distribution>( max < 0 ? std::numeric_limits<T>::lowest() : 0, max );
94 template <
typename T,
typename Engine,
typename Distribution>
requires std::is_arithmetic_v<T>
97 return Random<T, Engine, Distribution>( std::numeric_limits<T>::max() );
100 template<
typename Engine>
103 customRNG::srand<Engine>();
106 template<
typename Engine>
109 customRNG::srand<Engine>( seed );
113 template <
typename T>
requires std::is_arithmetic<T>::value
114 constexpr void CLAMP( T& n,
const T min,
const T max )
noexcept
116 n = std::min( std::max( n, min), max);
119 template <
typename T>
122 return CLAMP( n,
static_cast<T
>(0),
static_cast<T
>(1) );
125 template <
typename T>
requires std::is_arithmetic<T>::value
126 constexpr T
CLAMPED(
const T n,
const T min,
const T max )
noexcept
129 CLAMP( ret, min, max );
133 template <
typename T>
requires std::is_arithmetic<T>::value
136 return CLAMPED( n,
static_cast<T
>( 0 ),
static_cast<T
>( 1 ) );
140 template <
typename T>
requires std::is_arithmetic<T>::value
141 constexpr T
MAP(
const T input,
const T in_min,
const T in_max,
const T out_min,
const T out_max,
D64& slopeOut )
noexcept
144 slopeOut = 1.0 * (out_max - out_min) / diff;
145 return static_cast<T
>(out_min + slopeOut * (input - in_min));
148 template <
typename T>
149 constexpr void REMAP( T& input, T in_min, T in_max, T out_min, T out_max,
D64& slopeOut )
noexcept
151 input =
MAP( input, in_min, in_max, out_min, out_max, slopeOut );
154 template <
typename T>
155 requires std::is_arithmetic<T>::value
158 return input * input;
162 void CLAMP_IN_RECT( T& inout_x, T& inout_y, T rect_x, T rect_y, T rect_z, T rect_w )
noexcept
164 CLAMP( inout_x, rect_x, rect_z + rect_x );
165 CLAMP( inout_y, rect_y, rect_w + rect_y );
171 CLAMP_IN_RECT( inout_x, inout_y, rect.x, rect.y, rect.z, rect.w );
177 CLAMP_IN_RECT( inout_x, inout_y, rect.x, rect.y, rect.z, rect.w );
180 template <
typename T>
181 bool COORDS_IN_RECT( T input_x, T input_y, T rect_x, T rect_y, T rect_z, T rect_w )
noexcept
190 return COORDS_IN_RECT( input_x, input_y, rect.x, rect.y, rect.z, rect.w );
193 template <
typename T>
196 return COORDS_IN_RECT( input_x, input_y, rect.x, rect.y, rect.z, rect.w );
199 template<
typename T>
requires std::is_integral<T>::value && std::is_unsigned<T>::value
200 constexpr T
roundup( T value,
unsigned maxb =
sizeof( T ) * CHAR_BIT,
unsigned curb = 1 )
204 :
roundup( ((value - 1) | ((value - 1) >> curb)) + 1, maxb, curb << 1 );
232 while ( result * result < elementCount )
239 template <
typename T,
typename U>
240 T
Lerp(
const T v1,
const T v2,
const U t )
noexcept
242 return v1 * (
static_cast<U
>(1) - t) + v2 * t;
245 template <
typename T,
typename U>
246 T
FastLerp(
const T v1,
const T v2,
const U t )
noexcept
248 return v1 + t * (v2 - v1);
251 template <
typename T>
252 T
Sqrt(
const T input )
noexcept
254 return static_cast<T
>(std::sqrt( input ));
257 template <
typename T,
typename U>
258 T
Sqrt(
const U input )
noexcept
260 return static_cast<T
>(std::sqrt( input ));
264 inline F32 Sqrt(
const __m128 input )
noexcept
266 return _mm_cvtss_f32( _mm_sqrt_ss( input ) );
273 return to_F32( fmod( floatValue, 1.0f ) );
278 assert( value >= -1.f && value <= 1.f );
279 return to_I8( (value >= 1.0f ? 127 : (value <= -1.0f ? -127 :
to_I32(
SIGN( value ) * std::floor( std::abs( value ) * 128.0f ) ))) );
284 return value / 127.f;
289 assert( value >= -1.f && value <= 1.f );
291 const F32_NORM normValue = (value + 1) * 0.5f;
299 return 2 * normValue - 1;
304 return value == 255 ? 1.0f : value / 256.0f;
309 assert( value >= 0.f && value <= 1.f );
310 return to_U8( (value >= 1.0f ? 255 : (value <= 0.0f ? 0 :
to_I32( std::floor( value * 256.0f ) ))) );
318 assert( x >= -1.0f && x <= 1.0f );
319 assert( y >= -1.0f && y <= 1.0f );
320 assert( z >= -1.0f && z <= 1.0f );
324 to_U8( ((y + 1.0f) * 0.5f) * 255.0f ),
325 to_U8( ((z + 1.0f) * 0.5f) * 255.0f ) );
330 const U32 packed = x << 16 | y << 8 | z;
338 y =
FRACT( src * 256.0f );
339 z =
FRACT( src * 65536.0f );
351 template <
typename T>
359 template <
typename T>
367 template <
typename T>
379 template <
typename T>
391 template <
typename T>
397 template <
typename T>
403 template <
typename T>
409 template <
typename T>
415 template <
typename T>
421 template <
typename T>
428 template <
typename T>
435 template <
typename T>
441 template <
typename T>
442 constexpr T
Degrees(
const T degrees )
noexcept
448 template <
typename T>
449 constexpr T
Radians(
const T radians )
noexcept
460 template <
typename T>
463 return Tera<T, T>( a );
467 template <
typename T>
470 return Giga<T, T>( a );
474 template <
typename T>
477 return Mega<T, T>( a );
481 template <
typename T>
484 return Kilo<T, T>( a );
488 template <
typename T>
491 return Hecto<T, T>( a );
495 template <
typename T>
498 return Deca<T, T>( a );
502 template <
typename T>
505 return Base<T, T>( a );
509 template <
typename T>
512 return Deci<T, T>( a );
516 template <
typename T>
519 return Centi<T, T>( a );
523 template <
typename T>
526 return Milli<T, T>( a );
530 template <
typename T>
533 return Micro<T, T>( a );
537 template <
typename T>
540 return Nano<T, T>( a );
544 template <
typename T>
547 return Pico<T, T>( a );
551 template <
typename T,
typename U>
554 return static_cast<T
>(
multiply( a, 1'000'000'000'000 ));
557 template <
typename T,
typename U>
560 return static_cast<T
>(
multiply( a, 1'000'000'000 ));
563 template <
typename T,
typename U>
566 return static_cast<T
>(
multiply( a, 1'000'000 ));
569 template <
typename T,
typename U>
572 return static_cast<T
>(
multiply( a, 1'000 ));
575 template <
typename T,
typename U>
578 return static_cast<T
>(
multiply( a, 100 ));
581 template <
typename T,
typename U>
584 return static_cast<T
>(
multiply( a, 10 ));
587 template <
typename T,
typename U>
590 return static_cast<T
>(a);
593 template <
typename T,
typename U>
596 return static_cast<T
>(
divide( a, 10.0 ));
599 template <
typename T,
typename U>
602 return static_cast<T
>(
divide( a, 100.0 ));
605 template <
typename T,
typename U>
608 return static_cast<T
>(
divide( a, 1000.0 ));
611 template <
typename T,
typename U>
614 return static_cast<T
>(
divide( a, 1e6 ));
617 template <
typename T,
typename U>
620 return static_cast<T
>(
divide( a, 1e9 ));
623 template <
typename T,
typename U>
626 return static_cast<T
>(
divide( a, 1e12 ));
634 template <
typename T>
640 template <
typename T>
646 template <
typename T>
652 template <
typename T>
658 template <
typename T>
664 template <
typename T>
670 template <
typename T,
typename U>
673 return static_cast<T
>(a);
676 template <
typename T,
typename U>
679 return static_cast<T
>(a);
682 template <
typename T,
typename U>
685 return static_cast<T
>(a);
688 template <
typename T,
typename U>
691 return static_cast<T
>(a);
694 template <
typename T,
typename U>
697 return static_cast<T
>(a);
700 template <
typename T,
typename U>
703 return static_cast<T
>(a);
706 template <
typename T,
typename U>
709 return Metric::Nano<T, U>( a );
712 template <
typename T,
typename U>
715 return Metric::Micro<T, U>( a );
718 template <
typename T,
typename U>
721 return Metric::Milli<T, U>( a );
724 template <
typename T,
typename U>
727 return Metric::Micro<T, U>( a );
730 template <
typename T,
typename U>
733 return Metric::Milli<T, U>( a );
736 template <
typename T,
typename U>
739 return Metric::Kilo<T, U>( a );
742 template <
typename T,
typename U>
745 return Metric::Milli<T, U>( a );
748 template <
typename T,
typename U>
751 return Metric::Kilo<T, U>( a );
754 template <
typename T,
typename U>
757 return Metric::Mega<T, U>( a );
760 template <
typename T,
typename U>
763 return Metric::Kilo<T, U>( a );
766 template <
typename T,
typename U>
769 return Metric::Mega<T, U>( a );
772 template <
typename T,
typename U>
775 return Metric::Giga<T, U>( a );
785 return value % alignment == 0u
787 : ((value + alignment - 1u) / alignment) * alignment;
791 template<
typename T,
typename... Rest>
794 seed ^= std::hash<T>{}(v)+0x9e3779b9 + (seed << 6) + (seed >> 2);
798 template<
typename T,
typename... Rest>
requires std::is_integral<T>::value && std::is_unsigned<T>::value
801 seed ^= v + 0x9e3779b9 + (seed << 6) + (seed >> 2);
805 template <
typename TargetType,
typename SourceType>
809 std::istringstream iss( data );
811 DIVIDE_ASSERT( !iss.fail(),
"Util::convertData error : invalid conversion!" );
815 template<
class FwdIt,
class Compare>
818 for (
auto it = first; it != last; ++it )
820 auto const insertion = eastl::upper_bound( first, it, *it, cmp );
821 eastl::rotate( insertion, it, eastl::next( it ) );
constexpr T Degrees(T degrees) noexcept
Returns the specified value. Used only for emphasis.
constexpr T DegreesToRadians(T angleDegrees) noexcept
Return the radian equivalent of the given degree value.
constexpr DEGREES< T > to_DEGREES(RADIANS< T > angle) noexcept
constexpr T RadiansToDegrees(T angleRadians) noexcept
Return the degree equivalent of the given radian value.
constexpr RADIANS< T > to_RADIANS(DEGREES< T > angle) noexcept
constexpr DEGREES< T > to_VerticalFoV(DEGREES< T > horizontalFoV, D64 aspectRatio) noexcept
constexpr T Radians(T radians) noexcept
Returns the specified value. Used only for emphasis.
constexpr DEGREES< T > to_HorizontalFoV(DEGREES< T > verticalFoV, D64 aspectRatio) noexcept
constexpr T Nano(T a)
Base value * 0.000000001.
constexpr T Milli(T a)
Base value * 0.001.
constexpr T Kilo(T a)
Base value * 1000.
constexpr T Mega(T a)
Base value * 1000000.
constexpr T Tera(T a)
Base value * 1000000000000.
constexpr T Centi(T a)
Base value * 0.01.
constexpr T Deci(T a)
Base value * 0.1.
constexpr T Pico(T a)
Base value * 0.000000000001.
constexpr T Deca(T a)
Base value * 10.
constexpr T Giga(T a)
Base value * 1000000000.
constexpr T Base(T a)
Base value.
constexpr T Micro(T a)
Base value * 0.000001.
constexpr T Hecto(T a)
Base value * 100.
constexpr T MillisecondsToSeconds(U a) noexcept
constexpr T MicrosecondsToSeconds(U a) noexcept
constexpr T SecondsToNanoseconds(U a) noexcept
constexpr T MicrosecondsToMilliseconds(U a) noexcept
constexpr T NanosecondsToMilliseconds(U a) noexcept
constexpr T Milliseconds(T a)
constexpr T SecondsToMicroseconds(U a) noexcept
constexpr T NanosecondsToSeconds(U a) noexcept
constexpr T Microseconds(T a)
constexpr T NanosecondsToMicroseconds(U a) noexcept
constexpr T SecondsToMilliseconds(U a) noexcept
constexpr T MicrosecondsToNanoseconds(U a) noexcept
constexpr T MillisecondsToMicroseconds(U a) noexcept
constexpr T MillisecondsToNanoseconds(U a) noexcept
constexpr T Nanoseconds(T a)
U ConvertData(const T &data)
F32 PACK_VEC3(F32_SNORM x, F32_SNORM y, F32_SNORM z) noexcept
FORCE_INLINE size_t GetAlignmentCorrected(const size_t value, const size_t alignment) noexcept
void UNPACK_VEC3(F32 src, F32_SNORM &x, F32_SNORM &y, F32_SNORM &z) noexcept
void Hash_combine(size_t &seed, const T &v, const Rest &... rest) noexcept
a la Boost
void InsertionSort(FwdIt first, FwdIt last, Compare cmp=Compare())
Handle console commands that start with a forward slash.
FORCE_INLINE bool Compare(const GUIDWrapper *const lhs, const GUIDWrapper *const rhs) noexcept
constexpr U8 FLOAT_TO_CHAR_UNORM(F32_NORM value) noexcept
Returns round(value * 255)
::value constexpr void CLAMP_01(T &n) noexcept
constexpr I8 FLOAT_TO_CHAR_SNORM(F32_SNORM value) noexcept
Returns clamped value * 128.
constexpr F32_SNORM UNORM_CHAR_TO_PACKED_FLOAT(U8 value) noexcept
constexpr U32 nextPOW2(U32 n) noexcept
T Lerp(T v1, T v2, U t) noexcept
TextureType TargetType(const ImageView &imageView) noexcept
::value &&std::is_unsigned< T >::value constexpr T roundup(T value, unsigned maxb=sizeof(T) *CHAR_BIT, unsigned curb=1)
constexpr T SQUARED(T input) noexcept
constexpr F32_NORM UNORM_CHAR_TO_FLOAT(U8 value) noexcept
Returns value / 255.f.
constexpr D64 EPSILON_D64
bool IS_IN_RANGE_INCLUSIVE(const T x, const U min, const U max) noexcept
F32 FRACT(F32 floatValue) noexcept
Helper method to emulate GLSL.
constexpr void REMAP(T &input, T in_min, T in_max, T out_min, T out_max, D64 &slopeOut) noexcept
void CLAMP_IN_RECT(T &inout_x, T &inout_y, T rect_x, T rect_y, T rect_z, T rect_w) noexcept
constexpr F32 to_F32(const T value)
constexpr D64 to_D64(const T value)
constexpr resolve_uac< A, B >::return_type divide(const A &a, const B &b) noexcept
constexpr I32 SIGN(const T val)
constexpr U32 prevPOW2(U32 n) noexcept
constexpr F32 M_180DIVPI_f
constexpr U8 PACKED_FLOAT_TO_CHAR_UNORM(F32_SNORM value) noexcept
Helper methods to go from an snorm float (-1...1) to packed unorm char (value => (value + 1) * 0....
constexpr I8 to_I8(const T value)
::value constexpr T MAP(T input, T in_min, T in_max, T out_min, T out_max, D64 &slopeOut) noexcept
constexpr U8 to_U8(const T value)
::value constexpr T CLAMPED(T n, T min, T max) noexcept
constexpr F32 M_PIDIV180_f
constexpr F32_SNORM SNORM_CHAR_TO_FLOAT(I8 value) noexcept
constexpr U32 minSquareMatrixSize(U32 elementCount) noexcept
bool COORDS_IN_RECT(T input_x, T input_y, T rect_x, T rect_y, T rect_z, T rect_w) noexcept
::value constexpr void CLAMP(T &n, T min, T max) noexcept
Clamps value n between min and max.
T FastLerp(T v1, T v2, U t) noexcept
constexpr I32 to_I32(const T value)
constexpr resolve_uac< A, B >::return_type multiply(const A &a, const B &b) noexcept
::value constexpr T CLAMPED_01(T n) noexcept