From 423f285d5d868dd128d6f143dc8ec31154018f57 Mon Sep 17 00:00:00 2001 From: Michael Herzog Date: Thu, 1 Aug 2024 13:07:29 +0200 Subject: [PATCH] NodeMaterial: Use `materialReference()` for env maps. (#28982) * NodeMaterial: Use `materialReference()` for env maps. * TSL: Move to TSL approach * Move to TSL approach *2 * EnvironmentNode: Fix PMREM generation. --------- Co-authored-by: sunag --- src/nodes/Nodes.js | 1 + src/nodes/accessors/MaterialNode.js | 5 ----- src/nodes/accessors/MaterialProperties.js | 3 +++ src/nodes/accessors/MaterialReferenceNode.js | 2 ++ src/nodes/accessors/ReferenceNode.js | 5 +++++ src/nodes/accessors/ReflectVectorNode.js | 2 +- src/nodes/lighting/EnvironmentNode.js | 14 ++++++++------ src/nodes/materials/NodeMaterial.js | 4 +--- 8 files changed, 21 insertions(+), 15 deletions(-) create mode 100644 src/nodes/accessors/MaterialProperties.js diff --git a/src/nodes/Nodes.js b/src/nodes/Nodes.js index 23c3c48bbf3a2a..13055672aa7732 100644 --- a/src/nodes/Nodes.js +++ b/src/nodes/Nodes.js @@ -90,6 +90,7 @@ export { default as CubeTextureNode, cubeTexture } from './accessors/CubeTexture export { default as InstanceNode, instance } from './accessors/InstanceNode.js'; export { default as BatchNode, batch } from './accessors/BatchNode.js'; export { default as MaterialNode, materialAlphaTest, materialColor, materialShininess, materialEmissive, materialOpacity, materialSpecular, materialSpecularStrength, materialReflectivity, materialRoughness, materialMetalness, materialNormal, materialClearcoat, materialClearcoatRoughness, materialClearcoatNormal, materialRotation, materialSheen, materialSheenRoughness, materialIridescence, materialIridescenceIOR, materialIridescenceThickness, materialLineScale, materialLineDashSize, materialLineGapSize, materialLineWidth, materialLineDashOffset, materialPointWidth, materialAnisotropy, materialAnisotropyVector, materialDispersion, materialLightMap, materialAOMap } from './accessors/MaterialNode.js'; +export * from './accessors/MaterialProperties.js'; export { default as MaterialReferenceNode, materialReference } from './accessors/MaterialReferenceNode.js'; export { default as RendererReferenceNode, rendererReference } from './accessors/RendererReferenceNode.js'; export { default as MorphNode, morphReference } from './accessors/MorphNode.js'; diff --git a/src/nodes/accessors/MaterialNode.js b/src/nodes/accessors/MaterialNode.js index bac8adee9fa371..2556763151dedc 100644 --- a/src/nodes/accessors/MaterialNode.js +++ b/src/nodes/accessors/MaterialNode.js @@ -320,10 +320,6 @@ class MaterialNode extends Node { node = this.getFloat( scope ); - } else if ( scope === MaterialNode.REFRACTION_RATIO ) { - - node = this.getFloat( scope ); - } else if ( scope === MaterialNode.LIGHT_MAP ) { node = this.getTexture( scope ).rgb.mul( this.getFloat( 'lightMapIntensity' ) ); @@ -383,7 +379,6 @@ MaterialNode.POINT_WIDTH = 'pointWidth'; MaterialNode.DISPERSION = 'dispersion'; MaterialNode.LIGHT_MAP = 'light'; MaterialNode.AO_MAP = 'ao'; -MaterialNode.REFRACTION_RATIO = 'refractionRatio'; export default MaterialNode; diff --git a/src/nodes/accessors/MaterialProperties.js b/src/nodes/accessors/MaterialProperties.js new file mode 100644 index 00000000000000..117214b7422dff --- /dev/null +++ b/src/nodes/accessors/MaterialProperties.js @@ -0,0 +1,3 @@ +import { uniform } from '../core/UniformNode.js'; + +export const materialRefractionRatio = /*@__PURE__*/ uniform( 0 ).onReference( ( { material } ) => material ).onRenderUpdate( ( { material } ) => material.refractionRatio ); diff --git a/src/nodes/accessors/MaterialReferenceNode.js b/src/nodes/accessors/MaterialReferenceNode.js index e52a2f3f015e26..3c1a14fc194704 100644 --- a/src/nodes/accessors/MaterialReferenceNode.js +++ b/src/nodes/accessors/MaterialReferenceNode.js @@ -14,6 +14,8 @@ class MaterialReferenceNode extends ReferenceNode { //this.updateType = NodeUpdateType.RENDER; + this.isMaterialReferenceNode = true; + } /*setNodeType( node ) { diff --git a/src/nodes/accessors/ReferenceNode.js b/src/nodes/accessors/ReferenceNode.js index fe5e8fb05c72ac..70c96059473a38 100644 --- a/src/nodes/accessors/ReferenceNode.js +++ b/src/nodes/accessors/ReferenceNode.js @@ -2,6 +2,7 @@ import Node, { addNodeClass } from '../core/Node.js'; import { NodeUpdateType } from '../core/constants.js'; import { uniform } from '../core/UniformNode.js'; import { texture } from './TextureNode.js'; +import { cubeTexture } from './CubeTextureNode.js'; import { buffer } from './BufferNode.js'; import { nodeObject } from '../shadernode/ShaderNode.js'; import { uniformArray } from './UniformArrayNode.js'; @@ -78,6 +79,10 @@ class ReferenceNode extends Node { node = texture( null ); + } else if ( uniformType === 'cubeTexture' ) { + + node = cubeTexture( null ); + } else { node = uniform( null, uniformType ); diff --git a/src/nodes/accessors/ReflectVectorNode.js b/src/nodes/accessors/ReflectVectorNode.js index 2e5bcd8c278fdf..1868d89703eaf2 100644 --- a/src/nodes/accessors/ReflectVectorNode.js +++ b/src/nodes/accessors/ReflectVectorNode.js @@ -1,7 +1,7 @@ import { cameraViewMatrix } from './CameraNode.js'; import { transformedNormalView } from './NormalNode.js'; import { positionViewDirection } from './PositionNode.js'; -import { materialRefractionRatio } from './MaterialNode.js'; +import { materialRefractionRatio } from './MaterialProperties.js'; export const reflectView = /*#__PURE__*/ positionViewDirection.negate().reflect( transformedNormalView ); export const refractView = /*#__PURE__*/ positionViewDirection.negate().refract( transformedNormalView, materialRefractionRatio ); diff --git a/src/nodes/lighting/EnvironmentNode.js b/src/nodes/lighting/EnvironmentNode.js index 1f4ec55a17ca74..3eff84ca70dff6 100644 --- a/src/nodes/lighting/EnvironmentNode.js +++ b/src/nodes/lighting/EnvironmentNode.js @@ -25,17 +25,21 @@ class EnvironmentNode extends LightingNode { setup( builder ) { + const { material } = builder; + let envNode = this.envNode; - if ( envNode.isTextureNode ) { + if ( envNode.isTextureNode || envNode.isMaterialReferenceNode ) { + + const value = ( envNode.isTextureNode ) ? envNode.value : material[ envNode.property ]; - let cacheEnvNode = _envNodeCache.get( envNode.value ); + let cacheEnvNode = _envNodeCache.get( value ); if ( cacheEnvNode === undefined ) { - cacheEnvNode = pmremTexture( envNode.value ); + cacheEnvNode = pmremTexture( value ); - _envNodeCache.set( envNode.value, cacheEnvNode ); + _envNodeCache.set( value, cacheEnvNode ); } @@ -45,8 +49,6 @@ class EnvironmentNode extends LightingNode { // - const { material } = builder; - const envMap = material.envMap; const intensity = envMap ? reference( 'envMapIntensity', 'float', builder.material ) : reference( 'environmentIntensity', 'float', builder.scene ); // @TODO: Add materialEnvIntensity in MaterialNode diff --git a/src/nodes/materials/NodeMaterial.js b/src/nodes/materials/NodeMaterial.js index b2b4a11e59c9b8..52c96da95a3e37 100644 --- a/src/nodes/materials/NodeMaterial.js +++ b/src/nodes/materials/NodeMaterial.js @@ -13,8 +13,6 @@ import { materialReference } from '../accessors/MaterialReferenceNode.js'; import { positionLocal, positionView } from '../accessors/PositionNode.js'; import { skinningReference } from '../accessors/SkinningNode.js'; import { morphReference } from '../accessors/MorphNode.js'; -import { texture } from '../accessors/TextureNode.js'; -import { cubeTexture } from '../accessors/CubeTextureNode.js'; import { lightsNode } from '../lighting/LightsNode.js'; import { mix } from '../math/MathNode.js'; import { float, vec3, vec4 } from '../shadernode/ShaderNode.js'; @@ -374,7 +372,7 @@ class NodeMaterial extends Material { } else if ( this.envMap ) { - node = this.envMap.isCubeTexture ? cubeTexture( this.envMap ) : texture( this.envMap ); + node = this.envMap.isCubeTexture ? materialReference( 'envMap', 'cubeTexture' ) : materialReference( 'envMap', 'texture' ); }