12#include "translate3.hpp"
15#include "../macros.hpp"
21hi_export_module(hikogui.geometry : matrix3);
23hi_export
namespace hi {
inline namespace v1 {
47 auto const a = f32x4::broadcast(1.0f);
61 constexpr matrix3(f32x4 col0, f32x4 col1, f32x4 col2, f32x4 col3 = f32x4{0.0f, 0.0f, 0.0f, 1.0f})
noexcept :
62 _col0(col0), _col1(col1), _col2(col2), _col3(col3)
74 _col0(static_cast<f32x4>(col0)),
75 _col1(static_cast<f32x4>(col1)),
76 _col2(static_cast<f32x4>(col2)),
77 _col3(static_cast<f32x4>(col3).xyz1())
119 float c2r2) noexcept :
120 _col0(c0r0, c0r1, c0r2, 0.0f), _col1(c1r0, c1r1, c1r2, 0.0f), _col2(c2r0, c2r1, c2r2, 0.0f), _col3(0.0f, 0.0f, 0.0f, 1.0f)
162 float c3r3) noexcept :
163 _col0(c0r0, c0r1, c0r2, c0r3), _col1(c1r0, c1r1, c1r2, c1r3), _col2(c2r0, c2r1, c2r2, c2r3), _col3(c3r0, c3r1, c3r2, c3r3)
174 [[nodiscard]]
constexpr explicit operator matrix2() const noexcept
190 return matrix2{tmp0, tmp1, tmp2, tmp3};
193 [[nodiscard]]
constexpr matrix3(scale3
const& rhs)
noexcept
195 _col0 = f32x4{rhs}.x000();
196 _col1 = f32x4{rhs}._0y00();
197 _col2 = f32x4{rhs}._00z0();
198 _col3 = f32x4{rhs}._000w();
201 [[nodiscard]]
constexpr matrix3(translate3
const& rhs)
noexcept
203 auto const ones = f32x4::broadcast(1.0f);
205 _col1 = ones._0y00();
206 _col2 = ones._00z0();
207 _col3 = ones._000w() + f32x4{rhs};
226 auto const x_mul = f32x4{rhs}.xxxx() * f32x4{rhs};
227 auto const y_mul = f32x4{rhs}.yyyy() * f32x4{rhs};
228 auto const z_mul = f32x4{rhs}.zzzz() * f32x4{rhs};
230 auto twos = f32x4{-2.0f, 2.0f, 2.0f, 0.0f};
231 auto one = f32x4{1.0f, 0.0f, 0.0f, 0.0f};
232 _col0 =
one + addsub_mask<0b0011>(z_mul.zwxy(), y_mul.yxwz()) * twos;
235 _col1 =
one + addsub_mask<0b0110>(x_mul.yxwz(), z_mul.wzyx()) * twos;
238 _col2 =
one + addsub_mask<0b0101>(y_mul.wzyx(), x_mul.zwxy()) * twos;
246 hi_axiom(holds_invariant());
247 return {_col0, _col1, _col2, _col3};
259 [[nodiscard]]
constexpr static matrix3
271 [[nodiscard]]
friend constexpr f32x4
const&
get(matrix3
const& rhs)
noexcept
273 if constexpr (I == 0) {
275 }
else if constexpr (I == 1) {
277 }
else if constexpr (I == 2) {
279 }
else if constexpr (I == 3) {
282 hi_static_no_default();
292 [[nodiscard]]
friend constexpr f32x4&
get(matrix3& rhs)
noexcept
294 if constexpr (I == 0) {
296 }
else if constexpr (I == 1) {
298 }
else if constexpr (I == 2) {
300 }
else if constexpr (I == 3) {
303 hi_static_no_default();
307 [[nodiscard]]
constexpr bool holds_invariant() const noexcept
317 [[nodiscard]]
constexpr f32x4
operator*(f32x4
const& rhs)
const noexcept
319 return {_col0 * rhs.xxxx() + _col1 * rhs.yyyy() + _col2 * rhs.zzzz() + _col3 * rhs.wwww()};
325 [[nodiscard]]
friend constexpr matrix3
transpose(matrix3
const& rhs)
noexcept
327 auto tmp =
transpose(rhs._col0, rhs._col1, rhs._col2, rhs._col3);
328 return matrix3{std::get<0>(tmp), std::get<1>(tmp), std::get<2>(tmp), std::get<3>(tmp)};
364 template<
char DstX,
char DstY,
char DstZ,
char DstW = 'w'>
365 [[nodiscard]]
friend constexpr matrix3
reflect(matrix3
const& rhs)
noexcept
367 return matrix3{reflect_column<DstX>(), reflect_column<DstY>(), reflect_column<DstZ>(), reflect_column<DstW>()} * rhs;
375 [[nodiscard]]
constexpr friend bool operator==(matrix3
const& lhs, matrix3
const& rhs)
noexcept
377 return equal(lhs._col0, rhs._col0) and equal(lhs._col1, rhs._col1) and equal(lhs._col2, rhs._col2) and
378 equal(lhs._col3, rhs._col3);
390 auto const s0c0 = _col0 * _col1.yxwz();
396 auto const s1c1 = _col0 * _col2.yxwz();
397 auto const s0c0s1c1 = hsub(s0c0, s1c1);
403 auto const s2c2 = _col0 * _col3.yxwz();
409 auto const s3c3 = _col1 * _col2.yxwz();
410 auto const s2c2s3c3 = hsub(s2c2, s3c3);
416 auto const s4c4 = _col1 * _col3.yxwz();
422 auto const s5c5 = _col2 * _col3.yxwz();
423 auto const s4c4s5c5 = hsub(s4c4, s5c5);
431 auto const s0123 = s0c0s1c1.xz00() + s2c2s3c3._00xz();
432 auto const s45__ = s4c4s5c5.xz00();
434 auto const c5432 = s4c4s5c5.wy00() + s2c2s3c3._00wy();
435 auto const c10__ = s0c0s1c1.wy00();
437 auto const det_prod_half0 = neg_mask<0b0010>(s0123 * c5432);
438 auto const det_prod_half1 = neg_mask<0b0001>(s45__ * c10__);
440 auto const det_sum0 = hadd(det_prod_half0, det_prod_half1);
441 auto const det_sum1 = hadd(det_sum0, det_sum0);
442 auto const det = hadd(det_sum1, det_sum1).xxxx();
444 if (det.x() == 0.0f) {
448 auto const invdet = rcp(det);
457 auto tmp_c5543 = neg_mask<0b1010>(c5432.xxyz());
458 auto tmp_c4221 = neg_mask<0b0101>(c5432.yww0() + c10__._000x());
459 auto tmp_c3100 = neg_mask<0b1010>(c5432.z000() + c10__._0xyy());
460 auto const inv_col0 = ((t._col1.yxxx() * tmp_c5543) + (t._col1.zzyy() * tmp_c4221) + (t._col1.wwwz() * tmp_c3100)) * invdet;
466 tmp_c5543 = -tmp_c5543;
467 tmp_c4221 = -tmp_c4221;
468 tmp_c3100 = -tmp_c3100;
469 auto const inv_col1 = ((t._col0.yxxx() * tmp_c5543) + (t._col0.zzyy() * tmp_c4221) + (t._col0.wwwz() * tmp_c3100)) * invdet;
475 auto tmp_s5543 = neg_mask<0b1010>(s45__.yyx0() + s0123._000w());
476 auto tmp_s4221 = neg_mask<0b0101>(s45__.x000() + s0123._0zzy());
477 auto tmp_s3100 = neg_mask<0b1010>(s0123.wyxx());
478 auto const inv_col2 = ((t._col3.yxxx() * tmp_s5543) + (t._col3.zzyy() * tmp_s4221) + (t._col3.wwwz() * tmp_s3100)) * invdet;
484 tmp_s5543 = -tmp_s5543;
485 tmp_s4221 = -tmp_s4221;
486 tmp_s3100 = -tmp_s3100;
487 auto const inv_col3 = ((t._col2.yxxx() * tmp_s5543) + (t._col2.zzyy() * tmp_s4221) + (t._col2.wwwz() * tmp_s3100)) * invdet;
489 return matrix3{inv_col0, inv_col1, inv_col2, inv_col3};
499 [[nodiscard]]
constexpr static f32x4 reflect_column() noexcept
501 if constexpr (Axis ==
'x') {
502 return f32x4{1.0f, 0.0f, 0.0f, 0.0f};
503 }
else if constexpr (Axis ==
'X') {
504 return f32x4{-1.0f, 0.0f, 0.0f, 0.0f};
505 }
else if constexpr (Axis ==
'y') {
506 return f32x4{0.0f, 1.0f, 0.0f, 0.0f};
507 }
else if constexpr (Axis ==
'Y') {
508 return f32x4{0.0f, -1.0f, 0.0f, 0.0f};
509 }
else if constexpr (Axis ==
'z') {
510 return f32x4{0.0f, 0.0f, 1.0f, 0.0f};
511 }
else if constexpr (Axis ==
'Z') {
512 return f32x4{0.0f, 0.0f, -1.0f, 0.0f};
513 }
else if constexpr (Axis ==
'w') {
514 return f32x4{0.0f, 0.0f, 0.0f, 1.0f};
515 }
else if constexpr (Axis ==
'W') {
516 return f32x4{0.0f, 0.0f, 0.0f, -1.0f};
518 hi_static_no_default();
@ other
The gui_event does not have associated data.
Definition gui_event_variant.hpp:24
The HikoGUI namespace.
Definition array_generic.hpp:21
The HikoGUI API version 1.
Definition array_generic.hpp:22
@ one
The number was one, and this means something in the current language.
Definition unicode_plural.hpp:35
constexpr matrix2 operator*(matrix2 const &lhs, matrix2 const &rhs) noexcept
Matrix/Matrix multiplication.
Definition transform.hpp:69
Class which represents an axis-aligned rectangle.
Definition aarectangle.hpp:33
Horizontal/Vertical alignment combination.
Definition alignment.hpp:244
A 2D or 3D homogenius matrix for transforming homogenious vectors and points.
Definition matrix2.hpp:39
static constexpr matrix2 uniform(aarectangle src_rectangle, aarectangle dst_rectangle, alignment alignment) noexcept
Create a transformation matrix to translate and uniformly-scale a src_rectangle to a dst_rectangle.
Definition matrix2.hpp:241
A 2D or 3D homogenius matrix for transforming homogenious vectors and points.
Definition matrix3.hpp:36
friend constexpr matrix3 transpose(matrix3 const &rhs) noexcept
Matrix transpose.
Definition matrix3.hpp:325
constexpr f32x4 operator*(f32x4 const &rhs) const noexcept
Transform a f32x4 numeric array by the matrix.
Definition matrix3.hpp:317
friend constexpr matrix3 reflect(matrix3 const &rhs) noexcept
Reflect axis of a matrix.
Definition matrix3.hpp:365
constexpr matrix3(f32x4 col0, f32x4 col1, f32x4 col2, f32x4 col3=f32x4{0.0f, 0.0f, 0.0f, 1.0f}) noexcept
Construct a matrix from four columns.
Definition matrix3.hpp:61
constexpr matrix3(float c0r0, float c1r0, float c2r0, float c3r0, float c0r1, float c1r1, float c2r1, float c3r1, float c0r2, float c1r2, float c2r2, float c3r2, float c0r3, float c1r3, float c2r3, float c3r3) noexcept
Construct a 4x4 matrix from scalar values.
Definition matrix3.hpp:146
constexpr matrix3(matrix2 const &other) noexcept
Copy-construct a matrix from a smaller matrix.
Definition matrix3.hpp:169
constexpr matrix3(rotate3 const &rhs) noexcept
Convert quaternion to matrix.
Definition matrix3.hpp:213
constexpr friend bool operator==(matrix3 const &lhs, matrix3 const &rhs) noexcept
Compare two matrices potentially of different dimensions.
Definition matrix3.hpp:375
constexpr matrix3() noexcept
Constructs an identity matrix.
Definition matrix3.hpp:45
friend constexpr f32x4 & get(matrix3 &rhs) noexcept
Get a column.
Definition matrix3.hpp:292
constexpr matrix3 operator~() const
Invert matrix.
Definition matrix3.hpp:383
friend constexpr f32x4 const & get(matrix3 const &rhs) noexcept
Get a column.
Definition matrix3.hpp:271
constexpr matrix3(float c0r0, float c1r0, float c2r0, float c0r1, float c1r1, float c2r1, float c0r2, float c1r2, float c2r2) noexcept
Construct a matrix from two vectors.
Definition matrix3.hpp:110
static constexpr matrix3 uniform(aarectangle src_rectangle, aarectangle dst_rectangle, alignment alignment) noexcept
Create a transformation matrix to translate and uniformly-scale a src_rectangle to a dst_rectangle.
Definition matrix3.hpp:260
constexpr matrix3(vector3 col0, vector3 col1, vector3 col2, vector3 col3=vector3{}) noexcept
Construct a matrix from four vectors.
Definition matrix3.hpp:73
Definition rotate3.hpp:17
Definition translate3.hpp:22
A high-level geometric vector Part of the high-level vector, point, mat and color types.
Definition vector3.hpp:26