|
@@ -412,6 +412,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
this.addPostPlugin = function ( plugin ) {
|
|
|
|
|
|
plugin.init( this, lights, _webglObjects, _webglObjectsImmediate );
|
|
|
+
|
|
|
this.renderPluginsPost.push( plugin );
|
|
|
|
|
|
};
|
|
@@ -419,6 +420,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
this.addPrePlugin = function ( plugin ) {
|
|
|
|
|
|
plugin.init( this, lights, _webglObjects, _webglObjectsImmediate );
|
|
|
+
|
|
|
this.renderPluginsPre.push( plugin );
|
|
|
|
|
|
};
|
|
@@ -511,13 +513,17 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
// Events
|
|
|
|
|
|
- var onObjectDispose = function ( event ) {
|
|
|
+ var onObjectRemoved = function ( event ) {
|
|
|
|
|
|
var object = event.target;
|
|
|
|
|
|
- object.removeEventListener( 'dispose', onObjectDispose );
|
|
|
+ object.traverse( function ( child ) {
|
|
|
+
|
|
|
+ child.removeEventListener( 'remove', onObjectRemoved );
|
|
|
|
|
|
- removeObject( object )
|
|
|
+ removeObject( child );
|
|
|
+
|
|
|
+ } );
|
|
|
|
|
|
};
|
|
|
|
|
@@ -588,14 +594,9 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( geometry.__webglCustomAttributesList !== undefined ) {
|
|
|
|
|
|
- var attributes = geometry.__webglCustomAttributesList;
|
|
|
- var keys = Object.keys( attributes );
|
|
|
+ for ( var name in geometry.__webglCustomAttributesList ) {
|
|
|
|
|
|
- for ( var i = 0; i < keys.length; i ++ ) {
|
|
|
-
|
|
|
- var name = keys[ i ];
|
|
|
-
|
|
|
- _gl.deleteBuffer( attributes[ name ].buffer );
|
|
|
+ _gl.deleteBuffer( geometry.__webglCustomAttributesList[ name ].buffer );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -611,16 +612,11 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
|
|
|
- var attributes = geometry.attributes;
|
|
|
- var keys = Object.keys( attributes );
|
|
|
-
|
|
|
- for ( var i = 0; i < keys.length; i ++ ) {
|
|
|
+ for ( var name in geometry.attributes ) {
|
|
|
|
|
|
- var name = keys[ i ];
|
|
|
+ if ( geometry.attributes[ name ].buffer !== undefined ) {
|
|
|
|
|
|
- if ( attributes[ name ].buffer !== undefined ) {
|
|
|
-
|
|
|
- _gl.deleteBuffer( attributes[ name ].buffer );
|
|
|
+ _gl.deleteBuffer( geometry.attributes[ name ].buffer );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -794,11 +790,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- var keys = Object.keys( material.attributes );
|
|
|
-
|
|
|
- for ( var i = 0; i < keys.length; i ++ ) {
|
|
|
+ for ( var name in material.attributes ) {
|
|
|
|
|
|
- var name = keys[ i ];
|
|
|
var attribute = material.attributes[ name ];
|
|
|
|
|
|
if ( ! attribute.__webglInitialized || attribute.createUniqueBuffers ) {
|
|
@@ -941,23 +934,17 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- var keys = Object.keys( material.attributes );
|
|
|
-
|
|
|
- for ( var i = 0; i < keys.length; i ++ ) {
|
|
|
+ for ( var name in material.attributes ) {
|
|
|
|
|
|
// Do a shallow copy of the attribute object so different geometryGroup chunks use different
|
|
|
// attribute buffers which are correctly indexed in the setMeshBuffers function
|
|
|
|
|
|
- var name = keys[ i ];
|
|
|
var originalAttribute = material.attributes[ name ];
|
|
|
|
|
|
var attribute = {};
|
|
|
|
|
|
- var keys2 = Object.keys( originalAttribute );
|
|
|
-
|
|
|
- for ( var j = 0; j < keys2.length; j ++ ) {
|
|
|
+ for ( var property in originalAttribute ) {
|
|
|
|
|
|
- var property = keys2[ j ];
|
|
|
attribute[ property ] = originalAttribute[ property ];
|
|
|
|
|
|
}
|
|
@@ -2306,12 +2293,11 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
function setDirectBuffers( geometry ) {
|
|
|
|
|
|
var attributes = geometry.attributes;
|
|
|
+ var attributesKeys = geometry.attributesKeys;
|
|
|
|
|
|
- var keys = Object.keys( attributes );
|
|
|
-
|
|
|
- for ( var i = 0; i < keys.length; i ++ ) {
|
|
|
+ for ( var i = 0, l = attributesKeys.length; i < l; i ++ ) {
|
|
|
|
|
|
- var attributeName = keys[ i ];
|
|
|
+ var attributeName = attributesKeys[ i ];
|
|
|
var attributeItem = attributes[ attributeName ];
|
|
|
|
|
|
if ( attributeItem.buffer === undefined ) {
|
|
@@ -2435,28 +2421,34 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
};
|
|
|
|
|
|
- function setupVertexAttributes( material, programAttributes, geometryAttributes, startIndex ) {
|
|
|
+ function setupVertexAttributes( material, program, geometry, startIndex ) {
|
|
|
|
|
|
- var keys = Object.keys( programAttributes );
|
|
|
+ var geometryAttributes = geometry.attributes;
|
|
|
|
|
|
- for ( var i = 0; i < keys.length; i ++ ) {
|
|
|
+ var programAttributes = program.attributes;
|
|
|
+ var programAttributesKeys = program.attributesKeys;
|
|
|
|
|
|
- var attributeName = keys[ i ];
|
|
|
+ for ( var i = 0, l = programAttributesKeys.length; i < l; i ++ ) {
|
|
|
+
|
|
|
+ var attributeName = programAttributesKeys[ i ];
|
|
|
|
|
|
- var attributeItem = geometryAttributes[ attributeName ];
|
|
|
var attributePointer = programAttributes[ attributeName ];
|
|
|
|
|
|
if ( attributePointer >= 0 ) {
|
|
|
|
|
|
- if ( attributeItem ) {
|
|
|
+ var attributeItem = geometryAttributes[ attributeName ];
|
|
|
+
|
|
|
+ if ( attributeItem !== undefined ) {
|
|
|
|
|
|
var attributeSize = attributeItem.itemSize;
|
|
|
|
|
|
_gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer );
|
|
|
+
|
|
|
enableAttribute( attributePointer );
|
|
|
+
|
|
|
_gl.vertexAttribPointer( attributePointer, attributeSize, _gl.FLOAT, false, 0, startIndex * attributeSize * 4 ); // 4 bytes per Float32
|
|
|
|
|
|
- } else if ( material.defaultAttributeValues ) {
|
|
|
+ } else if ( material.defaultAttributeValues !== undefined ) {
|
|
|
|
|
|
if ( material.defaultAttributeValues[ attributeName ].length === 2 ) {
|
|
|
|
|
@@ -2480,14 +2472,13 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
this.renderBufferDirect = function ( camera, lights, fog, material, geometry, object ) {
|
|
|
|
|
|
+ if ( material.visible === false ) return;
|
|
|
+
|
|
|
var linewidth, a, attribute;
|
|
|
var attributeItem, attributeName, attributePointer, attributeSize;
|
|
|
|
|
|
var program = setProgram( camera, lights, fog, material, object );
|
|
|
|
|
|
- var programAttributes = program.attributes;
|
|
|
- var geometryAttributes = geometry.attributes;
|
|
|
-
|
|
|
var updateBuffers = false,
|
|
|
wireframeBit = material.wireframe ? 1 : 0,
|
|
|
geometryHash = ( geometry.id * 0xffffff ) + ( program.id * 2 ) + wireframeBit;
|
|
@@ -2509,7 +2500,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( object instanceof THREE.Mesh ) {
|
|
|
|
|
|
- var index = geometryAttributes[ 'index' ];
|
|
|
+ var index = geometry.attributes.index;
|
|
|
|
|
|
if ( index ) {
|
|
|
|
|
@@ -2535,7 +2526,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( updateBuffers ) {
|
|
|
|
|
|
- setupVertexAttributes( material, programAttributes, geometryAttributes, 0 );
|
|
|
+ setupVertexAttributes( material, program, geometry, 0 );
|
|
|
_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );
|
|
|
|
|
|
}
|
|
@@ -2560,7 +2551,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( updateBuffers ) {
|
|
|
|
|
|
- setupVertexAttributes( material, programAttributes, geometryAttributes, startIndex );
|
|
|
+ setupVertexAttributes( material, program, geometry, startIndex );
|
|
|
_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );
|
|
|
|
|
|
}
|
|
@@ -2583,7 +2574,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( updateBuffers ) {
|
|
|
|
|
|
- setupVertexAttributes( material, programAttributes, geometryAttributes, 0 );
|
|
|
+ setupVertexAttributes( material, program, geometry, 0 );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -2605,11 +2596,11 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( updateBuffers ) {
|
|
|
|
|
|
- setupVertexAttributes( material, programAttributes, geometryAttributes, 0 );
|
|
|
+ setupVertexAttributes( material, program, geometry, 0 );
|
|
|
|
|
|
}
|
|
|
|
|
|
- var position = geometryAttributes[ 'position' ];
|
|
|
+ var position = geometry.attributes.position;
|
|
|
|
|
|
// render particles
|
|
|
|
|
@@ -2624,7 +2615,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
setLineWidth( material.linewidth );
|
|
|
|
|
|
- var index = geometryAttributes[ 'index' ];
|
|
|
+ var index = geometry.attributes.index;
|
|
|
|
|
|
if ( index ) {
|
|
|
|
|
@@ -2650,7 +2641,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( updateBuffers ) {
|
|
|
|
|
|
- setupVertexAttributes( material, programAttributes, geometryAttributes, 0 );
|
|
|
+ setupVertexAttributes( material, program, geometry, 0 );
|
|
|
_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );
|
|
|
|
|
|
}
|
|
@@ -2674,7 +2665,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( updateBuffers ) {
|
|
|
|
|
|
- setupVertexAttributes( material, programAttributes, geometryAttributes, startIndex );
|
|
|
+ setupVertexAttributes( material, program, geometry, startIndex );
|
|
|
_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );
|
|
|
|
|
|
}
|
|
@@ -2696,11 +2687,11 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( updateBuffers ) {
|
|
|
|
|
|
- setupVertexAttributes( material, programAttributes, geometryAttributes, 0 );
|
|
|
+ setupVertexAttributes( material, program, geometry, 0 );
|
|
|
|
|
|
}
|
|
|
|
|
|
- var position = geometryAttributes[ 'position' ];
|
|
|
+ var position = geometry.attributes.position;
|
|
|
|
|
|
_gl.drawArrays( mode, 0, position.array.length / 3 );
|
|
|
|
|
@@ -2715,6 +2706,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
this.renderBuffer = function ( camera, lights, fog, material, geometryGroup, object ) {
|
|
|
|
|
|
+ if ( material.visible === false ) return;
|
|
|
+
|
|
|
var linewidth, a, attribute, i, il;
|
|
|
|
|
|
var program = setProgram( camera, lights, fog, material, object );
|
|
@@ -2796,7 +2789,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
enableAttribute( attributes.color );
|
|
|
_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );
|
|
|
|
|
|
- } else if ( material.defaultAttributeValues ) {
|
|
|
+ } else if ( material.defaultAttributeValues !== undefined ) {
|
|
|
|
|
|
|
|
|
_gl.vertexAttrib3fv( attributes.color, material.defaultAttributeValues.color );
|
|
@@ -2835,7 +2828,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
enableAttribute( attributes.uv );
|
|
|
_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );
|
|
|
|
|
|
- } else if ( material.defaultAttributeValues ) {
|
|
|
+ } else if ( material.defaultAttributeValues !== undefined ) {
|
|
|
|
|
|
|
|
|
_gl.vertexAttrib2fv( attributes.uv, material.defaultAttributeValues.uv );
|
|
@@ -2852,7 +2845,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
enableAttribute( attributes.uv2 );
|
|
|
_gl.vertexAttribPointer( attributes.uv2, 2, _gl.FLOAT, false, 0, 0 );
|
|
|
|
|
|
- } else if ( material.defaultAttributeValues ) {
|
|
|
+ } else if ( material.defaultAttributeValues !== undefined ) {
|
|
|
|
|
|
|
|
|
_gl.vertexAttrib2fv( attributes.uv2, material.defaultAttributeValues.uv2 );
|
|
@@ -3163,7 +3156,6 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
};
|
|
|
|
|
|
-
|
|
|
// Rendering
|
|
|
|
|
|
this.render = function ( scene, camera, renderTarget, forceClear ) {
|
|
@@ -3384,38 +3376,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
for ( var i = 0, il = plugins.length; i < il; i ++ ) {
|
|
|
|
|
|
- // reset state for plugin (to start from clean slate)
|
|
|
-
|
|
|
- _currentProgram = null;
|
|
|
- _currentCamera = null;
|
|
|
-
|
|
|
- _oldBlending = - 1;
|
|
|
- _oldDepthTest = - 1;
|
|
|
- _oldDepthWrite = - 1;
|
|
|
- _oldDoubleSided = - 1;
|
|
|
- _oldFlipSided = - 1;
|
|
|
- _currentGeometryGroupHash = - 1;
|
|
|
- _currentMaterialId = - 1;
|
|
|
-
|
|
|
- _lightsNeedUpdate = true;
|
|
|
-
|
|
|
plugins[ i ].render( scene, camera, _currentWidth, _currentHeight );
|
|
|
|
|
|
- // reset state after plugin (anything could have changed)
|
|
|
-
|
|
|
- _currentProgram = null;
|
|
|
- _currentCamera = null;
|
|
|
-
|
|
|
- _oldBlending = - 1;
|
|
|
- _oldDepthTest = - 1;
|
|
|
- _oldDepthWrite = - 1;
|
|
|
- _oldDoubleSided = - 1;
|
|
|
- _oldFlipSided = - 1;
|
|
|
- _currentGeometryGroupHash = - 1;
|
|
|
- _currentMaterialId = - 1;
|
|
|
-
|
|
|
- _lightsNeedUpdate = true;
|
|
|
-
|
|
|
}
|
|
|
|
|
|
};
|
|
@@ -3592,11 +3554,11 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
if ( object.__webglInit === undefined ) {
|
|
|
|
|
|
object.__webglInit = true;
|
|
|
- object.addEventListener( 'dispose', onObjectDispose );
|
|
|
-
|
|
|
object._modelViewMatrix = new THREE.Matrix4();
|
|
|
object._normalMatrix = new THREE.Matrix3();
|
|
|
|
|
|
+ object.addEventListener( 'removed', onObjectRemoved );
|
|
|
+
|
|
|
}
|
|
|
|
|
|
var geometry = object.geometry;
|
|
@@ -3616,12 +3578,6 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
} else if ( object instanceof THREE.Mesh ) {
|
|
|
|
|
|
- if ( object.__webglActive !== undefined ) {
|
|
|
-
|
|
|
- removeObject( object, scene );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
initGeometryGroups(scene, object, geometry);
|
|
|
|
|
|
} else if ( object instanceof THREE.Line ) {
|
|
@@ -3870,11 +3826,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
function areCustomAttributesDirty( material ) {
|
|
|
|
|
|
- var keys = Object.keys( material.attributes );
|
|
|
-
|
|
|
- for ( var i = 0; i < keys.length; i ++ ) {
|
|
|
-
|
|
|
- var name = keys[ i ];
|
|
|
+ for ( var name in material.attributes ) {
|
|
|
|
|
|
if ( material.attributes[ name ].needsUpdate ) return true;
|
|
|
|
|
@@ -3886,11 +3838,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
function clearCustomAttributes( material ) {
|
|
|
|
|
|
- var keys = Object.keys( material.attributes );
|
|
|
-
|
|
|
- for ( var i = 0; i < keys.length; i ++ ) {
|
|
|
-
|
|
|
- var name = keys[ i ];
|
|
|
+ for ( var name in material.attributes ) {
|
|
|
|
|
|
material.attributes[ name ].needsUpdate = false;
|
|
|
|
|
@@ -3914,6 +3862,10 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ delete object.__webglInit;
|
|
|
+ delete object._modelViewMatrix;
|
|
|
+ delete object._normalMatrix;
|
|
|
+
|
|
|
delete object.__webglActive;
|
|
|
|
|
|
};
|
|
@@ -4072,31 +4024,21 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- var keys;
|
|
|
-
|
|
|
if ( material.defines !== undefined ) {
|
|
|
|
|
|
- keys = Object.keys( material.defines );
|
|
|
-
|
|
|
- for ( var i = 0; i < keys.length; i ++ ) {
|
|
|
+ for ( var name in material.defines ) {
|
|
|
|
|
|
- var d = keys[ i ];
|
|
|
-
|
|
|
- chunks.push( d );
|
|
|
- chunks.push( material.defines[ d ] );
|
|
|
+ chunks.push( name );
|
|
|
+ chunks.push( material.defines[ name ] );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
- keys = Object.keys( parameters );
|
|
|
-
|
|
|
- for ( var i = 0; i < keys.length; i ++ ) {
|
|
|
-
|
|
|
- var p = keys[ i ];
|
|
|
+ for ( var name in parameters ) {
|
|
|
|
|
|
- chunks.push( p );
|
|
|
- chunks.push( parameters[ p ] );
|
|
|
+ chunks.push( name );
|
|
|
+ chunks.push( parameters[ name ] );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -4132,7 +4074,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
material.program = program;
|
|
|
|
|
|
- var attributes = material.program.attributes;
|
|
|
+ var attributes = program.attributes;
|
|
|
|
|
|
if ( material.morphTargets ) {
|
|
|
|
|
@@ -4140,7 +4082,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
var id, base = 'morphTarget';
|
|
|
|
|
|
- for ( i = 0; i < _this.maxMorphTargets; i ++ ) {
|
|
|
+ for ( var i = 0; i < _this.maxMorphTargets; i ++ ) {
|
|
|
|
|
|
id = base + i;
|
|
|
|
|
@@ -4176,11 +4118,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
material.uniformsList = [];
|
|
|
|
|
|
- keys = Object.keys( material.__webglShader.uniforms );
|
|
|
+ for ( var u in material.__webglShader.uniforms ) {
|
|
|
|
|
|
- for ( var i = 0; i < keys.length; i ++ ) {
|
|
|
-
|
|
|
- var u = keys[ i ];
|
|
|
var location = material.program.uniforms[ u ];
|
|
|
|
|
|
if ( location ) {
|
|
@@ -6276,7 +6215,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- };
|
|
|
+ }
|
|
|
|
|
|
function setDefaultGLState () {
|
|
|
|
|
@@ -6299,7 +6238,26 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
_gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );
|
|
|
|
|
|
- };
|
|
|
+ }
|
|
|
+
|
|
|
+ function resetGLState() {
|
|
|
+
|
|
|
+ _currentProgram = null;
|
|
|
+ _currentCamera = null;
|
|
|
+
|
|
|
+ _oldBlending = - 1;
|
|
|
+ _oldDepthTest = - 1;
|
|
|
+ _oldDepthWrite = - 1;
|
|
|
+ _oldDoubleSided = - 1;
|
|
|
+ _oldFlipSided = - 1;
|
|
|
+ _currentGeometryGroupHash = - 1;
|
|
|
+ _currentMaterialId = - 1;
|
|
|
+
|
|
|
+ _lightsNeedUpdate = true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ this.resetGLState = resetGLState;
|
|
|
|
|
|
// default plugins (order is important)
|
|
|
|