Browse Source

WebGLRenderer: Morphs influences should update per render per object.

Mr.doob 10 years ago
parent
commit
9c0636d10b
2 changed files with 54 additions and 64 deletions
  1. 49 0
      src/renderers/WebGLRenderer.js
  2. 5 64
      src/renderers/webgl/WebGLObjects.js

+ 49 - 0
src/renderers/WebGLRenderer.js

@@ -40,6 +40,8 @@ THREE.WebGLRenderer = function ( parameters ) {
 	var opaqueImmediateObjects = [];
 	var transparentImmediateObjects = [];
 
+	var morphInfluences = new Float32Array( 8 );
+
 	var sprites = [];
 	var lensFlares = [];
 
@@ -1021,6 +1023,47 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 		}
 
+		// morph targets
+
+		if ( object.morphTargetInfluences !== undefined ) {
+
+			var activeInfluences = [];
+			var morphTargetInfluences = object.morphTargetInfluences;
+
+			for ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {
+
+				var influence = morphTargetInfluences[ i ];
+				activeInfluences.push( [ influence, i ] );
+
+			}
+
+			activeInfluences.sort( numericalSort );
+
+			if ( activeInfluences.length > 8 ) {
+
+				activeInfluences.length = 8;
+
+			}
+
+			for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {
+
+				morphInfluences[ i ] = activeInfluences[ i ][ 0 ];
+
+				var attribute = geometry.morphAttributes[ activeInfluences[ i ][ 1 ] ];
+				geometry.addAttribute( 'morphTarget' + i, attribute );
+
+			}
+
+			var uniforms = program.getUniforms();
+
+			if ( uniforms.morphTargetInfluences !== null ) {
+
+				_gl.uniform1fv( uniforms.morphTargetInfluences, morphInfluences );
+
+			}
+
+		}
+
 		if ( object instanceof THREE.Mesh ) {
 
 			renderMesh( material, geometry, object, program, updateBuffers );
@@ -1470,6 +1513,12 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	// Sorting
 
+	function numericalSort ( a, b ) {
+
+		return b[ 0 ] - a[ 0 ];
+
+	}
+
 	function painterSortStable ( a, b ) {
 
 		if ( a.object.renderOrder !== b.object.renderOrder ) {

+ 5 - 64
src/renderers/webgl/WebGLObjects.js

@@ -6,8 +6,6 @@ THREE.WebGLObjects = function ( gl, properties, info ) {
 
 	var objects = {};
 
-	var morphInfluences = new Float32Array( 8 );
-
 	var geometries = new THREE.WebGLGeometries( gl, properties, info );
 
 	//
@@ -79,12 +77,6 @@ THREE.WebGLObjects = function ( gl, properties, info ) {
 
 	};
 
-	function numericalSort ( a, b ) {
-
-		return b[ 0 ] - a[ 0 ];
-
-	}
-
 	function updateObject( object ) {
 
 		var geometry = geometries.get( object );
@@ -95,57 +87,6 @@ THREE.WebGLObjects = function ( gl, properties, info ) {
 
 		}
 
-		// morph targets
-
-		if ( object.morphTargetInfluences !== undefined ) {
-
-			var activeInfluences = [];
-			var morphTargetInfluences = object.morphTargetInfluences;
-
-			for ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {
-
-				var influence = morphTargetInfluences[ i ];
-				activeInfluences.push( [ influence, i ] );
-
-			}
-
-			activeInfluences.sort( numericalSort );
-
-			if ( activeInfluences.length > 8 ) {
-
-				activeInfluences.length = 8;
-
-			}
-
-			for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {
-
-				morphInfluences[ i ] = activeInfluences[ i ][ 0 ];
-
-				var attribute = geometry.morphAttributes[ activeInfluences[ i ][ 1 ] ];
-				geometry.addAttribute( 'morphTarget' + i, attribute );
-
-			}
-
-			var material = object.material;
-
-			if ( material.program !== undefined ) {
-
-				var uniforms = material.program.getUniforms();
-
-				if ( uniforms.morphTargetInfluences !== null ) {
-
-					gl.uniform1fv( uniforms.morphTargetInfluences, morphInfluences );
-
-				}
-
-			} else {
-
-				console.warn( 'TOFIX: material.program is undefined' );
-
-			}
-
-		}
-
 		//
 
 		var attributes = geometry.attributes;
@@ -158,7 +99,7 @@ THREE.WebGLObjects = function ( gl, properties, info ) {
 
 	}
 
-	function updateAttribute ( attribute, name ) {
+	function updateAttribute( attribute, name ) {
 
 		var bufferType = ( name === 'index' ) ? gl.ELEMENT_ARRAY_BUFFER : gl.ARRAY_BUFFER;
 
@@ -178,7 +119,7 @@ THREE.WebGLObjects = function ( gl, properties, info ) {
 
 	}
 
-	function createBuffer ( attributeProperties, data, bufferType ) {
+	function createBuffer( attributeProperties, data, bufferType ) {
 
 		attributeProperties.__webglBuffer = gl.createBuffer();
 		gl.bindBuffer( bufferType, attributeProperties.__webglBuffer );
@@ -199,7 +140,7 @@ THREE.WebGLObjects = function ( gl, properties, info ) {
 
 	}
 
-	function updateBuffer ( attributeProperties, data, bufferType ) {
+	function updateBuffer( attributeProperties, data, bufferType ) {
 
 		gl.bindBuffer( bufferType, attributeProperties.__webglBuffer );
 
@@ -239,9 +180,9 @@ THREE.WebGLObjects = function ( gl, properties, info ) {
 
 	this.update = function ( renderList ) {
 
-		for ( var i = 0, ul = renderList.length; i < ul; i++ ) {
+		for ( var i = 0, ul = renderList.length; i < ul; i ++ ) {
 
-			var object = renderList[i].object;
+			var object = renderList[ i ].object;
 
 			if ( object.material.visible !== false ) {