13 float t00,
float t01,
float t02,
float t03,
14 float t10,
float t11,
float t12,
float t13,
15 float t20,
float t21,
float t22,
float t23,
16 float t30,
float t31,
float t32,
float t33
35 major.x, zero, zero, zero,
36 zero, major.y, zero, zero,
37 zero, zero, major.z, zero,
38 zero, zero, zero, major.w
104 const auto c =
cos(a);
105 const auto s =
sin(a);
118 const auto c =
cos(a);
119 const auto s =
sin(a);
133 const auto c =
cos(a);
134 const auto s =
sin(a);
151 const auto u = aa.
axis.
x;
152 const auto v = aa.
axis.
y;
153 const auto w = aa.
axis.
z;
157 rcos + u * u * (1 - rcos),
158 w * rsin + v * u * (1 - rcos),
159 -v * rsin + w * u * (1 - rcos),
162 -w * rsin + u * v * (1 - rcos),
163 rcos + v * v * (1 - rcos),
164 u * rsin + w * v * (1 - rcos),
167 v * rsin + u * w * (1 - rcos),
168 -u * rsin + v * w * (1 - rcos),
169 rcos + w * w * (1 - rcos),
234 m[5] * m[10] * m[15] - m[5] * m[11] * m[14] -
235 m[9] * m[6] * m[15] + m[9] * m[7] * m[14] +
236 m[13] * m[6] * m[11] - m[13] * m[7] * m[10]
240 -m[4] * m[10] * m[15] + m[4] * m[11] * m[14] +
241 m[8] * m[6] * m[15] - m[8] * m[7] * m[14] -
242 m[12] * m[6] * m[11] + m[12] * m[7] * m[10]
246 m[4] * m[9] * m[15] - m[4] * m[11] * m[13] -
247 m[8] * m[5] * m[15] + m[8] * m[7] * m[13] +
248 m[12] * m[5] * m[11] - m[12] * m[7] * m[9]
252 -m[4] * m[9] * m[14] + m[4] * m[10] * m[13] +
253 m[8] * m[5] * m[14] - m[8] * m[6] * m[13] -
254 m[12] * m[5] * m[10] + m[12] * m[6] * m[9]
258 -m[1] * m[10] * m[15] + m[1] * m[11] * m[14] +
259 m[9] * m[2] * m[15] - m[9] * m[3] * m[14] -
260 m[13] * m[2] * m[11] + m[13] * m[3] * m[10]
264 m[0] * m[10] * m[15] - m[0] * m[11] * m[14] -
265 m[8] * m[2] * m[15] + m[8] * m[3] * m[14] +
266 m[12] * m[2] * m[11] - m[12] * m[3] * m[10]
270 -m[0] * m[9] * m[15] + m[0] * m[11] * m[13] +
271 m[8] * m[1] * m[15] - m[8] * m[3] * m[13] -
272 m[12] * m[1] * m[11] + m[12] * m[3] * m[9]
276 m[0] * m[9] * m[14] - m[0] * m[10] * m[13] -
277 m[8] * m[1] * m[14] + m[8] * m[2] * m[13] +
278 m[12] * m[1] * m[10] - m[12] * m[2] * m[9]
282 m[1] * m[6] * m[15] - m[1] * m[7] * m[14] -
283 m[5] * m[2] * m[15] + m[5] * m[3] * m[14] +
284 m[13] * m[2] * m[7] - m[13] * m[3] * m[6]
288 -m[0] * m[6] * m[15] + m[0] * m[7] * m[14] +
289 m[4] * m[2] * m[15] - m[4] * m[3] * m[14] -
290 m[12] * m[2] * m[7] + m[12] * m[3] * m[6]
294 m[0] * m[5] * m[15] - m[0] * m[7] * m[13] -
295 m[4] * m[1] * m[15] + m[4] * m[3] * m[13] +
296 m[12] * m[1] * m[7] - m[12] * m[3] * m[5]
300 -m[0] * m[5] * m[14] + m[0] * m[6] * m[13] +
301 m[4] * m[1] * m[14] - m[4] * m[2] * m[13] -
302 m[12] * m[1] * m[6] + m[12] * m[2] * m[5]
306 -m[1] * m[6] * m[11] + m[1] * m[7] * m[10] +
307 m[5] * m[2] * m[11] - m[5] * m[3] * m[10] -
308 m[9] * m[2] * m[7] + m[9] * m[3] * m[6]
312 m[0] * m[6] * m[11] - m[0] * m[7] * m[10] -
313 m[4] * m[2] * m[11] + m[4] * m[3] * m[10] +
314 m[8] * m[2] * m[7] - m[8] * m[3] * m[6]
318 -m[0] * m[5] * m[11] + m[0] * m[7] * m[9] +
319 m[4] * m[1] * m[11] - m[4] * m[3] * m[9] -
320 m[8] * m[1] * m[7] + m[8] * m[3] * m[5]
324 m[0] * m[5] * m[10] - m[0] * m[6] * m[9] -
325 m[4] * m[1] * m[10] + m[4] * m[2] * m[9] +
326 m[8] * m[1] * m[6] - m[8] * m[2] * m[5]
330 m[0] * inv[0] + m[1] * inv[4] + m[2] * inv[8] +
338 const auto det = 1.0f / inv_det;
340 for(
int index = 0; index < 16; index += 1)
342 data[index] = inv[index] * det;
352 const auto was_inverted = r.invert();
371 #define OP(i) data[i] += rhs.data[i]
382 #define OP(i) data[i] -= rhs.data[i]
397 2 / (r - l), 0, 0, -(r + l) / (r - l),
398 0, 2 / (t - b), 0, -(t + b) / (t - b),
399 0, 0, -2 / (f - n), -(f + n) / (f - n),
408 const float t = 1 /
tan(fov / 2);
409 const float zm = far - near;
410 const float zp = far + near;
415 0, 0, -zp / zm, (-2 * far * near) / zm,
454 return data[col * 4 + row];
460 const auto base = col * 4;
479 return fmt::format(
"({}, {}. {}. {})", m.get_row(0), m.get_row(1), m.get_row(2), m.get_row(3));
503 const auto x = lhs.
x * rhs.
x;
504 const auto y = lhs.
y * rhs.
y;
505 const auto z = lhs.
z * rhs.
z;
506 const auto w = lhs.
w* rhs.
w;
507 return x + y + z + w;
512 const auto op = [&lhs, &rhs](
int r,
int c) ->
float
518 op(0, 0), op(0, 1), op(0, 2), op(0, 3),
519 op(1, 0), op(1, 1), op(1, 2), op(1, 3),
520 op(2, 0), op(2, 1), op(2, 2), op(2, 3),
521 op(3, 0), op(3, 1), op(3, 2), op(3, 3)
528 const auto op = [&lhs, &rhs](
int r) ->
float
533 return {op(0), op(1), op(2), op(3)};
Angle operator+(const Angle &lhs, const Angle &rhs)
Angle operator-(const Angle &lhs, const Angle &rhs)
float tan(const Angle &ang)
std::string to_string(const Aabb &a)
float cos(const Angle &ang)
float sin(const Angle &ang)
Angle operator*(const Angle &lhs, float rhs)
float get_component_multiply_sum(const vec2f &lhs, const vec2f &rhs)
Angle angle
rotation according to right-hand rule
constexpr static mat3f from_row_major(float t00, float t10, float t20, float t01, float t11, float t21, float t02, float t12, float t22)
static mat4f from_axis_angle(const AxisAngle &aa)
mat4f get_translated(const vec3f &t) const
vec3f get_transform_point(const vec3f &p) const
void operator+=(const mat4f &rhs)
unit3f get_z_axis() const
float * get_column_major()
mat4f get_rotated(const AxisAngle &aa) const
mat4f get_scaled(const Scale3f &scale) const
unit3f get_axis(int col) const
float get(int row, int col) const
static mat4f from_major(const vec4f &major)
static mat4f from_rot_y(const Angle &a)
static mat4f from_rot_x(const Angle &a)
static mat4f from_col_major(float t00, float t01, float t02, float t03, float t10, float t11, float t12, float t13, float t20, float t21, float t22, float t23, float t30, float t31, float t32, float t33)
static mat4f from_scale(const Scale3f &scale)
mat4f get_inverted() const
void operator-=(const mat4f &rhs)
vec3f get_transform_vec(const vec3f &p) const
static mat4f create_perspective(const Angle &fov, float a, float near, float far)
constexpr static mat4f from_row_major(float t00, float t10, float t20, float t30, float t01, float t11, float t21, float t31, float t02, float t12, float t22, float t32, float t03, float t13, float t23, float t33)
unit3f get_x_axis() const
vec4f get_column(int c) const
vec3f get_translation() const
static mat4f create_ortho(float l, float r, float b, float t, float n, float f)
unit3f get_y_axis() const
static mat4f from_translation(const vec3f &v)
mat4f get_transposed() const
static mat4f from_rot_z(const Angle &a)
vec4f get_row(int r) const
vec4f get_transform(const vec4f &p) const
static unit3f to_unit(float x, float y, float z)