|
|
@@ -32,7 +32,7 @@ import { Vector4 } from '../../math/Vector4.js';
|
|
|
import { RenderTarget } from '../../core/RenderTarget.js';
|
|
|
import { DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping, LinearFilter, HalfFloatType, RGBAFormat, PCFShadowMap } from '../../constants.js';
|
|
|
|
|
|
-import { float, vec3, vec4 } from '../../nodes/tsl/TSLCore.js';
|
|
|
+import { float, vec3, vec4, Fn } from '../../nodes/tsl/TSLCore.js';
|
|
|
import { reference } from '../../nodes/accessors/ReferenceNode.js';
|
|
|
import { highpModelNormalViewMatrix, highpModelViewMatrix } from '../../nodes/accessors/ModelNode.js';
|
|
|
import { context } from '../../nodes/core/ContextNode.js';
|
|
|
@@ -3035,12 +3035,13 @@ class Renderer {
|
|
|
const hasMap = material.map !== null;
|
|
|
const hasColorNode = material.colorNode && material.colorNode.isNode;
|
|
|
const hasCastShadowNode = material.castShadowNode && material.castShadowNode.isNode;
|
|
|
+ const hasMaskNode = ( material.maskShadowNode && material.maskShadowNode.isNode ) || ( material.maskNode && material.maskNode.isNode );
|
|
|
|
|
|
let positionNode = null;
|
|
|
let colorNode = null;
|
|
|
let depthNode = null;
|
|
|
|
|
|
- if ( hasMap || hasColorNode || hasCastShadowNode ) {
|
|
|
+ if ( hasMap || hasColorNode || hasCastShadowNode || hasMaskNode ) {
|
|
|
|
|
|
let shadowRGB;
|
|
|
let shadowAlpha;
|
|
|
@@ -3071,6 +3072,20 @@ class Renderer {
|
|
|
|
|
|
colorNode = vec4( shadowRGB, shadowAlpha );
|
|
|
|
|
|
+ if ( hasMaskNode ) {
|
|
|
+
|
|
|
+ const maskNode = material.maskShadowNode || material.maskNode;
|
|
|
+
|
|
|
+ colorNode = Fn( ( [ color ] ) => {
|
|
|
+
|
|
|
+ maskNode.not().discard();
|
|
|
+
|
|
|
+ return color;
|
|
|
+
|
|
|
+ } )( colorNode );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
if ( material.depthNode && material.depthNode.isNode ) {
|