 |
Flutter Impeller
|
|
Go to the documentation of this file.
49 Vector4(0.0f, 1.0f, 0.0f, 0.0f),
50 Vector4(0.0f, 0.0f, 1.0f, 0.0f),
51 Vector4(0.0f, 0.0f, 0.0f, 1.0f)} {}
65 explicit Matrix(
const MatrixDecomposition& decomposition);
73 return Matrix(m0, m1, m2, m3,
87 return Matrix(m0, m4, m8, m12,
96 return Matrix(1.0f, 0.0f, 0.0f, 0.0f,
97 0.0f, 1.0f, 0.0f, 0.0f,
98 0.0f, 0.0f, 1.0f, 0.0f,
105 return Matrix(s.
x, 0.0f, 0.0f, 0.0f,
106 0.0f, s.
y, 0.0f, 0.0f,
107 0.0f, 0.0f, s.
z, 0.0f,
108 0.0f, 0.0f, 0.0f, 1.0f);
118 return Matrix(1.0f, sy , 0.0f, 0.0f,
119 sx , 1.0f, 0.0f, 0.0f,
120 0.0f, 0.0f, 1.0f, 0.0f,
121 0.0f, 0.0f, 0.0f, 1.0f);
128 1.0f - 2.0f * q.
y * q.
y - 2.0f * q.
z * q.
z,
129 2.0f * q.
x * q.
y + 2.0f * q.
z * q.
w,
130 2.0f * q.
x * q.
z - 2.0f * q.
y * q.
w,
133 2.0f * q.
x * q.
y - 2.0f * q.
z * q.
w,
134 1.0f - 2.0f * q.
x * q.
x - 2.0f * q.
z * q.
z,
135 2.0f * q.
y * q.
z + 2.0f * q.
x * q.
w,
138 2.0f * q.
x * q.
z + 2.0f * q.
y * q.
w,
139 2.0f * q.
y * q.
z - 2.0f * q.
x * q.
w,
140 1.0f - 2.0f * q.
x * q.
x - 2.0f * q.
y * q.
y,
153 const Scalar cosine = cos(radians);
154 const Scalar cosp = 1.0f - cosine;
155 const Scalar sine = sin(radians);
159 cosine + cosp * v.
x * v.
x,
160 cosp * v.
x * v.
y + v.
z * sine,
161 cosp * v.
x * v.
z - v.
y * sine,
164 cosp * v.
x * v.
y - v.
z * sine,
165 cosine + cosp * v.
y * v.
y,
166 cosp * v.
y * v.
z + v.
x * sine,
169 cosp * v.
x * v.
z + v.
y * sine,
170 cosp * v.
y * v.
z - v.
x * sine,
171 cosine + cosp * v.
z * v.
z,
186 1.0f, 0.0f, 0.0f, 0.0f,
187 0.0f, cosine, sine, 0.0f,
188 0.0f, -sine, cosine, 0.0f,
189 0.0f, 0.0f, 0.0f, 1.0f
200 cosine, 0.0f, -sine, 0.0f,
201 0.0f, 1.0f, 0.0f, 0.0f,
202 sine, 0.0f, cosine, 0.0f,
203 0.0f, 0.0f, 0.0f, 1.0f
214 cosine, sine, 0.0f, 0.0f,
215 -sine, cosine, 0.0f, 0.0f,
216 0.0f, 0.0f, 1.0f, 0.0f,
217 0.0f, 0.0f, 0.0f, 1.0
225 m[0],
m[1],
m[2], 0.0f,
226 m[4],
m[5],
m[6], 0.0f,
227 m[8],
m[9],
m[10], 0.0f,
228 0.0f, 0.0f, 0.0f, 1.0
236 m[4],
m[5],
m[6],
m[7],
237 m[8],
m[9],
m[10],
m[11],
238 m[0] * t.
x +
m[4] * t.
y +
m[8] * t.
z +
m[12],
239 m[1] * t.
x +
m[5] * t.
y +
m[9] * t.
z +
m[13],
240 m[2] * t.
x +
m[6] * t.
y +
m[10] * t.
z +
m[14],
248 m[4] * s.
y,
m[5] * s.
y,
m[6] * s.
y,
m[7] * s.
y,
249 m[8] * s.
z,
m[9] * s.
z,
m[10] * s.
z,
m[11] * s.
z,
250 m[12] ,
m[13] ,
m[14] ,
m[15] );
257 m[0] * o.
m[0] +
m[4] * o.
m[1] +
m[8] * o.
m[2] +
m[12] * o.
m[3],
258 m[1] * o.
m[0] +
m[5] * o.
m[1] +
m[9] * o.
m[2] +
m[13] * o.
m[3],
259 m[2] * o.
m[0] +
m[6] * o.
m[1] +
m[10] * o.
m[2] +
m[14] * o.
m[3],
260 m[3] * o.
m[0] +
m[7] * o.
m[1] +
m[11] * o.
m[2] +
m[15] * o.
m[3],
261 m[0] * o.
m[4] +
m[4] * o.
m[5] +
m[8] * o.
m[6] +
m[12] * o.
m[7],
262 m[1] * o.
m[4] +
m[5] * o.
m[5] +
m[9] * o.
m[6] +
m[13] * o.
m[7],
263 m[2] * o.
m[4] +
m[6] * o.
m[5] +
m[10] * o.
m[6] +
m[14] * o.
m[7],
264 m[3] * o.
m[4] +
m[7] * o.
m[5] +
m[11] * o.
m[6] +
m[15] * o.
m[7],
265 m[0] * o.
m[8] +
m[4] * o.
m[9] +
m[8] * o.
m[10] +
m[12] * o.
m[11],
266 m[1] * o.
m[8] +
m[5] * o.
m[9] +
m[9] * o.
m[10] +
m[13] * o.
m[11],
267 m[2] * o.
m[8] +
m[6] * o.
m[9] +
m[10] * o.
m[10] +
m[14] * o.
m[11],
268 m[3] * o.
m[8] +
m[7] * o.
m[9] +
m[11] * o.
m[10] +
m[15] * o.
m[11],
269 m[0] * o.
m[12] +
m[4] * o.
m[13] +
m[8] * o.
m[14] +
m[12] * o.
m[15],
270 m[1] * o.
m[12] +
m[5] * o.
m[13] +
m[9] * o.
m[14] +
m[13] * o.
m[15],
271 m[2] * o.
m[12] +
m[6] * o.
m[13] +
m[10] * o.
m[14] +
m[14] * o.
m[15],
272 m[3] * o.
m[12] +
m[7] * o.
m[13] +
m[11] * o.
m[14] +
m[15] * o.
m[15]);
279 m[0],
m[4],
m[8],
m[12],
280 m[1],
m[5],
m[9],
m[13],
281 m[2],
m[6],
m[10],
m[14],
282 m[3],
m[7],
m[11],
m[15],
312 return (
m[2] == 0 &&
m[3] == 0 &&
m[6] == 0 &&
m[7] == 0 &&
m[8] == 0 &&
313 m[9] == 0 &&
m[10] == 1 &&
m[11] == 0 &&
m[14] == 0 &&
m[15] == 1);
317 return m[3] != 0 ||
m[7] != 0 ||
m[11] != 0 ||
m[15] != 1;
331 if (v[0] + v[1] + v[2] != 1 ||
332 v[3] + v[4] + v[5] != 1 ||
333 v[6] + v[7] + v[8] != 1) {
337 if (v[0] + v[3] + v[6] != 1 ||
338 v[1] + v[4] + v[7] != 1 ||
339 v[2] + v[5] + v[8] != 1) {
348 m[0] == 1.0f &&
m[1] == 0.0f &&
m[2] == 0.0f &&
m[3] == 0.0f &&
349 m[4] == 0.0f &&
m[5] == 1.0f &&
m[6] == 0.0f &&
m[7] == 0.0f &&
350 m[8] == 0.0f &&
m[9] == 0.0f &&
m[10] == 1.0f &&
m[11] == 0.0f &&
351 m[12] == 0.0f &&
m[13] == 0.0f &&
m[14] == 0.0f &&
m[15] == 1.0f
361 m[0] != 0.0 &&
m[1] == 0.0 &&
m[2] == 0.0 &&
m[3] == 0.0 &&
362 m[4] == 0.0 &&
m[5] != 0.0 &&
m[6] == 0.0 &&
m[7] == 0.0 &&
363 m[8] == 0.0 &&
m[9] == 0.0 &&
m[10] != 0.0 &&
m[11] == 0.0 &&
369 std::optional<MatrixDecomposition>
Decompose()
const;
373 return vec[0] ==
m.vec[0]
374 &&
vec[1] ==
m.vec[1]
375 &&
vec[2] ==
m.vec[2]
376 &&
vec[3] ==
m.vec[3];
382 return vec[0] !=
m.vec[0]
383 ||
vec[1] !=
m.vec[1]
384 ||
vec[2] !=
m.vec[2]
385 ||
vec[3] !=
m.vec[3];
399 v.
x *
m[1] + v.
y *
m[5] + v.
z *
m[9] + v.
w *
m[13],
400 v.
x *
m[2] + v.
y *
m[6] + v.
z *
m[10] + v.
w *
m[14],
401 v.
x *
m[3] + v.
y *
m[7] + v.
z *
m[11] + v.
w *
m[15]);
407 v.
x *
m[1] + v.
y *
m[5] + v.
z *
m[9] +
m[13],
408 v.
x *
m[2] + v.
y *
m[6] + v.
z *
m[10] +
m[14]);
421 v.
x *
m[1] + v.
y *
m[5] +
m[13]);
433 v.
x *
m[1] + v.
y *
m[5] + v.
z *
m[9],
434 v.
x *
m[2] + v.
y *
m[6] + v.
z *
m[10], v.
w);
439 v.
x *
m[1] + v.
y *
m[5] + v.
z *
m[9],
440 v.
x *
m[2] + v.
y *
m[6] + v.
z *
m[10]);
454 return translate * scale;
462 Scalar width = height * aspect_ratio;
466 1.0f / width, 0.0f, 0.0f, 0.0f,
467 0.0f, 1.0f / height, 0.0f, 0.0f,
468 0.0f, 0.0f, z_far / (z_far - z_near), 1.0f,
469 0.0f, 0.0f, -(z_far * z_near) / (z_far - z_near), 0.0f,
486 Vector3 forward = (target - position).Normalize();
488 up = forward.
Cross(right);
492 right.
x, up.
x, forward.
x, 0.0f,
493 right.
y, up.
y, forward.
y, 0.0f,
494 right.
z, up.
z, forward.
z, 0.0f,
495 -right.
Dot(position), -up.
Dot(position), -forward.
Dot(position), 1.0f
501 static_assert(
sizeof(
struct Matrix) ==
sizeof(
Scalar) * 16,
502 "The matrix must be of consistent size.");
508 out <<
"(" << std::endl << std::fixed;
509 for (
size_t i = 0; i < 4u; i++) {
510 for (
size_t j = 0; j < 4u; j++) {
511 out << std::setw(15) << m.
e[j][i] <<
",";
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
constexpr Vector3 TransformDirection(const Vector3 &v) const
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 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)
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.
Scalar GetMaxBasisLengthXY() const
constexpr Matrix Scale(const Vector3 &s) const
constexpr bool IsAligned(Scalar tolerance=0) const