Browse Source

Modularised WebGLGeometries.

Mr.doob 10 years ago
parent
commit
bf573f30af

+ 1 - 1
src/renderers/WebGLRenderer.js

@@ -1819,7 +1819,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 			var webglObject = renderList[ i ];
 
 			var object = webglObject.object;
-			var buffer = objects.geometries[ object.geometry.id ];
+			var buffer = objects.geometries.get( object );
 
 			setupMatrices( object, camera );
 

+ 63 - 0
src/renderers/webgl/WebGLGeometries.js

@@ -0,0 +1,63 @@
+/**
+* @author mrdoob / http://mrdoob.com/
+*/
+
+THREE.WebGLGeometries = function ( gl, info ) {
+
+	var geometries = {};
+
+	this.get = function ( object ) {
+
+		var geometry = object.geometry;
+
+		if ( geometries[ geometry.id ] !== undefined ) {
+
+			return geometries[ geometry.id ];
+
+		}
+
+		geometry.addEventListener( 'dispose', onGeometryDispose );
+
+		if ( geometry instanceof THREE.BufferGeometry ) {
+
+			geometries[ geometry.id ] = geometry;
+
+		} else {
+
+			geometries[ geometry.id ] = new THREE.BufferGeometry().setFromObject( object );
+
+		}
+
+		info.memory.geometries ++;
+
+		return geometries[ geometry.id ];
+
+	};
+
+	function onGeometryDispose( event ) {
+
+		var geometry = event.target;
+
+		geometry.removeEventListener( 'dispose', onGeometryDispose );
+
+		geometry = geometries[ geometry.id ];
+
+		for ( var name in geometry.attributes ) {
+
+			var attribute = geometry.attributes[ name ];
+
+			if ( attribute.buffer !== undefined ) {
+
+				gl.deleteBuffer( attribute.buffer );
+
+				delete attribute.buffer;
+
+			}
+
+		}
+
+		info.memory.geometries --;
+
+	}
+
+};

+ 2 - 62
src/renderers/webgl/WebGLObjects.js

@@ -7,33 +7,13 @@ THREE.WebGLObjects = function ( gl, info ) {
 	var objects = {};
 	var objectsImmediate = [];
 
-	var geometries = {};
+	var geometries = new THREE.WebGLGeometries( gl, info );
 
 	var geometryGroups = {};
 	var geometryGroupCounter = 0;
 
 	//
 
-	function initGeometry( object ) {
-
-		var geometry = object.geometry;
-
-		geometry.addEventListener( 'dispose', onGeometryDispose );
-
-		if ( geometry instanceof THREE.BufferGeometry ) {
-
-			geometries[ geometry.id ] = geometry;
-
-		} else {
-
-			geometries[ geometry.id ] = new THREE.BufferGeometry().setFromObject( object );
-
-		}
-
-		info.memory.geometries ++;
-
-	}
-
 	function onObjectRemoved( event ) {
 
 		var object = event.target;
@@ -85,34 +65,6 @@ THREE.WebGLObjects = function ( gl, info ) {
 
 	//
 
-	function onGeometryDispose( event ) {
-
-		var geometry = event.target;
-
-		geometry.removeEventListener( 'dispose', onGeometryDispose );
-
-		geometry = geometries[ geometry.id ];
-
-		for ( var name in geometry.attributes ) {
-
-			var attribute = geometry.attributes[ name ];
-
-			if ( attribute.buffer !== undefined ) {
-
-				gl.deleteBuffer( attribute.buffer );
-
-				delete attribute.buffer;
-
-			}
-
-		}
-
-		info.memory.geometries --;
-
-	}
-
-	//
-
 	this.objects = objects;
 	this.objectsImmediate = objectsImmediate;
 
@@ -130,18 +82,6 @@ THREE.WebGLObjects = function ( gl, info ) {
 
 		}
 
-		var geometry = object.geometry;
-
-		if ( geometry !== undefined ) {
-
-			if ( geometries[ geometry.id ] === undefined ) {
-
-				initGeometry( object );
-
-			}
-
-		}
-
 		if ( object.__webglActive === undefined) {
 
 			object.__webglActive = true;
@@ -175,7 +115,7 @@ THREE.WebGLObjects = function ( gl, info ) {
 
 		var geometry = geometries.get( object );
 
-		if ( geometry instanceof THREE.DynamicGeometry ) {
+		if ( object.geometry instanceof THREE.DynamicGeometry ) {
 
 			geometry.updateFromObject( object );
 

+ 1 - 0
utils/build/includes/common.json

@@ -154,6 +154,7 @@
 	"src/renderers/WebGLRenderTarget.js",
 	"src/renderers/WebGLRenderTargetCube.js",
 	"src/renderers/webgl/WebGLExtensions.js",
+	"src/renderers/webgl/WebGLGeometries.js",
 	"src/renderers/webgl/WebGLObjects.js",
 	"src/renderers/webgl/WebGLProgram.js",
 	"src/renderers/webgl/WebGLShader.js",