|
@@ -29,6 +29,9 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
var lights = [];
|
|
|
|
|
|
+ var _webglObjects = {};
|
|
|
+ var _webglObjectsImmediate = [];
|
|
|
+
|
|
|
var opaqueObjects = [];
|
|
|
var transparentObjects = [];
|
|
|
|
|
@@ -408,14 +411,14 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
this.addPostPlugin = function ( plugin ) {
|
|
|
|
|
|
- plugin.init( this, lights );
|
|
|
+ plugin.init( this, lights, _webglObjects, _webglObjectsImmediate );
|
|
|
this.renderPluginsPost.push( plugin );
|
|
|
|
|
|
};
|
|
|
|
|
|
this.addPrePlugin = function ( plugin ) {
|
|
|
|
|
|
- plugin.init( this, lights );
|
|
|
+ plugin.init( this, lights, _webglObjects, _webglObjectsImmediate );
|
|
|
this.renderPluginsPre.push( plugin );
|
|
|
|
|
|
};
|
|
@@ -3196,13 +3199,6 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
|
|
|
_frustum.setFromMatrix( _projScreenMatrix );
|
|
|
|
|
|
- if ( ! scene.__webglObjects ) {
|
|
|
-
|
|
|
- scene.__webglObjects = {};
|
|
|
- scene.__webglObjectsImmediate = [];
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
lights.length = 0;
|
|
|
opaqueObjects.length = 0;
|
|
|
transparentObjects.length = 0;
|
|
@@ -3235,18 +3231,11 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- // set matrices for regular objects (frustum culled)
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
// set matrices for immediate objects
|
|
|
|
|
|
- renderList = scene.__webglObjectsImmediate;
|
|
|
+ for ( i = 0, il = _webglObjectsImmediate.length; i < il; i ++ ) {
|
|
|
|
|
|
- for ( i = 0, il = renderList.length; i < il; i ++ ) {
|
|
|
-
|
|
|
- webglObject = renderList[ i ];
|
|
|
+ webglObject = _webglObjectsImmediate[ i ];
|
|
|
object = webglObject.object;
|
|
|
|
|
|
if ( object.visible ) {
|
|
@@ -3270,7 +3259,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
renderObjects( opaqueObjects, camera, lights, fog, true, material );
|
|
|
renderObjects( transparentObjects, camera, lights, fog, true, material );
|
|
|
- renderObjectsImmediate( scene.__webglObjectsImmediate, '', camera, lights, fog, false, material );
|
|
|
+ renderObjectsImmediate( _webglObjectsImmediate, '', camera, lights, fog, false, material );
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -3281,12 +3270,12 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
this.setBlending( THREE.NoBlending );
|
|
|
|
|
|
renderObjects( opaqueObjects, camera, lights, fog, false, material );
|
|
|
- renderObjectsImmediate( scene.__webglObjectsImmediate, 'opaque', camera, lights, fog, false, material );
|
|
|
+ renderObjectsImmediate( _webglObjectsImmediate, 'opaque', camera, lights, fog, false, material );
|
|
|
|
|
|
// transparent pass (back-to-front order)
|
|
|
|
|
|
renderObjects( transparentObjects, camera, lights, fog, true, material );
|
|
|
- renderObjectsImmediate( scene.__webglObjectsImmediate, 'transparent', camera, lights, fog, true, material );
|
|
|
+ renderObjectsImmediate( _webglObjectsImmediate, 'transparent', camera, lights, fog, true, material );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -3322,34 +3311,42 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- initObject( object, scene );
|
|
|
+ if ( object instanceof THREE.Scene ) {
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ initObject( object, scene );
|
|
|
|
|
|
- var webglObjects = scene.__webglObjects[ object.id ];
|
|
|
+ var webglObjects = _webglObjects[ object.id ];
|
|
|
|
|
|
- if ( webglObjects && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {
|
|
|
+ if ( webglObjects && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {
|
|
|
|
|
|
- updateObject( object, scene );
|
|
|
+ updateObject( object, scene );
|
|
|
|
|
|
- for ( var i = 0, l = webglObjects.length; i < l; i ++ ) {
|
|
|
+ for ( var i = 0, l = webglObjects.length; i < l; i ++ ) {
|
|
|
|
|
|
- var webglObject = webglObjects[i];
|
|
|
+ var webglObject = webglObjects[i];
|
|
|
|
|
|
- unrollBufferMaterial( webglObject );
|
|
|
+ unrollBufferMaterial( webglObject );
|
|
|
|
|
|
- webglObject.render = true;
|
|
|
+ webglObject.render = true;
|
|
|
|
|
|
- if ( _this.sortObjects === true ) {
|
|
|
+ if ( _this.sortObjects === true ) {
|
|
|
|
|
|
- if ( object.renderDepth !== null ) {
|
|
|
+ if ( object.renderDepth !== null ) {
|
|
|
|
|
|
- webglObject.z = object.renderDepth;
|
|
|
+ webglObject.z = object.renderDepth;
|
|
|
|
|
|
- } else {
|
|
|
+ } else {
|
|
|
|
|
|
- _vector3.setFromMatrixPosition( object.matrixWorld );
|
|
|
- _vector3.applyProjection( _projScreenMatrix );
|
|
|
+ _vector3.setFromMatrixPosition( object.matrixWorld );
|
|
|
+ _vector3.applyProjection( _projScreenMatrix );
|
|
|
|
|
|
- webglObject.z = _vector3.z;
|
|
|
+ webglObject.z = _vector3.z;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
@@ -3364,7 +3361,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
projectObject( scene, object.children[ i ], camera );
|
|
|
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
|
|
|
function renderPlugins( plugins, scene, camera ) {
|
|
@@ -3647,14 +3644,14 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
|
|
|
- addBuffer( scene.__webglObjects, geometry, object );
|
|
|
+ addBuffer( _webglObjects, geometry, object );
|
|
|
|
|
|
} else if ( geometry instanceof THREE.Geometry ) {
|
|
|
|
|
|
for ( var i = 0,l = geometry.geometryGroupsList.length; i<l;i++ ) {
|
|
|
|
|
|
var geometryGroup = geometry.geometryGroupsList[ i ];
|
|
|
- addBuffer( scene.__webglObjects, geometryGroup, object );
|
|
|
+ addBuffer( _webglObjects, geometryGroup, object );
|
|
|
|
|
|
}
|
|
|
}
|
|
@@ -3662,11 +3659,11 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
} else if ( object instanceof THREE.Line ||
|
|
|
object instanceof THREE.PointCloud ) {
|
|
|
|
|
|
- addBuffer( scene.__webglObjects, geometry, object );
|
|
|
+ addBuffer( _webglObjects, geometry, object );
|
|
|
|
|
|
} else if ( object instanceof THREE.ImmediateRenderObject || object.immediateRenderCallback ) {
|
|
|
|
|
|
- addBufferImmediate( scene.__webglObjectsImmediate, object );
|
|
|
+ addBufferImmediate( _webglObjectsImmediate, object );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -3683,7 +3680,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( geometry.geometryGroups === undefined || geometry.groupsNeedUpdate ) {
|
|
|
|
|
|
- delete scene.__webglObjects[object.id];
|
|
|
+ delete _webglObjects[object.id];
|
|
|
geometry.makeGroups( material instanceof THREE.MeshFaceMaterial, _glExtensionElementIndexUint ? 4294967296 : 65535 );
|
|
|
geometry.groupsNeedUpdate = false;
|
|
|
|
|
@@ -3719,7 +3716,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
}
|
|
|
|
|
|
if ( addBuffers || object.__webglActive === undefined ) {
|
|
|
- addBuffer( scene.__webglObjects, geometryGroup, object );
|
|
|
+ addBuffer( _webglObjects, geometryGroup, object );
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -3888,31 +3885,23 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
// Objects removal
|
|
|
|
|
|
- function removeObject( object, scene ) {
|
|
|
+ function removeObject( object ) {
|
|
|
|
|
|
if ( object instanceof THREE.Mesh ||
|
|
|
object instanceof THREE.PointCloud ||
|
|
|
object instanceof THREE.Line ) {
|
|
|
|
|
|
- removeInstancesWebglObjects( scene.__webglObjects, object );
|
|
|
+ delete _webglObjects[ object.id ];
|
|
|
|
|
|
} else if ( object instanceof THREE.ImmediateRenderObject || object.immediateRenderCallback ) {
|
|
|
|
|
|
- removeInstances( scene.__webglObjectsImmediate, object );
|
|
|
+ removeInstances( _webglObjectsImmediate, object );
|
|
|
|
|
|
}
|
|
|
|
|
|
delete object.__webglActive;
|
|
|
|
|
|
};
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- function removeInstancesWebglObjects( objlist, object ) {
|
|
|
-
|
|
|
- delete objlist[ object.id ];
|
|
|
-
|
|
|
- };
|
|
|
|
|
|
function removeInstances( objlist, object ) {
|
|
|
|