diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 64b10391dc25c91c002e9b8a3047ccf0d11f0dc4..40a32b746e32480ac507797ef2a7aae485cbca24 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -687,24 +687,50 @@ function WebGLRenderer( parameters ) { if ( objectInfluences !== undefined ) { + var length = objectInfluences.length; + var influences = influencesList[ geometry.id ]; if ( influences === undefined ) { - influencesList[ geometry.id ] = influences = new Array( objectInfluences.length ); + // initialise list + + influences = []; + + for ( var i = 0; i < length; i ++ ) { + + influences[ i ] = [ i, 0 ]; + + } + + influencesList[ geometry.id ] = influences; } - for ( var i = 0, l = objectInfluences.length; i < l; i ++ ) { + var morphTargets = material.morphTargets && geometry.morphAttributes.position; + var morphNormals = material.morphNormals && geometry.morphAttributes.normal; + + // Remove current morphAttributes + + for ( var i = 0; i < length; i ++ ) { var influence = influences[ i ]; - if ( influence === undefined ) { + if ( influence[ 1 ] !== 0 ) { - influences[ i ] = influence = new Array( 2 ); + if ( morphTargets ) geometry.removeAttribute( 'morphTarget' + i ); + if ( morphNormals ) geometry.removeAttribute( 'morphNormal' + i ); } + } + + // Collect influences + + for ( var i = 0; i < length; i ++ ) { + + var influence = influences[ i ]; + influence[ 0 ] = i; influence[ 1 ] = objectInfluences[ i ]; @@ -712,36 +738,28 @@ function WebGLRenderer( parameters ) { influences.sort( absNumericalSort ); - var morphTargets = material.morphTargets && geometry.morphAttributes.position; - var morphNormals = material.morphNormals && geometry.morphAttributes.normal; - - for ( var i = 0, l = Math.min( influences.length, 8 ); i < l; i ++ ) { + // Add morphAttributes - var morphTargetId = 'morphTarget' + i; - var morphNormalId = 'morphNormal' + i; + for ( var i = 0; i < 8; i ++ ) { var influence = influences[ i ]; - var index = influence[ 0 ]; - var value = influence[ 1 ]; + if ( influence ) { - if ( value !== 0 ) { + var index = influence[ 0 ]; + var value = influence[ 1 ]; - if ( morphTargets ) geometry.addAttribute( morphTargetId, morphTargets[ index ] ); - if ( morphNormals ) geometry.addAttribute( morphNormalId, morphNormals[ index ] ); + if ( value ) { - } else { + if ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] ); + if ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] ); - if ( morphTargets ) geometry.removeAttribute( morphTargetId ); - if ( morphNormals ) geometry.removeAttribute( morphNormalId ); + morphInfluences[ i ] = value; + continue; - } - - morphInfluences[ i ] = value; - - } + } - for ( var i = Math.min( influences.length, 8 ), il = morphInfluences.length; i < il; i ++ ) { + } morphInfluences[ i ] = 0;