Skip to content

Commit 3101dff

Browse files
authored
[web] Optimize Matrix4.identity (flutter#22622)
1 parent f4ada80 commit 3101dff

File tree

1 file changed

+42
-34
lines changed

1 file changed

+42
-34
lines changed

lib/web_ui/lib/src/engine/vector_math.dart

Lines changed: 42 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,12 @@ class Matrix4 {
6767
Matrix4.zero() : _m4storage = Float32List(16);
6868

6969
/// Identity matrix.
70-
factory Matrix4.identity() => Matrix4.zero()..setIdentity();
70+
Matrix4.identity() : _m4storage = Float32List(16) {
71+
_m4storage[15] = 1.0;
72+
_m4storage[0] = 1.0;
73+
_m4storage[5] = 1.0;
74+
_m4storage[10] = 1.0;
75+
}
7176

7277
/// Copies values from [other].
7378
factory Matrix4.copy(Matrix4 other) => Matrix4.zero()..setFrom(other);
@@ -98,14 +103,12 @@ class Matrix4 {
98103
..setRotationZ(radians);
99104

100105
/// Translation matrix.
101-
factory Matrix4.translation(Vector3 translation) => Matrix4.zero()
102-
..setIdentity()
106+
factory Matrix4.translation(Vector3 translation) => Matrix4.identity()
103107
..setTranslation(translation);
104108

105109
/// Translation matrix.
106110
factory Matrix4.translationValues(double x, double y, double z) =>
107-
Matrix4.zero()
108-
..setIdentity()
111+
Matrix4.identity()
109112
..setTranslationRaw(x, y, z);
110113

111114
/// Scale matrix.
@@ -198,6 +201,9 @@ class Matrix4 {
198201
/// Copy into [arg].
199202
Matrix4 copyInto(Matrix4 arg) {
200203
final Float32List argStorage = arg._m4storage;
204+
// Start reading from the last element to eliminate range checks
205+
// in subsequent reads.
206+
argStorage[15] = _m4storage[15];
201207
argStorage[0] = _m4storage[0];
202208
argStorage[1] = _m4storage[1];
203209
argStorage[2] = _m4storage[2];
@@ -213,7 +219,6 @@ class Matrix4 {
213219
argStorage[12] = _m4storage[12];
214220
argStorage[13] = _m4storage[13];
215221
argStorage[14] = _m4storage[14];
216-
argStorage[15] = _m4storage[15];
217222
return arg;
218223
}
219224

@@ -248,6 +253,7 @@ class Matrix4 {
248253
final double sy = y ?? x;
249254
final double sz = z ?? x;
250255
const double sw = 1.0;
256+
_m4storage[15] *= sw;
251257
_m4storage[0] *= sx;
252258
_m4storage[1] *= sx;
253259
_m4storage[2] *= sx;
@@ -263,7 +269,6 @@ class Matrix4 {
263269
_m4storage[12] *= sw;
264270
_m4storage[13] *= sw;
265271
_m4storage[14] *= sw;
266-
_m4storage[15] *= sw;
267272
}
268273

269274
/// Create a copy of [this] scaled by a [Vector3], [Vector4] or [x],[y], and
@@ -272,6 +277,7 @@ class Matrix4 {
272277

273278
/// Zeros [this].
274279
void setZero() {
280+
_m4storage[15] = 0.0;
275281
_m4storage[0] = 0.0;
276282
_m4storage[1] = 0.0;
277283
_m4storage[2] = 0.0;
@@ -287,11 +293,11 @@ class Matrix4 {
287293
_m4storage[12] = 0.0;
288294
_m4storage[13] = 0.0;
289295
_m4storage[14] = 0.0;
290-
_m4storage[15] = 0.0;
291296
}
292297

293298
/// Makes [this] into the identity matrix.
294299
void setIdentity() {
300+
_m4storage[15] = 1.0;
295301
_m4storage[0] = 1.0;
296302
_m4storage[1] = 0.0;
297303
_m4storage[2] = 0.0;
@@ -307,7 +313,6 @@ class Matrix4 {
307313
_m4storage[12] = 0.0;
308314
_m4storage[13] = 0.0;
309315
_m4storage[14] = 0.0;
310-
_m4storage[15] = 1.0;
311316
}
312317

313318
/// Returns the tranpose of this.
@@ -337,34 +342,35 @@ class Matrix4 {
337342

338343
/// Returns the determinant of this matrix.
339344
double determinant() {
345+
final Float32List m = _m4storage;
340346
final double det2_01_01 =
341-
_m4storage[0] * _m4storage[5] - _m4storage[1] * _m4storage[4];
347+
m[0] * m[5] - m[1] * m[4];
342348
final double det2_01_02 =
343-
_m4storage[0] * _m4storage[6] - _m4storage[2] * _m4storage[4];
349+
m[0] * m[6] - m[2] * m[4];
344350
final double det2_01_03 =
345-
_m4storage[0] * _m4storage[7] - _m4storage[3] * _m4storage[4];
351+
m[0] * m[7] - m[3] * m[4];
346352
final double det2_01_12 =
347-
_m4storage[1] * _m4storage[6] - _m4storage[2] * _m4storage[5];
353+
m[1] * m[6] - m[2] * m[5];
348354
final double det2_01_13 =
349-
_m4storage[1] * _m4storage[7] - _m4storage[3] * _m4storage[5];
355+
m[1] * m[7] - m[3] * m[5];
350356
final double det2_01_23 =
351-
_m4storage[2] * _m4storage[7] - _m4storage[3] * _m4storage[6];
352-
final double det3_201_012 = _m4storage[8] * det2_01_12 -
353-
_m4storage[9] * det2_01_02 +
354-
_m4storage[10] * det2_01_01;
355-
final double det3_201_013 = _m4storage[8] * det2_01_13 -
356-
_m4storage[9] * det2_01_03 +
357-
_m4storage[11] * det2_01_01;
358-
final double det3_201_023 = _m4storage[8] * det2_01_23 -
359-
_m4storage[10] * det2_01_03 +
360-
_m4storage[11] * det2_01_02;
361-
final double det3_201_123 = _m4storage[9] * det2_01_23 -
362-
_m4storage[10] * det2_01_13 +
363-
_m4storage[11] * det2_01_12;
364-
return -det3_201_123 * _m4storage[12] +
365-
det3_201_023 * _m4storage[13] -
366-
det3_201_013 * _m4storage[14] +
367-
det3_201_012 * _m4storage[15];
357+
m[2] * m[7] - m[3] * m[6];
358+
final double det3_201_012 = m[8] * det2_01_12 -
359+
m[9] * det2_01_02 +
360+
m[10] * det2_01_01;
361+
final double det3_201_013 = m[8] * det2_01_13 -
362+
m[9] * det2_01_03 +
363+
m[11] * det2_01_01;
364+
final double det3_201_023 = m[8] * det2_01_23 -
365+
m[10] * det2_01_03 +
366+
m[11] * det2_01_02;
367+
final double det3_201_123 = m[9] * det2_01_23 -
368+
m[10] * det2_01_13 +
369+
m[11] * det2_01_12;
370+
return -det3_201_123 * m[12] +
371+
det3_201_023 * m[13] -
372+
det3_201_013 * m[14] +
373+
det3_201_012 * m[15];
368374
}
369375

370376
/// Returns a new vector or matrix by multiplying [this] with [arg].
@@ -387,6 +393,7 @@ class Matrix4 {
387393
/// defined by [this].
388394
Vector3 perspectiveTransform(Vector3 arg) {
389395
final Float32List argStorage = arg._v3storage;
396+
390397
final double x = (_m4storage[0] * argStorage[0]) +
391398
(_m4storage[4] * argStorage[1]) +
392399
(_m4storage[8] * argStorage[2]) +
@@ -733,6 +740,7 @@ class Matrix4 {
733740

734741
/// Multiply [this] by [arg].
735742
void multiply(Matrix4 arg) {
743+
final double m33 = _m4storage[15];
736744
final double m00 = _m4storage[0];
737745
final double m01 = _m4storage[4];
738746
final double m02 = _m4storage[8];
@@ -748,8 +756,8 @@ class Matrix4 {
748756
final double m30 = _m4storage[3];
749757
final double m31 = _m4storage[7];
750758
final double m32 = _m4storage[11];
751-
final double m33 = _m4storage[15];
752759
final Float32List argStorage = arg._m4storage;
760+
final double n33 = argStorage[15];
753761
final double n00 = argStorage[0];
754762
final double n01 = argStorage[4];
755763
final double n02 = argStorage[8];
@@ -765,7 +773,6 @@ class Matrix4 {
765773
final double n30 = argStorage[3];
766774
final double n31 = argStorage[7];
767775
final double n32 = argStorage[11];
768-
final double n33 = argStorage[15];
769776
_m4storage[0] = (m00 * n00) + (m01 * n10) + (m02 * n20) + (m03 * n30);
770777
_m4storage[4] = (m00 * n01) + (m01 * n11) + (m02 * n21) + (m03 * n31);
771778
_m4storage[8] = (m00 * n02) + (m01 * n12) + (m02 * n22) + (m03 * n32);
@@ -789,6 +796,7 @@ class Matrix4 {
789796

790797
/// Multiply a transposed [this] with [arg].
791798
void transposeMultiply(Matrix4 arg) {
799+
final double m33 = _m4storage[15];
792800
final double m00 = _m4storage[0];
793801
final double m01 = _m4storage[1];
794802
final double m02 = _m4storage[2];
@@ -804,7 +812,7 @@ class Matrix4 {
804812
final double m30 = _m4storage[12];
805813
final double m31 = _m4storage[13];
806814
final double m32 = _m4storage[14];
807-
final double m33 = _m4storage[15];
815+
808816
final Float32List argStorage = arg._m4storage;
809817
_m4storage[0] = (m00 * argStorage[0]) +
810818
(m01 * argStorage[1]) +

0 commit comments

Comments
 (0)