1 #include "lxgui/gui_matrix4.hpp"
10 for (std::size_t row = 0u; row < 4u; ++row) {
11 for (std::size_t col = 0u; col < 4u; ++col)
12 id(row, col) = (row == col ? 1.0f : 0.0f);
21 const std::size_t length = std::min<std::size_t>(list.size(), 16u);
22 std::copy(list.begin(), list.begin() + length, data);
26 std::copy(mat, mat + 16u, data);
30 return {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
31 0.0f, 0.0f, 1.0f, 0.0f, dx.x, dx.y, 0.0f, 1.0f};
35 return {scale.x, 0.0f, 0.0f, 0.0f, 0.0f, scale.y, 0.0f, 0.0f,
36 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
40 float co = std::cos(rot), si = std::sin(rot);
42 return {co, si, 0.0f, 0.0f, -si, co, 0.0f, 0.0f,
43 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
47 float co = std::cos(rot), si = std::sin(rot);
49 return {scale.x * co, scale.y * si, 0.0f, 0.0f, -scale.x * si, scale.y * co, 0.0f, 0.0f,
50 0.0f, 0.0f, 1.0f, 0.0f, scale.x * dx.x, scale.y * dx.y, 0.0f, 1.0f};
54 return {2.0f / window.x, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f / window.y, 0.0f, 0.0f,
55 -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, -1.0f, 0.0f, 1.0f};
59 return translation(
vector2f(window.x / 2, window.y / 2) -
center) * view(window);
63 for (std::size_t row = 0; row < 4; ++row) {
64 for (std::size_t col = 0; col < 4; ++col)
65 std::swap((*
this)(row, col), (*
this)(col, row));
80 element_type m00 = m(0, 0), m01 = m(0, 1), m02 = m(0, 2), m03 = m(0, 3);
81 element_type m10 = m(1, 0), m11 = m(1, 1), m12 = m(1, 2), m13 = m(1, 3);
82 element_type m20 = m(2, 0), m21 = m(2, 1), m22 = m(2, 2), m23 = m(2, 3);
83 element_type m30 = m(3, 0), m31 = m(3, 1), m32 = m(3, 2), m33 = m(3, 3);
97 element_type inv_det = 1.0f / (t00 * m00 + t10 * m01 + t20 * m02 + t30 * m03);
104 element_type d01 = -(v5 * m01 - v4 * m02 + v3 * m03) * inv_det;
105 element_type d11 = (v5 * m00 - v2 * m02 + v1 * m03) * inv_det;
106 element_type d21 = -(v4 * m00 - v2 * m01 + v0 * m03) * inv_det;
107 element_type d31 = (v3 * m00 - v1 * m01 + v0 * m02) * inv_det;
109 v0 = m10 * m31 - m11 * m30;
110 v1 = m10 * m32 - m12 * m30;
111 v2 = m10 * m33 - m13 * m30;
112 v3 = m11 * m32 - m12 * m31;
113 v4 = m11 * m33 - m13 * m31;
114 v5 = m12 * m33 - m13 * m32;
116 element_type d02 = (v5 * m01 - v4 * m02 + v3 * m03) * inv_det;
117 element_type d12 = -(v5 * m00 - v2 * m02 + v1 * m03) * inv_det;
118 element_type d22 = (v4 * m00 - v2 * m01 + v0 * m03) * inv_det;
119 element_type d32 = -(v3 * m00 - v1 * m01 + v0 * m02) * inv_det;
121 v0 = m21 * m10 - m20 * m11;
122 v1 = m22 * m10 - m20 * m12;
123 v2 = m23 * m10 - m20 * m13;
124 v3 = m22 * m11 - m21 * m12;
125 v4 = m23 * m11 - m21 * m13;
126 v5 = m23 * m12 - m22 * m13;
128 element_type d03 = -(v5 * m01 - v4 * m02 + v3 * m03) * inv_det;
129 element_type d13 = (v5 * m00 - v2 * m02 + v1 * m03) * inv_det;
130 element_type d23 = -(v4 * m00 - v2 * m01 + v0 * m03) * inv_det;
131 element_type d33 = (v3 * m00 - v1 * m01 + v0 * m02) * inv_det;
133 return {d00, d01, d02, d03, d10, d11, d12, d13, d20, d21, d22, d23, d30, d31, d32, d33};
139 for (std::size_t i = 0; i < 16; ++i)
140 r.
data[i] = m1.data[i] + m2.data[i];
148 for (std::size_t i = 0; i < 16; ++i)
149 r.
data[i] = m1.data[i] - m2.data[i];
157 r(0, 0) = m1(0, 0) * m2(0, 0) + m1(0, 1) * m2(1, 0) + m1(0, 2) * m2(2, 0) + m1(0, 3) * m2(3, 0);
158 r(0, 1) = m1(0, 0) * m2(0, 1) + m1(0, 1) * m2(1, 1) + m1(0, 2) * m2(2, 1) + m1(0, 3) * m2(3, 1);
159 r(0, 2) = m1(0, 0) * m2(0, 2) + m1(0, 1) * m2(1, 2) + m1(0, 2) * m2(2, 2) + m1(0, 3) * m2(3, 2);
160 r(0, 3) = m1(0, 0) * m2(0, 3) + m1(0, 1) * m2(1, 3) + m1(0, 2) * m2(2, 3) + m1(0, 3) * m2(3, 3);
162 r(1, 0) = m1(1, 0) * m2(0, 0) + m1(1, 1) * m2(1, 0) + m1(1, 2) * m2(2, 0) + m1(1, 3) * m2(3, 0);
163 r(1, 1) = m1(1, 0) * m2(0, 1) + m1(1, 1) * m2(1, 1) + m1(1, 2) * m2(2, 1) + m1(1, 3) * m2(3, 1);
164 r(1, 2) = m1(1, 0) * m2(0, 2) + m1(1, 1) * m2(1, 2) + m1(1, 2) * m2(2, 2) + m1(1, 3) * m2(3, 2);
165 r(1, 3) = m1(1, 0) * m2(0, 3) + m1(1, 1) * m2(1, 3) + m1(1, 2) * m2(2, 3) + m1(1, 3) * m2(3, 3);
167 r(2, 0) = m1(2, 0) * m2(0, 0) + m1(2, 1) * m2(1, 0) + m1(2, 2) * m2(2, 0) + m1(2, 3) * m2(3, 0);
168 r(2, 1) = m1(2, 0) * m2(0, 1) + m1(2, 1) * m2(1, 1) + m1(2, 2) * m2(2, 1) + m1(2, 3) * m2(3, 1);
169 r(2, 2) = m1(2, 0) * m2(0, 2) + m1(2, 1) * m2(1, 2) + m1(2, 2) * m2(2, 2) + m1(2, 3) * m2(3, 2);
170 r(2, 3) = m1(2, 0) * m2(0, 3) + m1(2, 1) * m2(1, 3) + m1(2, 2) * m2(2, 3) + m1(2, 3) * m2(3, 3);
172 r(3, 0) = m1(3, 0) * m2(0, 0) + m1(3, 1) * m2(1, 0) + m1(3, 2) * m2(2, 0) + m1(3, 3) * m2(3, 0);
173 r(3, 1) = m1(3, 0) * m2(0, 1) + m1(3, 1) * m2(1, 1) + m1(3, 2) * m2(2, 1) + m1(3, 3) * m2(3, 1);
174 r(3, 2) = m1(3, 0) * m2(0, 2) + m1(3, 1) * m2(1, 2) + m1(3, 2) * m2(2, 2) + m1(3, 3) * m2(3, 2);
175 r(3, 3) = m1(3, 0) * m2(0, 3) + m1(3, 1) * m2(1, 3) + m1(3, 2) * m2(2, 3) + m1(3, 3) * m2(3, 3);
183 const float inv_w = 1.0f / (m(3, 0) * v.x + m(3, 1) * v.y + m(3, 3));
185 r.
x = (m(0, 0) * v.x + m(0, 1) * v.y + m(0, 3)) * inv_w;
186 r.
y = (m(1, 0) * v.x + m(1, 1) * v.y + m(1, 3)) * inv_w;
194 const float inv_w = 1.0f / (m(0, 3) * v.x + m(1, 3) * v.y + m(3, 3));
196 r.
x = (m(0, 0) * v.x + m(1, 0) * v.y + m(3, 0)) * inv_w;
197 r.
y = (m(0, 1) * v.x + m(1, 1) * v.y + m(3, 1)) * inv_w;
203 return o <<
"(" << m(0, 0) <<
", " << m(0, 1) <<
", " << m(0, 2) <<
", " << m(0, 3) <<
")\n"
204 <<
"(" << m(1, 0) <<
", " << m(1, 1) <<
", " << m(1, 2) <<
", " << m(1, 3) <<
")\n"
205 <<
"(" << m(2, 0) <<
", " << m(2, 1) <<
", " << m(2, 2) <<
", " << m(2, 3) <<
")\n"
206 <<
"(" << m(3, 0) <<
", " << m(3, 1) <<
", " << m(3, 2) <<
", " << m(3, 3) <<
")\n";
vector2< float > vector2f
Holds 2D coordinates (as floats)
std::ostream & operator<<(std::ostream &stream, const color &c)
matrix4f build_identity() noexcept
color operator+(const color &c1, const color &c2) noexcept
color operator*(const color &c1, const color &c2) noexcept
color operator-(const color &c1, const color &c2) noexcept
A 4x4 matrix, used for coordinate transformations.
static matrix4f scaling(const vector2f &scale) noexcept
static const matrix4f identity
void transpose() noexcept
matrix4f() noexcept=default
static matrix4f translation(const vector2f &dx) noexcept
static matrix4f transformation(const vector2f &dx, const vector2f &scale, float rot) noexcept
static matrix4f view(const vector2f &window) noexcept
static matrix4f rotation(float rot) noexcept