Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
matrix.h
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef FLUTTER_IMPELLER_GEOMETRY_MATRIX_H_
6#define FLUTTER_IMPELLER_GEOMETRY_MATRIX_H_
7
8#include <cmath>
9#include <iomanip>
10#include <limits>
11#include <optional>
12#include <ostream>
13#include <utility>
14
22
23namespace impeller {
24
25//------------------------------------------------------------------------------
26/// @brief A 4x4 matrix using column-major storage.
27///
28/// Utility methods that need to make assumptions about normalized
29/// device coordinates must use the following convention:
30/// * Left-handed coordinate system. Positive rotation is
31/// clockwise about axis of rotation.
32/// * Lower left corner is -1.0f, -1.0.
33/// * Upper right corner is 1.0f, 1.0.
34/// * Visible z-space is from 0.0 to 1.0.
35/// * This is NOT the same as OpenGL! Be careful.
36/// * NDC origin is at (0.0f, 0.0f, 0.5f).
37struct Matrix {
38 union {
39 Scalar m[16];
40 Scalar e[4][4];
42 };
43
44 //----------------------------------------------------------------------------
45 /// Constructs a default identity matrix.
46 ///
47 constexpr Matrix()
48 // clang-format off
49 : vec{ Vector4(1.0f, 0.0f, 0.0f, 0.0f),
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)} {}
53 // clang-format on
54
55 // clang-format off
56 constexpr Matrix(Scalar m0, Scalar m1, Scalar m2, Scalar m3,
57 Scalar m4, Scalar m5, Scalar m6, Scalar m7,
58 Scalar m8, Scalar m9, Scalar m10, Scalar m11,
59 Scalar m12, Scalar m13, Scalar m14, Scalar m15)
60 : vec{Vector4(m0, m1, m2, m3),
61 Vector4(m4, m5, m6, m7),
62 Vector4(m8, m9, m10, m11),
63 Vector4(m12, m13, m14, m15)} {}
64 // clang-format on
65
66 explicit Matrix(const MatrixDecomposition& decomposition);
67
68 // clang-format off
69 static constexpr Matrix MakeColumn(
70 Scalar m0, Scalar m1, Scalar m2, Scalar m3,
71 Scalar m4, Scalar m5, Scalar m6, Scalar m7,
72 Scalar m8, Scalar m9, Scalar m10, Scalar m11,
73 Scalar m12, Scalar m13, Scalar m14, Scalar m15){
74 return Matrix(m0, m1, m2, m3,
75 m4, m5, m6, m7,
76 m8, m9, m10, m11,
77 m12, m13, m14, m15);
78
79 }
80 // clang-format on
81
82 // clang-format off
83 static constexpr Matrix MakeRow(
84 Scalar m0, Scalar m1, Scalar m2, Scalar m3,
85 Scalar m4, Scalar m5, Scalar m6, Scalar m7,
86 Scalar m8, Scalar m9, Scalar m10, Scalar m11,
87 Scalar m12, Scalar m13, Scalar m14, Scalar m15){
88 return Matrix(m0, m4, m8, m12,
89 m1, m5, m9, m13,
90 m2, m6, m10, m14,
91 m3, m7, m11, m15);
92 }
93 // clang-format on
94
95 static constexpr Matrix MakeTranslation(const Vector3& t) {
96 // clang-format off
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);
101 // clang-format on
102 }
103
104 static constexpr Matrix MakeScale(const Vector3& s) {
105 // clang-format off
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);
110 // clang-format on
111 }
112
113 static constexpr Matrix MakeScale(const Vector2& s) {
114 return MakeScale(Vector3(s.x, s.y, 1.0f));
115 }
116
117 static constexpr Matrix MakeSkew(Scalar sx, Scalar sy) {
118 // clang-format off
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);
123 // clang-format on
124 }
125
127 // clang-format off
128 return Matrix(
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,
132 0.0f,
133
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,
137 0.0f,
138
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,
142 0.0f,
143
144 0.0f,
145 0.0f,
146 0.0f,
147 1.0f);
148 // clang-format on
149 }
150
151 static Matrix MakeRotation(Radians radians, const Vector4& r) {
152 const Vector4 v = r.Normalize();
153
154 const Vector2 cos_sin = CosSin(radians);
155 const Scalar cosine = cos_sin.x;
156 const Scalar cosp = 1.0f - cosine;
157 const Scalar sine = cos_sin.y;
158
159 // clang-format off
160 return Matrix(
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,
164 0.0f,
165
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,
169 0.0f,
170
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,
174 0.0f,
175
176 0.0f,
177 0.0f,
178 0.0f,
179 1.0f);
180 // clang-format on
181 }
182
184 const Vector2 cos_sin = CosSin(r);
185 const Scalar cosine = cos_sin.x;
186 const Scalar sine = cos_sin.y;
187
188 // clang-format off
189 return Matrix(
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
194 );
195 // clang-format on
196 }
197
199 const Vector2 cos_sin = CosSin(r);
200 const Scalar cosine = cos_sin.x;
201 const Scalar sine = cos_sin.y;
202
203 // clang-format off
204 return Matrix(
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
209 );
210 // clang-format on
211 }
212
214 const Vector2 cos_sin = CosSin(r);
215 const Scalar cosine = cos_sin.x;
216 const Scalar sine = cos_sin.y;
217
218 // clang-format off
219 return Matrix (
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
224 );
225 // clang-format on
226 }
227
228 /// The Matrix without its `w` components (without translation).
229 constexpr Matrix Basis() const {
230 // clang-format off
231 return Matrix(
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
236 );
237 // clang-format on
238 }
239
240 constexpr Matrix Translate(const Vector3& t) const {
241 // clang-format off
242 return Matrix(m[0], m[1], m[2], m[3],
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[15]);
249 // clang-format on
250 }
251
252 constexpr Matrix Scale(const Vector3& s) const {
253 // clang-format off
254 return Matrix(m[0] * s.x, m[1] * s.x, m[2] * s.x, m[3] * s.x,
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] );
258 // clang-format on
259 }
260
261 constexpr Matrix Multiply(const Matrix& o) const {
262 // clang-format off
263 return Matrix(
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]);
280 // clang-format on
281 }
282
283 constexpr Matrix Transpose() const {
284 // clang-format off
285 return {
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],
290 };
291 // clang-format on
292 }
293
294 Matrix Invert() const;
295
296 Scalar GetDeterminant() const;
297
299
300 constexpr Scalar GetMaxBasisLengthXY() const {
301 return std::sqrt(std::max(e[0][0] * e[0][0] + e[0][1] * e[0][1],
302 e[1][0] * e[1][0] + e[1][1] * e[1][1]));
303 }
304
305 constexpr Vector3 GetBasisX() const { return Vector3(m[0], m[1], m[2]); }
306
307 constexpr Vector3 GetBasisY() const { return Vector3(m[4], m[5], m[6]); }
308
309 constexpr Vector3 GetBasisZ() const { return Vector3(m[8], m[9], m[10]); }
310
311 constexpr Vector3 GetScale() const {
312 return Vector3(GetBasisX().Length(), GetBasisY().Length(),
313 GetBasisZ().Length());
314 }
315
316 constexpr Scalar GetDirectionScale(Vector3 direction) const {
317 return 1.0f / (this->Basis().Invert() * direction.Normalize()).Length() *
318 direction.Length();
319 }
320
321 constexpr bool IsAffine() const {
322 return (m[2] == 0 && m[3] == 0 && m[6] == 0 && m[7] == 0 && m[8] == 0 &&
323 m[9] == 0 && m[10] == 1 && m[11] == 0 && m[14] == 0 && m[15] == 1);
324 }
325
326 constexpr bool HasPerspective2D() const {
327 return m[3] != 0 || m[7] != 0 || m[15] != 1;
328 }
329
330 constexpr bool HasPerspective() const {
331 return m[3] != 0 || m[7] != 0 || m[11] != 0 || m[15] != 1;
332 }
333
334 constexpr bool IsAligned2D(Scalar tolerance = 0) const {
335 if (HasPerspective2D()) {
336 return false;
337 }
338 if (ScalarNearlyZero(m[1], tolerance) &&
339 ScalarNearlyZero(m[4], tolerance)) {
340 return true;
341 }
342 if (ScalarNearlyZero(m[0], tolerance) &&
343 ScalarNearlyZero(m[5], tolerance)) {
344 return true;
345 }
346 return false;
347 }
348
349 constexpr bool IsAligned(Scalar tolerance = 0) const {
350 if (HasPerspective()) {
351 return false;
352 }
353 int v[] = {!ScalarNearlyZero(m[0], tolerance), //
354 !ScalarNearlyZero(m[1], tolerance), //
355 !ScalarNearlyZero(m[2], tolerance), //
356 !ScalarNearlyZero(m[4], tolerance), //
357 !ScalarNearlyZero(m[5], tolerance), //
358 !ScalarNearlyZero(m[6], tolerance), //
359 !ScalarNearlyZero(m[8], tolerance), //
360 !ScalarNearlyZero(m[9], tolerance), //
361 !ScalarNearlyZero(m[10], tolerance)};
362 // Check if all three basis vectors are aligned to an axis.
363 if (v[0] + v[1] + v[2] != 1 || //
364 v[3] + v[4] + v[5] != 1 || //
365 v[6] + v[7] + v[8] != 1) {
366 return false;
367 }
368 // Ensure that none of the basis vectors overlap.
369 if (v[0] + v[3] + v[6] != 1 || //
370 v[1] + v[4] + v[7] != 1 || //
371 v[2] + v[5] + v[8] != 1) {
372 return false;
373 }
374 return true;
375 }
376
377 constexpr bool IsIdentity() const {
378 return (
379 // clang-format off
380 m[0] == 1.0f && m[1] == 0.0f && m[2] == 0.0f && m[3] == 0.0f &&
381 m[4] == 0.0f && m[5] == 1.0f && m[6] == 0.0f && m[7] == 0.0f &&
382 m[8] == 0.0f && m[9] == 0.0f && m[10] == 1.0f && m[11] == 0.0f &&
383 m[12] == 0.0f && m[13] == 0.0f && m[14] == 0.0f && m[15] == 1.0f
384 // clang-format on
385 );
386 }
387
388 /// @brief Returns true if the matrix has a scale-only basis and is
389 /// non-projective. Note that an identity matrix meets this criteria.
390 constexpr bool IsTranslationScaleOnly() const {
391 return (
392 // clang-format off
393 m[0] != 0.0 && m[1] == 0.0 && m[2] == 0.0 && m[3] == 0.0 &&
394 m[4] == 0.0 && m[5] != 0.0 && m[6] == 0.0 && m[7] == 0.0 &&
395 m[8] == 0.0 && m[9] == 0.0 && m[10] != 0.0 && m[11] == 0.0 &&
396 m[15] == 1.0
397 // clang-format on
398 );
399 }
400
401 std::optional<MatrixDecomposition> Decompose() const;
402
403 constexpr bool operator==(const Matrix& m) const {
404 // clang-format off
405 return vec[0] == m.vec[0]
406 && vec[1] == m.vec[1]
407 && vec[2] == m.vec[2]
408 && vec[3] == m.vec[3];
409 // clang-format on
410 }
411
412 constexpr bool operator!=(const Matrix& m) const {
413 // clang-format off
414 return vec[0] != m.vec[0]
415 || vec[1] != m.vec[1]
416 || vec[2] != m.vec[2]
417 || vec[3] != m.vec[3];
418 // clang-format on
419 }
420
421 Matrix operator+(const Vector3& t) const { return Translate(t); }
422
423 Matrix operator-(const Vector3& t) const { return Translate(-t); }
424
425 Matrix operator*(const Matrix& m) const { return Multiply(m); }
426
427 Matrix operator+(const Matrix& m) const;
428
429 constexpr Vector4 operator*(const Vector4& v) const {
430 return Vector4(v.x * m[0] + v.y * m[4] + v.z * m[8] + v.w * m[12],
431 v.x * m[1] + v.y * m[5] + v.z * m[9] + v.w * m[13],
432 v.x * m[2] + v.y * m[6] + v.z * m[10] + v.w * m[14],
433 v.x * m[3] + v.y * m[7] + v.z * m[11] + v.w * m[15]);
434 }
435
436 constexpr Vector3 operator*(const Vector3& v) const {
437 Scalar w = v.x * m[3] + v.y * m[7] + v.z * m[11] + m[15];
438 Vector3 result(v.x * m[0] + v.y * m[4] + v.z * m[8] + m[12],
439 v.x * m[1] + v.y * m[5] + v.z * m[9] + m[13],
440 v.x * m[2] + v.y * m[6] + v.z * m[10] + m[14]);
441
442 // This is Skia's behavior, but it may be reasonable to allow UB for the w=0
443 // case.
444 if (w) {
445 w = 1 / w;
446 }
447 return result * w;
448 }
449
450 constexpr Point operator*(const Point& v) const {
451 Scalar w = v.x * m[3] + v.y * m[7] + m[15];
452 Point result(v.x * m[0] + v.y * m[4] + m[12],
453 v.x * m[1] + v.y * m[5] + m[13]);
454
455 // This is Skia's behavior, but it may be reasonable to allow UB for the w=0
456 // case.
457 if (w) {
458 w = 1 / w;
459 }
460 return result * w;
461 }
462
463 constexpr Vector3 TransformHomogenous(const Point& v) const {
464 return Vector3(v.x * m[0] + v.y * m[4] + m[12],
465 v.x * m[1] + v.y * m[5] + m[13],
466 v.x * m[3] + v.y * m[7] + m[15]);
467 }
468
469 constexpr Vector4 TransformDirection(const Vector4& v) const {
470 return Vector4(v.x * m[0] + v.y * m[4] + v.z * m[8],
471 v.x * m[1] + v.y * m[5] + v.z * m[9],
472 v.x * m[2] + v.y * m[6] + v.z * m[10], v.w);
473 }
474
475 constexpr Vector3 TransformDirection(const Vector3& v) const {
476 return Vector3(v.x * m[0] + v.y * m[4] + v.z * m[8],
477 v.x * m[1] + v.y * m[5] + v.z * m[9],
478 v.x * m[2] + v.y * m[6] + v.z * m[10]);
479 }
480
481 constexpr Vector2 TransformDirection(const Vector2& v) const {
482 return Vector2(v.x * m[0] + v.y * m[4], v.x * m[1] + v.y * m[5]);
483 }
484
485 constexpr Quad Transform(const Quad& quad) const {
486 return {
487 *this * quad[0],
488 *this * quad[1],
489 *this * quad[2],
490 *this * quad[3],
491 };
492 }
493
494 template <class T>
495 static constexpr Matrix MakeOrthographic(TSize<T> size) {
496 // Per assumptions about NDC documented above.
497 const auto scale =
498 MakeScale({2.0f / static_cast<Scalar>(size.width),
499 -2.0f / static_cast<Scalar>(size.height), 0.0f});
500 const auto translate = MakeTranslation({-1.0f, 1.0f, 0.5f});
501 return translate * scale;
502 }
503
504 static constexpr Matrix MakePerspective(Radians fov_y,
505 Scalar aspect_ratio,
506 Scalar z_near,
507 Scalar z_far) {
508 Scalar height = std::tan(fov_y.radians * 0.5f);
509 Scalar width = height * aspect_ratio;
510
511 // clang-format off
512 return {
513 1.0f / width, 0.0f, 0.0f, 0.0f,
514 0.0f, 1.0f / height, 0.0f, 0.0f,
515 0.0f, 0.0f, z_far / (z_far - z_near), 1.0f,
516 0.0f, 0.0f, -(z_far * z_near) / (z_far - z_near), 0.0f,
517 };
518 // clang-format on
519 }
520
521 template <class T>
522 static constexpr Matrix MakePerspective(Radians fov_y,
523 TSize<T> size,
524 Scalar z_near,
525 Scalar z_far) {
526 return MakePerspective(fov_y, static_cast<Scalar>(size.width) / size.height,
527 z_near, z_far);
528 }
529
530 static constexpr Matrix MakeLookAt(Vector3 position,
532 Vector3 up) {
533 Vector3 forward = (target - position).Normalize();
534 Vector3 right = up.Cross(forward);
535 up = forward.Cross(right);
536
537 // clang-format off
538 return {
539 right.x, up.x, forward.x, 0.0f,
540 right.y, up.y, forward.y, 0.0f,
541 right.z, up.z, forward.z, 0.0f,
542 -right.Dot(position), -up.Dot(position), -forward.Dot(position), 1.0f
543 };
544 // clang-format on
545 }
546
547 private:
548 static constexpr Vector2 CosSin(Radians radians) {
549 // The precision of a float around 1.0 is much lower than it is
550 // around 0.0, so we end up with cases on quadrant rotations where
551 // we get a +/-1.0 for one of the values and a non-zero value for
552 // the other. This happens around quadrant rotations which makes it
553 // especially common and results in unclean quadrant rotation
554 // matrices which do not return true from |IsAligned[2D]| even
555 // though that is exactly where you need them to exhibit that property.
556 // It also injects small floating point mantissa errors into the
557 // matrices whenever you concatenate them with a quadrant rotation.
558 //
559 // This issue is also exacerbated by the fact that, in radians, the
560 // angles for quadrant rotations are irrational numbers. The measuring
561 // error for representing 90 degree multiples is small enough that
562 // either sin or cos will return a value near +/-1.0, but not small
563 // enough that the other value will be a clean 0.0.
564 //
565 // Some geometry packages simply discard very small numbers from
566 // sin/cos, but the following approach specifically targets just the
567 // area around a quadrant rotation (where either the sin or cos are
568 // measuring as +/-1.0) for symmetry of precision.
569
570 Scalar sin = std::sin(radians.radians);
571 if (std::abs(sin) == 1.0f) {
572 // 90 or 270 degrees (mod 360)
573 return {0.0f, sin};
574 } else {
575 Scalar cos = std::cos(radians.radians);
576 if (std::abs(cos) == 1.0f) {
577 // 0 or 180 degrees (mod 360)
578 return {cos, 0.0f};
579 }
580 return {cos, sin};
581 }
582 }
583};
584
585static_assert(sizeof(struct Matrix) == sizeof(Scalar) * 16,
586 "The matrix must be of consistent size.");
587
588} // namespace impeller
589
590namespace std {
591inline std::ostream& operator<<(std::ostream& out, const impeller::Matrix& m) {
592 out << "(" << std::endl << std::fixed;
593 for (size_t i = 0; i < 4u; i++) {
594 for (size_t j = 0; j < 4u; j++) {
595 out << std::setw(15) << m.e[j][i] << ",";
596 }
597 out << std::endl;
598 }
599 out << ")";
600 return out;
601}
602
603} // namespace std
604
605#endif // FLUTTER_IMPELLER_GEOMETRY_MATRIX_H_
static bool right(const SkPoint &p0, const SkPoint &p1)
struct MyStruct s
GAsyncResult * result
uint32_t * target
Point Vector2
Definition point.h:320
float Scalar
Definition scalar.h:18
constexpr bool ScalarNearlyZero(Scalar x, Scalar tolerance=kEhCloseEnough)
Definition scalar.h:25
std::array< Point, 4 > Quad
Definition point.h:321
Definition ref_ptr.h:256
std::ostream & operator<<(std::ostream &out, const impeller::Color &c)
Definition color.h:951
SkScalar w
int32_t height
int32_t width
const Scalar scale
A 4x4 matrix using column-major storage.
Definition matrix.h:37
static constexpr Matrix MakeOrthographic(TSize< T > size)
Definition matrix.h:495
constexpr Matrix Multiply(const Matrix &o) const
Definition matrix.h:261
constexpr bool IsAffine() const
Definition matrix.h:321
static constexpr Matrix MakeTranslation(const Vector3 &t)
Definition matrix.h:95
constexpr Vector3 GetBasisY() const
Definition matrix.h:307
constexpr Matrix()
Definition matrix.h:47
constexpr bool IsIdentity() const
Definition matrix.h:377
constexpr bool IsTranslationScaleOnly() const
Returns true if the matrix has a scale-only basis and is non-projective. Note that an identity matrix...
Definition matrix.h:390
constexpr Scalar GetMaxBasisLengthXY() const
Definition matrix.h:300
Scalar m[16]
Definition matrix.h:39
static constexpr Matrix MakePerspective(Radians fov_y, Scalar aspect_ratio, Scalar z_near, Scalar z_far)
Definition matrix.h:504
constexpr Matrix Translate(const Vector3 &t) const
Definition matrix.h:240
constexpr Vector3 GetScale() const
Definition matrix.h:311
constexpr Vector2 TransformDirection(const Vector2 &v) const
Definition matrix.h:481
static constexpr Matrix MakeScale(const Vector2 &s)
Definition matrix.h:113
Matrix operator+(const Vector3 &t) const
Definition matrix.h:421
constexpr Matrix Basis() const
The Matrix without its w components (without translation).
Definition matrix.h:229
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)
Definition matrix.h:56
Matrix operator*(const Matrix &m) const
Definition matrix.h:425
constexpr bool IsAligned(Scalar tolerance=0) const
Definition matrix.h:349
Matrix Invert() const
Definition matrix.cc:97
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)
Definition matrix.h:69
static Matrix MakeRotationY(Radians r)
Definition matrix.h:198
constexpr Vector3 GetBasisZ() const
Definition matrix.h:309
Vector4 vec[4]
Definition matrix.h:41
static constexpr Matrix MakeLookAt(Vector3 position, Vector3 target, Vector3 up)
Definition matrix.h:530
std::optional< MatrixDecomposition > Decompose() const
Definition matrix.cc:209
constexpr bool HasPerspective2D() const
Definition matrix.h:326
Matrix operator-(const Vector3 &t) const
Definition matrix.h:423
constexpr Scalar GetDirectionScale(Vector3 direction) const
Definition matrix.h:316
constexpr Vector4 operator*(const Vector4 &v) const
Definition matrix.h:429
constexpr bool operator!=(const Matrix &m) const
Definition matrix.h:412
constexpr Point operator*(const Point &v) const
Definition matrix.h:450
constexpr Vector3 operator*(const Vector3 &v) const
Definition matrix.h:436
Scalar GetMaxBasisLength() const
Definition matrix.cc:196
constexpr Vector3 TransformDirection(const Vector3 &v) const
Definition matrix.h:475
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)
Definition matrix.h:83
static constexpr Matrix MakeSkew(Scalar sx, Scalar sy)
Definition matrix.h:117
constexpr Quad Transform(const Quad &quad) const
Definition matrix.h:485
constexpr bool operator==(const Matrix &m) const
Definition matrix.h:403
constexpr Matrix Scale(const Vector3 &s) const
Definition matrix.h:252
constexpr Vector3 TransformHomogenous(const Point &v) const
Definition matrix.h:463
Scalar e[4][4]
Definition matrix.h:40
static Matrix MakeRotationZ(Radians r)
Definition matrix.h:213
static Matrix MakeRotation(Radians radians, const Vector4 &r)
Definition matrix.h:151
static constexpr Matrix MakePerspective(Radians fov_y, TSize< T > size, Scalar z_near, Scalar z_far)
Definition matrix.h:522
Scalar GetDeterminant() const
Definition matrix.cc:162
constexpr bool HasPerspective() const
Definition matrix.h:330
static constexpr Matrix MakeScale(const Vector3 &s)
Definition matrix.h:104
constexpr Vector4 TransformDirection(const Vector4 &v) const
Definition matrix.h:469
constexpr Vector3 GetBasisX() const
Definition matrix.h:305
constexpr bool IsAligned2D(Scalar tolerance=0) const
Definition matrix.h:334
static Matrix MakeRotation(Quaternion q)
Definition matrix.h:126
constexpr Matrix Transpose() const
Definition matrix.h:283
static Matrix MakeRotationX(Radians r)
Definition matrix.h:183
Scalar radians
Definition scalar.h:39
constexpr Vector3 Cross(const Vector3 &other) const
Definition vector.h:62
constexpr Vector3 Normalize() const
Definition vector.h:49
constexpr Scalar Length() const
Definition vector.h:47
constexpr Scalar Dot(const Vector3 &other) const
Definition vector.h:54
Vector4 Normalize() const
Definition vector.h:258