@@ -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