 |
Flutter Impeller
|
|
Go to the documentation of this file.
5 #ifndef FLUTTER_IMPELLER_GEOMETRY_MATRIX_H_
6 #define FLUTTER_IMPELLER_GEOMETRY_MATRIX_H_
50 Vector4(0.0f, 1.0f, 0.0f, 0.0f),
51 Vector4(0.0f, 0.0f, 1.0f, 0.0f),
52 Vector4(0.0f, 0.0f, 0.0f, 1.0f)} {}
66 explicit Matrix(
const MatrixDecomposition& decomposition);
74 return Matrix(m0, m1, m2, m3,
88 return Matrix(m0, m4, m8, m12,
97 return Matrix(1.0f, 0.0f, 0.0f, 0.0f,
98 0.0f, 1.0f, 0.0f, 0.0f,
99 0.0f, 0.0f, 1.0f, 0.0f,
100 t.
x, t.
y, t.
z, 1.0f);
106 return Matrix(s.
x, 0.0f, 0.0f, 0.0f,
107 0.0f, s.
y, 0.0f, 0.0f,
108 0.0f, 0.0f, s.
z, 0.0f,
109 0.0f, 0.0f, 0.0f, 1.0f);
119 return Matrix(1.0f, sy , 0.0f, 0.0f,
120 sx , 1.0f, 0.0f, 0.0f,
121 0.0f, 0.0f, 1.0f, 0.0f,
122 0.0f, 0.0f, 0.0f, 1.0f);
129 1.0f - 2.0f * q.
y * q.
y - 2.0f * q.
z * q.
z,
130 2.0f * q.
x * q.
y + 2.0f * q.
z * q.
w,
131 2.0f * q.
x * q.
z - 2.0f * q.
y * q.
w,
134 2.0f * q.
x * q.
y - 2.0f * q.
z * q.
w,
135 1.0f - 2.0f * q.
x * q.
x - 2.0f * q.
z * q.
z,
136 2.0f * q.
y * q.
z + 2.0f * q.
x * q.
w,
139 2.0f * q.
x * q.
z + 2.0f * q.
y * q.
w,
140 2.0f * q.
y * q.
z - 2.0f * q.
x * q.
w,
141 1.0f - 2.0f * q.
x * q.
x - 2.0f * q.
y * q.
y,
154 const Vector2 cos_sin = CosSin(radians);
155 const Scalar cosine = cos_sin.
x;
156 const Scalar cosp = 1.0f - cosine;
161 cosine + cosp * v.
x * v.
x,
162 cosp * v.
x * v.
y + v.
z * sine,
163 cosp * v.
x * v.
z - v.
y * sine,
166 cosp * v.
x * v.
y - v.
z * sine,
167 cosine + cosp * v.
y * v.
y,
168 cosp * v.
y * v.
z + v.
x * sine,
171 cosp * v.
x * v.
z + v.
y * sine,
172 cosp * v.
y * v.
z - v.
x * sine,
173 cosine + cosp * v.
z * v.
z,
184 const Vector2 cos_sin = CosSin(r);
185 const Scalar cosine = cos_sin.
x;
190 1.0f, 0.0f, 0.0f, 0.0f,
191 0.0f, cosine, sine, 0.0f,
192 0.0f, -sine, cosine, 0.0f,
193 0.0f, 0.0f, 0.0f, 1.0f
199 const Vector2 cos_sin = CosSin(r);
200 const Scalar cosine = cos_sin.
x;
205 cosine, 0.0f, -sine, 0.0f,
206 0.0f, 1.0f, 0.0f, 0.0f,
207 sine, 0.0f, cosine, 0.0f,
208 0.0f, 0.0f, 0.0f, 1.0f
214 const Vector2 cos_sin = CosSin(r);
215 const Scalar cosine = cos_sin.
x;
220 cosine, sine, 0.0f, 0.0f,
221 -sine, cosine, 0.0f, 0.0f,
222 0.0f, 0.0f, 1.0f, 0.0f,
223 0.0f, 0.0f, 0.0f, 1.0
232 m[0],
m[1],
m[2], 0.0f,
233 m[4],
m[5],
m[6], 0.0f,
234 m[8],
m[9],
m[10], 0.0f,
235 0.0f, 0.0f, 0.0f, 1.0
243 m[4],
m[5],
m[6],
m[7],
244 m[8],
m[9],
m[10],
m[11],
245 m[0] * t.
x +
m[4] * t.
y +
m[8] * t.
z +
m[12],
246 m[1] * t.
x +
m[5] * t.
y +
m[9] * t.
z +
m[13],
247 m[2] * t.
x +
m[6] * t.
y +
m[10] * t.
z +
m[14],
248 m[3] * t.
x +
m[7] * t.
y +
m[11] * t.
z +
m[15]);
255 m[4] * s.
y,
m[5] * s.
y,
m[6] * s.
y,
m[7] * s.
y,
256 m[8] * s.
z,
m[9] * s.
z,
m[10] * s.
z,
m[11] * s.
z,
257 m[12] ,
m[13] ,
m[14] ,
m[15] );
264 m[0] * o.
m[0] +
m[4] * o.
m[1] +
m[8] * o.
m[2] +
m[12] * o.
m[3],
265 m[1] * o.
m[0] +
m[5] * o.
m[1] +
m[9] * o.
m[2] +
m[13] * o.
m[3],
266 m[2] * o.
m[0] +
m[6] * o.
m[1] +
m[10] * o.
m[2] +
m[14] * o.
m[3],
267 m[3] * o.
m[0] +
m[7] * o.
m[1] +
m[11] * o.
m[2] +
m[15] * o.
m[3],
268 m[0] * o.
m[4] +
m[4] * o.
m[5] +
m[8] * o.
m[6] +
m[12] * o.
m[7],
269 m[1] * o.
m[4] +
m[5] * o.
m[5] +
m[9] * o.
m[6] +
m[13] * o.
m[7],
270 m[2] * o.
m[4] +
m[6] * o.
m[5] +
m[10] * o.
m[6] +
m[14] * o.
m[7],
271 m[3] * o.
m[4] +
m[7] * o.
m[5] +
m[11] * o.
m[6] +
m[15] * o.
m[7],
272 m[0] * o.
m[8] +
m[4] * o.
m[9] +
m[8] * o.
m[10] +
m[12] * o.
m[11],
273 m[1] * o.
m[8] +
m[5] * o.
m[9] +
m[9] * o.
m[10] +
m[13] * o.
m[11],
274 m[2] * o.
m[8] +
m[6] * o.
m[9] +
m[10] * o.
m[10] +
m[14] * o.
m[11],
275 m[3] * o.
m[8] +
m[7] * o.
m[9] +
m[11] * o.
m[10] +
m[15] * o.
m[11],
276 m[0] * o.
m[12] +
m[4] * o.
m[13] +
m[8] * o.
m[14] +
m[12] * o.
m[15],
277 m[1] * o.
m[12] +
m[5] * o.
m[13] +
m[9] * o.
m[14] +
m[13] * o.
m[15],
278 m[2] * o.
m[12] +
m[6] * o.
m[13] +
m[10] * o.
m[14] +
m[14] * o.
m[15],
279 m[3] * o.
m[12] +
m[7] * o.
m[13] +
m[11] * o.
m[14] +
m[15] * o.
m[15]);
286 m[0],
m[4],
m[8],
m[12],
287 m[1],
m[5],
m[9],
m[13],
288 m[2],
m[6],
m[10],
m[14],
289 m[3],
m[7],
m[11],
m[15],
303 if (
e[0][1] == 0 &&
e[1][0] == 0) {
304 return std::max(std::abs(
e[0][0]), std::abs(
e[1][1]));
306 return std::sqrt(std::max(
e[0][0] *
e[0][0] +
e[0][1] *
e[0][1],
307 e[1][0] *
e[1][0] +
e[1][1] *
e[1][1]));
327 return (
m[2] == 0 &&
m[3] == 0 &&
m[6] == 0 &&
m[7] == 0 &&
m[8] == 0 &&
328 m[9] == 0 &&
m[10] == 1 &&
m[11] == 0 &&
m[14] == 0 &&
m[15] == 1);
332 return m[3] != 0 ||
m[7] != 0 ||
m[15] != 1;
336 return m[3] != 0 ||
m[7] != 0 ||
m[11] != 0 ||
m[15] != 1;
370 if (v[0] + v[1] + v[2] != 1 ||
371 v[3] + v[4] + v[5] != 1 ||
372 v[6] + v[7] + v[8] != 1) {
376 if (v[0] + v[3] + v[6] != 1 ||
377 v[1] + v[4] + v[7] != 1 ||
378 v[2] + v[5] + v[8] != 1) {
387 m[0] == 1.0f &&
m[1] == 0.0f &&
m[2] == 0.0f &&
m[3] == 0.0f &&
388 m[4] == 0.0f &&
m[5] == 1.0f &&
m[6] == 0.0f &&
m[7] == 0.0f &&
389 m[8] == 0.0f &&
m[9] == 0.0f &&
m[10] == 1.0f &&
m[11] == 0.0f &&
390 m[12] == 0.0f &&
m[13] == 0.0f &&
m[14] == 0.0f &&
m[15] == 1.0f
400 m[0] != 0.0 &&
m[1] == 0.0 &&
m[2] == 0.0 &&
m[3] == 0.0 &&
401 m[4] == 0.0 &&
m[5] != 0.0 &&
m[6] == 0.0 &&
m[7] == 0.0 &&
402 m[8] == 0.0 &&
m[9] == 0.0 &&
m[10] != 0.0 &&
m[11] == 0.0 &&
408 std::optional<MatrixDecomposition>
Decompose()
const;
433 return vec[0] ==
m.vec[0]
434 &&
vec[1] ==
m.vec[1]
435 &&
vec[2] ==
m.vec[2]
436 &&
vec[3] ==
m.vec[3];
442 return vec[0] !=
m.vec[0]
443 ||
vec[1] !=
m.vec[1]
444 ||
vec[2] !=
m.vec[2]
445 ||
vec[3] !=
m.vec[3];
459 v.
x *
m[1] + v.
y *
m[5] + v.
z *
m[9] + v.
w *
m[13],
460 v.
x *
m[2] + v.
y *
m[6] + v.
z *
m[10] + v.
w *
m[14],
461 v.
x *
m[3] + v.
y *
m[7] + v.
z *
m[11] + v.
w *
m[15]);
467 v.
x *
m[1] + v.
y *
m[5] + v.
z *
m[9] +
m[13],
468 v.
x *
m[2] + v.
y *
m[6] + v.
z *
m[10] +
m[14]);
481 v.
x *
m[1] + v.
y *
m[5] +
m[13]);
493 v.
x *
m[1] + v.
y *
m[5] +
m[13],
494 v.
x *
m[3] + v.
y *
m[7] +
m[15]);
499 v.
x *
m[1] + v.
y *
m[5] + v.
z *
m[9],
500 v.
x *
m[2] + v.
y *
m[6] + v.
z *
m[10], v.
w);
505 v.
x *
m[1] + v.
y *
m[5] + v.
z *
m[9],
506 v.
x *
m[2] + v.
y *
m[6] + v.
z *
m[10]);
529 return translate *
scale;
537 Scalar width = height * aspect_ratio;
541 1.0f / width, 0.0f, 0.0f, 0.0f,
542 0.0f, 1.0f / height, 0.0f, 0.0f,
543 0.0f, 0.0f, z_far / (z_far - z_near), 1.0f,
544 0.0f, 0.0f, -(z_far * z_near) / (z_far - z_near), 0.0f,
561 Vector3 forward = (target - position).Normalize();
563 up = forward.
Cross(right);
567 right.
x, up.
x, forward.
x, 0.0f,
568 right.
y, up.
y, forward.
y, 0.0f,
569 right.
z, up.
z, forward.
z, 0.0f,
570 -right.
Dot(position), -up.
Dot(position), -forward.
Dot(position), 1.0f
599 if (std::abs(sin) == 1.0f) {
604 if (std::abs(cos) == 1.0f) {
613 static_assert(
sizeof(
struct Matrix) ==
sizeof(
Scalar) * 16,
614 "The matrix must be of consistent size.");
620 out <<
"(" << std::endl << std::fixed;
621 for (
size_t i = 0; i < 4u; i++) {
622 for (
size_t j = 0; j < 4u; j++) {
623 out << std::setw(15) << m.
e[j][i] <<
",";
633 #endif // FLUTTER_IMPELLER_GEOMETRY_MATRIX_H_
static constexpr Matrix MakeSkew(Scalar sx, Scalar sy)
constexpr bool HasPerspective() const
Matrix operator+(const Vector3 &t) const
constexpr Scalar Dot(const Vector3 &other) const
constexpr Vector3 TransformHomogenous(const Point &v) const
std::optional< MatrixDecomposition > Decompose() const
bool Equals(const Matrix &matrix, Scalar epsilon=1e-5f) const
static Matrix MakeRotationX(Radians r)
constexpr Vector3 Cross(const Vector3 &other) const
static constexpr Matrix MakePerspective(Radians fov_y, TSize< T > size, Scalar z_near, Scalar z_far)
Vector4 Normalize() const
Matrix operator-(const Vector3 &t) const
constexpr Point operator*(const Point &v) const
static Matrix MakeRotation(Quaternion q)
static Matrix MakeRotationY(Radians r)
Scalar GetDeterminant() const
std::ostream & operator<<(std::ostream &out, const impeller::Color &c)
Matrix operator*(const Matrix &m) const
static constexpr Matrix MakeRow(Scalar m0, Scalar m1, Scalar m2, Scalar m3, Scalar m4, Scalar m5, Scalar m6, Scalar m7, Scalar m8, Scalar m9, Scalar m10, Scalar m11, Scalar m12, Scalar m13, Scalar m14, Scalar m15)
static constexpr Matrix MakeTranslation(const Vector3 &t)
static Matrix MakeRotation(Radians radians, const Vector4 &r)
static constexpr Matrix MakeLookAt(Vector3 position, Vector3 target, Vector3 up)
static constexpr Matrix MakePerspective(Radians fov_y, Scalar aspect_ratio, Scalar z_near, Scalar z_far)
constexpr Matrix Basis() const
The Matrix without its w components (without translation).
constexpr Vector3 TransformDirection(const Vector3 &v) const
std::array< Point, 4 > Quad
constexpr Matrix Multiply(const Matrix &o) const
constexpr Vector3 GetScale() const
constexpr bool operator==(const Matrix &m) const
constexpr Matrix Transpose() const
constexpr Vector4 operator*(const Vector4 &v) const
constexpr bool IsTranslationScaleOnly() const
Returns true if the matrix has a scale-only basis and is non-projective. Note that an identity matrix...
constexpr Matrix Translate(const Vector3 &t) const
constexpr Matrix(Scalar m0, Scalar m1, Scalar m2, Scalar m3, Scalar m4, Scalar m5, Scalar m6, Scalar m7, Scalar m8, Scalar m9, Scalar m10, Scalar m11, Scalar m12, Scalar m13, Scalar m14, Scalar m15)
static constexpr Matrix MakeColumn(Scalar m0, Scalar m1, Scalar m2, Scalar m3, Scalar m4, Scalar m5, Scalar m6, Scalar m7, Scalar m8, Scalar m9, Scalar m10, Scalar m11, Scalar m12, Scalar m13, Scalar m14, Scalar m15)
constexpr Vector2 TransformDirection(const Vector2 &v) const
constexpr bool IsAffine() const
constexpr bool ScalarNearlyZero(Scalar x, Scalar tolerance=kEhCloseEnough)
constexpr Scalar GetLength() const
constexpr Vector3 GetBasisZ() const
constexpr Quad Transform(const Quad &quad) const
constexpr bool HasTranslation() const
constexpr bool IsIdentity() const
constexpr Scalar GetDirectionScale(Vector3 direction) const
constexpr Vector3 Normalize() const
constexpr Vector4 TransformDirection(const Vector4 &v) const
static Matrix MakeRotationZ(Radians r)
constexpr Scalar GetMaxBasisLengthXY() const
constexpr Vector3 operator*(const Vector3 &v) const
constexpr bool operator!=(const Matrix &m) const
constexpr bool ScalarNearlyEqual(Scalar x, Scalar y, Scalar tolerance=kEhCloseEnough)
static constexpr Matrix MakeOrthographic(TSize< T > size)
constexpr Vector3 GetBasisY() const
static constexpr Matrix MakeScale(const Vector3 &s)
constexpr bool IsAligned2D(Scalar tolerance=0) const
static constexpr Matrix MakeScale(const Vector2 &s)
constexpr Vector3 GetBasisX() const
constexpr bool HasPerspective2D() const
A 4x4 matrix using column-major storage.
constexpr Matrix Scale(const Vector3 &s) const
constexpr bool IsAligned(Scalar tolerance=0) const