@@ -67,7 +67,12 @@ class Matrix4 {
67
67
Matrix4 .zero () : _m4storage = Float32List (16 );
68
68
69
69
/// 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
+ }
71
76
72
77
/// Copies values from [other] .
73
78
factory Matrix4 .copy (Matrix4 other) => Matrix4 .zero ()..setFrom (other);
@@ -98,14 +103,12 @@ class Matrix4 {
98
103
..setRotationZ (radians);
99
104
100
105
/// Translation matrix.
101
- factory Matrix4 .translation (Vector3 translation) => Matrix4 .zero ()
102
- ..setIdentity ()
106
+ factory Matrix4 .translation (Vector3 translation) => Matrix4 .identity ()
103
107
..setTranslation (translation);
104
108
105
109
/// Translation matrix.
106
110
factory Matrix4 .translationValues (double x, double y, double z) =>
107
- Matrix4 .zero ()
108
- ..setIdentity ()
111
+ Matrix4 .identity ()
109
112
..setTranslationRaw (x, y, z);
110
113
111
114
/// Scale matrix.
@@ -198,6 +201,9 @@ class Matrix4 {
198
201
/// Copy into [arg] .
199
202
Matrix4 copyInto (Matrix4 arg) {
200
203
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 ];
201
207
argStorage[0 ] = _m4storage[0 ];
202
208
argStorage[1 ] = _m4storage[1 ];
203
209
argStorage[2 ] = _m4storage[2 ];
@@ -213,7 +219,6 @@ class Matrix4 {
213
219
argStorage[12 ] = _m4storage[12 ];
214
220
argStorage[13 ] = _m4storage[13 ];
215
221
argStorage[14 ] = _m4storage[14 ];
216
- argStorage[15 ] = _m4storage[15 ];
217
222
return arg;
218
223
}
219
224
@@ -248,6 +253,7 @@ class Matrix4 {
248
253
final double sy = y ?? x;
249
254
final double sz = z ?? x;
250
255
const double sw = 1.0 ;
256
+ _m4storage[15 ] *= sw;
251
257
_m4storage[0 ] *= sx;
252
258
_m4storage[1 ] *= sx;
253
259
_m4storage[2 ] *= sx;
@@ -263,7 +269,6 @@ class Matrix4 {
263
269
_m4storage[12 ] *= sw;
264
270
_m4storage[13 ] *= sw;
265
271
_m4storage[14 ] *= sw;
266
- _m4storage[15 ] *= sw;
267
272
}
268
273
269
274
/// Create a copy of [this] scaled by a [Vector3] , [Vector4] or [x] ,[y] , and
@@ -272,6 +277,7 @@ class Matrix4 {
272
277
273
278
/// Zeros [this] .
274
279
void setZero () {
280
+ _m4storage[15 ] = 0.0 ;
275
281
_m4storage[0 ] = 0.0 ;
276
282
_m4storage[1 ] = 0.0 ;
277
283
_m4storage[2 ] = 0.0 ;
@@ -287,11 +293,11 @@ class Matrix4 {
287
293
_m4storage[12 ] = 0.0 ;
288
294
_m4storage[13 ] = 0.0 ;
289
295
_m4storage[14 ] = 0.0 ;
290
- _m4storage[15 ] = 0.0 ;
291
296
}
292
297
293
298
/// Makes [this] into the identity matrix.
294
299
void setIdentity () {
300
+ _m4storage[15 ] = 1.0 ;
295
301
_m4storage[0 ] = 1.0 ;
296
302
_m4storage[1 ] = 0.0 ;
297
303
_m4storage[2 ] = 0.0 ;
@@ -307,7 +313,6 @@ class Matrix4 {
307
313
_m4storage[12 ] = 0.0 ;
308
314
_m4storage[13 ] = 0.0 ;
309
315
_m4storage[14 ] = 0.0 ;
310
- _m4storage[15 ] = 1.0 ;
311
316
}
312
317
313
318
/// Returns the tranpose of this.
@@ -337,34 +342,35 @@ class Matrix4 {
337
342
338
343
/// Returns the determinant of this matrix.
339
344
double determinant () {
345
+ final Float32List m = _m4storage;
340
346
final double det2_01_01 =
341
- _m4storage [0 ] * _m4storage [5 ] - _m4storage [1 ] * _m4storage [4 ];
347
+ m [0 ] * m [5 ] - m [1 ] * m [4 ];
342
348
final double det2_01_02 =
343
- _m4storage [0 ] * _m4storage [6 ] - _m4storage [2 ] * _m4storage [4 ];
349
+ m [0 ] * m [6 ] - m [2 ] * m [4 ];
344
350
final double det2_01_03 =
345
- _m4storage [0 ] * _m4storage [7 ] - _m4storage [3 ] * _m4storage [4 ];
351
+ m [0 ] * m [7 ] - m [3 ] * m [4 ];
346
352
final double det2_01_12 =
347
- _m4storage [1 ] * _m4storage [6 ] - _m4storage [2 ] * _m4storage [5 ];
353
+ m [1 ] * m [6 ] - m [2 ] * m [5 ];
348
354
final double det2_01_13 =
349
- _m4storage [1 ] * _m4storage [7 ] - _m4storage [3 ] * _m4storage [5 ];
355
+ m [1 ] * m [7 ] - m [3 ] * m [5 ];
350
356
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 ];
368
374
}
369
375
370
376
/// Returns a new vector or matrix by multiplying [this] with [arg] .
@@ -387,6 +393,7 @@ class Matrix4 {
387
393
/// defined by [this] .
388
394
Vector3 perspectiveTransform (Vector3 arg) {
389
395
final Float32List argStorage = arg._v3storage;
396
+
390
397
final double x = (_m4storage[0 ] * argStorage[0 ]) +
391
398
(_m4storage[4 ] * argStorage[1 ]) +
392
399
(_m4storage[8 ] * argStorage[2 ]) +
@@ -733,6 +740,7 @@ class Matrix4 {
733
740
734
741
/// Multiply [this] by [arg] .
735
742
void multiply (Matrix4 arg) {
743
+ final double m33 = _m4storage[15 ];
736
744
final double m00 = _m4storage[0 ];
737
745
final double m01 = _m4storage[4 ];
738
746
final double m02 = _m4storage[8 ];
@@ -748,8 +756,8 @@ class Matrix4 {
748
756
final double m30 = _m4storage[3 ];
749
757
final double m31 = _m4storage[7 ];
750
758
final double m32 = _m4storage[11 ];
751
- final double m33 = _m4storage[15 ];
752
759
final Float32List argStorage = arg._m4storage;
760
+ final double n33 = argStorage[15 ];
753
761
final double n00 = argStorage[0 ];
754
762
final double n01 = argStorage[4 ];
755
763
final double n02 = argStorage[8 ];
@@ -765,7 +773,6 @@ class Matrix4 {
765
773
final double n30 = argStorage[3 ];
766
774
final double n31 = argStorage[7 ];
767
775
final double n32 = argStorage[11 ];
768
- final double n33 = argStorage[15 ];
769
776
_m4storage[0 ] = (m00 * n00) + (m01 * n10) + (m02 * n20) + (m03 * n30);
770
777
_m4storage[4 ] = (m00 * n01) + (m01 * n11) + (m02 * n21) + (m03 * n31);
771
778
_m4storage[8 ] = (m00 * n02) + (m01 * n12) + (m02 * n22) + (m03 * n32);
@@ -789,6 +796,7 @@ class Matrix4 {
789
796
790
797
/// Multiply a transposed [this] with [arg] .
791
798
void transposeMultiply (Matrix4 arg) {
799
+ final double m33 = _m4storage[15 ];
792
800
final double m00 = _m4storage[0 ];
793
801
final double m01 = _m4storage[1 ];
794
802
final double m02 = _m4storage[2 ];
@@ -804,7 +812,7 @@ class Matrix4 {
804
812
final double m30 = _m4storage[12 ];
805
813
final double m31 = _m4storage[13 ];
806
814
final double m32 = _m4storage[14 ];
807
- final double m33 = _m4storage[ 15 ];
815
+
808
816
final Float32List argStorage = arg._m4storage;
809
817
_m4storage[0 ] = (m00 * argStorage[0 ]) +
810
818
(m01 * argStorage[1 ]) +
0 commit comments