Browse Source

Merge remote-tracking branch 'alteredq/dev' into dev

Mr.doob 13 years ago
parent
commit
1fb1c46343
3 changed files with 43 additions and 47 deletions
  1. 37 0
      src/core/Matrix3.js
  2. 2 40
      src/core/Matrix4.js
  3. 4 7
      src/renderers/WebGLRenderer.js

+ 37 - 0
src/core/Matrix3.js

@@ -12,6 +12,43 @@ THREE.Matrix3.prototype = {
 
 
 	constructor: THREE.Matrix3,
 	constructor: THREE.Matrix3,
 
 
+	getInverse: function ( m ) {
+
+		// input: THREE.Matrix4
+		// ( based on http://code.google.com/p/webgl-mjs/ )
+
+		var a11 =   m.n33 * m.n22 - m.n32 * m.n23,
+			a21 = - m.n33 * m.n21 + m.n31 * m.n23,
+			a31 =   m.n32 * m.n21 - m.n31 * m.n22,
+			a12 = - m.n33 * m.n12 + m.n32 * m.n13,
+			a22 =   m.n33 * m.n11 - m.n31 * m.n13,
+			a32 = - m.n32 * m.n11 + m.n31 * m.n12,
+			a13 =   m.n23 * m.n12 - m.n22 * m.n13,
+			a23 = - m.n23 * m.n11 + m.n21 * m.n13,
+			a33 =   m.n22 * m.n11 - m.n21 * m.n12;
+
+		var det = m.n11 * a11 + m.n21 * a12 + m.n31 * a13;
+
+		// no inverse
+
+		if ( det === 0 ) {
+
+			console.warn( "Matrix3.getInverse(): determinant == 0" );
+
+		}
+
+		var idet = 1.0 / det;
+
+		var m = this.m;
+
+		m[ 0 ] = idet * a11; m[ 1 ] = idet * a21; m[ 2 ] = idet * a31;
+		m[ 3 ] = idet * a12; m[ 4 ] = idet * a22; m[ 5 ] = idet * a32;
+		m[ 6 ] = idet * a13; m[ 7 ] = idet * a23; m[ 8 ] = idet * a33;
+
+		return this;
+
+	},
+
 	/*
 	/*
 	transpose: function () {
 	transpose: function () {
 
 

+ 2 - 40
src/core/Matrix4.js

@@ -20,8 +20,6 @@ THREE.Matrix4 = function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33
 
 
 	);
 	);
 
 
-	this.m33 = new THREE.Matrix3();
-
 };
 };
 
 
 THREE.Matrix4.prototype = {
 THREE.Matrix4.prototype = {
@@ -232,6 +230,7 @@ THREE.Matrix4.prototype = {
 
 
 		//TODO: make this more efficient
 		//TODO: make this more efficient
 		//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )
 		//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )
+
 		return (
 		return (
 			n14 * n23 * n32 * n41-
 			n14 * n23 * n32 * n41-
 			n13 * n24 * n32 * n41-
 			n13 * n24 * n32 * n41-
@@ -962,6 +961,7 @@ THREE.Matrix4.prototype = {
 
 
 	},
 	},
 
 
+
 	clone: function () {
 	clone: function () {
 
 
 		return new THREE.Matrix4(
 		return new THREE.Matrix4(
@@ -977,44 +977,6 @@ THREE.Matrix4.prototype = {
 
 
 };
 };
 
 
-THREE.Matrix4.makeInvert3x3 = function ( m1 ) {
-
-	// input:  THREE.Matrix4, output: THREE.Matrix3
-	// ( based on http://code.google.com/p/webgl-mjs/ )
-
-	var m33 = m1.m33, m33m = m33.m,
-	a11 =   m1.n33 * m1.n22 - m1.n32 * m1.n23,
-	a21 = - m1.n33 * m1.n21 + m1.n31 * m1.n23,
-	a31 =   m1.n32 * m1.n21 - m1.n31 * m1.n22,
-	a12 = - m1.n33 * m1.n12 + m1.n32 * m1.n13,
-	a22 =   m1.n33 * m1.n11 - m1.n31 * m1.n13,
-	a32 = - m1.n32 * m1.n11 + m1.n31 * m1.n12,
-	a13 =   m1.n23 * m1.n12 - m1.n22 * m1.n13,
-	a23 = - m1.n23 * m1.n11 + m1.n21 * m1.n13,
-	a33 =   m1.n22 * m1.n11 - m1.n21 * m1.n12,
-
-	det = m1.n11 * a11 + m1.n21 * a12 + m1.n31 * a13,
-
-	idet;
-
-	// no inverse
-
-	if ( det === 0 ) {
-
-		return null;
-
-	}
-
-	idet = 1.0 / det;
-
-	m33m[ 0 ] = idet * a11; m33m[ 1 ] = idet * a21; m33m[ 2 ] = idet * a31;
-	m33m[ 3 ] = idet * a12; m33m[ 4 ] = idet * a22; m33m[ 5 ] = idet * a32;
-	m33m[ 6 ] = idet * a13; m33m[ 7 ] = idet * a23; m33m[ 8 ] = idet * a33;
-
-	return m33;
-
-}
-
 THREE.Matrix4.__v1 = new THREE.Vector3();
 THREE.Matrix4.__v1 = new THREE.Vector3();
 THREE.Matrix4.__v2 = new THREE.Vector3();
 THREE.Matrix4.__v2 = new THREE.Vector3();
 THREE.Matrix4.__v3 = new THREE.Vector3();
 THREE.Matrix4.__v3 = new THREE.Vector3();

+ 4 - 7
src/renderers/WebGLRenderer.js

@@ -301,6 +301,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 		object.__webglInit = false;
 		object.__webglInit = false;
 
 
 		delete object._modelViewMatrix;
 		delete object._modelViewMatrix;
+		delete object._normalMatrix;
 
 
 		delete object._normalMatrixArray;
 		delete object._normalMatrixArray;
 		delete object._modelViewMatrixArray;
 		delete object._modelViewMatrixArray;
@@ -3824,6 +3825,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 			object.__webglInit = true;
 			object.__webglInit = true;
 
 
 			object._modelViewMatrix = new THREE.Matrix4();
 			object._modelViewMatrix = new THREE.Matrix4();
+			object._normalMatrix = new THREE.Matrix3();
 
 
 			object._normalMatrixArray = new Float32Array( 9 );
 			object._normalMatrixArray = new Float32Array( 9 );
 			object._modelViewMatrixArray = new Float32Array( 16 );
 			object._modelViewMatrixArray = new Float32Array( 16 );
@@ -4937,13 +4939,8 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 		object._modelViewMatrix.multiplyToArray( camera.matrixWorldInverse, object.matrixWorld, object._modelViewMatrixArray );
 		object._modelViewMatrix.multiplyToArray( camera.matrixWorldInverse, object.matrixWorld, object._modelViewMatrixArray );
 
 
-		var inverseMatrix = THREE.Matrix4.makeInvert3x3( object._modelViewMatrix );
-
-		if ( inverseMatrix ) {
-
-			inverseMatrix.transposeIntoArray( object._normalMatrixArray );
-
-		}
+		object._normalMatrix.getInverse( object._modelViewMatrix );
+		object._normalMatrix.transposeIntoArray( object._normalMatrixArray );
 
 
 	};
 	};