Browse Source

Some Matrix4 optimisations...

Mr.doob 14 years ago
parent
commit
5ee46bd973
2 changed files with 58 additions and 52 deletions
  1. 42 36
      src/core/Matrix4.js
  2. 16 16
      src/renderers/Projector.js

+ 42 - 36
src/core/Matrix4.js

@@ -50,30 +50,26 @@ THREE.Matrix4.prototype = {
 
 
 	},
 	},
 
 
-	transform: function ( v ) {
+	transformVector3: function ( v ) {
 
 
-		var vx = v.x, vy = v.y, vz = v.z, vw = v.w || 1, vwi;
+		var vx = v.x, vy = v.y, vz = v.z;
 
 
-		v.x = this.n11 * vx + this.n12 * vy + this.n13 * vz + this.n14 * vw;
-		v.y = this.n21 * vx + this.n22 * vy + this.n23 * vz + this.n24 * vw;
-		v.z = this.n31 * vx + this.n32 * vy + this.n33 * vz + this.n34 * vw;
+		v.x = this.n11 * vx + this.n12 * vy + this.n13 * vz + this.n14;
+		v.y = this.n21 * vx + this.n22 * vy + this.n23 * vz + this.n24;
+		v.z = this.n31 * vx + this.n32 * vy + this.n33 * vz + this.n34;
 
 
-		vw = this.n41 * vx + this.n42 * vy + this.n43 * vz + this.n44 * vw;
+		v.multiplyScalar( 1 / ( this.n41 * vx + this.n42 * vy + this.n43 * vz + this.n44 ) );
 
 
-		if ( v.w ) {
-
-			v.w = vw;
+	},
 
 
-		} else {
+	transformVector4: function ( v ) {
 
 
-			vwi = 1 / vw;
-			v.x *= vwi;
-			v.y *= vwi;
-			v.z *= vwi;
+		var vx = v.x, vy = v.y, vz = v.z, vw = v.w;
 
 
-		}
-
-		return v;
+		v.x = this.n11 * vx + this.n12 * vy + this.n13 * vz + this.n14 * vw;
+		v.y = this.n21 * vx + this.n22 * vy + this.n23 * vz + this.n24 * vw;
+		v.z = this.n31 * vx + this.n32 * vy + this.n33 * vz + this.n34 * vw;
+		v.w = this.n41 * vx + this.n42 * vy + this.n43 * vz + this.n44 * vw;
 
 
 	},
 	},
 
 
@@ -93,25 +89,35 @@ THREE.Matrix4.prototype = {
 
 
 	multiply: function ( a, b ) {
 	multiply: function ( a, b ) {
 
 
-		this.n11 = a.n11 * b.n11 + a.n12 * b.n21 + a.n13 * b.n31 + a.n14 * b.n41;
-		this.n12 = a.n11 * b.n12 + a.n12 * b.n22 + a.n13 * b.n32 + a.n14 * b.n42;
-		this.n13 = a.n11 * b.n13 + a.n12 * b.n23 + a.n13 * b.n33 + a.n14 * b.n43;
-		this.n14 = a.n11 * b.n14 + a.n12 * b.n24 + a.n13 * b.n34 + a.n14 * b.n44;
-
-		this.n21 = a.n21 * b.n11 + a.n22 * b.n21 + a.n23 * b.n31 + a.n24 * b.n41;
-		this.n22 = a.n21 * b.n12 + a.n22 * b.n22 + a.n23 * b.n32 + a.n24 * b.n42;
-		this.n23 = a.n21 * b.n13 + a.n22 * b.n23 + a.n23 * b.n33 + a.n24 * b.n43;
-		this.n24 = a.n21 * b.n14 + a.n22 * b.n24 + a.n23 * b.n34 + a.n24 * b.n44;
-
-		this.n31 = a.n31 * b.n11 + a.n32 * b.n21 + a.n33 * b.n31 + a.n34 * b.n41;
-		this.n32 = a.n31 * b.n12 + a.n32 * b.n22 + a.n33 * b.n32 + a.n34 * b.n42;
-		this.n33 = a.n31 * b.n13 + a.n32 * b.n23 + a.n33 * b.n33 + a.n34 * b.n43;
-		this.n34 = a.n31 * b.n14 + a.n32 * b.n24 + a.n33 * b.n34 + a.n34 * b.n44;
-
-		this.n41 = a.n41 * b.n11 + a.n42 * b.n21 + a.n43 * b.n31 + a.n44 * b.n41;
-		this.n42 = a.n41 * b.n12 + a.n42 * b.n22 + a.n43 * b.n32 + a.n44 * b.n42;
-		this.n43 = a.n41 * b.n13 + a.n42 * b.n23 + a.n43 * b.n33 + a.n44 * b.n43;
-		this.n44 = a.n41 * b.n14 + a.n42 * b.n24 + a.n43 * b.n34 + a.n44 * b.n44;
+		var a11 = a.n11, a12 = a.n12, a13 = a.n13, a14 = a.n14,
+		a21 = a.n21, a22 = a.n22, a23 = a.n23, a24 = a.n24,
+		a31 = a.n31, a32 = a.n32, a33 = a.n33, a34 = a.n34,
+		a41 = a.n41, a42 = a.n42, a43 = a.n43, a44 = a.n44,
+
+		b11 = b.n11, b12 = b.n12, b13 = b.n13, b14 = b.n14,
+		b21 = b.n21, b22 = b.n22, b23 = b.n23, b24 = b.n24,
+		b31 = b.n31, b32 = b.n32, b33 = b.n33, b34 = b.n34,
+		b41 = b.n41, b42 = b.n42, b43 = b.n43, b44 = b.n44;
+
+		this.n11 = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;
+		this.n12 = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;
+		this.n13 = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;
+		this.n14 = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;
+
+		this.n21 = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;
+		this.n22 = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;
+		this.n23 = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;
+		this.n24 = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;
+
+		this.n31 = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;
+		this.n32 = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;
+		this.n33 = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;
+		this.n34 = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;
+
+		this.n41 = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;
+		this.n42 = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;
+		this.n43 = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;
+		this.n44 = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;
 
 
 	},
 	},
 
 

+ 16 - 16
src/renderers/Projector.js

@@ -57,11 +57,11 @@ THREE.Projector = function() {
 					vertex = vertices[ v ];
 					vertex = vertices[ v ];
 
 
 					vertex.positionWorld.copy( vertex.position );
 					vertex.positionWorld.copy( vertex.position );
-					objectMatrix.transform( vertex.positionWorld );
+					objectMatrix.transformVector3( vertex.positionWorld );
 
 
 					vertexPositionScreen = vertex.positionScreen;
 					vertexPositionScreen = vertex.positionScreen;
 					vertexPositionScreen.copy( vertex.positionWorld );
 					vertexPositionScreen.copy( vertex.positionWorld );
-					_projScreenMatrix.transform( vertexPositionScreen );
+					_projScreenMatrix.transformVector4( vertexPositionScreen );
 
 
 					// Perform the perspective divide. TODO: This should be be performend 
 					// Perform the perspective divide. TODO: This should be be performend 
 					// post clipping (imagine if the vertex lies at the same location as 
 					// post clipping (imagine if the vertex lies at the same location as 
@@ -101,13 +101,13 @@ THREE.Projector = function() {
 								_face3.v3.positionScreen.copy( v3.positionScreen );
 								_face3.v3.positionScreen.copy( v3.positionScreen );
 
 
 								_face3.normalWorld.copy( face.normal );
 								_face3.normalWorld.copy( face.normal );
-								objectRotationMatrix.transform( _face3.normalWorld );
+								objectRotationMatrix.transformVector3( _face3.normalWorld );
 
 
 								_face3.centroidWorld.copy( face.centroid );
 								_face3.centroidWorld.copy( face.centroid );
-								objectMatrix.transform( _face3.centroidWorld );
+								objectMatrix.transformVector3( _face3.centroidWorld );
 
 
 								_face3.centroidScreen.copy( _face3.centroidWorld );
 								_face3.centroidScreen.copy( _face3.centroidWorld );
-								_projScreenMatrix.transform( _face3.centroidScreen );
+								_projScreenMatrix.transformVector3( _face3.centroidScreen );
 
 
 								faceVertexNormals = face.vertexNormals;
 								faceVertexNormals = face.vertexNormals;
 								_face3VertexNormals = _face3.vertexNormalsWorld;
 								_face3VertexNormals = _face3.vertexNormalsWorld;
@@ -116,7 +116,7 @@ THREE.Projector = function() {
 
 
 									normal = _face3VertexNormals[ n ] = _face3VertexNormals[ n ] || new THREE.Vector3();
 									normal = _face3VertexNormals[ n ] = _face3VertexNormals[ n ] || new THREE.Vector3();
 									normal.copy( faceVertexNormals[ n ] );
 									normal.copy( faceVertexNormals[ n ] );
-									objectRotationMatrix.transform( normal );
+									objectRotationMatrix.transformVector3( normal );
 
 
 								}
 								}
 
 
@@ -165,13 +165,13 @@ THREE.Projector = function() {
 								_face3.v3.positionScreen.copy( v4.positionScreen );
 								_face3.v3.positionScreen.copy( v4.positionScreen );
 
 
 								_face3.normalWorld.copy( face.normal );
 								_face3.normalWorld.copy( face.normal );
-								objectRotationMatrix.transform( _face3.normalWorld );
+								objectRotationMatrix.transformVector3( _face3.normalWorld );
 
 
 								_face3.centroidWorld.copy( face.centroid );
 								_face3.centroidWorld.copy( face.centroid );
-								objectMatrix.transform( _face3.centroidWorld );
+								objectMatrix.transformVector3( _face3.centroidWorld );
 
 
 								_face3.centroidScreen.copy( _face3.centroidWorld );
 								_face3.centroidScreen.copy( _face3.centroidWorld );
-								_projScreenMatrix.transform( _face3.centroidScreen );
+								_projScreenMatrix.transformVector3( _face3.centroidScreen );
 
 
 								// TODO: Handle vertex normals
 								// TODO: Handle vertex normals
 
 
@@ -245,14 +245,14 @@ THREE.Projector = function() {
 
 
 				vertex = vertices[ 0 ];
 				vertex = vertices[ 0 ];
 				vertex.positionScreen.copy( vertex.position );
 				vertex.positionScreen.copy( vertex.position );
-				_projScreenObjectMatrix.transform( vertex.positionScreen );
+				_projScreenObjectMatrix.transformVector4( vertex.positionScreen );
 
 
 				for ( v = 1, vl = vertices.length; v < vl; v++ ) {
 				for ( v = 1, vl = vertices.length; v < vl; v++ ) {
 
 
 					v1 = vertices[ v ];
 					v1 = vertices[ v ];
 
 
 					v1.positionScreen.copy( v1.position );
 					v1.positionScreen.copy( v1.position );
-					_projScreenObjectMatrix.transform( v1.positionScreen );
+					_projScreenObjectMatrix.transformVector4( v1.positionScreen );
 
 
 					v2 = vertices[ v - 1 ];
 					v2 = vertices[ v - 1 ];
 
 
@@ -283,15 +283,15 @@ THREE.Projector = function() {
 
 
 				_vector4.set( object.position.x, object.position.y, object.position.z, 1 );
 				_vector4.set( object.position.x, object.position.y, object.position.z, 1 );
 
 
-				_projScreenMatrix.transform( _vector4 );
+				_projScreenMatrix.transformVector4( _vector4 );
 
 
-				_vector4.z /= _vector4.w;
+				_vector4.multiplyScalar( 1 / _vector4.w );
 
 
 				if ( _vector4.z > 0 && _vector4.z < 1 ) {
 				if ( _vector4.z > 0 && _vector4.z < 1 ) {
 
 
 					_particle = _particlePool[ _particleCount ] = _particlePool[ _particleCount ] || new THREE.RenderableParticle();
 					_particle = _particlePool[ _particleCount ] = _particlePool[ _particleCount ] || new THREE.RenderableParticle();
-					_particle.x = _vector4.x / _vector4.w;
-					_particle.y = _vector4.y / _vector4.w;
+					_particle.x = _vector4.x;
+					_particle.y = _vector4.y;
 					_particle.z = _vector4.z;
 					_particle.z = _vector4.z;
 
 
 					_particle.rotation = object.rotation.z;
 					_particle.rotation = object.rotation.z;
@@ -322,7 +322,7 @@ THREE.Projector = function() {
 		var matrix = new THREE.Matrix4();
 		var matrix = new THREE.Matrix4();
 
 
 		matrix.multiply( THREE.Matrix4.makeInvert( camera.matrix ), THREE.Matrix4.makeInvert( camera.projectionMatrix ) );
 		matrix.multiply( THREE.Matrix4.makeInvert( camera.matrix ), THREE.Matrix4.makeInvert( camera.projectionMatrix ) );
-		matrix.transform( vector );
+		matrix.transformVector3( vector );
 
 
 		return vector;
 		return vector;