BLT/include/blt/math/math.h

97 lines
2.4 KiB
C
Raw Normal View History

2023-01-10 10:45:11 -05:00
/*
* Created by Brett on 09/01/23.
* Licensed under GNU General Public License V3.0
* See LICENSE file for license detail
*/
#ifndef BLT_MATH_H
#define BLT_MATH_H
#include <blt/math/vectors.h>
#include <blt/math/matrix.h>
2023-02-07 22:34:10 -05:00
2023-12-29 19:32:16 -05:00
namespace blt
{
static inline constexpr double PI = 3.141592653589793238462643383279502884197;
template<typename T>
static inline T toRadians(T deg)
{
constexpr double CONV = PI / 180.0;
return deg * CONV;
}
2023-03-14 17:30:22 -04:00
/**
* fast number integer
*/
2023-12-29 19:32:16 -05:00
static inline unsigned int f_randi(unsigned int seed)
{
seed = (seed << 13) ^ seed;
return ((seed * (seed * seed * 15731 + 789221) + 1376312589) & 0x7fffffff);
}
2024-02-22 15:54:52 -05:00
#ifdef __GNUC__
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wstrict-aliasing"
2024-02-21 20:24:00 -05:00
#endif
2023-12-29 19:32:16 -05:00
/**
* fast inverse sqrt
*/
2023-12-29 19:32:16 -05:00
static inline float fsqrt(float n)
{
int i;
float x, y;
x = n * 0.5f;
y = n;
2023-04-05 17:21:19 -04:00
i = *reinterpret_cast<int*>(&y);
i = 0x5f3759df - (i >> 1);
2023-04-05 17:21:19 -04:00
y = *reinterpret_cast<float*>(&i);
y = y * (1.5f - (x * y * y));
y = y * (1.5f - (x * y * y));
return y;
}
2024-02-22 15:54:52 -05:00
#ifdef __GNUC__
#pragma GCC diagnostic pop
2024-02-21 20:24:00 -05:00
#endif
2023-12-29 19:32:16 -05:00
static inline constexpr double pow(int b, int p)
{
int collection = 1;
for (int i = 0; i < p; i++)
collection *= b;
return collection;
}
/**
* This is a fast rounding function and is not guaranteed to be 100% correct
* @tparam decimal_places
* @param value
* @return
*/
template<int decimal_places>
2024-03-11 12:05:37 -04:00
constexpr static inline double round_up(double value)
2023-12-29 19:32:16 -05:00
{
2024-03-11 12:05:37 -04:00
if constexpr (decimal_places < 0)
return value;
else
{
constexpr double multiplier = pow(10, decimal_places);
return ((int) (value * multiplier) + 1) / multiplier;
}
}
2023-04-05 17:21:19 -04:00
/*inline std::ostream& operator<<(std::ostream& out, const mat4x4& v) {
return out << "\rMatrix4x4{" << v.m00() << ", " << v.m01() << ", " << v.m02() << ", " << v.m03() << "} \n"\
<< " {" << v.m10() << ", " << v.m11() << ", " << v.m12() << ", " << v.m13() << "} \n"\
<< " {" << v.m20() << ", " << v.m21() << ", " << v.m22() << ", " << v.m23() << "} \n"\
<< " {" << v.m30() << ", " << v.m31() << ", " << v.m32() << ", " << v.m33() << "} \n";
}*/
2023-12-29 19:32:16 -05:00
2023-01-10 10:45:11 -05:00
}
#endif //BLT_MATH_H