diff --git a/examples/webgpu_clipping.html b/examples/webgpu_clipping.html index 39128b2865d219..90bf8022c60b5d 100644 --- a/examples/webgpu_clipping.html +++ b/examples/webgpu_clipping.html @@ -107,8 +107,6 @@ color: 0x80ee10, shininess: 0, side: THREE.DoubleSide, - - // ***** Clipping setup (material): ***** alphaToCoverage: true } ); diff --git a/src/materials/nodes/NodeMaterial.js b/src/materials/nodes/NodeMaterial.js index 5efbcbc3edc539..13f990fd320111 100644 --- a/src/materials/nodes/NodeMaterial.js +++ b/src/materials/nodes/NodeMaterial.js @@ -84,16 +84,6 @@ class NodeMaterial extends Material { */ this.lights = false; - /** - * Whether this material uses hardware clipping or not. - * This property is managed by the engine and should not be - * modified by apps. - * - * @type {boolean} - * @default false - */ - this.hardwareClipping = false; - /** * Node materials which set their `lights` property to `true` * are affected by all lights of the scene. Sometimes selective @@ -656,7 +646,7 @@ class NodeMaterial extends Material { */ setupHardwareClipping( builder ) { - this.hardwareClipping = false; + builder.hardwareClipping = false; if ( builder.clippingContext === null ) return; @@ -668,7 +658,7 @@ class NodeMaterial extends Material { builder.stack.addToStack( hardwareClipping() ); - this.hardwareClipping = true; + builder.hardwareClipping = true; } diff --git a/src/nodes/accessors/ClippingNode.js b/src/nodes/accessors/ClippingNode.js index 3c14e70508120b..8a2f072ea6c8cd 100644 --- a/src/nodes/accessors/ClippingNode.js +++ b/src/nodes/accessors/ClippingNode.js @@ -57,7 +57,7 @@ class ClippingNode extends Node { const clippingContext = builder.clippingContext; const { intersectionPlanes, unionPlanes } = clippingContext; - this.hardwareClipping = builder.material.hardwareClipping; + this.hardwareClipping = builder.hardwareClipping; if ( this.scope === ClippingNode.ALPHA_TO_COVERAGE ) { diff --git a/src/nodes/core/NodeBuilder.js b/src/nodes/core/NodeBuilder.js index d35b66e0eb14a8..92084e93a64d93 100644 --- a/src/nodes/core/NodeBuilder.js +++ b/src/nodes/core/NodeBuilder.js @@ -216,6 +216,14 @@ class NodeBuilder { */ this.clippingContext = null; + /** + * Whether the built material uses hardware clipping or not. + * + * @type {boolean} + * @default false + */ + this.hardwareClipping = false; + /** * The generated vertex shader. * diff --git a/src/renderers/common/RenderObject.js b/src/renderers/common/RenderObject.js index a50a9e62af6a71..f5a8db798ea18a 100644 --- a/src/renderers/common/RenderObject.js +++ b/src/renderers/common/RenderObject.js @@ -365,7 +365,7 @@ class RenderObject { */ get hardwareClippingPlanes() { - return this.material.hardwareClipping === true ? this.clippingContext.unionClippingCount : 0; + return this.getNodeBuilderState().hardwareClipping === true ? this.clippingContext.unionClippingCount : 0; } diff --git a/src/renderers/common/nodes/NodeBuilderState.js b/src/renderers/common/nodes/NodeBuilderState.js index d59209fb7fb114..5b7f90756cf485 100644 --- a/src/renderers/common/nodes/NodeBuilderState.js +++ b/src/renderers/common/nodes/NodeBuilderState.js @@ -23,9 +23,10 @@ class NodeBuilderState { * @param {Array} updateBeforeNodes - An array of nodes that implement their `updateBefore()` method. * @param {Array} updateAfterNodes - An array of nodes that implement their `updateAfter()` method. * @param {NodeMaterialObserver} observer - A node material observer. + * @param {boolean} hardwareClipping - Whether the built material uses hardware clipping or not. * @param {Array} transforms - An array with transform attribute objects. Only relevant when using compute shaders with WebGL 2. */ - constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes, updateAfterNodes, observer, transforms = [] ) { + constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes, updateAfterNodes, observer, hardwareClipping, transforms = [] ) { /** * The native vertex shader code. @@ -100,6 +101,13 @@ class NodeBuilderState { */ this.observer = observer; + /** + * Whether the built material uses hardware clipping or not. + * + * @type {boolean} + */ + this.hardwareClipping = hardwareClipping; + /** * How often this state is used by render objects. * diff --git a/src/renderers/common/nodes/NodeManager.js b/src/renderers/common/nodes/NodeManager.js index 6a8864bae8bbc3..8c6ddde8f664ca 100644 --- a/src/renderers/common/nodes/NodeManager.js +++ b/src/renderers/common/nodes/NodeManager.js @@ -483,6 +483,7 @@ class NodeManager extends DataMap { nodeBuilder.updateBeforeNodes, nodeBuilder.updateAfterNodes, nodeBuilder.observer, + nodeBuilder.hardwareClipping, nodeBuilder.transforms );