Переглянути джерело

WebGLObjects: Robustness.

Mr.doob 10 роки тому
батько
коміт
6eb38b498f
2 змінених файлів з 57 додано та 33 видалено
  1. 46 20
      examples/webgl_lines_sphere.html
  2. 11 13
      src/renderers/webgl/WebGLObjects.js

+ 46 - 20
examples/webgl_lines_sphere.html

@@ -81,27 +81,9 @@
 
 				var i, line, vertex1, vertex2, material, p,
 					parameters = [ [ 0.25, 0xff7700, 1, 2 ], [ 0.5, 0xff9900, 1, 1 ], [ 0.75, 0xffaa00, 0.75, 1 ], [ 1, 0xffaa00, 0.5, 1 ], [ 1.25, 0x000833, 0.8, 1 ],
-							       [ 3.0, 0xaaaaaa, 0.75, 2 ], [ 3.5, 0xffffff, 0.5, 1 ], [ 4.5, 0xffffff, 0.25, 1 ], [ 5.5, 0xffffff, 0.125, 1 ] ],
+							       [ 3.0, 0xaaaaaa, 0.75, 2 ], [ 3.5, 0xffffff, 0.5, 1 ], [ 4.5, 0xffffff, 0.25, 1 ], [ 5.5, 0xffffff, 0.125, 1 ] ];
 
-					geometry = new THREE.Geometry();
-
-
-				for ( i = 0; i < 1500; i ++ ) {
-
-					var vertex1 = new THREE.Vector3();
-					vertex1.x = Math.random() * 2 - 1;
-					vertex1.y = Math.random() * 2 - 1;
-					vertex1.z = Math.random() * 2 - 1;
-					vertex1.normalize();
-					vertex1.multiplyScalar( r );
-
-					vertex2 = vertex1.clone();
-					vertex2.multiplyScalar( Math.random() * 0.09 + 1 );
-
-					geometry.vertices.push( vertex1 );
-					geometry.vertices.push( vertex2 );
-
-				}
+				var geometry = createGeometry();
 
 				for( i = 0; i < parameters.length; ++ i ) {
 
@@ -131,6 +113,50 @@
 
 				window.addEventListener( 'resize', onWindowResize, false );
 
+				// test geometry swapability
+
+				setInterval( function () {
+
+					var geometry = createGeometry();
+
+					scene.traverse( function ( object ) {
+
+						if ( object instanceof THREE.Line ) {
+
+							object.geometry.dispose();
+							object.geometry = geometry;
+
+						}
+
+					} );
+
+				}, 1000 );
+
+			}
+
+			function createGeometry() {
+
+				var geometry = new THREE.Geometry();
+
+				for ( i = 0; i < 1500; i ++ ) {
+
+					var vertex1 = new THREE.Vector3();
+					vertex1.x = Math.random() * 2 - 1;
+					vertex1.y = Math.random() * 2 - 1;
+					vertex1.z = Math.random() * 2 - 1;
+					vertex1.normalize();
+					vertex1.multiplyScalar( r );
+
+					vertex2 = vertex1.clone();
+					vertex2.multiplyScalar( Math.random() * 0.09 + 1 );
+
+					geometry.vertices.push( vertex1 );
+					geometry.vertices.push( vertex2 );
+
+				}
+
+				return geometry;
+
 			}
 
 			function onWindowResize() {

+ 11 - 13
src/renderers/webgl/WebGLObjects.js

@@ -134,7 +134,11 @@ THREE.WebGLObjects = function ( gl, info ) {
 
 		if ( geometry !== undefined ) {
 
-			initGeometry( object );
+			if ( geometries[ geometry.id ] === undefined ) {
+
+				initGeometry( object );
+
+			}
 
 		}
 
@@ -169,23 +173,17 @@ THREE.WebGLObjects = function ( gl, info ) {
 
 	this.update = function ( object ) {
 
-		var geometry = object.geometry;
-
-		if ( geometry instanceof THREE.Geometry ) {
+		if ( geometries[ object.geometry.id ] === undefined ) {
 
-			geometry = geometries[ geometry.id ];
-
-			if ( geometry === undefined ) {
-
-				initGeometry( object );
+			initGeometry( object );
 
-				geometry = geometries[ geometry.id ];
+		}
 
-			} else {
+		var geometry = geometries[ object.geometry.id ];
 
-				geometry.updateFromObject( object );
+		if ( object.geometry instanceof THREE.Geometry ) {
 
-			}
+			geometry.updateFromObject( object );
 
 		}