 |
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 Scalar cosine = cos(radians);
155 const Scalar cosp = 1.0f - cosine;
156 const Scalar sine = sin(radians);
160 cosine + cosp * v.
x * v.
x,
161 cosp * v.
x * v.
y + v.
z * sine,
162 cosp * v.
x * v.
z - v.
y * sine,
165 cosp * v.
x * v.
y - v.
z * sine,
166 cosine + cosp * v.
y * v.
y,
167 cosp * v.
y * v.
z + v.
x * sine,
170 cosp * v.
x * v.
z + v.
y * sine,
171 cosp * v.
y * v.
z - v.
x * sine,
172 cosine + cosp * v.
z * v.
z,
187 1.0f, 0.0f, 0.0f, 0.0f,
188 0.0f, cosine, sine, 0.0f,
189 0.0f, -sine, cosine, 0.0f,
190 0.0f, 0.0f, 0.0f, 1.0f
201 cosine, 0.0f, -sine, 0.0f,
202 0.0f, 1.0f, 0.0f, 0.0f,
203 sine, 0.0f, cosine, 0.0f,
204 0.0f, 0.0f, 0.0f, 1.0f
215 cosine, sine, 0.0f, 0.0f,
216 -sine, cosine, 0.0f, 0.0f,
217 0.0f, 0.0f, 1.0f, 0.0f,
218 0.0f, 0.0f, 0.0f, 1.0
227 m[0],
m[1],
m[2], 0.0f,
228 m[4],
m[5],
m[6], 0.0f,
229 m[8],
m[9],
m[10], 0.0f,
230 0.0f, 0.0f, 0.0f, 1.0
238 m[4],
m[5],
m[6],
m[7],
239 m[8],
m[9],
m[10],
m[11],
240 m[0] * t.
x +
m[4] * t.
y +
m[8] * t.
z +
m[12],
241 m[1] * t.
x +
m[5] * t.
y +
m[9] * t.
z +
m[13],
242 m[2] * t.
x +
m[6] * t.
y +
m[10] * t.
z +
m[14],
250 m[4] * s.
y,
m[5] * s.
y,
m[6] * s.
y,
m[7] * s.
y,
251 m[8] * s.
z,
m[9] * s.
z,
m[10] * s.
z,
m[11] * s.
z,
252 m[12] ,
m[13] ,
m[14] ,
m[15] );
259 m[0] * o.
m[0] +
m[4] * o.
m[1] +
m[8] * o.
m[2] +
m[12] * o.
m[3],
260 m[1] * o.
m[0] +
m[5] * o.
m[1] +
m[9] * o.
m[2] +
m[13] * o.
m[3],
261 m[2] * o.
m[0] +
m[6] * o.
m[1] +
m[10] * o.
m[2] +
m[14] * o.
m[3],
262 m[3] * o.
m[0] +
m[7] * o.
m[1] +
m[11] * o.
m[2] +
m[15] * o.
m[3],
263 m[0] * o.
m[4] +
m[4] * o.
m[5] +
m[8] * o.
m[6] +
m[12] * o.
m[7],
264 m[1] * o.
m[4] +
m[5] * o.
m[5] +
m[9] * o.
m[6] +
m[13] * o.
m[7],
265 m[2] * o.
m[4] +
m[6] * o.
m[5] +
m[10] * o.
m[6] +
m[14] * o.
m[7],
266 m[3] * o.
m[4] +
m[7] * o.
m[5] +
m[11] * o.
m[6] +
m[15] * o.
m[7],
267 m[0] * o.
m[8] +
m[4] * o.
m[9] +
m[8] * o.
m[10] +
m[12] * o.
m[11],
268 m[1] * o.
m[8] +
m[5] * o.
m[9] +
m[9] * o.
m[10] +
m[13] * o.
m[11],
269 m[2] * o.
m[8] +
m[6] * o.
m[9] +
m[10] * o.
m[10] +
m[14] * o.
m[11],
270 m[3] * o.
m[8] +
m[7] * o.
m[9] +
m[11] * o.
m[10] +
m[15] * o.
m[11],
271 m[0] * o.
m[12] +
m[4] * o.
m[13] +
m[8] * o.
m[14] +
m[12] * o.
m[15],
272 m[1] * o.
m[12] +
m[5] * o.
m[13] +
m[9] * o.
m[14] +
m[13] * o.
m[15],
273 m[2] * o.
m[12] +
m[6] * o.
m[13] +
m[10] * o.
m[14] +
m[14] * o.
m[15],
274 m[3] * o.
m[12] +
m[7] * o.
m[13] +
m[11] * o.
m[14] +
m[15] * o.
m[15]);
281 m[0],
m[4],
m[8],
m[12],
282 m[1],
m[5],
m[9],
m[13],
283 m[2],
m[6],
m[10],
m[14],
284 m[3],
m[7],
m[11],
m[15],
296 return std::sqrt(std::max(
e[0][0] *
e[0][0] +
e[0][1] *
e[0][1],
297 e[1][0] *
e[1][0] +
e[1][1] *
e[1][1]));
317 return (
m[2] == 0 &&
m[3] == 0 &&
m[6] == 0 &&
m[7] == 0 &&
m[8] == 0 &&
318 m[9] == 0 &&
m[10] == 1 &&
m[11] == 0 &&
m[14] == 0 &&
m[15] == 1);
322 return m[3] != 0 ||
m[7] != 0 ||
m[11] != 0 ||
m[15] != 1;
336 if (v[0] + v[1] + v[2] != 1 ||
337 v[3] + v[4] + v[5] != 1 ||
338 v[6] + v[7] + v[8] != 1) {
342 if (v[0] + v[3] + v[6] != 1 ||
343 v[1] + v[4] + v[7] != 1 ||
344 v[2] + v[5] + v[8] != 1) {
353 m[0] == 1.0f &&
m[1] == 0.0f &&
m[2] == 0.0f &&
m[3] == 0.0f &&
354 m[4] == 0.0f &&
m[5] == 1.0f &&
m[6] == 0.0f &&
m[7] == 0.0f &&
355 m[8] == 0.0f &&
m[9] == 0.0f &&
m[10] == 1.0f &&
m[11] == 0.0f &&
356 m[12] == 0.0f &&
m[13] == 0.0f &&
m[14] == 0.0f &&
m[15] == 1.0f
366 m[0] != 0.0 &&
m[1] == 0.0 &&
m[2] == 0.0 &&
m[3] == 0.0 &&
367 m[4] == 0.0 &&
m[5] != 0.0 &&
m[6] == 0.0 &&
m[7] == 0.0 &&
368 m[8] == 0.0 &&
m[9] == 0.0 &&
m[10] != 0.0 &&
m[11] == 0.0 &&
374 std::optional<MatrixDecomposition>
Decompose()
const;
378 return vec[0] ==
m.vec[0]
379 &&
vec[1] ==
m.vec[1]
380 &&
vec[2] ==
m.vec[2]
381 &&
vec[3] ==
m.vec[3];
387 return vec[0] !=
m.vec[0]
388 ||
vec[1] !=
m.vec[1]
389 ||
vec[2] !=
m.vec[2]
390 ||
vec[3] !=
m.vec[3];
404 v.
x *
m[1] + v.
y *
m[5] + v.
z *
m[9] + v.
w *
m[13],
405 v.
x *
m[2] + v.
y *
m[6] + v.
z *
m[10] + v.
w *
m[14],
406 v.
x *
m[3] + v.
y *
m[7] + v.
z *
m[11] + v.
w *
m[15]);
412 v.
x *
m[1] + v.
y *
m[5] + v.
z *
m[9] +
m[13],
413 v.
x *
m[2] + v.
y *
m[6] + v.
z *
m[10] +
m[14]);
426 v.
x *
m[1] + v.
y *
m[5] +
m[13]);
438 v.
x *
m[1] + v.
y *
m[5] + v.
z *
m[9],
439 v.
x *
m[2] + v.
y *
m[6] + v.
z *
m[10], v.
w);
444 v.
x *
m[1] + v.
y *
m[5] + v.
z *
m[9],
445 v.
x *
m[2] + v.
y *
m[6] + v.
z *
m[10]);
468 return translate *
scale;
476 Scalar width = height * aspect_ratio;
480 1.0f / width, 0.0f, 0.0f, 0.0f,
481 0.0f, 1.0f / height, 0.0f, 0.0f,
482 0.0f, 0.0f, z_far / (z_far - z_near), 1.0f,
483 0.0f, 0.0f, -(z_far * z_near) / (z_far - z_near), 0.0f,
500 Vector3 forward = (target - position).Normalize();
502 up = forward.
Cross(right);
506 right.
x, up.
x, forward.
x, 0.0f,
507 right.
y, up.
y, forward.
y, 0.0f,
508 right.
z, up.
z, forward.
z, 0.0f,
509 -right.
Dot(position), -up.
Dot(position), -forward.
Dot(position), 1.0f
515 static_assert(
sizeof(
struct Matrix) ==
sizeof(
Scalar) * 16,
516 "The matrix must be of consistent size.");
522 out <<
"(" << std::endl << std::fixed;
523 for (
size_t i = 0; i < 4u; i++) {
524 for (
size_t j = 0; j < 4u; j++) {
525 out << std::setw(15) << m.
e[j][i] <<
",";
535 #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
std::optional< MatrixDecomposition > Decompose() 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 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
Scalar GetMaxBasisLength() 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 Length() const
constexpr Vector3 GetBasisZ() const
constexpr Quad Transform(const Quad &quad) 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
static Matrix MakeRotation(Scalar radians, const Vector4 &r)
constexpr Vector3 operator*(const Vector3 &v) const
constexpr bool operator!=(const Matrix &m) const
static constexpr Matrix MakeOrthographic(TSize< T > size)
constexpr Vector3 GetBasisY() const
static constexpr Matrix MakeScale(const Vector3 &s)
static constexpr Matrix MakeScale(const Vector2 &s)
constexpr Vector3 GetBasisX() const
A 4x4 matrix using column-major storage.
constexpr Matrix Scale(const Vector3 &s) const
constexpr bool IsAligned(Scalar tolerance=0) const