nngn
Loading...
Searching...
No Matches
math.h
Go to the documentation of this file.
1
5#ifndef NNGN_MATH_MATH_H
6#define NNGN_MATH_MATH_H
7
8#include <bit>
9#include <cassert>
10#include <cmath>
11#include <optional>
12#include <random>
13#include <span>
14
15#include "utils/concepts/fundamental.h"
16
17#include "mat3.h"
18#include "mat4.h"
19
20namespace nngn {
21
22class Math {
23public:
24 struct rnd_generator_t : private std::mt19937 {
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;
34 };
35 using rand_seed_t = std::decay_t<decltype(rnd_generator_t::default_seed)>;
36private:
37 std::optional<rnd_generator_t> m_rnd_generator = {};
38public:
39 // Constants
40 template<typename T> static constexpr T sq2_2(void);
41 template<typename T> static constexpr T sq2(void);
42 template<typename T> static constexpr T e(void);
43 template<typename T> static constexpr T pi(void);
44 template<typename T> static constexpr T tau(void);
45 template<typename T> static constexpr T radians(T d);
46 template<typename T> static constexpr T degrees(T r);
47 // Scalar
48 template<typename T> static constexpr T round_down_pow2(T n, T d);
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 // Vector
55 template<typename T> static constexpr auto length2(const T &v);
56 template<typename T> static auto length(const T &v);
57 template<typename T> static T normalize(const T &v);
58 template<template<typename> typename V, typename T>
59 requires vector<V, T>
60 static V<T> clamp_len(V<T> v, T len);
61 template<typename T>
62 static constexpr vector_type<T> sum(const T &v);
63 template<typename T>
64 static constexpr vector_type<T> product(const T &v);
65 template<typename T>
66 static constexpr vector_type<T> avg(const T &v);
67 template<typename T>
68 static constexpr vector_type<T> dot(const T &u, const T &v);
69 template<typename T> static constexpr vec3_base<T> cross(
70 const vec3_base<T> &u, const vec3_base<T> &v);
71 template<typename T>
72 static constexpr T angle(const vec2_base<T> &u, const vec2_base<T> &v);
73 template<typename T>
74 static constexpr T angle(
75 const vec3_base<T> &u, const vec3_base<T> &v, const vec3_base<T> &n);
76 template<typename T>
77 static constexpr vec3_base<T> reflect(
78 const vec3_base<T> &v, const vec3_base<T> &n);
79 // Plane
80 template<typename T> static constexpr vec3_base<T> normal(
81 const vec3_base<T> &p0, const vec3_base<T> &p1, const vec3_base<T> &p2);
82 // Matrix
83 static void mat_mul(
84 std::span<float> dst, const float *src0, const float *src1,
85 std::size_t n);
86 template<typename T>
87 static constexpr vec3_base<T> diag(
88 const mat3_base<T> &m, std::size_t i);
89 template<typename T>
90 static constexpr vec3_base<T> inv_diag(
91 const mat3_base<T> &m, std::size_t i);
92 template<typename T>
93 static constexpr mat3_base<T> minor_matrix(
94 const mat4_base<T> &m, std::size_t i, std::size_t j);
95 template<typename T>
96 static constexpr T minor(
97 const mat4_base<T> &m, std::size_t i, std::size_t j);
98 template<typename T>
99 static constexpr T determinant(const mat3_base<T> &m);
100 template<typename T>
101 static constexpr T determinant(const mat4_base<T> &m);
102 template<typename T>
103 static constexpr T cofactor(
104 const mat4_base<T> &m, std::size_t i, std::size_t j);
105 template<typename T>
106 static constexpr mat4_base<T> adjugate(const mat4_base<T> &m);
107 template<typename T>
108 static constexpr mat4_base<T> inverse(const mat4_base<T> &m);
109 template<typename T>
110 static constexpr mat3_base<T> transpose(const mat3_base<T> &m);
111 template<typename T>
112 static constexpr mat4_base<T> transpose(const mat4_base<T> &m);
113 template<typename T>
114 static constexpr mat4_base<T> translate(
115 const mat4_base<T> &m, const vec3_base<T> &v);
116 template<typename T>
117 static constexpr mat4_base<T> scale(
118 const mat4_base<T> &m, const vec3_base<T> &v);
119 // Rotation
120 template<typename T>
121 static constexpr vec2_base<T> rotate(const vec2_base<T> &v, T sin, T cos);
122 template<typename T>
123 static constexpr vec2_base<T> rotate(const vec2_base<T> &v, T angle);
124 template<typename T>
125 static constexpr vec3_base<T> rotate(
126 const vec3_base<T> &v, T sin, T cos, const vec3_base<T> &n);
127 template<typename T>
128 static constexpr vec3_base<T> rotate(
129 const vec3_base<T> &v, T angle, const vec3_base<T> &n);
130 template<typename T>
131 static constexpr vec3_base<T> rotate_x(const vec3_base<T> &v, T sin, T cos);
132 template<typename T>
133 static constexpr vec3_base<T> rotate_y(const vec3_base<T> &v, T sin, T cos);
134 template<typename T>
135 static constexpr vec3_base<T> rotate_z(const vec3_base<T> &v, T sin, T cos);
136 template<typename T>
137 static constexpr vec3_base<T> rotate_x(const vec3_base<T> &v, T angle);
138 template<typename T>
139 static constexpr vec3_base<T> rotate_y(const vec3_base<T> &v, T angle);
140 template<typename T>
141 static constexpr vec3_base<T> rotate_z(const vec3_base<T> &v, T angle);
142 template<typename T>
143 static constexpr mat4_base<T> rotate(
144 const mat4_base<T> &m, T angle, const vec3_base<T> &v);
145 // Projection
146 template<typename T>
147 static constexpr mat4_base<T> ortho(T left, T right, T bottom, T top);
148 template<typename T>
149 static constexpr mat4_base<T> ortho(
150 T left, T right, T bottom, T top, T near, T far);
151 template<typename T>
152 static constexpr mat4_base<T> perspective(T fovy, T aspect, T near, T far);
153 // View
154 template<typename T>
155 static constexpr mat4_base<T> look_at(
156 const vec3_base<T> &eye, const vec3_base<T> &center,
157 const vec3_base<T> &up);
158 // Etc.
159 static void gaussian_filter(
160 std::size_t size, float std_dev, std::span<float> s);
161 static void gaussian_filter(
162 std::size_t xsize, std::size_t ysize, float std_dev,
163 std::span<float> s);
164 static bool is_aligned(void *p, std::size_t a);
165 static void *align_ptr(void *p, std::size_t a);
166 template<typename T>
167 static T *align_ptr(void *p);
168 auto *rnd_generator(void) { return &*this->m_rnd_generator; }
169 void init(void);
170 void seed_rand(rand_seed_t s);
171 void rand_mat(std::span<float> m);
172};
173
174template<typename T> inline constexpr T Math::sq2(void) {
175 return static_cast<T>(1.41421356237309514547462185873882845);
176}
177
178template<typename T> inline constexpr T Math::sq2_2(void) {
179 return static_cast<T>(0.70710678118654757273731092936941423);
180}
181
182template<typename T> inline constexpr T Math::e(void) {
183 return static_cast<T>(2.7182818284590450907955982984276488);
184}
185
186template<typename T> inline constexpr T Math::pi(void) {
187 return static_cast<T>(3.14159265358979323846264338327950288);
188}
189
190template<typename T> inline constexpr T Math::tau(void) {
191 return static_cast<T>(6.28318530717958647692528676655900576);
192}
193
194template<typename T> inline constexpr T Math::radians(T d) {
195 constexpr auto mul = Math::tau<T>() / T{360};
196 return d * mul;
197}
198
199template<typename T> inline constexpr T Math::degrees(T r) {
200 constexpr auto mul = T{360} * Math::tau<T>();
201 return r * mul;
202}
203
204template<typename T>
205constexpr T Math::round_down_pow2(T n, T d) {
206 assert(std::popcount(d) == 1);
207 return n & ~--d;
208}
209
210template<typename T>
211constexpr T Math::round_up_pow2(T n, T d) {
212 assert(std::popcount(d) == 1);
213 return --d, (n + d) & ~d;
214}
215
216template<typename T>
217constexpr T Math::round_down(T n, T d) {
218 if(const auto r = n % d)
219 n -= r;
220 return n;
221}
222
223template<typename T>
224constexpr T Math::round_up(T n, T d) {
225 if(const auto r = n % d)
226 n += d - r;
227 return n;
228}
229
230template<typename T>
231constexpr T Math::round_up_div(T n, T d) {
232 return (d - 1 + n) / d;
233}
234
235template<unsigned_integral T>
236constexpr T Math::mip_levels(T extent) {
237 assert(std::popcount(extent) == 1);
238 return T{1} + static_cast<T>(std::countr_zero(std::bit_floor(extent)));
239}
240
241template<typename T>
242inline constexpr auto Math::length2(const T &v) {
243 return Math::dot(v, v);
244}
245
246template<typename T>
247inline auto Math::length(const T &v) {
248 return std::sqrt(Math::length2(v));
249}
250
251template<typename T>
252inline T Math::normalize(const T &v) {
253 return v / Math::length(v);
254}
255
256template<template<typename> typename V, typename T>
257requires vector<V, T>
258inline V<T> Math::clamp_len(V<T> v, T len) {
259 const auto len2 = Math::length2(v), max2 = len * len;
260 return len2 <= max2 ? v : v * std::sqrt(max2 / len2);
261}
262
263template<typename T>
264inline constexpr vector_type<T> Math::sum(const T &v) {
265 return std::accumulate(begin(v), end(v), vector_type<T>{});
266}
267
268template<typename T>
269inline constexpr vector_type<T> Math::product(const T &v) {
270 return std::accumulate(
271 begin(v), end(v), vector_type<T>{1}, std::multiplies<>{});
272}
273
274template<typename T>
275inline constexpr vector_type<T> Math::avg(const T &v) {
276 return Math::sum(v) / vector_type<T>{T::n_dim};
277}
278
279template<typename T>
280inline constexpr vector_type<T> Math::dot(const T &u, const T &v) {
281 return std::inner_product(begin(u), end(u), begin(v), vector_type<T>{});
282}
283
284template<typename T>
285inline constexpr vec3_base<T> Math::cross(
286 const vec3_base<T> &u, const vec3_base<T> &v)
287{
288 return {
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,
292 };
293}
294
295template<typename T>
296inline constexpr T Math::angle(
297 const vec2_base<T> &u, const vec2_base<T> &v)
298{
299 return Math::angle(vec3_base<T>(u), vec3_base<T>(v), {0, 0, 1});
300}
301
302template<typename T>
303inline constexpr T Math::angle(
304 const vec3_base<T> &u, const vec3_base<T> &v, const vec3_base<T> &n)
305{
306 const auto cross = Math::cross(u, v);
307 const auto ret = std::acos(Math::dot(u, v));
308 return Math::dot(cross, n) < 0 ? Math::tau<T>() - ret : ret;
309}
310
311template<typename T>
313 const vec3_base<T> &v, const vec3_base<T> &n)
314{
315 return v - T(2) * n * Math::dot(v, n);
316}
317
318template<typename T>
319inline constexpr vec3_base<T> Math::normal(
320 const vec3_base<T> &p0, const vec3_base<T> &p1, const vec3_base<T> &p2)
321{
322 return Math::cross(p1 - p0, p2 - p0);
323}
324
325template<typename T>
326inline constexpr mat3_base<T> Math::transpose(const mat3_base<T> &m) {
327 return {m.row(0), m.row(1), m.row(2)};
328}
329
330template<typename T>
331inline constexpr mat4_base<T> Math::transpose(const mat4_base<T> &m) {
332 return {m.row(0), m.row(1), m.row(2), m.row(3)};
333}
334
335template<typename T>
336inline constexpr vec3_base<T> Math::diag(
337 const mat3_base<T> &m, std::size_t i)
338{
339 return {m[i][0], m[(i + 1) % 3][1], m[(i + 2) % 3][2]};
340}
341
342template<typename T>
344 const mat3_base<T> &m, std::size_t i)
345{
346 return {m[i][0], m[(i + 2) % 3][1], m[(i + 1) % 3][2]};
347}
348
349template<typename T>
351 const mat4_base<T> &m, std::size_t i, std::size_t j)
352{
353 mat3_base<T> ret = {};
354 std::size_t c = 0;
355 for(; c != i; ++c) {
356 std::size_t r = 0;
357 for( ; r != j; ++r) ret[c][r ] = m[c][r];
358 for(++r; r != 4; ++r) ret[c][r - 1] = m[c][r];
359 }
360 for(++c; c != 4; ++c) {
361 std::size_t r = 0;
362 for( ; r != j; ++r) ret[c - 1][r ] = m[c][r];
363 for(++r; r != 4; ++r) ret[c - 1][r - 1] = m[c][r];
364 }
365 return ret;
366}
367
368template<typename T>
369inline constexpr T Math::minor(
370 const mat4_base<T> &m, std::size_t i, std::size_t j)
371{
373}
374
375template<typename T>
376inline constexpr T Math::determinant(const mat3_base<T> &m) {
377 using M = Math;
378 return M::product(M::diag(m, 0)) - M::product(M::inv_diag(m, 0))
379 + M::product(M::diag(m, 1)) - M::product(M::inv_diag(m, 1))
380 + M::product(M::diag(m, 2)) - M::product(M::inv_diag(m, 2));
381}
382
383template<typename T>
384inline constexpr T Math::determinant(const mat4_base<T> &m) {
385 using M = Math;
386 return m[0][0] * M::minor(m, 0, 0)
387 - m[0][1] * M::minor(m, 0, 1)
388 + m[0][2] * M::minor(m, 0, 2)
389 - m[0][3] * M::minor(m, 0, 3);
390}
391
392template<typename T>
393inline constexpr mat4_base<T> Math::adjugate(const mat4_base<T> &m) {
394 mat4_base<T> ret = {};
395 float s = 1.0f;
396 for(std::size_t c = 0; c != 4; ++c, s = -s)
397 for(std::size_t r = 0; r != 4; ++r, s = -s)
398 ret[c][r] = s * Math::minor(m, r, c);
399 return ret;
400}
401
402template<typename T>
403inline constexpr mat4_base<T> Math::inverse(const mat4_base<T> &m) {
404 return T{1} / Math::determinant(m) * Math::adjugate(m);
405}
406
407template<typename T>
409 const mat4_base<T> &m, const vec3_base<T> &v)
410{
411 return {
412 m[0], m[1], m[2],
413 {m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3]}};
414}
415
416template<typename T>
417inline constexpr mat4_base<T> Math::scale(
418 const mat4_base<T> &m, const vec3_base<T> &v)
419{
420 return {m[0] * v[0], m[1] * v[1], m[2] * v[2], m[3]};
421}
422
423template<typename T>
424inline constexpr vec2_base<T> Math::rotate(
425 const vec2_base<T> &v, T sin, T cos)
426{
427 return {v.x * cos - v.y * sin, v.x * sin + v.y * cos};
428}
429
430
431template<typename T>
432inline constexpr vec2_base<T> Math::rotate(const vec2_base<T> &v, T angle) {
433 return Math::rotate(v, std::sin(angle), std::cos(angle));
434}
435
436template<typename T>
437inline constexpr vec3_base<T> Math::rotate(
438 const vec3_base<T> &v, T sin, T cos, const vec3_base<T> &n)
439{
440 const auto proj = n * Math::dot(n, v);
441 const auto d = v - proj;
442 const auto rot = cos * d + sin * Math::cross(n, d);
443 return proj + rot;
444}
445
446template<typename T>
447inline constexpr vec3_base<T> Math::rotate(
448 const vec3_base<T> &v, T angle, const vec3_base<T> &n) {
449 return Math::rotate(v, std::sin(angle), std::cos(angle), n);
450}
451
452template<typename T>
454 const vec3_base<T> &v, T sin, T cos) {
455 return {v.x, Math::rotate(v.yz(), sin, cos)};
456}
457
458template<typename T>
460 const vec3_base<T> &v, T sin, T cos)
461{
462 const auto ret = Math::rotate(v.zx(), sin, cos);
463 return {ret[1], v.y, ret[0]};
464}
465
466template<typename T>
468 const vec3_base<T> &v, T sin, T cos) {
469 return {Math::rotate(v.xy(), sin, cos), v.z};
470}
471
472template<typename T>
473inline constexpr vec3_base<T> Math::rotate_x(const vec3_base<T> &v, T angle) {
474 return Math::rotate_x(v, std::sin(angle), std::cos(angle));
475}
476
477template<typename T>
478inline constexpr vec3_base<T> Math::rotate_y(const vec3_base<T> &v, T angle) {
479 return Math::rotate_y(v, std::sin(angle), std::cos(angle));
480}
481
482template<typename T>
483inline constexpr vec3_base<T> Math::rotate_z(const vec3_base<T> &v, T angle) {
484 return Math::rotate_z(v, std::sin(angle), std::cos(angle));
485}
486
487template<typename T>
488inline constexpr mat4_base<T> Math::rotate(
489 const mat4_base<T> &m, T angle, const vec3_base<T> &v)
490{
491 const T cos = std::cos(angle);
492 const T sin = std::sin(angle);
493 const auto axis = Math::normalize(v);
494 const auto tmp = (T{1} - cos) * axis;
495 mat4 rot = {};
496 rot[0][0] = tmp.x * axis.x + cos;
497 rot[0][1] = tmp.y * axis.x + sin * axis.z;
498 rot[0][2] = tmp.z * axis.x - sin * axis.y;
499 rot[1][0] = tmp.x * axis.y - sin * axis.z;
500 rot[1][1] = tmp.y * axis.y + cos;
501 rot[1][2] = tmp.z * axis.y + sin * axis.x;
502 rot[2][0] = tmp.x * axis.z + sin * axis.y;
503 rot[2][1] = tmp.y * axis.z - sin * axis.x;
504 rot[2][2] = tmp.z * axis.z + cos;
505 rot[3][3] = T{1};
506 return m * rot;
507}
508
509template<typename T>
510inline constexpr mat4_base<T> Math::ortho(T left, T right, T bottom, T top) {
511 const auto w = right - left, h = top - bottom;
513 T{2} / w, 0, 0, -(right + left) / w,
514 0, T{2} / h, 0, -(top + bottom) / h,
515 0, 0, T{-1}, 0,
516 0, 0, 0, T{1}});
517}
518
519template<typename T>
520inline constexpr mat4_base<T> Math::ortho(
521 T left, T right, T bottom, T top, T near, T far)
522{
523 auto ret = Math::ortho(left, right, bottom, top);
524 const auto z = far - near;
525 ret[2][2] = -T{2} / z;
526 ret[3][2] = -(far + near) / z;
527 return ret;
528}
529
530template<typename T>
532 T fovy, T aspect, T near, T far)
533{
534 assert(std::abs(aspect) > -std::numeric_limits<T>::epsilon());
535 const auto z = far - near;
536 const auto t = std::tan(fovy / T{2});
538 T{1} / (aspect * t), 0, 0, 0,
539 0, T{1} / t, 0, 0,
540 0, 0, -(far + near) / z, -(T{2} * far * near) / z,
541 0, 0, -T{1}, 0});
542}
543
544template<typename T>
546 const vec3_base<T> &eye, const vec3_base<T> &center,
547 const vec3_base<T> &up)
548{
549 const auto f = Math::normalize(center - eye);
550 const auto s = Math::normalize(Math::cross(f, up));
551 const auto u = Math::cross(s, f);
552 return Math::transpose(mat4{
553 vec4{s, -Math::dot(s, eye)},
554 vec4{u, -Math::dot(u, eye)},
555 vec4{-f, Math::dot(f, eye)},
556 vec4{0, 0, 0, 1}});
557}
558
559inline bool Math::is_aligned(void *p, std::size_t a) {
560 const auto u = reinterpret_cast<std::uintptr_t>(p);
561 return !(u & --a);
562}
563
564inline void *Math::align_ptr(void *p, std::size_t a) {
565 const auto u = reinterpret_cast<std::uintptr_t>(p);
566 const auto r = Math::round_up_pow2(u, a);
567 return reinterpret_cast<void*>(r);
568}
569
570template<typename T>
572 return static_cast<T*>(Math::align_ptr(p, alignof(T)));
573}
574
575}
576
577#endif
Definition: math.h:22
static constexpr mat3_base< T > minor_matrix(const mat4_base< T > &m, std::size_t i, std::size_t j)
Definition: math.h:350
static constexpr T pi(void)
Definition: math.h:186
static constexpr vector_type< T > sum(const T &v)
Definition: math.h:264
static constexpr mat4_base< T > ortho(T left, T right, T bottom, T top)
Definition: math.h:510
std::decay_t<> rand_seed_t
Definition: math.h:35
static constexpr T tau(void)
Definition: math.h:190
void init(void)
Definition: math.cpp:56
static constexpr vec3_base< T > cross(const vec3_base< T > &u, const vec3_base< T > &v)
Definition: math.h:285
static constexpr vector_type< T > avg(const T &v)
Definition: math.h:275
static constexpr vec3_base< T > inv_diag(const mat3_base< T > &m, std::size_t i)
Definition: math.h:343
static constexpr T round_down(T n, T d)
Definition: math.h:217
static constexpr T e(void)
Definition: math.h:182
static constexpr mat4_base< T > inverse(const mat4_base< T > &m)
Definition: math.h:403
static void mat_mul(std::span< float > dst, const float *src0, const float *src1, std::size_t n)
Definition: math.cpp:44
static constexpr vec3_base< T > normal(const vec3_base< T > &p0, const vec3_base< T > &p1, const vec3_base< T > &p2)
Definition: math.h:319
static constexpr auto length2(const T &v)
Definition: math.h:242
static constexpr T angle(const vec2_base< T > &u, const vec2_base< T > &v)
Definition: math.h:296
static constexpr mat3_base< T > transpose(const mat3_base< T > &m)
Definition: math.h:326
static constexpr T round_up_div(T n, T d)
Definition: math.h:231
static constexpr vec3_base< T > rotate_x(const vec3_base< T > &v, T sin, T cos)
Definition: math.h:453
static constexpr T determinant(const mat3_base< T > &m)
Definition: math.h:376
static constexpr vector_type< T > product(const T &v)
Definition: math.h:269
static constexpr mat4_base< T > translate(const mat4_base< T > &m, const vec3_base< T > &v)
Definition: math.h:408
static constexpr vec3_base< T > reflect(const vec3_base< T > &v, const vec3_base< T > &n)
Definition: math.h:312
static constexpr T mip_levels(T extent)
Definition: math.h:236
static constexpr T cofactor(const mat4_base< T > &m, std::size_t i, std::size_t j)
static constexpr vec3_base< T > rotate_y(const vec3_base< T > &v, T sin, T cos)
Definition: math.h:459
static constexpr T round_up_pow2(T n, T d)
Definition: math.h:211
void seed_rand(rand_seed_t s)
Definition: math.cpp:58
static constexpr mat4_base< T > look_at(const vec3_base< T > &eye, const vec3_base< T > &center, const vec3_base< T > &up)
Definition: math.h:545
static T normalize(const T &v)
Definition: math.h:252
static constexpr T sq2(void)
Definition: math.h:174
static constexpr mat4_base< T > adjugate(const mat4_base< T > &m)
Definition: math.h:393
static V< T > clamp_len(V< T > v, T len)
Definition: math.h:258
static constexpr T sq2_2(void)
Definition: math.h:178
static bool is_aligned(void *p, std::size_t a)
Definition: math.h:559
std::optional< rnd_generator_t > m_rnd_generator
Definition: math.h:37
static constexpr vec2_base< T > rotate(const vec2_base< T > &v, T sin, T cos)
Definition: math.h:424
static constexpr T round_down_pow2(T n, T d)
Definition: math.h:205
static constexpr vec3_base< T > rotate_z(const vec3_base< T > &v, T sin, T cos)
Definition: math.h:467
static auto length(const T &v)
Definition: math.h:247
static constexpr vec3_base< T > diag(const mat3_base< T > &m, std::size_t i)
Definition: math.h:336
static constexpr T radians(T d)
Definition: math.h:194
static constexpr vector_type< T > dot(const T &u, const T &v)
Definition: math.h:280
static constexpr T round_up(T n, T d)
Definition: math.h:224
auto * rnd_generator(void)
Definition: math.h:168
static constexpr T degrees(T r)
Definition: math.h:199
static constexpr mat4_base< T > scale(const mat4_base< T > &m, const vec3_base< T > &v)
Definition: math.h:417
static constexpr mat4_base< T > perspective(T fovy, T aspect, T near, T far)
Definition: math.h:531
void rand_mat(std::span< float > m)
Definition: math.cpp:67
static constexpr T minor(const mat4_base< T > &m, std::size_t i, std::size_t j)
Definition: math.h:369
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:564
Definition: vec.h:60
round_down_pow2
Definition: common.lua:27
round_up
Definition: common.lua:26
function DEMO text end
Definition: demo0.lua:6
for i
Definition: font.lua:5
r
Definition: gamma.lua:7
c
Definition: gamma.lua:11
assert
Definition: debug.lua:3
n
Definition: dump_lights.lua:5
rotate
Definition: camera.lua:49
z
Definition: input.lua:25
a
Definition: input.lua:31
m
Definition: input.lua:23
p
Definition: input.lua:29
function f()) end
v[1]
Definition: math.lua:19
w
Definition: strict.lua:12
std::chrono::seconds s
Definition: timing.cpp:6
#define T(f0, f1, f2)
Definition: audio.cpp:7
constexpr const R * begin(const T< R > &v)
Definition: vec.h:207
typename T::type vector_type
Definition: vec.h:62
Definition: math.h:24
Definition: mat3.h:12
Definition: mat4.h:12
Definition: vec2.h:11
Definition: vec3.h:12
T z
Definition: vec3.h:13
T x
Definition: vec3.h:13
T y
Definition: vec3.h:13