From ef4e8f74b22a91c268fe9be05537798371705332 Mon Sep 17 00:00:00 2001 From: sunag Date: Tue, 26 Jul 2022 04:54:39 -0300 Subject: [PATCH 1/4] add MeshPhysicalNodeMaterial --- examples/jsm/nodes/materials/Materials.js | 5 +- .../materials/MeshPhysicalNodeMaterial.js | 38 +++++++++++++ .../materials/MeshStandardNodeMaterial.js | 6 --- .../renderers/webgl/nodes/WebGLNodeBuilder.js | 54 ++++++++++++++----- 4 files changed, 84 insertions(+), 19 deletions(-) create mode 100644 examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js diff --git a/examples/jsm/nodes/materials/Materials.js b/examples/jsm/nodes/materials/Materials.js index aadfb633f29240..853123a6da3167 100644 --- a/examples/jsm/nodes/materials/Materials.js +++ b/examples/jsm/nodes/materials/Materials.js @@ -2,6 +2,7 @@ import NodeMaterial from './NodeMaterial.js'; import LineBasicNodeMaterial from './LineBasicNodeMaterial.js'; import MeshBasicNodeMaterial from './MeshBasicNodeMaterial.js'; import MeshStandardNodeMaterial from './MeshStandardNodeMaterial.js'; +import MeshPhysicalNodeMaterial from './MeshPhysicalNodeMaterial.js'; import PointsNodeMaterial from './PointsNodeMaterial.js'; import SpriteNodeMaterial from './SpriteNodeMaterial.js'; @@ -10,6 +11,7 @@ export { LineBasicNodeMaterial, MeshBasicNodeMaterial, MeshStandardNodeMaterial, + MeshPhysicalNodeMaterial, PointsNodeMaterial, SpriteNodeMaterial }; @@ -21,8 +23,9 @@ NodeMaterial.fromMaterial = function ( material ) { LineBasicNodeMaterial, MeshBasicNodeMaterial, MeshStandardNodeMaterial, + MeshPhysicalNodeMaterial, PointsNodeMaterial, - SpriteNodeMaterial, + SpriteNodeMaterial }; const type = material.type.replace( 'Material', 'NodeMaterial' ); diff --git a/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js b/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js new file mode 100644 index 00000000000000..2836a014e87ce8 --- /dev/null +++ b/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js @@ -0,0 +1,38 @@ +import MeshStandardNodeMaterial from './MeshStandardNodeMaterial.js'; + +import { MeshPhysicalMaterial } from 'three'; + +const defaultValues = new MeshPhysicalMaterial(); + +export default class MeshPhysicalNodeMaterial extends MeshStandardNodeMaterial { + + constructor( parameters ) { + + super(); + + this.isMeshPhysicalNodeMaterial = true; + + this.clearcoatNode = null; + this.clearcoatRoughnessNode = null; + this.clearcoatNormalNode = null; + + this.clearcoat = 0; + this.iridescence = 0; + + this.setDefaultValues( defaultValues ); + + this.setValues( parameters ); + + } + + copy( source ) { + + this.clearcoatNode = source.clearcoatNode; + this.clearcoatRoughnessNode = source.clearcoatRoughnessNode; + this.clearcoatNormalNode = source.clearcoatNormalNode; + + return super.copy( source ); + + } + +} diff --git a/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js b/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js index 23287e1f3d13a8..a4bd5ecead0f60 100644 --- a/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +++ b/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js @@ -35,9 +35,6 @@ export default class MeshStandardNodeMaterial extends NodeMaterial { this.metalnessNode = null; this.roughnessNode = null; - this.clearcoatNode = null; - this.clearcoatRoughnessNode = null; - this.envNode = null; this.lightsNode = null; @@ -158,9 +155,6 @@ export default class MeshStandardNodeMaterial extends NodeMaterial { this.metalnessNode = source.metalnessNode; this.roughnessNode = source.roughnessNode; - this.clearcoatNode = source.clearcoatNode; - this.clearcoatRoughnessNode = source.clearcoatRoughnessNode; - this.envNode = source.envNode; this.lightsNode = source.lightsNode; diff --git a/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js b/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js index 7d4bcf9ef37a6c..12e0c876e5a059 100644 --- a/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +++ b/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js @@ -14,7 +14,8 @@ const nodeShaderLib = { LineBasicNodeMaterial: ShaderLib.basic, MeshBasicNodeMaterial: ShaderLib.basic, PointsNodeMaterial: ShaderLib.points, - MeshStandardNodeMaterial: ShaderLib.standard + MeshStandardNodeMaterial: ShaderLib.standard, + MeshPhysicalMaterial: ShaderLib.physical }; function getIncludeSnippet( name ) { @@ -70,7 +71,8 @@ class WebGLNodeBuilder extends NodeBuilder { // shader lib - if ( material.isMeshStandardNodeMaterial ) type = 'MeshStandardNodeMaterial'; + if ( material.isMeshPhysicalNodeMaterial ) type = 'MeshPhysicalMaterial'; + else if ( material.isMeshStandardNodeMaterial ) type = 'MeshStandardNodeMaterial'; else if ( material.isMeshBasicNodeMaterial ) type = 'MeshBasicNodeMaterial'; else if ( material.isPointsNodeMaterial ) type = 'PointsNodeMaterial'; else if ( material.isLineBasicNodeMaterial ) type = 'LineBasicNodeMaterial'; @@ -130,15 +132,31 @@ class WebGLNodeBuilder extends NodeBuilder { } - if ( material.clearcoatNode && material.clearcoatNode.isNode ) { + if ( material.isMeshPhysicalNodeMaterial ) { - this.addSlot( 'fragment', new SlotNode( material.clearcoatNode, 'CLEARCOAT', 'float' ) ); + if ( material.clearcoatNode && material.clearcoatNode.isNode ) { - } + this.addSlot( 'fragment', new SlotNode( material.clearcoatNode, 'CLEARCOAT', 'float' ) ); + + if ( material.clearcoatRoughnessNode && material.clearcoatRoughnessNode.isNode ) { + + this.addSlot( 'fragment', new SlotNode( material.clearcoatRoughnessNode, 'CLEARCOAT_ROUGHNESS', 'float' ) ); + + } - if ( material.clearcoatRoughnessNode && material.clearcoatRoughnessNode.isNode ) { + if ( material.clearcoatNormalNode && material.clearcoatNormalNode.isNode ) { - this.addSlot( 'fragment', new SlotNode( material.clearcoatRoughnessNode, 'CLEARCOAT_ROUGHNESS', 'float' ) ); + this.addSlot( 'fragment', new SlotNode( material.clearcoatNormalNode, 'CLEARCOAT_NORMAL', 'vec3' ) ); + + } + + material.defines.USE_CLEARCOAT = ''; + + } else { + + delete material.defines.USE_CLEARCOAT; + + } } @@ -319,7 +337,7 @@ class WebGLNodeBuilder extends NodeBuilder { const shaderProperty = getShaderStageProperty( shaderStage ); - this.shader[ shaderProperty ] = this.shader[ shaderProperty ].replaceAll( source, target ); + this[ shaderProperty ] = this[ shaderProperty ].replaceAll( source, target ); } @@ -433,6 +451,7 @@ ${this.shader[ getShaderStageProperty( shaderStage ) ]} _addSnippets() { this.parseInclude( 'fragment', 'lights_physical_fragment' ); + this.parseInclude( 'fragment', 'clearcoat_normal_fragment_begin' ); const colorSlot = this.getSlot( 'fragment', 'COLOR' ); const opacityNode = this.getSlot( 'fragment', 'OPACITY' ); @@ -442,6 +461,7 @@ ${this.shader[ getShaderStageProperty( shaderStage ) ]} const metalnessNode = this.getSlot( 'fragment', 'METALNESS' ); const clearcoatNode = this.getSlot( 'fragment', 'CLEARCOAT' ); const clearcoatRoughnessNode = this.getSlot( 'fragment', 'CLEARCOAT_ROUGHNESS' ); + const clearcoatNormalNode = this.getSlot( 'fragment', 'CLEARCOAT_NORMAL' ); const iridescenceNode = this.getSlot( 'fragment', 'IRIDESCENCE' ); const iridescenceIORNode = this.getSlot( 'fragment', 'IRIDESCENCE_IOR' ); const iridescenceThicknessNode = this.getSlot( 'fragment', 'IRIDESCENCE_THICKNESS' ); @@ -513,7 +533,7 @@ ${this.shader[ getShaderStageProperty( shaderStage ) ]} this.addCodeAfterSnippet( 'fragment', - 'material.clearcoatRoughness = clearcoatRoughness;', + 'material.clearcoat = clearcoat;', `${clearcoatNode.code}\n\tmaterial.clearcoat = ${clearcoatNode.result};` ); @@ -529,9 +549,19 @@ ${this.shader[ getShaderStageProperty( shaderStage ) ]} } - if ( iridescenceNode !== undefined ) { + if ( clearcoatNormalNode !== undefined ) { this.addCodeAfterSnippet( + 'fragment', + 'vec3 clearcoatNormal = geometryNormal;', + `${clearcoatNormalNode.code}\n\tclearcoatNormal = ${clearcoatNormalNode.result};` + ); + + } + + if ( iridescenceNode !== undefined ) { + + this.addCodeAfterInclude( 'fragment', 'iridescence_fragment', `${iridescenceNode.code}\n\tmaterial.iridescence = ${iridescenceNode.result};` @@ -541,7 +571,7 @@ ${this.shader[ getShaderStageProperty( shaderStage ) ]} if ( iridescenceIORNode !== undefined ) { - this.addCodeAfterSnippet( + this.addCodeAfterInclude( 'fragment', 'iridescence_fragment', `${iridescenceIORNode.code}\n\tmaterial.iridescenceIOR = ${iridescenceIORNode.result};` @@ -551,7 +581,7 @@ ${this.shader[ getShaderStageProperty( shaderStage ) ]} if ( iridescenceThicknessNode !== undefined ) { - this.addCodeAfterSnippet( + this.addCodeAfterInclude( 'fragment', 'iridescence_fragment', `${iridescenceThicknessNode.code}\n\tmaterial.iridescenceThickness = ${iridescenceThicknessNode.result};` From 1b95ee2710ea4e395c508ab813d7f60f30c9365a Mon Sep 17 00:00:00 2001 From: sunag Date: Tue, 26 Jul 2022 04:55:36 -0300 Subject: [PATCH 2/4] add example: webgl clearcoat using nodes --- examples/files.json | 1 + ...bgl_materials_physical_clearcoat_nodes.jpg | Bin 0 -> 31931 bytes ...gl_materials_physical_clearcoat_nodes.html | 256 ++++++++++++++++++ 3 files changed, 257 insertions(+) create mode 100644 examples/screenshots/webgl_materials_physical_clearcoat_nodes.jpg create mode 100644 examples/webgl_materials_physical_clearcoat_nodes.html diff --git a/examples/files.json b/examples/files.json index 45199a3d76aabd..a48c92382d111d 100644 --- a/examples/files.json +++ b/examples/files.json @@ -229,6 +229,7 @@ ], "webgl / nodes": [ "webgl_materials_instance_uniform_nodes", + "webgl_materials_physical_clearcoat_nodes", "webgl_materials_standard_nodes", "webgl_nodes_playground", "webgl_points_nodes" diff --git a/examples/screenshots/webgl_materials_physical_clearcoat_nodes.jpg b/examples/screenshots/webgl_materials_physical_clearcoat_nodes.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9827e23d95ce1c200026be84f02e849d04542860 GIT binary patch literal 31931 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

`Fkj?I-u%yHEk;aCR@PnE?&97 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 MT>k)cQ<(?<*)Ifq#sB~S literal 0 HcmV?d00001 diff --git a/examples/webgl_materials_physical_clearcoat_nodes.html b/examples/webgl_materials_physical_clearcoat_nodes.html new file mode 100644 index 00000000000000..5ccdfcf22299f9 --- /dev/null +++ b/examples/webgl_materials_physical_clearcoat_nodes.html @@ -0,0 +1,256 @@ + + + + three.js webgl - materials - clearcoat nodes + + + + + +

+ three.js webgl - materials - clearcoat nodes +
+ + + + + + + + + + From e6105cc4331ae1ceae82c55f15226cb1a0ce457d Mon Sep 17 00:00:00 2001 From: sunag Date: Tue, 26 Jul 2022 05:10:40 -0300 Subject: [PATCH 3/4] cleanup --- examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js b/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js index 12e0c876e5a059..a0b10eab7dddc3 100644 --- a/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +++ b/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js @@ -268,9 +268,7 @@ class WebGLNodeBuilder extends NodeBuilder { const attributes = this.attributes; - for ( let index = 0; index < attributes.length; index ++ ) { - - const attribute = attributes[ index ]; + for ( const attribute of attributes ) { // ignore common attributes to prevent redefinitions if ( attribute.name === 'uv' || attribute.name === 'position' || attribute.name === 'normal' ) @@ -292,9 +290,7 @@ class WebGLNodeBuilder extends NodeBuilder { const varys = this.varys; - for ( let index = 0; index < varys.length; index ++ ) { - - const vary = varys[ index ]; + for ( const vary of varys ) { snippet += `varying ${vary.type} ${vary.name}; `; From fce542c921a8e4fc7c95cafd5e80b9e2301757d7 Mon Sep 17 00:00:00 2001 From: sunag Date: Tue, 26 Jul 2022 05:39:19 -0300 Subject: [PATCH 4/4] add dafaultValues --- examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js b/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js index 2836a014e87ce8..0b07a3f7dae2a7 100644 --- a/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +++ b/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js @@ -16,8 +16,10 @@ export default class MeshPhysicalNodeMaterial extends MeshStandardNodeMaterial { this.clearcoatRoughnessNode = null; this.clearcoatNormalNode = null; + this.sheen = 0; this.clearcoat = 0; this.iridescence = 0; + this.transmission = 0; this.setDefaultValues( defaultValues );