Browse Source

Cleanups: fix memory leak, update only on changes

Removed stats and animation loop, since scene needs update only on
input. Fixed mesh memory leak.
Eric Haines 10 years ago
parent
commit
18637d2595
1 changed files with 45 additions and 55 deletions
  1. 45 55
      examples/webgl_buffergeometry_teapot.html

+ 45 - 55
examples/webgl_buffergeometry_teapot.html

@@ -28,9 +28,6 @@
 
 
 			a { color: blue; }
 			a { color: blue; }
 
 
-			#stats #fps { background: transparent !important }
-			#stats #fps #fpsText { color: #444 !important }
-			#stats #fps #fpsGraph { display: none }
 		</style>
 		</style>
 	</head>
 	</head>
 	<body>
 	<body>
@@ -43,7 +40,6 @@
 		<script src="js/controls/OrbitControls.js"></script>
 		<script src="js/controls/OrbitControls.js"></script>
 
 
 		<script src="js/Detector.js"></script>
 		<script src="js/Detector.js"></script>
-		<script src="js/libs/stats.min.js"></script>
 
 
 		<script src='js/libs/dat.gui.min.js'></script>
 		<script src='js/libs/dat.gui.min.js'></script>
 
 
@@ -54,14 +50,13 @@
 			////////////////////////////////////////////////////////////////////////////////
 			////////////////////////////////////////////////////////////////////////////////
 			// Utah/Newell Teapot demo
 			// Utah/Newell Teapot demo
 			////////////////////////////////////////////////////////////////////////////////
 			////////////////////////////////////////////////////////////////////////////////
-			/*global THREE, requestAnimationFrame, Detector, container, Stats, dat, window */
+			/*global THREE, Detector, container, dat, window */
 
 
 			if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
 			if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
 
 
-			var camera, scene, sceneCube, renderer, stats;
+			var camera, scene, sceneCube, renderer;
 			var cameraControls;
 			var cameraControls;
 			var effectController;
 			var effectController;
-			var clock = new THREE.Clock();
 			var teapotSize = 400;
 			var teapotSize = 400;
 			var ambientLight, light;
 			var ambientLight, light;
 			var skybox;
 			var skybox;
@@ -75,12 +70,14 @@
 			var shading;
 			var shading;
 			var wireMaterial, flatMaterial, gouraudMaterial, phongMaterial, texturedMaterial, reflectiveMaterial;
 			var wireMaterial, flatMaterial, gouraudMaterial, phongMaterial, texturedMaterial, reflectiveMaterial;
 
 
+			var teapot, teapotMesh;
+
 			// allocate these just once
 			// allocate these just once
 			var diffuseColor = new THREE.Color();
 			var diffuseColor = new THREE.Color();
 			var specularColor = new THREE.Color();
 			var specularColor = new THREE.Color();
 
 
 			init();
 			init();
-			animate();
+			render();
 
 
 			function init() {
 			function init() {
 
 
@@ -108,18 +105,13 @@
 				renderer.gammaOutput = true;
 				renderer.gammaOutput = true;
 				container.appendChild( renderer.domElement );
 				container.appendChild( renderer.domElement );
 
 
-				// STATS
-				stats = new Stats();
-				stats.domElement.style.position = 'absolute';
-				stats.domElement.style.top = '0px';
-				container.appendChild( stats.domElement );
-
 				// EVENTS
 				// EVENTS
 				window.addEventListener( 'resize', onWindowResize, false );
 				window.addEventListener( 'resize', onWindowResize, false );
 
 
 				// CONTROLS
 				// CONTROLS
 				cameraControls = new THREE.OrbitControls( camera, renderer.domElement );
 				cameraControls = new THREE.OrbitControls( camera, renderer.domElement );
 				cameraControls.target.set( 0, 0, 0 );
 				cameraControls.target.set( 0, 0, 0 );
+				cameraControls.addEventListener( 'change', render );
 
 
 				// TEXTURE MAP
 				// TEXTURE MAP
 				var textureMap = THREE.ImageUtils.loadTexture( 'textures/UV_Grid_Sm.jpg' );
 				var textureMap = THREE.ImageUtils.loadTexture( 'textures/UV_Grid_Sm.jpg' );
@@ -187,6 +179,8 @@
 				camera.aspect = canvasWidth / canvasHeight;
 				camera.aspect = canvasWidth / canvasHeight;
 				camera.updateProjectionMatrix();
 				camera.updateProjectionMatrix();
 
 
+				render();
+
 			}
 			}
 
 
 			function setupGui() {
 			function setupGui() {
@@ -229,66 +223,54 @@
 
 
 				h = gui.addFolder( "Material control" );
 				h = gui.addFolder( "Material control" );
 
 
-				h.add( effectController, "shininess", 1.0, 400.0, 1.0 ).name( "shininess" );
-				h.add( effectController, "kd", 0.0, 1.0, 0.025 ).name( "diffuse strength" );
-				h.add( effectController, "ks", 0.0, 1.0, 0.025 ).name( "specular strength" );
-				h.add( effectController, "metallic" );
+				h.add( effectController, "shininess", 1.0, 400.0, 1.0 ).name( "shininess" ).onChange( render );
+				h.add( effectController, "kd", 0.0, 1.0, 0.025 ).name( "diffuse strength" ).onChange( render );
+				h.add( effectController, "ks", 0.0, 1.0, 0.025 ).name( "specular strength" ).onChange( render );
+				h.add( effectController, "metallic" ).onChange( render );
 
 
 				// material (color)
 				// material (color)
 
 
 				h = gui.addFolder( "Material color" );
 				h = gui.addFolder( "Material color" );
 
 
-				h.add( effectController, "hue", 0.0, 1.0, 0.025 ).name( "hue" );
-				h.add( effectController, "saturation", 0.0, 1.0, 0.025 ).name( "saturation" );
-				h.add( effectController, "lightness", 0.0, 1.0, 0.025 ).name( "lightness" );
+				h.add( effectController, "hue", 0.0, 1.0, 0.025 ).name( "hue" ).onChange( render );
+				h.add( effectController, "saturation", 0.0, 1.0, 0.025 ).name( "saturation" ).onChange( render );
+				h.add( effectController, "lightness", 0.0, 1.0, 0.025 ).name( "lightness" ).onChange( render );
 
 
 				// light (point)
 				// light (point)
 
 
 				h = gui.addFolder( "Lighting" );
 				h = gui.addFolder( "Lighting" );
 
 
-				h.add( effectController, "lhue", 0.0, 1.0, 0.025 ).name( "hue" );
-				h.add( effectController, "lsaturation", 0.0, 1.0, 0.025 ).name( "saturation" );
-				h.add( effectController, "llightness", 0.0, 1.0, 0.025 ).name( "lightness" );
-				h.add( effectController, "ka", 0.0, 1.0, 0.025 ).name( "ambient" );
+				h.add( effectController, "lhue", 0.0, 1.0, 0.025 ).name( "hue" ).onChange( render );
+				h.add( effectController, "lsaturation", 0.0, 1.0, 0.025 ).name( "saturation" ).onChange( render );
+				h.add( effectController, "llightness", 0.0, 1.0, 0.025 ).name( "lightness" ).onChange( render );
+				h.add( effectController, "ka", 0.0, 1.0, 0.025 ).name( "ambient" ).onChange( render );
 
 
 				// light (directional)
 				// light (directional)
 
 
 				h = gui.addFolder( "Light direction" );
 				h = gui.addFolder( "Light direction" );
 
 
-				h.add( effectController, "lx", -1.0, 1.0, 0.025 ).name( "x" );
-				h.add( effectController, "ly", -1.0, 1.0, 0.025 ).name( "y" );
-				h.add( effectController, "lz", -1.0, 1.0, 0.025 ).name( "z" );
+				h.add( effectController, "lx", -1.0, 1.0, 0.025 ).name( "x" ).onChange( render );
+				h.add( effectController, "ly", -1.0, 1.0, 0.025 ).name( "y" ).onChange( render );
+				h.add( effectController, "lz", -1.0, 1.0, 0.025 ).name( "z" ).onChange( render );
 
 
 				h = gui.addFolder( "Tessellation control" );
 				h = gui.addFolder( "Tessellation control" );
-				h.add( effectController, "newTess", [ 2, 3, 4, 5, 6, 8, 10, 15, 20, 30, 40, 50 ] ).name( "Tessellation Level" );
-				h.add( effectController, "lid" ).name( "display lid" );
-				h.add( effectController, "body" ).name( "display body" );
-				h.add( effectController, "bottom" ).name( "display bottom" );
-				h.add( effectController, "fitLid" ).name( "snug lid" );
-				h.add( effectController, "nonblinn" ).name( "original scale" );
+				h.add( effectController, "newTess", [ 2, 3, 4, 5, 6, 8, 10, 15, 20, 30, 40, 50 ] ).name( "Tessellation Level" ).onChange( render );
+				h.add( effectController, "lid" ).name( "display lid" ).onChange( render );
+				h.add( effectController, "body" ).name( "display body" ).onChange( render );
+				h.add( effectController, "bottom" ).name( "display bottom" ).onChange( render );
+				h.add( effectController, "fitLid" ).name( "snug lid" ).onChange( render );
+				h.add( effectController, "nonblinn" ).name( "original scale" ).onChange( render );
 
 
 				// shading
 				// shading
-				h = gui.add( effectController, "newShading", [ "wireframe", "flat", "smooth", "glossy", "textured", "reflective" ] ).name( "Shading" );
+				h = gui.add( effectController, "newShading", [ "wireframe", "flat", "smooth", "glossy", "textured", "reflective" ] ).name( "Shading" ).onChange( render );
 
 
 			}
 			}
 
 
 
 
 			//
 			//
 
 
-			function animate() {
-
-				requestAnimationFrame( animate );
-				render();
-				stats.update();
-
-			}
-
 			function render() {
 			function render() {
 
 
-				var delta = clock.getDelta();
-
-				cameraControls.update( delta );
-
 				if ( effectController.newTess !== tess ||
 				if ( effectController.newTess !== tess ||
 					effectController.bottom !== bBottom ||
 					effectController.bottom !== bBottom ||
 					effectController.lid !== bLid ||
 					effectController.lid !== bLid ||
@@ -376,15 +358,23 @@
 
 
 				scene.add( ambientLight );
 				scene.add( ambientLight );
 				scene.add( light );
 				scene.add( light );
+				
+				if ( teapotMesh !== undefined ) {
+
+					teapotMesh.dispose();
+					
+				}
+
+				teapotMesh = new THREE.TeapotBufferGeometry( teapotSize,
+					tess,
+					effectController.bottom,
+					effectController.lid,
+					effectController.body,
+					effectController.fitLid,
+					! effectController.nonblinn );
 
 
-				var teapot = new THREE.Mesh(
-					new THREE.TeapotBufferGeometry( teapotSize,
-							tess,
-							effectController.bottom,
-							effectController.lid,
-							effectController.body,
-							effectController.fitLid,
-							! effectController.nonblinn ),
+				teapot = new THREE.Mesh(
+					teapotMesh,
 					shading === "wireframe" ? wireMaterial : (
 					shading === "wireframe" ? wireMaterial : (
 					shading === "flat" ? flatMaterial : (
 					shading === "flat" ? flatMaterial : (
 					shading === "smooth" ? gouraudMaterial : (
 					shading === "smooth" ? gouraudMaterial : (