Skip to content

Commit e803bbc

Browse files
Corey-Malermrdoob
authored andcommitted
Speedup Matrix inverse (mrdoob#8938)
* Speedup Matrix inverse * Matrix4 invert speedup
1 parent 141e514 commit e803bbc

2 files changed

Lines changed: 31 additions & 27 deletions

File tree

src/math/Matrix3.js

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -204,20 +204,22 @@ THREE.Matrix3.prototype = {
204204

205205
return this.identity();
206206
}
207+
208+
var detInv = 1 / det;
207209

208-
te[ 0 ] = t11;
209-
te[ 1 ] = n31 * n23 - n33 * n21;
210-
te[ 2 ] = n32 * n21 - n31 * n22;
210+
te[ 0 ] = t11 * detInv;
211+
te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;
212+
te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;
211213

212-
te[ 3 ] = t12;
213-
te[ 4 ] = n33 * n11 - n31 * n13;
214-
te[ 5 ] = n31 * n12 - n32 * n11;
214+
te[ 3 ] = t12 * detInv;
215+
te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;
216+
te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;
215217

216-
te[ 6 ] = t13;
217-
te[ 7 ] = n21 * n13 - n23 * n11;
218-
te[ 8 ] = n22 * n11 - n21 * n12;
218+
te[ 6 ] = t13 * detInv;
219+
te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;
220+
te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;
219221

220-
return this.multiplyScalar( 1 / det );
222+
return this;
221223

222224
},
223225

src/math/Matrix4.js

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -633,28 +633,30 @@ THREE.Matrix4.prototype = {
633633
return this.identity();
634634

635635
}
636+
637+
var detInv = 1 / det;
636638

637-
te[ 0 ] = t11;
638-
te[ 1 ] = n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44;
639-
te[ 2 ] = n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44;
640-
te[ 3 ] = n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43;
639+
te[ 0 ] = t11 * detInv;
640+
te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;
641+
te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;
642+
te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;
641643

642-
te[ 4 ] = t12;
643-
te[ 5 ] = n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44;
644-
te[ 6 ] = n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44;
645-
te[ 7 ] = n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43;
644+
te[ 4 ] = t12 * detInv;
645+
te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;
646+
te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;
647+
te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;
646648

647-
te[ 8 ] = t13;
648-
te[ 9 ] = n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44;
649-
te[ 10 ] = n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44;
650-
te[ 11 ] = n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43;
649+
te[ 8 ] = t13 * detInv;
650+
te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;
651+
te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;
652+
te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;
651653

652-
te[ 12 ] = t14;
653-
te[ 13 ] = n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34;
654-
te[ 14 ] = n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34;
655-
te[ 15 ] = n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33;
654+
te[ 12 ] = t14 * detInv;
655+
te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;
656+
te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;
657+
te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;
656658

657-
return this.multiplyScalar( 1 / det );
659+
return this;
658660

659661
},
660662

0 commit comments

Comments
 (0)