瀏覽代碼

WebGLRenderer: Combined ImmediateRenderObjects and normal objects. See #7160. @tschw also sounds good? :)

Mr.doob 10 年之前
父節點
當前提交
151ba8eb8a
共有 1 個文件被更改,包括 18 次插入73 次删除
  1. 18 73
      src/renderers/WebGLRenderer.js

+ 18 - 73
src/renderers/WebGLRenderer.js

@@ -36,11 +36,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 	var transparentObjects = [];
 	var transparentObjectsLastIndex = -1;
 
-	var opaqueImmediateObjects = [];
-	var opaqueImmediateObjectsLastIndex = -1;
-	var transparentImmediateObjects = [];
-	var transparentImmediateObjectsLastIndex = -1;
-
 	var morphInfluences = new Float32Array( 8 );
 
 
@@ -1101,9 +1096,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 		opaqueObjectsLastIndex = -1;
 		transparentObjectsLastIndex = -1;
 
-		opaqueImmediateObjectsLastIndex = -1;
-		transparentImmediateObjectsLastIndex = -1;
-
 		sprites.length = 0;
 		lensFlares.length = 0;
 
@@ -1112,9 +1104,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 		opaqueObjects.length = opaqueObjectsLastIndex + 1;
 		transparentObjects.length = transparentObjectsLastIndex + 1;
 
-		opaqueImmediateObjects.length = opaqueImmediateObjectsLastIndex + 1;
-		transparentImmediateObjects.length = transparentImmediateObjectsLastIndex + 1;
-
 		if ( _this.sortObjects === true ) {
 
 			opaqueObjects.sort( painterSortStable );
@@ -1150,22 +1139,16 @@ THREE.WebGLRenderer = function ( parameters ) {
 			renderObjects( opaqueObjects, camera, lights, fog, overrideMaterial );
 			renderObjects( transparentObjects, camera, lights, fog, overrideMaterial );
 
-			renderObjectsImmediate( opaqueImmediateObjects, camera, lights, fog, overrideMaterial );
-			renderObjectsImmediate( transparentImmediateObjects, camera, lights, fog, overrideMaterial );
-
 		} else {
 
 			// opaque pass (front-to-back order)
 
 			state.setBlending( THREE.NoBlending );
-
 			renderObjects( opaqueObjects, camera, lights, fog );
-			renderObjectsImmediate( opaqueImmediateObjects, camera, lights, fog );
 
 			// transparent pass (back-to-front order)
 
 			renderObjects( transparentObjects, camera, lights, fog );
-			renderObjectsImmediate( transparentImmediateObjects, camera, lights, fog );
 
 		}
 
@@ -1192,40 +1175,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	};
 
-	function pushImmediateRenderItem( object ) {
-
-		var array, index;
-
-		// allocate the next position in the appropriate array
-
-		if ( object.material.transparent ) {
-
-			array = transparentImmediateObjects;
-			index = ++ transparentImmediateObjectsLastIndex;
-
-		} else {
-
-			array = opaqueImmediateObjects;
-			index = ++ opaqueImmediateObjectsLastIndex;
-
-		}
-
-		// recycle existing position or grow the array
-
-		if ( index < array.length ) {
-
-			array[ index ] = object;
-
-		} else {
-
-			// assert( index === array.length );
-			array.push( object );
-
-		}
-
-
-	}
-
 	function pushRenderItem( object, geometry, material, z, group ) {
 
 		var array, index;
@@ -1293,7 +1242,14 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 		} else if ( object instanceof THREE.ImmediateRenderObject ) {
 
-			pushImmediateRenderItem( object );
+			if ( _this.sortObjects === true ) {
+
+				_vector3.setFromMatrixPosition( object.matrixWorld );
+				_vector3.applyProjection( _projScreenMatrix );
+
+			}
+
+			pushRenderItem( object, null, object.material, _vector3.z, null );
 
 		} else if ( object instanceof THREE.Mesh || object instanceof THREE.Line || object instanceof THREE.Points ) {
 
@@ -1372,36 +1328,25 @@ THREE.WebGLRenderer = function ( parameters ) {
 			object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
 			object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
 
-			_this.renderBufferDirect( camera, lights, fog, geometry, material, object, group );
-
-		}
-
-	}
+			if ( object instanceof THREE.ImmediateRenderObject ) {
 
-	function renderObjectsImmediate( renderList, camera, lights, fog, overrideMaterial ) {
+					setMaterial( material );
 
-		var material = overrideMaterial;
+					var program = setProgram( camera, lights, fog, material, object );
 
-		for ( var i = 0, l = renderList.length; i < l; i ++ ) {
+					_currentGeometryProgram = '';
 
-			var object = renderList[ i ];
+					object.render( function ( object ) {
 
-			object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
-			object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
+						_this.renderBufferImmediate( object, program, material );
 
-			if ( overrideMaterial === undefined ) material = object.material;
+					} );
 
-			setMaterial( material );
-
-			var program = setProgram( camera, lights, fog, material, object );
-
-			_currentGeometryProgram = '';
-
-			object.render( function ( object ) {
+			} else {
 
-				_this.renderBufferImmediate( object, program, material );
+				_this.renderBufferDirect( camera, lights, fog, geometry, material, object, group );
 
-			} );
+			}
 
 		}