5#ifndef NNGN_MATH_MATH_H
6#define NNGN_MATH_MATH_H
25 using std::mt19937::default_seed;
26 using std::mt19937::result_type;
27 using std::mt19937::min;
28 using std::mt19937::max;
29 using std::mt19937::mt19937;
30 using std::mt19937::operator();
31 using std::mt19937::operator=;
32 using std::mt19937::seed;
35 using rand_seed_t = std::decay_t<
decltype(rnd_generator_t::default_seed)>;
40 template<
typename T =
double>
static constexpr T
sq2_2(
void);
41 template<
typename T =
double>
static constexpr T
sq2(
void);
42 template<
typename T =
double>
static constexpr T
e(
void);
43 template<
typename T =
double>
static constexpr T
pi(
void);
44 template<
typename T =
double>
static constexpr T
tau(
void);
45 template<
typename T =
double>
static constexpr T
radians(T d);
46 template<
typename T =
double>
static constexpr T
degrees(T r);
49 template<
typename T>
static constexpr T
round_up_pow2(T n, T d);
50 template<
typename T>
static constexpr T
round_down(T n, T d);
51 template<
typename T>
static constexpr T
round_up(T n, T d);
52 template<
typename T>
static constexpr T
round_up_div(T n, T d);
53 template<
unsigned_
integral T>
static constexpr T
mip_levels(T extent);
54 template<
typename T>
static constexpr auto dot(T u, T
v);
56 template<
typename T>
static constexpr auto length2(T
v);
57 template<
typename T>
static auto length(T
v);
59 template<
template<
typename>
typename V,
typename T>
82 std::span<float> dst,
const float *src0,
const float *src1,
94 static constexpr T
minor(
148 T left, T right, T bottom, T top, T near, T far);
157 std::size_t size,
float std_dev, std::span<float>
s);
159 std::size_t xsize, std::size_t ysize,
float std_dev,
161 static bool is_aligned(
void *p, std::size_t a);
162 static void *
align_ptr(
void *p, std::size_t a);
171template<
typename T>
inline constexpr T
Math::sq2(
void) {
172 return static_cast<T
>(1.41421356237309514547462185873882845);
176 return static_cast<T
>(0.70710678118654757273731092936941423);
179template<
typename T>
inline constexpr T
Math::e(
void) {
180 return static_cast<T
>(2.7182818284590450907955982984276488);
183template<
typename T>
inline constexpr T
Math::pi(
void) {
184 return static_cast<T
>(3.14159265358979323846264338327950288);
187template<
typename T>
inline constexpr T
Math::tau(
void) {
188 return static_cast<T
>(6.28318530717958647692528676655900576);
192 constexpr auto mul = Math::tau<T>() / T{360};
197 constexpr auto mul = T{360} * Math::tau<T>();
203 assert(std::popcount(d) == 1);
209 assert(std::popcount(d) == 1);
210 return --d, (n + d) & ~d;
215 if(
const auto r = n % d)
222 if(
const auto r = n % d)
229 return (d - 1 + n) / d;
232template<
unsigned_
integral T>
234 assert(std::popcount(extent) == 1);
235 return T{1} +
static_cast<T
>(std::countr_zero(std::bit_floor(extent)));
240 if constexpr(std::ranges::range<T>)
241 return std::inner_product(
242 std::ranges::begin(u), std::ranges::end(u), std::ranges::begin(
v),
243 std::ranges::range_value_t<T>{});
263template<
template<
typename>
typename V,
typename T>
267 return len2 <= max2 ?
v :
v * std::sqrt(max2 / len2);
277 return std::accumulate(
289 u.
y *
v.z - u.
z *
v.y,
290 u.
z *
v.x - u.
x *
v.z,
291 u.
x *
v.y - u.
y *
v.x,
321 return {
m.row(0),
m.row(1),
m.row(2)};
326 return {
m.row(0),
m.row(1),
m.row(2),
m.row(3)};
333 return {
m[i][0],
m[(i + 1) % 3][1],
m[(i + 2) % 3][2]};
340 return {
m[i][0],
m[(i + 2) % 3][1],
m[(i + 1) % 3][2]};
351 for( ; r != j; ++r) ret[c][r ] =
m[c][r];
352 for(++r; r != 4; ++r) ret[c][r - 1] =
m[c][r];
354 for(++c; c != 4; ++c) {
356 for( ; r != j; ++r) ret[c - 1][r ] =
m[c][r];
357 for(++r; r != 4; ++r) ret[c - 1][r - 1] =
m[c][r];
372 return M::product(M::diag(
m, 0)) - M::product(M::inv_diag(
m, 0))
373 + M::product(M::diag(
m, 1)) - M::product(M::inv_diag(
m, 1))
374 + M::product(M::diag(
m, 2)) - M::product(M::inv_diag(
m, 2));
380 return m[0][0] * M::minor(
m, 0, 0)
381 -
m[0][1] * M::minor(
m, 0, 1)
382 +
m[0][2] * M::minor(
m, 0, 2)
383 -
m[0][3] * M::minor(
m, 0, 3);
390 for(std::size_t c = 0; c != 4; ++c,
s = -
s)
391 for(std::size_t r = 0; r != 4; ++r,
s = -
s)
407 {
m[0] *
v[0] +
m[1] *
v[1] +
m[2] *
v[2] +
m[3]}};
414 return {
m[0] *
v[0],
m[1] *
v[1],
m[2] *
v[2],
m[3]};
419 return {
v.x * cos -
v.y * sin,
v.x * sin +
v.y * cos};
433 const auto d =
v - proj;
434 const auto rot = cos * d + sin *
Math::cross(n, d);
448 return {
v.x, r.x, r.y};
454 return {r.y,
v.y, r.x};
460 return {r.x, r.y,
v.z};
482 const T cos = std::cos(
angle);
483 const T sin = std::sin(
angle);
485 const auto tmp = (T{1} - cos) * axis;
487 rot[0][0] = tmp.x * axis.x + cos;
488 rot[0][1] = tmp.y * axis.x + sin * axis.z;
489 rot[0][2] = tmp.z * axis.x - sin * axis.y;
490 rot[1][0] = tmp.x * axis.y - sin * axis.z;
491 rot[1][1] = tmp.y * axis.y + cos;
492 rot[1][2] = tmp.z * axis.y + sin * axis.x;
493 rot[2][0] = tmp.x * axis.z + sin * axis.y;
494 rot[2][1] = tmp.y * axis.z - sin * axis.x;
495 rot[2][2] = tmp.z * axis.z + cos;
502 const auto w = right - left, h = top - bottom;
504 ret[0][0] = T{2} /
w;
505 ret[1][1] = T{2} / h;
508 ret[3][0] = -(right + left) /
w;
509 ret[3][1] = -(top + bottom) / h;
515 T left, T right, T bottom, T top, T near, T far)
518 const auto z = far - near;
519 ret[2][2] = -T{2} / z;
520 ret[3][2] = -(far + near) / z;
526 T fovy, T aspect, T near, T far)
528 assert(std::abs(aspect) > -std::numeric_limits<T>::epsilon());
529 const auto tan = std::tan(fovy / T{2});
531 ret[0][0] = T{1} / (aspect * tan);
532 ret[1][1] = T{1} / tan;
533 ret[2][2] = -(far + near) / (far - near);
535 ret[3][2] = -T{2} * far * near / (far - near);
555 const auto u =
reinterpret_cast<std::uintptr_t
>(p);
560 const auto u =
reinterpret_cast<std::uintptr_t
>(p);
562 return reinterpret_cast<void*
>(r);
static constexpr mat3_base< T > minor_matrix(const mat4_base< T > &m, std::size_t i, std::size_t j)
Definition: math.h:344
static constexpr T pi(void)
Definition: math.h:183
static constexpr mat4_base< T > ortho(T left, T right, T bottom, T top)
Definition: math.h:501
std::decay_t<> rand_seed_t
Definition: math.h:35
static constexpr T tau(void)
Definition: math.h:187
void init(void)
Definition: math.cpp:56
static constexpr vec3_base< T > rotate_z(vec3_base< T > v, T sin, T cos)
Definition: math.h:458
static constexpr vec3_base< T > inv_diag(const mat3_base< T > &m, std::size_t i)
Definition: math.h:337
static constexpr T round_down(T n, T d)
Definition: math.h:214
static constexpr T e(void)
Definition: math.h:179
static constexpr mat4_base< T > inverse(const mat4_base< T > &m)
Definition: math.h:397
static void mat_mul(std::span< float > dst, const float *src0, const float *src1, std::size_t n)
Definition: math.cpp:44
static constexpr mat4_base< T > translate(const mat4_base< T > &m, vec3_base< T > v)
Definition: math.h:402
static constexpr vec3_base< T > normal(vec3_base< T > p0, vec3_base< T > p1, vec3_base< T > p2)
Definition: math.h:313
static constexpr mat3_base< T > transpose(const mat3_base< T > &m)
Definition: math.h:320
static constexpr T round_up_div(T n, T d)
Definition: math.h:228
static constexpr T determinant(const mat3_base< T > &m)
Definition: math.h:370
static auto length(T v)
Definition: math.h:254
static constexpr vector_type< T > product(T v)
Definition: math.h:276
static constexpr vector_type< T > avg(T v)
Definition: math.h:282
static constexpr T mip_levels(T extent)
Definition: math.h:233
static constexpr T cofactor(const mat4_base< T > &m, std::size_t i, std::size_t j)
static constexpr mat4_base< T > look_at(vec3_base< T > eye, vec3_base< T > center, vec3_base< T > up)
Definition: math.h:540
static constexpr T round_up_pow2(T n, T d)
Definition: math.h:208
void seed_rand(rand_seed_t s)
Definition: math.cpp:58
static constexpr vector_type< T > sum(T v)
Definition: math.h:271
std::optional< rnd_generator_t > m_rnd_generator
Definition: math.h:37
static constexpr T sq2(void)
Definition: math.h:171
static constexpr mat4_base< T > adjugate(const mat4_base< T > &m)
Definition: math.h:387
static V< T > clamp_len(V< T > v, T len)
Definition: math.h:265
static constexpr T sq2_2(void)
Definition: math.h:175
static bool is_aligned(void *p, std::size_t a)
Definition: math.h:554
static constexpr auto dot(T u, T v)
Definition: math.h:239
static constexpr T round_down_pow2(T n, T d)
Definition: math.h:202
static constexpr vec3_base< T > rotate_y(vec3_base< T > v, T sin, T cos)
Definition: math.h:452
static constexpr vec3_base< T > diag(const mat3_base< T > &m, std::size_t i)
Definition: math.h:330
static constexpr T radians(T d)
Definition: math.h:191
static constexpr T angle(vec2_base< T > u, vec2_base< T > v)
Definition: math.h:296
static constexpr T round_up(T n, T d)
Definition: math.h:221
static constexpr auto length2(T v)
Definition: math.h:249
auto * rnd_generator(void)
Definition: math.h:165
static constexpr T degrees(T r)
Definition: math.h:196
static constexpr vec2_base< T > rotate(vec2_base< T > v, T sin, T cos)
Definition: math.h:418
static T normalize(T v)
Definition: math.h:259
static constexpr mat4_base< T > perspective(T fovy, T aspect, T near, T far)
Definition: math.h:525
void rand_mat(std::span< float > m)
Definition: math.cpp:67
static constexpr vec3_base< T > reflect(vec3_base< T > v, vec3_base< T > n)
Definition: math.h:308
static constexpr mat4_base< T > scale(const mat4_base< T > &m, vec3_base< T > v)
Definition: math.h:411
static constexpr T minor(const mat4_base< T > &m, std::size_t i, std::size_t j)
Definition: math.h:363
static constexpr vec3_base< T > cross(vec3_base< T > u, vec3_base< T > v)
Definition: math.h:287
static constexpr vec3_base< T > rotate_x(vec3_base< T > v, T sin, T cos)
Definition: math.h:446
static void gaussian_filter(std::size_t size, float std_dev, std::span< float > s)
Definition: math.cpp:10
static void * align_ptr(void *p, std::size_t a)
Definition: math.h:559
assert
Definition: debug.lua:3
end
Definition: entities.lua:9
constexpr const R * begin(const T< R > &v)
Definition: vec.h:207
typename T::type vector_type
Definition: vec.h:62
rotate
Definition: camera.lua:44
v[1]
Definition: math.lua:19
w
Definition: strict.lua:12
std::chrono::seconds s
Definition: timing.cpp:6