소스 검색

Made light proxy and emitter scenes in DeferredHelper per scene instead of global.

alteredq 12 년 전
부모
커밋
77d6bc5e34
1개의 변경된 파일43개의 추가작업 그리고 32개의 파일을 삭제
  1. 43 32
      examples/js/DeferredHelper.js

+ 43 - 32
examples/js/DeferredHelper.js

@@ -12,18 +12,6 @@ THREE.DeferredHelper = function ( parameters ) {
 
 	var additiveSpecular = parameters.additiveSpecular;
 
-	// scene for light proxy geometry
-
-	var lightScene = new THREE.Scene();
-	lightNode = new THREE.Object3D();
-	lightScene.add( lightNode );
-
-	// scene for the coloured emitter spheres
-
-	var emitterScene = new THREE.Scene();
-	emitterNode = new THREE.Object3D();
-	emitterScene.add( emitterNode );
-
 	//
 
 	var geometryEmitter = new THREE.SphereGeometry( 0.7, 7, 7 );
@@ -52,6 +40,8 @@ THREE.DeferredHelper = function ( parameters ) {
 	var compColor, compNormal, compDepth, compEmitter, compLightBuffer, compFinal, compositePass;
 	var passColor, passNormal, passDepth, passEmitter, passLight;
 
+	var emitterScene, lightScene;
+
 	//
 
 	var defaultNormalMaterial = new THREE.ShaderMaterial( {
@@ -83,7 +73,7 @@ THREE.DeferredHelper = function ( parameters ) {
 
 	//
 
-	var addDeferredMaterials = function ( object ) {
+	var initDeferredMaterials = function ( object ) {
 
 		var originalMaterial = object.material;
 
@@ -211,13 +201,11 @@ THREE.DeferredHelper = function ( parameters ) {
 
 		}
 
-		object.properties.deferredInitialized = true;
-
 	};
 
-	var addDeferredPointLight = function ( light ) {
+	var createDeferredPointLight = function ( light ) {
 
-		// setup material
+		// setup light material
 
 		var materialLight = new THREE.ShaderMaterial( {
 
@@ -237,14 +225,19 @@ THREE.DeferredHelper = function ( parameters ) {
 		materialLight.uniforms[ "lightIntensity" ].value = light.intensity;
 		materialLight.uniforms[ "lightColor" ].value = light.color;
 
-		// setup proxy geometry for this light
+		// create light proxy mesh
 
 		var geometryLight = new THREE.SphereGeometry( light.distance, 16, 8 );
 		var meshLight = new THREE.Mesh( geometryLight, materialLight );
 		meshLight.position = light.position;
-		lightNode.add( meshLight );
 
-		// create emitter sphere
+		return meshLight;
+
+	};
+
+	var createEmitter = function ( light ) {
+
+		// setup emitter material
 
 		var matEmitter = new THREE.ShaderMaterial( {
 
@@ -257,15 +250,12 @@ THREE.DeferredHelper = function ( parameters ) {
 		matEmitter.uniforms[ "samplerDepth" ].value = compDepth.renderTarget2;
 		matEmitter.uniforms[ "lightColor" ].value = light.color;
 
+		// create emitter mesh
+
 		var meshEmitter = new THREE.Mesh( geometryEmitter, matEmitter );
 		meshEmitter.position = light.position;
-		emitterNode.add( meshEmitter );
 
-		// add emitter to light node
-
-		meshLight.properties.emitter = meshEmitter;
-
-		light.properties.deferredInitialized = true;
+		return meshEmitter;
 
 	};
 
@@ -273,8 +263,19 @@ THREE.DeferredHelper = function ( parameters ) {
 
 		if ( object.properties.deferredInitialized ) return;
 
-		if ( object.material ) addDeferredMaterials( object );
-		if ( object instanceof THREE.PointLight ) addDeferredPointLight( object );
+		if ( object.material ) initDeferredMaterials( object );
+
+		if ( object instanceof THREE.PointLight ) {
+
+			var meshEmitter = createEmitter( object );
+			var meshLight = createDeferredPointLight( object );
+
+			lightScene.add( meshLight );
+			emitterScene.add( meshEmitter );
+
+		}
+
+		object.properties.deferredInitialized = true;
 
 	};
 
@@ -302,6 +303,14 @@ THREE.DeferredHelper = function ( parameters ) {
 
 	this.render = function ( scene, camera ) {
 
+		// setup deferred properties
+
+		if ( ! scene.properties.emitterScene ) scene.properties.emitterScene = new THREE.Scene();
+		if ( ! scene.properties.lightScene ) scene.properties.lightScene = new THREE.Scene();
+
+		emitterScene = scene.properties.emitterScene;
+		lightScene = scene.properties.lightScene;
+
 		passColor.camera = camera;
 		passNormal.camera = camera;
 		passDepth.camera = camera;
@@ -311,6 +320,8 @@ THREE.DeferredHelper = function ( parameters ) {
 		passColor.scene = scene;
 		passNormal.scene = scene;
 		passDepth.scene = scene;
+		passEmitter.scene = emitterScene;
+		passLight.scene = lightScene;
 
 		scene.traverse( initDeferredProperties );
 
@@ -337,9 +348,9 @@ THREE.DeferredHelper = function ( parameters ) {
 
 		camera.projectionMatrixInverse.getInverse( camera.projectionMatrix );
 
-		for ( var i = 0, il = lightNode.children.length; i < il; i ++ ) {
+		for ( var i = 0, il = lightScene.children.length; i < il; i ++ ) {
 
-			var uniforms = lightNode.children[ i ].material.uniforms;
+			var uniforms = lightScene.children[ i ].material.uniforms;
 
 			uniforms[ "matProjInverse" ].value = camera.projectionMatrixInverse;
 			uniforms[ "matView" ].value = camera.matrixWorldInverse;
@@ -386,11 +397,11 @@ THREE.DeferredHelper = function ( parameters ) {
 		compDepth = new THREE.EffectComposer( renderer, rtDepth );
 		compDepth.addPass( passDepth );
 
-		passEmitter = new THREE.RenderPass( emitterScene );
+		passEmitter = new THREE.RenderPass();
 		compEmitter = new THREE.EffectComposer( renderer, rtEmitter );
 		compEmitter.addPass( passEmitter );
 
-		passLight = new THREE.RenderPass( lightScene );
+		passLight = new THREE.RenderPass();
 		compLightBuffer = new THREE.EffectComposer( renderer, rtLight );
 		compLightBuffer.addPass( passLight );