瀏覽代碼

Scene: Introduce .dispose()

Mugen87 6 年之前
父節點
當前提交
86383c5ab5

+ 5 - 0
docs/api/en/scenes/Scene.html

@@ -51,6 +51,11 @@
 		Return the scene data in JSON format.
 		</p>
 
+		<h3>[method:null dispose]()</h3>
+		<p>
+		Clears scene related data internally cached by [page:WebGLRenderer].
+		</p>
+
 		<h2>Source</h2>
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]

+ 5 - 0
docs/api/zh/scenes/Scene.html

@@ -54,6 +54,11 @@
 			使用JSON格式返回场景数据。
 		</p>
 
+		<h3>[method:null dispose]()</h3>
+		<p>
+			TODO
+		</p>
+
 		<h2>源代码</h2>
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]

+ 12 - 0
src/renderers/webgl/WebGLRenderLists.js

@@ -152,6 +152,16 @@ function WebGLRenderLists() {
 
 	var lists = {};
 
+	function onSceneDispose( event ) {
+
+		var scene = event.target;
+
+		scene.removeEventListener( 'dispose', onSceneDispose );
+
+		delete lists[ scene.id ];
+
+	}
+
 	function get( scene, camera ) {
 
 		var cameras = lists[ scene.id ];
@@ -162,6 +172,8 @@ function WebGLRenderLists() {
 			lists[ scene.id ] = {};
 			lists[ scene.id ][ camera.id ] = list;
 
+			scene.addEventListener( 'dispose', onSceneDispose );
+
 		} else {
 
 			list = cameras[ camera.id ];

+ 12 - 0
src/renderers/webgl/WebGLRenderStates.js

@@ -58,6 +58,16 @@ function WebGLRenderStates() {
 
 	var renderStates = {};
 
+	function onSceneDispose( event ) {
+
+		var scene = event.target;
+
+		scene.removeEventListener( 'dispose', onSceneDispose );
+
+		delete renderStates[ scene.id ];
+
+	}
+
 	function get( scene, camera ) {
 
 		var renderState;
@@ -68,6 +78,8 @@ function WebGLRenderStates() {
 			renderStates[ scene.id ] = {};
 			renderStates[ scene.id ][ camera.id ] = renderState;
 
+			scene.addEventListener( 'dispose', onSceneDispose );
+
 		} else {
 
 			if ( renderStates[ scene.id ][ camera.id ] === undefined ) {

+ 6 - 0
src/scenes/Scene.js

@@ -46,6 +46,12 @@ Scene.prototype = Object.assign( Object.create( Object3D.prototype ), {
 
 		return data;
 
+	},
+
+	dispose: function () {
+
+		this.dispatchEvent( { type: 'dispose' } );
+
 	}
 
 } );