2
0
Эх сурвалжийг харах

Reverted changes, starting again.

Mr.doob 13 жил өмнө
parent
commit
20c96f52e9
1 өөрчлөгдсөн 107 нэмэгдсэн , 99 устгасан
  1. 107 99
      src/renderers/WebGLRenderer.js

+ 107 - 99
src/renderers/WebGLRenderer.js

@@ -19,10 +19,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 	_currentGeometryGroupHash = null,
 	_geometryGroupCounter = 0,
 
-	_object, _objects = [],
-	_renderData, _projector = new THREE.Projector(),
-	_vertexBuffers = [], _textureBuffers = [],
-
 	// gl state cache
 
 	_oldDoubleSided = null,
@@ -181,7 +177,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	//
 
-	// this.context = _gl;
+	this.context = _gl;
 
 	var _supportsVertexTextures = ( maxVertexTextures() > 0 );
 
@@ -254,12 +250,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	var _spriteAttributesEnabled = false;
 
-	this.getContext = function () {
-
-		return _gl;
-
-	};
-
 	this.setSize = function ( width, height ) {
 
 		_canvas.width = width;
@@ -335,6 +325,12 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	};
 
+	this.getContext = function () {
+
+		return _gl;
+
+	};
+
 	this.deallocateObject = function ( object ) {
 
 		if ( ! object.__webglInit ) return;
@@ -712,7 +708,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	};
 
-	function initMeshBuffers( geometryGroup, object ) {
+	function initMeshBuffers ( geometryGroup, object ) {
 
 		var f, fl, fi, face,
 		m, ml, size,
@@ -3377,6 +3373,42 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	};
 
+	function computeFrustum( m ) {
+
+		_frustum[ 0 ].set( m.n41 - m.n11, m.n42 - m.n12, m.n43 - m.n13, m.n44 - m.n14 );
+		_frustum[ 1 ].set( m.n41 + m.n11, m.n42 + m.n12, m.n43 + m.n13, m.n44 + m.n14 );
+		_frustum[ 2 ].set( m.n41 + m.n21, m.n42 + m.n22, m.n43 + m.n23, m.n44 + m.n24 );
+		_frustum[ 3 ].set( m.n41 - m.n21, m.n42 - m.n22, m.n43 - m.n23, m.n44 - m.n24 );
+		_frustum[ 4 ].set( m.n41 - m.n31, m.n42 - m.n32, m.n43 - m.n33, m.n44 - m.n34 );
+		_frustum[ 5 ].set( m.n41 + m.n31, m.n42 + m.n32, m.n43 + m.n33, m.n44 + m.n34 );
+
+		var i, plane;
+
+		for ( i = 0; i < 6; i ++ ) {
+
+			plane = _frustum[ i ];
+			plane.divideScalar( Math.sqrt( plane.x * plane.x + plane.y * plane.y + plane.z * plane.z ) );
+
+		}
+
+	};
+
+	function isInFrustum( object ) {
+
+		var distance, matrix = object.matrixWorld,
+		radius = - object.geometry.boundingSphere.radius * Math.max( object.scale.x, Math.max( object.scale.y, object.scale.z ) );
+
+		for ( var i = 0; i < 6; i ++ ) {
+
+			distance = _frustum[ i ].x * matrix.n14 + _frustum[ i ].y * matrix.n24 + _frustum[ i ].z * matrix.n34 + _frustum[ i ].w;
+			if ( distance <= radius ) return false;
+
+		}
+
+		return true;
+
+	};
+
 	function addToFixedArray( where, what ) {
 
 		where.list[ where.count ] = what;
@@ -3677,12 +3709,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 		_this.info.render.vertices = 0;
 		_this.info.render.faces = 0;
 
-		if ( this.autoClear || forceClear ) {
-
-			this.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );
-
-		}
-
 		if ( camera.parent == null ) {
 
 			console.warn( "Camera is not on the Scene. Adding it..." );
@@ -3698,35 +3724,20 @@ THREE.WebGLRenderer = function ( parameters ) {
 		camera.projectionMatrix.flattenToArray( _projectionMatrixArray );
 
 		_projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
-		_projector.computeFrustum( _projScreenMatrix );
-
-		_renderData = _projector.projectGraph( scene );
-
-		// lights = scene.__webglLights;
+		computeFrustum( _projScreenMatrix );
 
-		setRenderTarget( renderTarget ); // TODO: A bit obfuscated
-
-		ol = _renderData.objects.length;
-
-		for ( o = 0; o < ol; o ++ ) {
+		this.initWebGLObjects( scene );
 
-			object = _renderData.objects[ o ];
-
-			_object = _objects[ object.id ] || initObject( object );
-
-			object.matrixWorld.flattenToArray( _object.objectMatrixArray );
+		lights = scene.__webglLights;
 
-			// setupMatrices()
+		setRenderTarget( renderTarget );
 
-			_object.modelViewMatrix.multiplyToArray( camera.matrixWorldInverse, object.matrixWorld, _object.modelViewMatrixArray );
-			THREE.Matrix4.makeInvert3x3( _object.modelViewMatrix ).transposeIntoArray( _object.normalMatrixArray );
+		if ( this.autoClear || forceClear ) {
 
+			this.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );
 
 		}
 
-
-		/*
-
 		// set matrices
 
 		ol = scene.__webglObjects.length;
@@ -4008,11 +4019,9 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 		}
 
-		*/
-
 		// render 2d
 
-		if ( _renderData.sprites.length ) {
+		if ( scene.__webglSprites.length ) {
 
 			renderSprites( scene, camera );
 
@@ -4225,102 +4234,102 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	};
 
-	function initObject( object ) {
+	function addObject( object, scene ) {
 
-		_object = _objects[ object.id ] = {};
+		var g, geometry, geometryGroup;
 
-		_object.modelViewMatrix = new THREE.Matrix4();
+		if ( ! object.__webglInit ) {
 
-		_object.normalMatrixArray = new Float32Array( 9 );
-		_object.modelViewMatrixArray = new Float32Array( 16 );
-		_object.objectMatrixArray = new Float32Array( 16 );
+			object.__webglInit = true;
 
-		object.matrixWorld.flattenToArray( _object.objectMatrixArray );
+			object._modelViewMatrix = new THREE.Matrix4();
 
-		if ( object instanceof THREE.Mesh ) {
+			object._normalMatrixArray = new Float32Array( 9 );
+			object._modelViewMatrixArray = new Float32Array( 16 );
+			object._objectMatrixArray = new Float32Array( 16 );
 
-			var geometry = object.geometry;
+			object.matrixWorld.flattenToArray( object._objectMatrixArray );
 
-			if ( geometry.geometryGroups == undefined ) {
+			if ( object instanceof THREE.Mesh ) {
 
-				sortFacesByMaterial( geometry );
+				geometry = object.geometry;
 
-			}
+				if ( geometry.geometryGroups == undefined ) {
 
-			// create separate VBOs per geometry chunk
+					sortFacesByMaterial( geometry );
 
-			for ( var g in geometry.geometryGroups ) {
+				}
 
-				var geometryGroup = geometry.geometryGroups[ g ];
+				// create separate VBOs per geometry chunk
 
-				// initialise VBO on the first access
+				for ( g in geometry.geometryGroups ) {
 
-				if ( ! geometryGroup.__webglVertexBuffer ) {
+					geometryGroup = geometry.geometryGroups[ g ];
 
-					createMeshBuffers( geometryGroup );
-					initMeshBuffers( geometryGroup, object );
+					// initialise VBO on the first access
 
-					geometry.__dirtyVertices = true;
-					geometry.__dirtyMorphTargets = true;
-					geometry.__dirtyElements = true;
-					geometry.__dirtyUvs = true;
-					geometry.__dirtyNormals = true;
-					geometry.__dirtyTangents = true;
-					geometry.__dirtyColors = true;
+					if ( ! geometryGroup.__webglVertexBuffer ) {
 
-				}
+						createMeshBuffers( geometryGroup );
+						initMeshBuffers( geometryGroup, object );
 
-			}
+						geometry.__dirtyVertices = true;
+						geometry.__dirtyMorphTargets = true;
+						geometry.__dirtyElements = true;
+						geometry.__dirtyUvs = true;
+						geometry.__dirtyNormals = true;
+						geometry.__dirtyTangents = true;
+						geometry.__dirtyColors = true;
 
-		} else if ( object instanceof THREE.Ribbon ) {
+					}
 
-			geometry = object.geometry;
+				}
 
-			if( ! geometry.__webglVertexBuffer ) {
+			} else if ( object instanceof THREE.Ribbon ) {
 
-				createRibbonBuffers( geometry );
-				initRibbonBuffers( geometry );
+				geometry = object.geometry;
 
-				geometry.__dirtyVertices = true;
-				geometry.__dirtyColors = true;
+				if( ! geometry.__webglVertexBuffer ) {
 
-			}
+					createRibbonBuffers( geometry );
+					initRibbonBuffers( geometry );
 
-		} else if ( object instanceof THREE.Line ) {
+					geometry.__dirtyVertices = true;
+					geometry.__dirtyColors = true;
 
-			geometry = object.geometry;
+				}
 
-			if( ! geometry.__webglVertexBuffer ) {
+			} else if ( object instanceof THREE.Line ) {
 
-				createLineBuffers( geometry );
-				initLineBuffers( geometry );
+				geometry = object.geometry;
 
-				geometry.__dirtyVertices = true;
-				geometry.__dirtyColors = true;
+				if( ! geometry.__webglVertexBuffer ) {
 
-			}
+					createLineBuffers( geometry );
+					initLineBuffers( geometry );
 
-		} else if ( object instanceof THREE.ParticleSystem ) {
+					geometry.__dirtyVertices = true;
+					geometry.__dirtyColors = true;
 
-			geometry = object.geometry;
+				}
 
-			if ( ! geometry.__webglVertexBuffer ) {
+			} else if ( object instanceof THREE.ParticleSystem ) {
 
-				createParticleBuffers( geometry );
-				initParticleBuffers( geometry, object );
+				geometry = object.geometry;
 
-				geometry.__dirtyVertices = true;
-				geometry.__dirtyColors = true;
+				if ( ! geometry.__webglVertexBuffer ) {
 
-			}
+					createParticleBuffers( geometry );
+					initParticleBuffers( geometry, object );
 
-		}
+					geometry.__dirtyVertices = true;
+					geometry.__dirtyColors = true;
 
-		return _object;
+				}
 
-	}
+			}
 
-	function addObject( object, scene ) {
+		}
 
 		if ( ! object.__webglActive ) {
 
@@ -5827,4 +5836,3 @@ THREE.WebGLRenderer = function ( parameters ) {
 	}
 	*/
 };
-