Просмотр исходного кода

ShadowNode: Inherit camera.layers only if shadow.camera.layers is not set (#30877)

* ShadowNode: Inherit camera.layers only if shadow.layers is not set

* Fix layers check

* invert condition

* restore after render

* move array creation to module scope
Renaud Rohlinger 9 месяцев назад
Родитель
Сommit
f35e49416e
2 измененных файлов с 32 добавлено и 2 удалено
  1. 23 1
      examples/jsm/tsl/shadows/TileShadowNode.js
  2. 9 1
      src/nodes/lighting/ShadowNode.js

+ 23 - 1
examples/jsm/tsl/shadows/TileShadowNode.js

@@ -19,6 +19,7 @@ import { min, Fn, shadow, NodeUpdateType, getShadowMaterial, getShadowRenderObje
 const { resetRendererAndSceneState, restoreRendererAndSceneState } = RendererUtils;
 let _rendererState;
 
+const _cameraLayers = [];
 const _vec3Temp1 = /*@__PURE__*/ new Vector3();
 const _vec3Temp2 = /*@__PURE__*/ new Vector3();
 const _vec3Temp3 = /*@__PURE__*/ new Vector3();
@@ -279,11 +280,21 @@ class TileShadowNode extends ShadowBaseNode {
 		scene.overrideMaterial = getShadowMaterial( light );
 		renderer.setRenderTarget( this.shadowMap );
 
+
 		for ( let index = 0; index < this.lights.length; index ++ ) {
 
 			const light = this.lights[ index ];
 			const shadow = light.shadow;
-			shadow.camera.layers.mask = camera.layers.mask;
+
+			const _shadowCameraLayer = shadow.camera.layers.mask;
+			_cameraLayers.push( _shadowCameraLayer );
+
+			if ( ( shadow.camera.layers.mask & 0xFFFFFFFE ) === 0 ) {
+
+				shadow.camera.layers.mask = camera.layers.mask;
+
+			}
+
 			shadow.updateMatrices( light );
 
 			renderer.setRenderObjectFunction( getShadowRenderObjectFunction( renderer, shadow, shadowType, useVelocity ) );
@@ -303,6 +314,17 @@ class TileShadowNode extends ShadowBaseNode {
 
 		restoreRendererAndSceneState( renderer, scene, _rendererState );
 
+		for ( let index = 0; index < this.lights.length; index ++ ) {
+
+			const light = this.lights[ index ];
+			const shadow = light.shadow;
+
+			shadow.camera.layers.mask = _cameraLayers[ index ];
+
+		}
+
+		_cameraLayers.length = 0;
+
 	}
 
 	/**

+ 9 - 1
src/nodes/lighting/ShadowNode.js

@@ -569,7 +569,13 @@ class ShadowNode extends ShadowBaseNode {
 		const depthVersion = shadowMap.depthTexture.version;
 		this._depthVersionCached = depthVersion;
 
-		shadow.camera.layers.mask = camera.layers.mask;
+		const _shadowCameraLayer = shadow.camera.layers.mask;
+
+		if ( ( shadow.camera.layers.mask & 0xFFFFFFFE ) === 0 ) {
+
+			shadow.camera.layers.mask = camera.layers.mask;
+
+		}
 
 		const currentRenderObjectFunction = renderer.getRenderObjectFunction();
 
@@ -596,6 +602,8 @@ class ShadowNode extends ShadowBaseNode {
 
 		}
 
+		shadow.camera.layers.mask = _shadowCameraLayer;
+
 		restoreRendererAndSceneState( renderer, scene, _rendererState );
 
 	}

粤ICP备19079148号