Jelajahi Sumber

WebGLObjects: Hackish approach to update only once per frame.

Mr.doob 8 tahun lalu
induk
melakukan
c31b30a1b4
2 mengubah file dengan 19 tambahan dan 9 penghapusan
  1. 2 1
      src/renderers/WebGLRenderer.js
  2. 17 8
      src/renderers/webgl/WebGLObjects.js

+ 2 - 1
src/renderers/WebGLRenderer.js

@@ -193,6 +193,7 @@ function WebGLRenderer( parameters ) {
 
 		_infoRender = {
 
+			frame: 0,
 			calls: 0,
 			vertices: 0,
 			faces: 0,
@@ -289,7 +290,7 @@ function WebGLRenderer( parameters ) {
 	var textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info );
 	var attributes = new WebGLAttributes( _gl );
 	var geometries = new WebGLGeometries( _gl, attributes, this.info );
-	var objects = new WebGLObjects( _gl, geometries );
+	var objects = new WebGLObjects( _gl, geometries, _infoRender );
 	var programCache = new WebGLPrograms( this, capabilities );
 	var lightCache = new WebGLLights();
 

+ 17 - 8
src/renderers/webgl/WebGLObjects.js

@@ -2,23 +2,32 @@
  * @author mrdoob / http://mrdoob.com/
  */
 
-function WebGLObjects( gl, geometries ) {
+function WebGLObjects( gl, geometries, infoRender ) {
 
 	function update( object ) {
 
-		// TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.
+		var frame = infoRender.frame;
 
-		var geometry = geometries.get( object );
+		var geometry = object.geometry;
+		var buffergeometry = geometries.get( object, geometry );
 
-		if ( object.geometry.isGeometry ) {
+		// Update once per frame
 
-			geometry.updateFromObject( object );
+		if ( buffergeometry.__frame !== frame ) {
 
-		}
+			if ( geometry.isGeometry ) {
+
+				buffergeometry.updateFromObject( object );
+
+			}
 
-		geometries.update( geometry );
+			geometries.update( buffergeometry );
+
+			buffergeometry.__frame = frame;
+
+		}
 
-		return geometry;
+		return buffergeometry;
 
 	}