diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index e2514e8e0864adb4643e10344fa87050027379e0..97ff77da1e162ee48b3276c453f7a92e61b5465a 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -12,6 +12,7 @@ import { WebGLShadowMap } from './webgl/WebGLShadowMap'; import { WebGLAttributes } from './webgl/WebGLAttributes'; import { WebGLBackground } from './webgl/WebGLBackground'; import { WebGLRenderLists } from './webgl/WebGLRenderLists'; +import { WebGLMorphtargets } from './webgl/WebGLMorphtargets'; import { WebGLIndexedBufferRenderer } from './webgl/WebGLIndexedBufferRenderer'; import { WebGLBufferRenderer } from './webgl/WebGLBufferRenderer'; import { WebGLGeometries } from './webgl/WebGLGeometries'; @@ -60,8 +61,6 @@ function WebGLRenderer( parameters ) { var currentRenderList = null; - var morphInfluences = new Float32Array( 8 ); - var spritesArray = []; var flaresArray = []; @@ -245,7 +244,7 @@ function WebGLRenderer( parameters ) { var properties, textures, attributes, geometries, objects, lights; var programCache, renderLists; - var background, bufferRenderer, indexedBufferRenderer; + var background, morphtargets, bufferRenderer, indexedBufferRenderer; var flareRenderer, spriteRenderer; function initGLContext() { @@ -276,6 +275,7 @@ function WebGLRenderer( parameters ) { attributes = new WebGLAttributes( _gl ); geometries = new WebGLGeometries( _gl, attributes, _infoMemory ); objects = new WebGLObjects( geometries, _infoRender ); + morphtargets = new WebGLMorphtargets( _gl ); programCache = new WebGLPrograms( _this, extensions, capabilities ); lights = new WebGLLights(); renderLists = new WebGLRenderLists(); @@ -657,14 +657,6 @@ function WebGLRenderer( parameters ) { }; - var influencesList = {}; - - function absNumericalSort( a, b ) { - - return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] ); - - } - this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) { state.setMaterial( material ); @@ -681,91 +673,9 @@ function WebGLRenderer( parameters ) { } - // morph targets - - var objectInfluences = object.morphTargetInfluences; - - if ( objectInfluences !== undefined ) { - - var length = objectInfluences.length; - - var influences = influencesList[ geometry.id ]; - - if ( influences === undefined ) { - - // initialise list - - influences = []; - - for ( var i = 0; i < length; i ++ ) { - - influences[ i ] = [ i, 0 ]; - - } - - influencesList[ geometry.id ] = influences; - - } - - 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[ 1 ] !== 0 ) { - - 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 ]; - - } - - influences.sort( absNumericalSort ); - - // Add morphAttributes - - for ( var i = 0; i < 8; i ++ ) { - - var influence = influences[ i ]; - - if ( influence ) { - - var index = influence[ 0 ]; - var value = influence[ 1 ]; - - if ( value ) { - - if ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] ); - if ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] ); - - morphInfluences[ i ] = value; - continue; - - } - - } - - morphInfluences[ i ] = 0; - - } + if ( object.morphTargetInfluences ) { - program.getUniforms().setValue( _gl, 'morphTargetInfluences', morphInfluences ); + morphtargets.update( object, geometry, material, program ); updateBuffers = true; diff --git a/src/renderers/webgl/WebGLMorphtargets.js b/src/renderers/webgl/WebGLMorphtargets.js new file mode 100644 index 0000000000000000000000000000000000000000..470049634a486cf251aa1cb22d048ce2979bb371 --- /dev/null +++ b/src/renderers/webgl/WebGLMorphtargets.js @@ -0,0 +1,111 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +function absNumericalSort( a, b ) { + + return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] ); + +} + +function WebGLMorphtargets( gl ) { + + var influencesList = {}; + var morphInfluences = new Float32Array( 8 ); + + function update( object, geometry, material, program ) { + + var objectInfluences = object.morphTargetInfluences; + + var length = objectInfluences.length; + + var influences = influencesList[ geometry.id ]; + + if ( influences === undefined ) { + + // initialise list + + influences = []; + + for ( var i = 0; i < length; i ++ ) { + + influences[ i ] = [ i, 0 ]; + + } + + influencesList[ geometry.id ] = influences; + + } + + 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[ 1 ] !== 0 ) { + + 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 ]; + + } + + influences.sort( absNumericalSort ); + + // Add morphAttributes + + for ( var i = 0; i < 8; i ++ ) { + + var influence = influences[ i ]; + + if ( influence ) { + + var index = influence[ 0 ]; + var value = influence[ 1 ]; + + if ( value ) { + + if ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] ); + if ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] ); + + morphInfluences[ i ] = value; + continue; + + } + + } + + morphInfluences[ i ] = 0; + + } + + program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences ); + + } + + return { + + update: update + + } + +} + + +export { WebGLMorphtargets };