diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 37a75f289f6da77893364d1ca7a88cc4e7013d93..f429a6078c02c170cfa447e88e948739c06bb515 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -869,6 +869,96 @@ THREE.WebGLRenderer = function ( parameters ) { }; + this.renderBufferDirect = function ( camera, lights, fog, material, object ) { + + if ( material.visible === false ) return; + + setMaterial( material ); + + var geometry = objects.geometries.get( object ); + var program = setProgram( camera, lights, fog, material, object ); + + var updateBuffers = false, + wireframeBit = material.wireframe ? 1 : 0, + geometryProgram = geometry.id + '_' + program.id + '_' + wireframeBit; + + if ( geometryProgram !== _currentGeometryProgram ) { + + _currentGeometryProgram = geometryProgram; + updateBuffers = true; + + } + + // morph targets + + var morphTargetInfluences = object.morphTargetInfluences; + + if ( morphTargetInfluences !== undefined ) { + + var activeInfluences = []; + + 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 ++ ) { + + var influence = activeInfluences[ i ]; + morphInfluences[ i ] = influence[ 0 ]; + + if ( influence[ 0 ] !== 0 ) { + + var attribute = geometry.morphAttributes[ influence[ 1 ] ]; + + geometry.addAttribute( 'morphTarget' + i, attribute ); + + } else { + + geometry.removeAttribute( 'morphTarget' + i ); + + } + + } + + var uniforms = program.getUniforms(); + + if ( uniforms.morphTargetInfluences !== null ) { + + _gl.uniform1fv( uniforms.morphTargetInfluences, morphInfluences ); + + } + + updateBuffers = true; + + } + + if ( object instanceof THREE.Mesh ) { + + renderMesh( material, geometry, object, program, updateBuffers ); + + } else if ( object instanceof THREE.Line ) { + + renderLine( material, geometry, object, program, updateBuffers ); + + } else if ( object instanceof THREE.PointCloud ) { + + renderPointCloud( material, geometry, object, program, updateBuffers ); + + } + + }; + function setupVertexAttributes( material, program, geometry, startIndex ) { var extension; @@ -1000,96 +1090,6 @@ THREE.WebGLRenderer = function ( parameters ) { } - this.renderBufferDirect = function ( camera, lights, fog, material, object ) { - - if ( material.visible === false ) return; - - setMaterial( material ); - - var geometry = objects.geometries.get( object ); - var program = setProgram( camera, lights, fog, material, object ); - - var updateBuffers = false, - wireframeBit = material.wireframe ? 1 : 0, - geometryProgram = geometry.id + '_' + program.id + '_' + wireframeBit; - - if ( geometryProgram !== _currentGeometryProgram ) { - - _currentGeometryProgram = geometryProgram; - updateBuffers = true; - - } - - // morph targets - - var morphTargetInfluences = object.morphTargetInfluences; - - if ( morphTargetInfluences !== undefined ) { - - var activeInfluences = []; - - 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 ++ ) { - - var influence = activeInfluences[ i ]; - morphInfluences[ i ] = influence[ 0 ]; - - if ( influence[ 0 ] !== 0 ) { - - var attribute = geometry.morphAttributes[ influence[ 1 ] ]; - - geometry.addAttribute( 'morphTarget' + i, attribute ); - - } else { - - geometry.removeAttribute( 'morphTarget' + i ); - - } - - } - - var uniforms = program.getUniforms(); - - if ( uniforms.morphTargetInfluences !== null ) { - - _gl.uniform1fv( uniforms.morphTargetInfluences, morphInfluences ); - - } - - updateBuffers = true; - - } - - if ( object instanceof THREE.Mesh ) { - - renderMesh( material, geometry, object, program, updateBuffers ); - - } else if ( object instanceof THREE.Line ) { - - renderLine( material, geometry, object, program, updateBuffers ); - - } else if ( object instanceof THREE.PointCloud ) { - - renderPointCloud( material, geometry, object, program, updateBuffers ); - - } - - }; - function renderMesh( material, geometry, object, program, updateBuffers ) { var mode = _gl.TRIANGLES;