@babylonjs/core 8.9.0 → 8.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AudioV2/abstractAudio/abstractSound.d.ts +0 -7
- package/AudioV2/abstractAudio/abstractSound.js.map +1 -1
- package/AudioV2/abstractAudio/abstractSoundSource.d.ts +6 -3
- package/AudioV2/abstractAudio/abstractSoundSource.js +1 -2
- package/AudioV2/abstractAudio/abstractSoundSource.js.map +1 -1
- package/AudioV2/webAudio/webAudioEngine.js +4 -1
- package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
- package/AudioV2/webAudio/webAudioSoundSource.js +1 -1
- package/AudioV2/webAudio/webAudioSoundSource.js.map +1 -1
- package/AudioV2/webAudio/webAudioStaticSound.js +1 -1
- package/AudioV2/webAudio/webAudioStaticSound.js.map +1 -1
- package/AudioV2/webAudio/webAudioStreamingSound.js +1 -1
- package/AudioV2/webAudio/webAudioStreamingSound.js.map +1 -1
- package/Collisions/gpuPicker.d.ts +3 -0
- package/Collisions/gpuPicker.js +26 -2
- package/Collisions/gpuPicker.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheBindGroups.js +4 -4
- package/Engines/WebGPU/webgpuCacheBindGroups.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js +16 -1
- package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/csmShadowGeneratorBlock.d.ts +3 -0
- package/FrameGraph/Node/Blocks/Rendering/csmShadowGeneratorBlock.js +13 -0
- package/FrameGraph/Node/Blocks/Rendering/csmShadowGeneratorBlock.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.d.ts +7 -0
- package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js +17 -0
- package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js.map +1 -1
- package/FrameGraph/frameGraph.d.ts +2 -0
- package/FrameGraph/frameGraph.js +2 -0
- package/FrameGraph/frameGraph.js.map +1 -1
- package/Gizmos/planeRotationGizmo.js +1 -1
- package/Gizmos/planeRotationGizmo.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +2 -4
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
- package/Materials/Node/Blocks/GaussianSplatting/gaussianBlock.d.ts +8 -0
- package/Materials/Node/Blocks/GaussianSplatting/gaussianBlock.js +23 -3
- package/Materials/Node/Blocks/GaussianSplatting/gaussianBlock.js.map +1 -1
- package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.d.ts +13 -0
- package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.js +44 -0
- package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.js.map +1 -1
- package/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.js +3 -0
- package/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/subSurfaceBlock.js +4 -1
- package/Materials/Node/Blocks/PBR/subSurfaceBlock.js.map +1 -1
- package/Materials/Node/nodeMaterialBuildState.d.ts +1 -1
- package/Materials/Node/nodeMaterialBuildState.js +6 -3
- package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
- package/Materials/Node/nodeMaterialDefault.js +6 -1
- package/Materials/Node/nodeMaterialDefault.js.map +1 -1
- package/Materials/Textures/renderTargetTexture.d.ts +4 -4
- package/Materials/Textures/renderTargetTexture.js.map +1 -1
- package/Maths/ThinMaths/thinMath.matrix.functions.d.ts +11 -11
- package/Maths/ThinMaths/thinMath.matrix.functions.js.map +1 -1
- package/Maths/math.like.d.ts +2 -2
- package/Maths/math.like.js.map +1 -1
- package/Meshes/Builders/decalBuilder.js +3 -2
- package/Meshes/Builders/decalBuilder.js.map +1 -1
- package/Meshes/csg2.js +1 -1
- package/Meshes/csg2.js.map +1 -1
- package/Misc/minMaxReducer.js +5 -0
- package/Misc/minMaxReducer.js.map +1 -1
- package/Shaders/ShadersInclude/gaussianSplatting.js +4 -4
- package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockReflectivity.js +2 -2
- package/Shaders/ShadersInclude/pbrBlockReflectivity.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockSubSurface.js +4 -4
- package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
- package/Shaders/gaussianSplatting.vertex.js +3 -3
- package/Shaders/gaussianSplatting.vertex.js.map +1 -1
- package/Shaders/pbr.fragment.js +4 -1
- package/Shaders/pbr.fragment.js.map +1 -1
- package/Shaders/pbr.vertex.js +7 -2
- package/Shaders/pbr.vertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +2 -2
- package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js +2 -2
- package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.vertex.js +3 -3
- package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
- package/package.json +1 -1
- package/scene.d.ts +4 -0
- package/scene.js +21 -15
- package/scene.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gaussianSplattingBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { VertexBuffer } from \"core/Meshes/buffer\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Block used for the Gaussian Splatting\r\n */\r\nexport class GaussianSplattingBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new GaussianSplattingBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Vertex);\r\n\r\n this._isUnique = true;\r\n\r\n this.registerInput(\"splatPosition\", NodeMaterialBlockConnectionPointTypes.Vector3, false, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"splatScale\", NodeMaterialBlockConnectionPointTypes.Vector2, true, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"world\", NodeMaterialBlockConnectionPointTypes.Matrix, false, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"view\", NodeMaterialBlockConnectionPointTypes.Matrix, false, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"projection\", NodeMaterialBlockConnectionPointTypes.Matrix, false, NodeMaterialBlockTargets.Vertex);\r\n\r\n this.registerOutput(\"splatVertex\", NodeMaterialBlockConnectionPointTypes.Vector4, NodeMaterialBlockTargets.Vertex);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public override getClassName() {\r\n return \"GaussianSplattingBlock\";\r\n }\r\n\r\n /**\r\n * Gets the position input component\r\n */\r\n public get splatPosition(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the scale input component\r\n */\r\n public get splatScale(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the View matrix input component\r\n */\r\n public get world(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the View matrix input component\r\n */\r\n public get view(): NodeMaterialConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the projection matrix input component\r\n */\r\n public get projection(): NodeMaterialConnectionPoint {\r\n return this._inputs[4];\r\n }\r\n\r\n /**\r\n * Gets the splatVertex output component\r\n */\r\n public get splatVertex(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public override initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"focal\");\r\n state._excludeVariableName(\"invViewport\");\r\n state._excludeVariableName(\"kernelSize\");\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (state.target === NodeMaterialBlockTargets.Fragment) {\r\n return;\r\n }\r\n\r\n const comments = `//${this.name}`;\r\n state._emitFunctionFromInclude(\"gaussianSplattingVertexDeclaration\", comments);\r\n state._emitFunctionFromInclude(\"gaussianSplatting\", comments);\r\n state._emitUniformFromString(\"focal\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n state._emitUniformFromString(\"invViewport\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n state._emitUniformFromString(\"kernelSize\", NodeMaterialBlockConnectionPointTypes.Float);\r\n state.attributes.push(VertexBuffer.PositionKind);\r\n state.sharedData.nodeMaterial.backFaceCulling = false;\r\n\r\n const splatPosition = this.splatPosition;\r\n const splatScale = this.splatScale;\r\n const world = this.world;\r\n const view = this.view;\r\n const projection = this.projection;\r\n const output = this.splatVertex;\r\n\r\n const addF = state.fSuffix;\r\n let splatScaleParameter = `vec2${addF}(1.,1.)`;\r\n if (splatScale.isConnected) {\r\n splatScaleParameter = splatScale.associatedVariableName;\r\n }\r\n\r\n let input = \"position\";\r\n let uniforms = \"\";\r\n if (state.shaderLanguage === ShaderLanguage.WGSL) {\r\n input = \"input.position\";\r\n uniforms = \", uniforms.focal, uniforms.invViewport, uniforms.kernelSize\";\r\n }\r\n state.compilationString += `${state._declareOutput(output)} = gaussianSplatting(${input}, ${splatPosition.associatedVariableName}, ${splatScaleParameter}, covA, covB, ${world.associatedVariableName}, ${view.associatedVariableName}, ${projection.associatedVariableName}${uniforms});\\n`;\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GaussianSplattingBlock\", GaussianSplattingBlock);\r\n"]}
|
|
1
|
+
{"version":3,"file":"gaussianSplattingBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { VertexBuffer } from \"core/Meshes/buffer\";\r\nimport type { GaussianSplattingMesh } from \"core/Meshes/GaussianSplatting/gaussianSplattingMesh\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { NodeMaterial, NodeMaterialDefines } from \"../../nodeMaterial\";\r\n\r\n/**\r\n * Block used for the Gaussian Splatting\r\n */\r\nexport class GaussianSplattingBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new GaussianSplattingBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Vertex);\r\n\r\n this._isUnique = true;\r\n\r\n this.registerInput(\"splatPosition\", NodeMaterialBlockConnectionPointTypes.Vector3, false, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"splatScale\", NodeMaterialBlockConnectionPointTypes.Vector2, true, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"world\", NodeMaterialBlockConnectionPointTypes.Matrix, false, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"view\", NodeMaterialBlockConnectionPointTypes.Matrix, false, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"projection\", NodeMaterialBlockConnectionPointTypes.Matrix, false, NodeMaterialBlockTargets.Vertex);\r\n\r\n this.registerOutput(\"splatVertex\", NodeMaterialBlockConnectionPointTypes.Vector4, NodeMaterialBlockTargets.Vertex);\r\n this.registerOutput(\"SH\", NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockTargets.Vertex);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public override getClassName() {\r\n return \"GaussianSplattingBlock\";\r\n }\r\n\r\n /**\r\n * Gets the position input component\r\n */\r\n public get splatPosition(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the scale input component\r\n */\r\n public get splatScale(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the View matrix input component\r\n */\r\n public get world(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the View matrix input component\r\n */\r\n public get view(): NodeMaterialConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the projection matrix input component\r\n */\r\n public get projection(): NodeMaterialConnectionPoint {\r\n return this._inputs[4];\r\n }\r\n\r\n /**\r\n * Gets the splatVertex output component\r\n */\r\n public get splatVertex(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the SH output contribution\r\n */\r\n public get SH(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public override initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"focal\");\r\n state._excludeVariableName(\"invViewport\");\r\n state._excludeVariableName(\"kernelSize\");\r\n state._excludeVariableName(\"eyePosition\");\r\n }\r\n /**\r\n * Update defines for shader compilation\r\n * @param mesh defines the mesh to be rendered\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n */\r\n public override prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {\r\n if (mesh.getClassName() == \"GaussianSplattingMesh\") {\r\n defines.setValue(\"SH_DEGREE\", (<GaussianSplattingMesh>mesh).shDegree, true);\r\n }\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (state.target === NodeMaterialBlockTargets.Fragment) {\r\n return;\r\n }\r\n\r\n state.sharedData.blocksWithDefines.push(this);\r\n\r\n const comments = `//${this.name}`;\r\n state._emitFunctionFromInclude(\"gaussianSplattingVertexDeclaration\", comments);\r\n state._emitFunctionFromInclude(\"gaussianSplatting\", comments);\r\n state._emitFunctionFromInclude(\"helperFunctions\", comments);\r\n state._emitUniformFromString(\"focal\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n state._emitUniformFromString(\"invViewport\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n state._emitUniformFromString(\"kernelSize\", NodeMaterialBlockConnectionPointTypes.Float);\r\n state._emitUniformFromString(\"eyePosition\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n state.attributes.push(VertexBuffer.PositionKind);\r\n state.sharedData.nodeMaterial.backFaceCulling = false;\r\n\r\n const splatPosition = this.splatPosition;\r\n const splatScale = this.splatScale;\r\n const world = this.world;\r\n const view = this.view;\r\n const projection = this.projection;\r\n const output = this.splatVertex;\r\n const sh = this.SH;\r\n\r\n const addF = state.fSuffix;\r\n let splatScaleParameter = `vec2${addF}(1.,1.)`;\r\n if (splatScale.isConnected) {\r\n splatScaleParameter = splatScale.associatedVariableName;\r\n }\r\n\r\n let input = \"position\";\r\n let uniforms = \"\";\r\n if (state.shaderLanguage === ShaderLanguage.WGSL) {\r\n input = \"input.position\";\r\n uniforms = \", uniforms.focal, uniforms.invViewport, uniforms.kernelSize\";\r\n }\r\n if (this.SH.isConnected) {\r\n state.compilationString += `#if SH_DEGREE > 0\\n`;\r\n\r\n if (state.shaderLanguage === ShaderLanguage.WGSL) {\r\n state.compilationString += `let worldRot: mat3x3f = mat3x3f(${world.associatedVariableName}[0].xyz, ${world.associatedVariableName}[1].xyz, ${world.associatedVariableName}[2].xyz);`;\r\n state.compilationString += `let normWorldRot: mat3x3f = inverseMat3(worldRot);`;\r\n state.compilationString += `var dir: vec3f = normalize(normWorldRot * (${splatPosition.associatedVariableName}.xyz - uniforms.eyePosition));\\n`;\r\n } else {\r\n state.compilationString += `mat3 worldRot = mat3(${world.associatedVariableName});`;\r\n state.compilationString += `mat3 normWorldRot = inverseMat3(worldRot);`;\r\n state.compilationString += `vec3 dir = normalize(normWorldRot * (${splatPosition.associatedVariableName}.xyz - eyePosition));\\n`;\r\n }\r\n\r\n state.compilationString += `dir *= vec3${addF}(1.,1.,-1.);\\n`;\r\n state.compilationString += `${state._declareOutput(sh)} = computeSH(splat, dir);\\n`;\r\n state.compilationString += `#else\\n`;\r\n state.compilationString += `${state._declareOutput(sh)} = vec3${addF}(0.,0.,0.);\\n`;\r\n state.compilationString += `#endif;\\n`;\r\n } else {\r\n state.compilationString += `${state._declareOutput(sh)} = vec3${addF}(0.,0.,0.);`;\r\n }\r\n\r\n state.compilationString += `${state._declareOutput(output)} = gaussianSplatting(${input}, ${splatPosition.associatedVariableName}, ${splatScaleParameter}, covA, covB, ${world.associatedVariableName}, ${view.associatedVariableName}, ${projection.associatedVariableName}${uniforms});\\n`;\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GaussianSplattingBlock\", GaussianSplattingBlock);\r\n"]}
|
|
@@ -76,6 +76,9 @@ export class SplatReaderBlock extends NodeMaterialBlock {
|
|
|
76
76
|
state._emit2DSampler("covariancesBTexture");
|
|
77
77
|
state._emit2DSampler("centersTexture");
|
|
78
78
|
state._emit2DSampler("colorsTexture");
|
|
79
|
+
state._emit2DSampler("shTexture0", "SH_DEGREE > 0", undefined, undefined, true, "highp");
|
|
80
|
+
state._emit2DSampler("shTexture1", "SH_DEGREE > 0", undefined, undefined, true, "highp");
|
|
81
|
+
state._emit2DSampler("shTexture2", "SH_DEGREE > 0", undefined, undefined, true, "highp");
|
|
79
82
|
state._emitFunctionFromInclude("gaussianSplattingVertexDeclaration", comments);
|
|
80
83
|
state._emitFunctionFromInclude("gaussianSplatting", comments);
|
|
81
84
|
state._emitVaryingFromString("vPosition", NodeMaterialBlockConnectionPointTypes.Vector2);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"splatReaderBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,qCAAqC,EAAE,MAAM,mDAAmD,CAAC;AAE1G,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAEhF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,gEAAmE;AAMvG;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,iBAAiB;IACnD;;;OAGG;IACH,YAAmB,IAAY;QAC3B,KAAK,CAAC,IAAI,EAAE,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAE7C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,qCAAqC,CAAC,KAAK,EAAE,KAAK,EAAE,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAEtH,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,qCAAqC,CAAC,OAAO,EAAE,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACrH,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,qCAAqC,CAAC,MAAM,EAAE,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACrH,CAAC;IAED;;;OAGG;IACa,YAAY;QACxB,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACa,UAAU,CAAC,KAA6B;QACpD,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACnC,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACnC,KAAK,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QACxC,KAAK,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,CAAC;QAClD,KAAK,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,CAAC;QAClD,KAAK,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QAC7C,KAAK,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC;QAC5C,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IAClD,CAAC;IAEe,IAAI,CAAC,MAAc,EAAE,YAA0B,EAAE,IAAW;QACxE,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO;QACX,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,yBAAyB,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC;IAEkB,WAAW,CAAC,KAA6B;QACxD,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAEzB,IAAI,KAAK,CAAC,MAAM,KAAK,wBAAwB,CAAC,QAAQ,EAAE,CAAC;YACrD,OAAO;QACX,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE3C,YAAY;QACZ,MAAM,QAAQ,GAAG,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QAClC,KAAK,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;QAC5C,KAAK,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;QAC5C,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;QACvC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"splatReaderBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { GaussianSplattingMaterial } from \"core/Materials/GaussianSplatting/gaussianSplattingMaterial\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport type { Effect } from \"core/Materials/effect\";\r\nimport type { NodeMaterial } from \"../../nodeMaterial\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Block used for Reading components of the Gaussian Splatting\r\n */\r\nexport class SplatReaderBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new SplatReaderBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Vertex);\r\n\r\n this._isUnique = true;\r\n\r\n this.registerInput(\"splatIndex\", NodeMaterialBlockConnectionPointTypes.Float, false, NodeMaterialBlockTargets.Vertex);\r\n\r\n this.registerOutput(\"splatPosition\", NodeMaterialBlockConnectionPointTypes.Vector3, NodeMaterialBlockTargets.Vertex);\r\n this.registerOutput(\"splatColor\", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Vertex);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public override getClassName() {\r\n return \"SplatReaderBlock\";\r\n }\r\n\r\n /**\r\n * Gets the splat index input component\r\n */\r\n public get splatIndex(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the splatPosition output component\r\n */\r\n public get splatPosition(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the splatColor output component\r\n */\r\n public get splatColor(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public override initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"covA\");\r\n state._excludeVariableName(\"covB\");\r\n state._excludeVariableName(\"vPosition\");\r\n state._excludeVariableName(\"covariancesATexture\");\r\n state._excludeVariableName(\"covariancesBTexture\");\r\n state._excludeVariableName(\"centersTexture\");\r\n state._excludeVariableName(\"colorsTexture\");\r\n state._excludeVariableName(\"dataTextureSize\");\r\n }\r\n\r\n public override bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh) {\r\n if (!mesh) {\r\n return;\r\n }\r\n const scene = mesh.getScene();\r\n GaussianSplattingMaterial.BindEffect(mesh, effect, scene);\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (state.target === NodeMaterialBlockTargets.Fragment) {\r\n return;\r\n }\r\n\r\n state.sharedData.bindableBlocks.push(this);\r\n\r\n // Emit code\r\n const comments = `//${this.name}`;\r\n state._emit2DSampler(\"covariancesATexture\");\r\n state._emit2DSampler(\"covariancesBTexture\");\r\n state._emit2DSampler(\"centersTexture\");\r\n state._emit2DSampler(\"colorsTexture\");\r\n state._emit2DSampler(\"shTexture0\", \"SH_DEGREE > 0\", undefined, undefined, true, \"highp\");\r\n state._emit2DSampler(\"shTexture1\", \"SH_DEGREE > 0\", undefined, undefined, true, \"highp\");\r\n state._emit2DSampler(\"shTexture2\", \"SH_DEGREE > 0\", undefined, undefined, true, \"highp\");\r\n\r\n state._emitFunctionFromInclude(\"gaussianSplattingVertexDeclaration\", comments);\r\n state._emitFunctionFromInclude(\"gaussianSplatting\", comments);\r\n state._emitVaryingFromString(\"vPosition\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n state._emitUniformFromString(\"dataTextureSize\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n const splatIndex = this.splatIndex;\r\n const splatPosition = this.splatPosition;\r\n const splatColor = this.splatColor;\r\n\r\n const splatVariablename = state._getFreeVariableName(\"splat\");\r\n\r\n if (state.shaderLanguage === ShaderLanguage.WGSL) {\r\n state.compilationString += `var ${splatVariablename}: Splat = readSplat(${splatIndex.associatedVariableName}, uniforms.dataTextureSize);\\n`;\r\n state.compilationString += `var covA: vec3f = splat.covA.xyz; var covB: vec3f = vec3f(splat.covA.w, splat.covB.xy);\\n`;\r\n state.compilationString += \"vertexOutputs.vPosition = input.position;\\n\";\r\n } else {\r\n state.compilationString += `Splat ${splatVariablename} = readSplat(${splatIndex.associatedVariableName});\\n`;\r\n state.compilationString += `vec3 covA = splat.covA.xyz; vec3 covB = vec3(splat.covA.w, splat.covB.xy);\\n`;\r\n state.compilationString += \"vPosition = position;\\n\";\r\n }\r\n state.compilationString += `${state._declareOutput(splatPosition)} = ${splatVariablename}.center.xyz;\\n`;\r\n state.compilationString += `${state._declareOutput(splatColor)} = ${splatVariablename}.color;\\n`;\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.SplatReaderBlock\", SplatReaderBlock);\r\n"]}
|
|
@@ -139,13 +139,16 @@ export class SubSurfaceBlock extends NodeMaterialBlock {
|
|
|
139
139
|
${state._declareLocalVar("vTintColor", NodeMaterialBlockConnectionPointTypes.Vector4)} = vec4${state.fSuffix}(${tintColor}, ${refractionTintAtDistance});
|
|
140
140
|
${state._declareLocalVar("vSubSurfaceIntensity", NodeMaterialBlockConnectionPointTypes.Vector3)} = vec3(${refractionIntensity}, ${translucencyIntensity}, 0.);
|
|
141
141
|
${state._declareLocalVar("dispersion", NodeMaterialBlockConnectionPointTypes.Float)} = ${dispersion};
|
|
142
|
+
#ifdef LEGACY_SPECULAR_ENERGY_CONSERVATION
|
|
143
|
+
vec3 vSpecularEnvironmentReflectance = vec3(max(colorSpecularEnvironmentReflectance.r, max(colorSpecularEnvironmentReflectance.g, colorSpecularEnvironmentReflectance.b)));
|
|
144
|
+
#endif
|
|
142
145
|
subSurfaceOut = subSurfaceBlock(
|
|
143
146
|
vSubSurfaceIntensity
|
|
144
147
|
, vThicknessParam
|
|
145
148
|
, vTintColor
|
|
146
149
|
, normalW
|
|
147
150
|
#ifdef LEGACY_SPECULAR_ENERGY_CONSERVATION
|
|
148
|
-
,
|
|
151
|
+
, vSpecularEnvironmentReflectance
|
|
149
152
|
#else
|
|
150
153
|
, baseSpecularEnvironmentReflectance
|
|
151
154
|
#endif
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subSurfaceBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/PBR/subSurfaceBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialConnectionPointDirection } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { InputBlock } from \"../Input/inputBlock\";\r\nimport { NodeMaterialConnectionPointCustomObject } from \"../../nodeMaterialConnectionPointCustomObject\";\r\nimport type { NodeMaterial, NodeMaterialDefines } from \"../../nodeMaterial\";\r\nimport type { AbstractMesh } from \"../../../../Meshes/abstractMesh\";\r\nimport type { ReflectionBlock } from \"./reflectionBlock\";\r\nimport type { Nullable } from \"../../../../types\";\r\nimport { RefractionBlock } from \"./refractionBlock\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { editableInPropertyPage, PropertyTypeForEdition } from \"../../../../Decorators/nodeDecorator\";\r\nimport { PBRSubSurfaceConfiguration } from \"core/Materials/PBR/pbrSubSurfaceConfiguration\";\r\n\r\n/**\r\n * Block used to implement the sub surface module of the PBR material\r\n */\r\nexport class SubSurfaceBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new SubSurfaceBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment);\r\n\r\n this._isUnique = true;\r\n\r\n this.registerInput(\"thickness\", NodeMaterialBlockConnectionPointTypes.Float, false, NodeMaterialBlockTargets.Fragment);\r\n this.registerInput(\"tintColor\", NodeMaterialBlockConnectionPointTypes.Color3, true, NodeMaterialBlockTargets.Fragment);\r\n this.registerInput(\"translucencyIntensity\", NodeMaterialBlockConnectionPointTypes.Float, true, NodeMaterialBlockTargets.Fragment);\r\n this.registerInput(\"translucencyDiffusionDist\", NodeMaterialBlockConnectionPointTypes.Color3, true, NodeMaterialBlockTargets.Fragment);\r\n this.registerInput(\r\n \"refraction\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n true,\r\n NodeMaterialBlockTargets.Fragment,\r\n new NodeMaterialConnectionPointCustomObject(\"refraction\", this, NodeMaterialConnectionPointDirection.Input, RefractionBlock, \"RefractionBlock\")\r\n );\r\n this.registerInput(\"dispersion\", NodeMaterialBlockConnectionPointTypes.Float, true, NodeMaterialBlockTargets.Fragment);\r\n\r\n this.registerOutput(\r\n \"subsurface\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n NodeMaterialBlockTargets.Fragment,\r\n new NodeMaterialConnectionPointCustomObject(\"subsurface\", this, NodeMaterialConnectionPointDirection.Output, SubSurfaceBlock, \"SubSurfaceBlock\")\r\n );\r\n }\r\n\r\n /**\r\n * Set it to true if your rendering in 8.0+ is different from that in 7 when you use sub-surface properties (transmission, refraction, etc.)\r\n */\r\n @editableInPropertyPage(\"Apply albedo after sub-surface\", PropertyTypeForEdition.Boolean, \"ADVANCED\")\r\n public applyAlbedoAfterSubSurface: boolean = PBRSubSurfaceConfiguration.DEFAULT_APPLY_ALBEDO_AFTERSUBSURFACE;\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public override initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"subSurfaceOut\");\r\n state._excludeVariableName(\"vThicknessParam\");\r\n state._excludeVariableName(\"vTintColor\");\r\n state._excludeVariableName(\"vTranslucencyColor\");\r\n state._excludeVariableName(\"vSubSurfaceIntensity\");\r\n state._excludeVariableName(\"dispersion\");\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public override getClassName() {\r\n return \"SubSurfaceBlock\";\r\n }\r\n\r\n /**\r\n * Gets the thickness component\r\n */\r\n public get thickness(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the tint color input component\r\n */\r\n public get tintColor(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the translucency intensity input component\r\n */\r\n public get translucencyIntensity(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the translucency diffusion distance input component\r\n */\r\n public get translucencyDiffusionDist(): NodeMaterialConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the refraction object parameters\r\n */\r\n public get refraction(): NodeMaterialConnectionPoint {\r\n return this._inputs[4];\r\n }\r\n\r\n /**\r\n * Gets the dispersion input component\r\n */\r\n public get dispersion(): NodeMaterialConnectionPoint {\r\n return this._inputs[5];\r\n }\r\n\r\n /**\r\n * Gets the sub surface object output component\r\n */\r\n public get subsurface(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n public override autoConfigure() {\r\n if (!this.thickness.isConnected) {\r\n const thicknessInput = new InputBlock(\"SubSurface thickness\", NodeMaterialBlockTargets.Fragment, NodeMaterialBlockConnectionPointTypes.Float);\r\n thicknessInput.value = 0;\r\n thicknessInput.output.connectTo(this.thickness);\r\n }\r\n }\r\n\r\n public override prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {\r\n super.prepareDefines(mesh, nodeMaterial, defines);\r\n\r\n const translucencyEnabled = this.translucencyDiffusionDist.isConnected || this.translucencyIntensity.isConnected;\r\n\r\n defines.setValue(\"SUBSURFACE\", translucencyEnabled || this.refraction.isConnected, true);\r\n defines.setValue(\"SS_TRANSLUCENCY\", translucencyEnabled, true);\r\n defines.setValue(\"SS_THICKNESSANDMASK_TEXTURE\", false, true);\r\n defines.setValue(\"SS_REFRACTIONINTENSITY_TEXTURE\", false, true);\r\n defines.setValue(\"SS_TRANSLUCENCYINTENSITY_TEXTURE\", false, true);\r\n defines.setValue(\"SS_USE_GLTF_TEXTURES\", false, true);\r\n defines.setValue(\"SS_DISPERSION\", this.dispersion.isConnected, true);\r\n defines.setValue(\"SS_APPLY_ALBEDO_AFTER_SUBSURFACE\", this.applyAlbedoAfterSubSurface, true);\r\n }\r\n\r\n /**\r\n * Gets the main code of the block (fragment side)\r\n * @param state current state of the node material building\r\n * @param ssBlock instance of a SubSurfaceBlock or null if the code must be generated without an active sub surface module\r\n * @param reflectionBlock instance of a ReflectionBlock null if the code must be generated without an active reflection module\r\n * @param worldPosVarName name of the variable holding the world position\r\n * @returns the shader code\r\n */\r\n public static GetCode(state: NodeMaterialBuildState, ssBlock: Nullable<SubSurfaceBlock>, reflectionBlock: Nullable<ReflectionBlock>, worldPosVarName: string): string {\r\n let code = \"\";\r\n\r\n const thickness = ssBlock?.thickness.isConnected ? ssBlock.thickness.associatedVariableName : \"0.\";\r\n const tintColor = ssBlock?.tintColor.isConnected ? ssBlock.tintColor.associatedVariableName : \"vec3(1.)\";\r\n const translucencyIntensity = ssBlock?.translucencyIntensity.isConnected ? ssBlock?.translucencyIntensity.associatedVariableName : \"1.\";\r\n const translucencyDiffusionDistance = ssBlock?.translucencyDiffusionDist.isConnected ? ssBlock?.translucencyDiffusionDist.associatedVariableName : \"vec3(1.)\";\r\n\r\n const refractionBlock: Nullable<RefractionBlock> = (ssBlock?.refraction.isConnected ? ssBlock?.refraction.connectedPoint?.ownerBlock : null) as Nullable<RefractionBlock>;\r\n\r\n const refractionTintAtDistance = refractionBlock?.tintAtDistance.isConnected ? refractionBlock.tintAtDistance.associatedVariableName : \"1.\";\r\n const refractionIntensity = refractionBlock?.intensity.isConnected ? refractionBlock.intensity.associatedVariableName : \"1.\";\r\n const refractionView = refractionBlock?.view.isConnected ? refractionBlock.view.associatedVariableName : \"\";\r\n\r\n const dispersion = ssBlock?.dispersion.isConnected ? ssBlock?.dispersion.associatedVariableName : \"0.0\";\r\n const isWebGPU = state.shaderLanguage === ShaderLanguage.WGSL;\r\n\r\n code += refractionBlock?.getCode(state) ?? \"\";\r\n\r\n code += `${isWebGPU ? \"var subSurfaceOut: subSurfaceOutParams\" : \"subSurfaceOutParams subSurfaceOut\"};\r\n\r\n #ifdef SUBSURFACE\r\n ${state._declareLocalVar(\"vThicknessParam\", NodeMaterialBlockConnectionPointTypes.Vector2)} = vec2${state.fSuffix}(0., ${thickness});\r\n ${state._declareLocalVar(\"vTintColor\", NodeMaterialBlockConnectionPointTypes.Vector4)} = vec4${state.fSuffix}(${tintColor}, ${refractionTintAtDistance});\r\n ${state._declareLocalVar(\"vSubSurfaceIntensity\", NodeMaterialBlockConnectionPointTypes.Vector3)} = vec3(${refractionIntensity}, ${translucencyIntensity}, 0.);\r\n ${state._declareLocalVar(\"dispersion\", NodeMaterialBlockConnectionPointTypes.Float)} = ${dispersion};\r\n subSurfaceOut = subSurfaceBlock(\r\n vSubSurfaceIntensity\r\n , vThicknessParam\r\n , vTintColor\r\n , normalW\r\n #ifdef LEGACY_SPECULAR_ENERGY_CONSERVATION\r\n , vec3(max(cumulativeSpecularEnvironmentReflectance.r, max(cumulativeSpecularEnvironmentReflectance.g, cumulativeSpecularEnvironmentReflectance.b)))\r\n #else\r\n , baseSpecularEnvironmentReflectance\r\n #endif\r\n #ifdef SS_THICKNESSANDMASK_TEXTURE\r\n , vec4${state.fSuffix}(0.)\r\n #endif\r\n #ifdef REFLECTION\r\n #ifdef SS_TRANSLUCENCY\r\n , ${(isWebGPU ? \"uniforms.\" : \"\") + reflectionBlock?._reflectionMatrixName}\r\n #ifdef USESPHERICALFROMREFLECTIONMAP\r\n #if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)\r\n , reflectionOut.irradianceVector\r\n #endif\r\n #if defined(REALTIME_FILTERING)\r\n , ${reflectionBlock?._cubeSamplerName}\r\n ${isWebGPU ? `, ${reflectionBlock?._cubeSamplerName}Sampler` : \"\"}\r\n , ${reflectionBlock?._vReflectionFilteringInfoName}\r\n #endif\r\n #endif\r\n #ifdef USEIRRADIANCEMAP\r\n , irradianceSampler\r\n ${isWebGPU ? `, irradianceSamplerSampler` : \"\"}\r\n #endif\r\n #endif\r\n #endif\r\n #if defined(SS_REFRACTION) || defined(SS_TRANSLUCENCY)\r\n , surfaceAlbedo\r\n #endif\r\n #ifdef SS_REFRACTION\r\n , ${worldPosVarName}.xyz\r\n , viewDirectionW\r\n , ${refractionView}\r\n , ${(isWebGPU ? \"uniforms.\" : \"\") + (refractionBlock?._vRefractionInfosName ?? \"\")}\r\n , ${(isWebGPU ? \"uniforms.\" : \"\") + (refractionBlock?._refractionMatrixName ?? \"\")}\r\n , ${(isWebGPU ? \"uniforms.\" : \"\") + (refractionBlock?._vRefractionMicrosurfaceInfosName ?? \"\")}\r\n , ${isWebGPU ? \"uniforms.\" : \"\"}vLightingIntensity\r\n #ifdef SS_LINKREFRACTIONTOTRANSPARENCY\r\n , alpha\r\n #endif\r\n #ifdef ${refractionBlock?._defineLODRefractionAlpha ?? \"IGNORE\"}\r\n , NdotVUnclamped\r\n #endif\r\n #ifdef ${refractionBlock?._defineLinearSpecularRefraction ?? \"IGNORE\"}\r\n , roughness\r\n #endif\r\n , alphaG\r\n #ifdef ${refractionBlock?._define3DName ?? \"IGNORE\"}\r\n , ${refractionBlock?._cubeSamplerName ?? \"\"}\r\n ${isWebGPU ? `, ${refractionBlock?._cubeSamplerName}Sampler` : \"\"}\r\n #else\r\n , ${refractionBlock?._2DSamplerName ?? \"\"}\r\n ${isWebGPU ? `, ${refractionBlock?._2DSamplerName}Sampler` : \"\"}\r\n #endif\r\n #ifndef LODBASEDMICROSFURACE\r\n #ifdef ${refractionBlock?._define3DName ?? \"IGNORE\"}\r\n , ${refractionBlock?._cubeSamplerName ?? \"\"} \r\n ${isWebGPU ? `, ${refractionBlock?._cubeSamplerName}Sampler` : \"\"}\r\n , ${refractionBlock?._cubeSamplerName ?? \"\"} \r\n ${isWebGPU ? `, ${refractionBlock?._cubeSamplerName}Sampler` : \"\"}\r\n #else\r\n , ${refractionBlock?._2DSamplerName ?? \"\"}\r\n ${isWebGPU ? `, ${refractionBlock?._2DSamplerName}Sampler` : \"\"}\r\n , ${refractionBlock?._2DSamplerName ?? \"\"}\r\n ${isWebGPU ? `, ${refractionBlock?._2DSamplerName}Sampler` : \"\"}\r\n #endif\r\n #endif\r\n #ifdef ANISOTROPIC\r\n , anisotropicOut\r\n #endif\r\n #ifdef REALTIME_FILTERING\r\n , ${refractionBlock?._vRefractionFilteringInfoName ?? \"\"}\r\n #endif\r\n #ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC\r\n , vRefractionPosition\r\n , vRefractionSize\r\n #endif\r\n #ifdef SS_DISPERSION\r\n , dispersion\r\n #endif\r\n #endif\r\n #ifdef SS_TRANSLUCENCY\r\n , ${translucencyDiffusionDistance}\r\n , vTintColor\r\n #ifdef SS_TRANSLUCENCYCOLOR_TEXTURE\r\n , vec4${state.fSuffix}(0.)\r\n #endif\r\n #endif \r\n );\r\n\r\n #ifdef SS_REFRACTION\r\n surfaceAlbedo = subSurfaceOut.surfaceAlbedo;\r\n #ifdef SS_LINKREFRACTIONTOTRANSPARENCY\r\n alpha = subSurfaceOut.alpha;\r\n #endif\r\n #endif\r\n #else\r\n subSurfaceOut.specularEnvironmentReflectance = colorSpecularEnvironmentReflectance;\r\n #endif\\n`;\r\n\r\n return code;\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n if (state.target === NodeMaterialBlockTargets.Fragment) {\r\n state.sharedData.blocksWithDefines.push(this);\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.SubSurfaceBlock\", SubSurfaceBlock);\r\n"]}
|
|
1
|
+
{"version":3,"file":"subSurfaceBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/PBR/subSurfaceBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialConnectionPointDirection } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { InputBlock } from \"../Input/inputBlock\";\r\nimport { NodeMaterialConnectionPointCustomObject } from \"../../nodeMaterialConnectionPointCustomObject\";\r\nimport type { NodeMaterial, NodeMaterialDefines } from \"../../nodeMaterial\";\r\nimport type { AbstractMesh } from \"../../../../Meshes/abstractMesh\";\r\nimport type { ReflectionBlock } from \"./reflectionBlock\";\r\nimport type { Nullable } from \"../../../../types\";\r\nimport { RefractionBlock } from \"./refractionBlock\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { editableInPropertyPage, PropertyTypeForEdition } from \"../../../../Decorators/nodeDecorator\";\r\nimport { PBRSubSurfaceConfiguration } from \"core/Materials/PBR/pbrSubSurfaceConfiguration\";\r\n\r\n/**\r\n * Block used to implement the sub surface module of the PBR material\r\n */\r\nexport class SubSurfaceBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new SubSurfaceBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment);\r\n\r\n this._isUnique = true;\r\n\r\n this.registerInput(\"thickness\", NodeMaterialBlockConnectionPointTypes.Float, false, NodeMaterialBlockTargets.Fragment);\r\n this.registerInput(\"tintColor\", NodeMaterialBlockConnectionPointTypes.Color3, true, NodeMaterialBlockTargets.Fragment);\r\n this.registerInput(\"translucencyIntensity\", NodeMaterialBlockConnectionPointTypes.Float, true, NodeMaterialBlockTargets.Fragment);\r\n this.registerInput(\"translucencyDiffusionDist\", NodeMaterialBlockConnectionPointTypes.Color3, true, NodeMaterialBlockTargets.Fragment);\r\n this.registerInput(\r\n \"refraction\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n true,\r\n NodeMaterialBlockTargets.Fragment,\r\n new NodeMaterialConnectionPointCustomObject(\"refraction\", this, NodeMaterialConnectionPointDirection.Input, RefractionBlock, \"RefractionBlock\")\r\n );\r\n this.registerInput(\"dispersion\", NodeMaterialBlockConnectionPointTypes.Float, true, NodeMaterialBlockTargets.Fragment);\r\n\r\n this.registerOutput(\r\n \"subsurface\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n NodeMaterialBlockTargets.Fragment,\r\n new NodeMaterialConnectionPointCustomObject(\"subsurface\", this, NodeMaterialConnectionPointDirection.Output, SubSurfaceBlock, \"SubSurfaceBlock\")\r\n );\r\n }\r\n\r\n /**\r\n * Set it to true if your rendering in 8.0+ is different from that in 7 when you use sub-surface properties (transmission, refraction, etc.)\r\n */\r\n @editableInPropertyPage(\"Apply albedo after sub-surface\", PropertyTypeForEdition.Boolean, \"ADVANCED\")\r\n public applyAlbedoAfterSubSurface: boolean = PBRSubSurfaceConfiguration.DEFAULT_APPLY_ALBEDO_AFTERSUBSURFACE;\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public override initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"subSurfaceOut\");\r\n state._excludeVariableName(\"vThicknessParam\");\r\n state._excludeVariableName(\"vTintColor\");\r\n state._excludeVariableName(\"vTranslucencyColor\");\r\n state._excludeVariableName(\"vSubSurfaceIntensity\");\r\n state._excludeVariableName(\"dispersion\");\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public override getClassName() {\r\n return \"SubSurfaceBlock\";\r\n }\r\n\r\n /**\r\n * Gets the thickness component\r\n */\r\n public get thickness(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the tint color input component\r\n */\r\n public get tintColor(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the translucency intensity input component\r\n */\r\n public get translucencyIntensity(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the translucency diffusion distance input component\r\n */\r\n public get translucencyDiffusionDist(): NodeMaterialConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the refraction object parameters\r\n */\r\n public get refraction(): NodeMaterialConnectionPoint {\r\n return this._inputs[4];\r\n }\r\n\r\n /**\r\n * Gets the dispersion input component\r\n */\r\n public get dispersion(): NodeMaterialConnectionPoint {\r\n return this._inputs[5];\r\n }\r\n\r\n /**\r\n * Gets the sub surface object output component\r\n */\r\n public get subsurface(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n public override autoConfigure() {\r\n if (!this.thickness.isConnected) {\r\n const thicknessInput = new InputBlock(\"SubSurface thickness\", NodeMaterialBlockTargets.Fragment, NodeMaterialBlockConnectionPointTypes.Float);\r\n thicknessInput.value = 0;\r\n thicknessInput.output.connectTo(this.thickness);\r\n }\r\n }\r\n\r\n public override prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {\r\n super.prepareDefines(mesh, nodeMaterial, defines);\r\n\r\n const translucencyEnabled = this.translucencyDiffusionDist.isConnected || this.translucencyIntensity.isConnected;\r\n\r\n defines.setValue(\"SUBSURFACE\", translucencyEnabled || this.refraction.isConnected, true);\r\n defines.setValue(\"SS_TRANSLUCENCY\", translucencyEnabled, true);\r\n defines.setValue(\"SS_THICKNESSANDMASK_TEXTURE\", false, true);\r\n defines.setValue(\"SS_REFRACTIONINTENSITY_TEXTURE\", false, true);\r\n defines.setValue(\"SS_TRANSLUCENCYINTENSITY_TEXTURE\", false, true);\r\n defines.setValue(\"SS_USE_GLTF_TEXTURES\", false, true);\r\n defines.setValue(\"SS_DISPERSION\", this.dispersion.isConnected, true);\r\n defines.setValue(\"SS_APPLY_ALBEDO_AFTER_SUBSURFACE\", this.applyAlbedoAfterSubSurface, true);\r\n }\r\n\r\n /**\r\n * Gets the main code of the block (fragment side)\r\n * @param state current state of the node material building\r\n * @param ssBlock instance of a SubSurfaceBlock or null if the code must be generated without an active sub surface module\r\n * @param reflectionBlock instance of a ReflectionBlock null if the code must be generated without an active reflection module\r\n * @param worldPosVarName name of the variable holding the world position\r\n * @returns the shader code\r\n */\r\n public static GetCode(state: NodeMaterialBuildState, ssBlock: Nullable<SubSurfaceBlock>, reflectionBlock: Nullable<ReflectionBlock>, worldPosVarName: string): string {\r\n let code = \"\";\r\n\r\n const thickness = ssBlock?.thickness.isConnected ? ssBlock.thickness.associatedVariableName : \"0.\";\r\n const tintColor = ssBlock?.tintColor.isConnected ? ssBlock.tintColor.associatedVariableName : \"vec3(1.)\";\r\n const translucencyIntensity = ssBlock?.translucencyIntensity.isConnected ? ssBlock?.translucencyIntensity.associatedVariableName : \"1.\";\r\n const translucencyDiffusionDistance = ssBlock?.translucencyDiffusionDist.isConnected ? ssBlock?.translucencyDiffusionDist.associatedVariableName : \"vec3(1.)\";\r\n\r\n const refractionBlock: Nullable<RefractionBlock> = (ssBlock?.refraction.isConnected ? ssBlock?.refraction.connectedPoint?.ownerBlock : null) as Nullable<RefractionBlock>;\r\n\r\n const refractionTintAtDistance = refractionBlock?.tintAtDistance.isConnected ? refractionBlock.tintAtDistance.associatedVariableName : \"1.\";\r\n const refractionIntensity = refractionBlock?.intensity.isConnected ? refractionBlock.intensity.associatedVariableName : \"1.\";\r\n const refractionView = refractionBlock?.view.isConnected ? refractionBlock.view.associatedVariableName : \"\";\r\n\r\n const dispersion = ssBlock?.dispersion.isConnected ? ssBlock?.dispersion.associatedVariableName : \"0.0\";\r\n const isWebGPU = state.shaderLanguage === ShaderLanguage.WGSL;\r\n\r\n code += refractionBlock?.getCode(state) ?? \"\";\r\n\r\n code += `${isWebGPU ? \"var subSurfaceOut: subSurfaceOutParams\" : \"subSurfaceOutParams subSurfaceOut\"};\r\n\r\n #ifdef SUBSURFACE\r\n ${state._declareLocalVar(\"vThicknessParam\", NodeMaterialBlockConnectionPointTypes.Vector2)} = vec2${state.fSuffix}(0., ${thickness});\r\n ${state._declareLocalVar(\"vTintColor\", NodeMaterialBlockConnectionPointTypes.Vector4)} = vec4${state.fSuffix}(${tintColor}, ${refractionTintAtDistance});\r\n ${state._declareLocalVar(\"vSubSurfaceIntensity\", NodeMaterialBlockConnectionPointTypes.Vector3)} = vec3(${refractionIntensity}, ${translucencyIntensity}, 0.);\r\n ${state._declareLocalVar(\"dispersion\", NodeMaterialBlockConnectionPointTypes.Float)} = ${dispersion};\r\n #ifdef LEGACY_SPECULAR_ENERGY_CONSERVATION\r\n vec3 vSpecularEnvironmentReflectance = vec3(max(colorSpecularEnvironmentReflectance.r, max(colorSpecularEnvironmentReflectance.g, colorSpecularEnvironmentReflectance.b)));\r\n #endif\r\n subSurfaceOut = subSurfaceBlock(\r\n vSubSurfaceIntensity\r\n , vThicknessParam\r\n , vTintColor\r\n , normalW\r\n #ifdef LEGACY_SPECULAR_ENERGY_CONSERVATION\r\n , vSpecularEnvironmentReflectance\r\n #else\r\n , baseSpecularEnvironmentReflectance\r\n #endif\r\n #ifdef SS_THICKNESSANDMASK_TEXTURE\r\n , vec4${state.fSuffix}(0.)\r\n #endif\r\n #ifdef REFLECTION\r\n #ifdef SS_TRANSLUCENCY\r\n , ${(isWebGPU ? \"uniforms.\" : \"\") + reflectionBlock?._reflectionMatrixName}\r\n #ifdef USESPHERICALFROMREFLECTIONMAP\r\n #if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)\r\n , reflectionOut.irradianceVector\r\n #endif\r\n #if defined(REALTIME_FILTERING)\r\n , ${reflectionBlock?._cubeSamplerName}\r\n ${isWebGPU ? `, ${reflectionBlock?._cubeSamplerName}Sampler` : \"\"}\r\n , ${reflectionBlock?._vReflectionFilteringInfoName}\r\n #endif\r\n #endif\r\n #ifdef USEIRRADIANCEMAP\r\n , irradianceSampler\r\n ${isWebGPU ? `, irradianceSamplerSampler` : \"\"}\r\n #endif\r\n #endif\r\n #endif\r\n #if defined(SS_REFRACTION) || defined(SS_TRANSLUCENCY)\r\n , surfaceAlbedo\r\n #endif\r\n #ifdef SS_REFRACTION\r\n , ${worldPosVarName}.xyz\r\n , viewDirectionW\r\n , ${refractionView}\r\n , ${(isWebGPU ? \"uniforms.\" : \"\") + (refractionBlock?._vRefractionInfosName ?? \"\")}\r\n , ${(isWebGPU ? \"uniforms.\" : \"\") + (refractionBlock?._refractionMatrixName ?? \"\")}\r\n , ${(isWebGPU ? \"uniforms.\" : \"\") + (refractionBlock?._vRefractionMicrosurfaceInfosName ?? \"\")}\r\n , ${isWebGPU ? \"uniforms.\" : \"\"}vLightingIntensity\r\n #ifdef SS_LINKREFRACTIONTOTRANSPARENCY\r\n , alpha\r\n #endif\r\n #ifdef ${refractionBlock?._defineLODRefractionAlpha ?? \"IGNORE\"}\r\n , NdotVUnclamped\r\n #endif\r\n #ifdef ${refractionBlock?._defineLinearSpecularRefraction ?? \"IGNORE\"}\r\n , roughness\r\n #endif\r\n , alphaG\r\n #ifdef ${refractionBlock?._define3DName ?? \"IGNORE\"}\r\n , ${refractionBlock?._cubeSamplerName ?? \"\"}\r\n ${isWebGPU ? `, ${refractionBlock?._cubeSamplerName}Sampler` : \"\"}\r\n #else\r\n , ${refractionBlock?._2DSamplerName ?? \"\"}\r\n ${isWebGPU ? `, ${refractionBlock?._2DSamplerName}Sampler` : \"\"}\r\n #endif\r\n #ifndef LODBASEDMICROSFURACE\r\n #ifdef ${refractionBlock?._define3DName ?? \"IGNORE\"}\r\n , ${refractionBlock?._cubeSamplerName ?? \"\"} \r\n ${isWebGPU ? `, ${refractionBlock?._cubeSamplerName}Sampler` : \"\"}\r\n , ${refractionBlock?._cubeSamplerName ?? \"\"} \r\n ${isWebGPU ? `, ${refractionBlock?._cubeSamplerName}Sampler` : \"\"}\r\n #else\r\n , ${refractionBlock?._2DSamplerName ?? \"\"}\r\n ${isWebGPU ? `, ${refractionBlock?._2DSamplerName}Sampler` : \"\"}\r\n , ${refractionBlock?._2DSamplerName ?? \"\"}\r\n ${isWebGPU ? `, ${refractionBlock?._2DSamplerName}Sampler` : \"\"}\r\n #endif\r\n #endif\r\n #ifdef ANISOTROPIC\r\n , anisotropicOut\r\n #endif\r\n #ifdef REALTIME_FILTERING\r\n , ${refractionBlock?._vRefractionFilteringInfoName ?? \"\"}\r\n #endif\r\n #ifdef SS_USE_LOCAL_REFRACTIONMAP_CUBIC\r\n , vRefractionPosition\r\n , vRefractionSize\r\n #endif\r\n #ifdef SS_DISPERSION\r\n , dispersion\r\n #endif\r\n #endif\r\n #ifdef SS_TRANSLUCENCY\r\n , ${translucencyDiffusionDistance}\r\n , vTintColor\r\n #ifdef SS_TRANSLUCENCYCOLOR_TEXTURE\r\n , vec4${state.fSuffix}(0.)\r\n #endif\r\n #endif \r\n );\r\n\r\n #ifdef SS_REFRACTION\r\n surfaceAlbedo = subSurfaceOut.surfaceAlbedo;\r\n #ifdef SS_LINKREFRACTIONTOTRANSPARENCY\r\n alpha = subSurfaceOut.alpha;\r\n #endif\r\n #endif\r\n #else\r\n subSurfaceOut.specularEnvironmentReflectance = colorSpecularEnvironmentReflectance;\r\n #endif\\n`;\r\n\r\n return code;\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n if (state.target === NodeMaterialBlockTargets.Fragment) {\r\n state.sharedData.blocksWithDefines.push(this);\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.SubSurfaceBlock\", SubSurfaceBlock);\r\n"]}
|
|
@@ -120,7 +120,7 @@ export declare class NodeMaterialBuildState {
|
|
|
120
120
|
/**
|
|
121
121
|
* @internal
|
|
122
122
|
*/
|
|
123
|
-
_emit2DSampler(name: string, define?: string, force?: boolean, annotation?: string): void;
|
|
123
|
+
_emit2DSampler(name: string, define?: string, force?: boolean, annotation?: string, unsignedSampler?: boolean, precision?: string): void;
|
|
124
124
|
/**
|
|
125
125
|
* @internal
|
|
126
126
|
*/
|
|
@@ -239,17 +239,20 @@ export class NodeMaterialBuildState {
|
|
|
239
239
|
/**
|
|
240
240
|
* @internal
|
|
241
241
|
*/
|
|
242
|
-
_emit2DSampler(name, define = "", force = false, annotation) {
|
|
242
|
+
_emit2DSampler(name, define = "", force = false, annotation, unsignedSampler, precision) {
|
|
243
243
|
if (this.samplers.indexOf(name) < 0 || force) {
|
|
244
244
|
if (define) {
|
|
245
245
|
this._samplerDeclaration += `#if ${define}\n`;
|
|
246
246
|
}
|
|
247
247
|
if (this.shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
|
|
248
|
+
const unsignedSamplerPrefix = unsignedSampler ? "u" : "f";
|
|
248
249
|
this._samplerDeclaration += `var ${name + `Sampler`}: sampler;\n`;
|
|
249
|
-
this._samplerDeclaration += `var ${name}: texture_2d
|
|
250
|
+
this._samplerDeclaration += `var ${name}: texture_2d<${unsignedSamplerPrefix}32>;\n`;
|
|
250
251
|
}
|
|
251
252
|
else {
|
|
252
|
-
|
|
253
|
+
const unsignedSamplerPrefix = unsignedSampler ? "u" : "";
|
|
254
|
+
const precisionDecl = precision ?? "";
|
|
255
|
+
this._samplerDeclaration += `uniform ${precisionDecl} ${unsignedSamplerPrefix}sampler2D ${name}; ${annotation ? annotation : ""}\n`;
|
|
253
256
|
}
|
|
254
257
|
if (define) {
|
|
255
258
|
this._samplerDeclaration += `#endif\n`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeMaterialBuildState.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/Node/nodeMaterialBuildState.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlockConnectionPointTypes } from \"./Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport { NodeMaterialBlockTargets } from \"./Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialBuildStateSharedData } from \"./nodeMaterialBuildStateSharedData\";\r\nimport { ShaderLanguage } from \"../shaderLanguage\";\r\nimport type { NodeMaterialConnectionPoint } from \"./nodeMaterialBlockConnectionPoint\";\r\nimport { ShaderStore as EngineShaderStore } from \"../../Engines/shaderStore\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport type { NodeMaterialBlock } from \"./nodeMaterialBlock\";\r\nimport { NodeMaterialModes } from \"./Enums/nodeMaterialModes\";\r\nimport { Process } from \"core/Engines/Processors/shaderProcessor\";\r\nimport type { _IProcessingOptions } from \"core/Engines/Processors/shaderProcessingOptions\";\r\nimport { WebGLShaderProcessor } from \"core/Engines/WebGL/webGLShaderProcessors\";\r\n\r\n/** @internal */\r\nexport const SfeModeDefine = \"USE_SFE_FRAMEWORK\";\r\n\r\n/**\r\n * Class used to store node based material build state\r\n */\r\nexport class NodeMaterialBuildState {\r\n /** Gets or sets a boolean indicating if the current state can emit uniform buffers */\r\n public supportUniformBuffers = false;\r\n /**\r\n * Gets the list of emitted attributes\r\n */\r\n public attributes: string[] = [];\r\n /**\r\n * Gets the list of emitted uniforms\r\n */\r\n public uniforms: string[] = [];\r\n /**\r\n * Gets the list of emitted constants\r\n */\r\n public constants: string[] = [];\r\n /**\r\n * Gets the list of emitted samplers\r\n */\r\n public samplers: string[] = [];\r\n /**\r\n * Gets the list of emitted functions\r\n */\r\n public functions: { [key: string]: string } = {};\r\n /**\r\n * Gets the list of emitted extensions\r\n */\r\n public extensions: { [key: string]: string } = {};\r\n /**\r\n * Gets the list of emitted prePass outputs - if using the prepass\r\n */\r\n public prePassOutput: { [key: string]: string } = {};\r\n\r\n /**\r\n * Gets the target of the compilation state\r\n */\r\n public target: NodeMaterialBlockTargets;\r\n /**\r\n * Gets the list of emitted counters\r\n */\r\n public counters: { [key: string]: number } = {};\r\n\r\n /**\r\n * Shared data between multiple NodeMaterialBuildState instances\r\n */\r\n public sharedData: NodeMaterialBuildStateSharedData;\r\n\r\n /** @internal */\r\n public _terminalBlocks: Set<NodeMaterialBlock> = new Set();\r\n\r\n /** @internal */\r\n public _vertexState: NodeMaterialBuildState;\r\n\r\n /** @internal */\r\n public _attributeDeclaration = \"\";\r\n /** @internal */\r\n public _uniformDeclaration = \"\";\r\n /** @internal */\r\n public _constantDeclaration = \"\";\r\n /** @internal */\r\n public _samplerDeclaration = \"\";\r\n /** @internal */\r\n public _varyingTransfer = \"\";\r\n /** @internal */\r\n public _injectAtEnd = \"\";\r\n\r\n private _repeatableContentAnchorIndex = 0;\r\n /** @internal */\r\n public _builtCompilationString = \"\";\r\n\r\n /**\r\n * Gets the emitted compilation strings\r\n */\r\n public compilationString = \"\";\r\n\r\n /**\r\n * Gets the current shader language to use\r\n */\r\n public get shaderLanguage() {\r\n return this.sharedData.nodeMaterial.shaderLanguage;\r\n }\r\n\r\n /** Gets suffix to add behind type casting */\r\n public get fSuffix() {\r\n return this.shaderLanguage === ShaderLanguage.WGSL ? \"f\" : \"\";\r\n }\r\n\r\n /**\r\n * Gets whether the current compilation should inject SFE syntax or not\r\n */\r\n public get isSFEMode() {\r\n return this.sharedData.nodeMaterial.mode === NodeMaterialModes.SFE;\r\n }\r\n\r\n /**\r\n * Returns the processed, compiled shader code\r\n * @returns the raw shader code used by the engine\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public getProcessedShaderAsync(): Promise<string> {\r\n if (!this._builtCompilationString) {\r\n throw new Error(\"Shader not built yet.\");\r\n }\r\n\r\n const engine = this.sharedData.nodeMaterial.getScene().getEngine();\r\n const options: _IProcessingOptions = {\r\n defines: [],\r\n indexParameters: undefined,\r\n isFragment: this.target === NodeMaterialBlockTargets.Fragment,\r\n shouldUseHighPrecisionShader: engine._shouldUseHighPrecisionShader,\r\n processor: engine._getShaderProcessor(this.shaderLanguage),\r\n supportsUniformBuffers: engine.supportsUniformBuffers,\r\n shadersRepository: EngineShaderStore.GetShadersRepository(this.shaderLanguage),\r\n includesShadersStore: EngineShaderStore.GetIncludesShadersStore(this.shaderLanguage),\r\n version: (engine.version * 100).toString(),\r\n platformName: engine.shaderPlatformName,\r\n processingContext: null,\r\n isNDCHalfZRange: engine.isNDCHalfZRange,\r\n useReverseDepthBuffer: engine.useReverseDepthBuffer,\r\n };\r\n\r\n // Export WebGL2 shaders with WebGL1 syntax for max compatibility\r\n if (!engine.isWebGPU && engine.version > 1.0) {\r\n options.processor = new WebGLShaderProcessor();\r\n }\r\n\r\n // For SFE, use the SFE define to toggle the SFE syntax in the shader\r\n if (this.isSFEMode) {\r\n options.defines.push(SfeModeDefine);\r\n }\r\n\r\n return new Promise((resolve) => {\r\n Process(\r\n this._builtCompilationString,\r\n options,\r\n (migratedCode, _) => {\r\n resolve(migratedCode);\r\n },\r\n engine\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Finalize the compilation strings\r\n * @param state defines the current compilation state\r\n */\r\n public finalize(state: NodeMaterialBuildState) {\r\n const emitComments = state.sharedData.emitComments;\r\n const isFragmentMode = this.target === NodeMaterialBlockTargets.Fragment;\r\n\r\n let entryPointString = `\\n${emitComments ? \"//Entry point\\n\" : \"\"}`;\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n if (isFragmentMode) {\r\n entryPointString = `@fragment\\nfn main(input: FragmentInputs) -> FragmentOutputs {\\n${this.sharedData.varyingInitializationsFragment}`;\r\n } else {\r\n entryPointString = `@vertex\\nfn main(input: VertexInputs) -> FragmentInputs{\\n`;\r\n }\r\n } else if (this.isSFEMode) {\r\n // SFE: Replace the entry with a helper function\r\n entryPointString += `#ifdef ${SfeModeDefine}\\n`;\r\n entryPointString += `vec4 nmeMain(vec2 vUV) { // main\\n`;\r\n entryPointString += `#else\\n`;\r\n entryPointString += `void main(void) {\\n`;\r\n entryPointString += `#endif\\n`;\r\n } else {\r\n entryPointString = `void main(void) {\\n`;\r\n }\r\n\r\n this.compilationString = entryPointString + this.compilationString;\r\n\r\n if (this._constantDeclaration) {\r\n this.compilationString = `\\n${emitComments ? \"//Constants\\n\" : \"\"}${this._constantDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n let functionCode = \"\";\r\n for (const functionName in this.functions) {\r\n functionCode += this.functions[functionName] + `\\n`;\r\n }\r\n this.compilationString = `\\n${functionCode}\\n${this.compilationString}`;\r\n\r\n if (!isFragmentMode && this._varyingTransfer) {\r\n this.compilationString = `${this.compilationString}\\n${this._varyingTransfer}`;\r\n }\r\n\r\n if (this._injectAtEnd) {\r\n this.compilationString = `${this.compilationString}\\n${this._injectAtEnd}`;\r\n }\r\n\r\n this.compilationString = `${this.compilationString}\\n}`;\r\n\r\n if (this.sharedData.varyingDeclaration) {\r\n this.compilationString = `\\n${emitComments ? \"//Varyings\\n\" : \"\"}${isFragmentMode ? this.sharedData.varyingDeclarationFragment : this.sharedData.varyingDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n if (this._samplerDeclaration) {\r\n this.compilationString = `\\n${emitComments ? \"//Samplers\\n\" : \"\"}${this._samplerDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n if (this._uniformDeclaration) {\r\n this.compilationString = `\\n${emitComments ? \"//Uniforms\\n\" : \"\"}${this._uniformDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n if (this._attributeDeclaration && !isFragmentMode) {\r\n this.compilationString = `\\n${emitComments ? \"//Attributes\\n\" : \"\"}${this._attributeDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n if (this.shaderLanguage !== ShaderLanguage.WGSL) {\r\n this.compilationString = \"precision highp float;\\n\" + this.compilationString;\r\n this.compilationString = \"#if defined(WEBGL2) || defined(WEBGPU)\\nprecision highp sampler2DArray;\\n#endif\\n\" + this.compilationString;\r\n\r\n if (isFragmentMode) {\r\n this.compilationString =\r\n \"#if defined(PREPASS)\\r\\n#extension GL_EXT_draw_buffers : require\\r\\nlayout(location = 0) out highp vec4 glFragData[SCENE_MRT_COUNT];\\r\\nhighp vec4 gl_FragColor;\\r\\n#endif\\r\\n\" +\r\n this.compilationString;\r\n }\r\n\r\n for (const extensionName in this.extensions) {\r\n const extension = this.extensions[extensionName];\r\n this.compilationString = `\\n${extension}\\n${this.compilationString}`;\r\n }\r\n }\r\n\r\n if (this.isSFEMode) {\r\n this.compilationString = `\\n// { \"smartFilterBlockType\": \"${this.sharedData.nodeMaterial.name}\", \"namespace\": \"Babylon.NME.Test\" }\\n${this.compilationString}`;\r\n }\r\n\r\n this._builtCompilationString = this.compilationString;\r\n }\r\n\r\n /** @internal */\r\n public get _repeatableContentAnchor(): string {\r\n return `###___ANCHOR${this._repeatableContentAnchorIndex++}___###`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getFreeVariableName(prefix: string): string {\r\n prefix = prefix.replace(/[^a-zA-Z_]+/g, \"\");\r\n\r\n if (this.sharedData.variableNames[prefix] === undefined) {\r\n this.sharedData.variableNames[prefix] = 0;\r\n\r\n // Check reserved words\r\n if (prefix === \"output\" || prefix === \"texture\") {\r\n return prefix + this.sharedData.variableNames[prefix];\r\n }\r\n\r\n return prefix;\r\n } else {\r\n this.sharedData.variableNames[prefix]++;\r\n }\r\n\r\n return prefix + this.sharedData.variableNames[prefix];\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getFreeDefineName(prefix: string): string {\r\n if (this.sharedData.defineNames[prefix] === undefined) {\r\n this.sharedData.defineNames[prefix] = 0;\r\n } else {\r\n this.sharedData.defineNames[prefix]++;\r\n }\r\n\r\n return prefix + this.sharedData.defineNames[prefix];\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _excludeVariableName(name: string) {\r\n this.sharedData.variableNames[name] = 0;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emit2DSampler(name: string, define = \"\", force = false, annotation?: string) {\r\n if (this.samplers.indexOf(name) < 0 || force) {\r\n if (define) {\r\n this._samplerDeclaration += `#if ${define}\\n`;\r\n }\r\n\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n this._samplerDeclaration += `var ${name + Constants.AUTOSAMPLERSUFFIX}: sampler;\\n`;\r\n this._samplerDeclaration += `var ${name}: texture_2d<f32>;\\n`;\r\n } else {\r\n this._samplerDeclaration += `uniform sampler2D ${name}; ${annotation ? annotation : \"\"}\\n`;\r\n }\r\n\r\n if (define) {\r\n this._samplerDeclaration += `#endif\\n`;\r\n }\r\n\r\n if (!force) {\r\n this.samplers.push(name);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitCubeSampler(name: string, define = \"\", force = false) {\r\n if (this.samplers.indexOf(name) < 0 || force) {\r\n if (define) {\r\n this._samplerDeclaration += `#if ${define}\\n`;\r\n }\r\n\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n this._samplerDeclaration += `var ${name + Constants.AUTOSAMPLERSUFFIX}: sampler;\\n`;\r\n this._samplerDeclaration += `var ${name}: texture_cube<f32>;\\n`;\r\n } else {\r\n this._samplerDeclaration += `uniform samplerCube ${name};\\n`;\r\n }\r\n\r\n if (define) {\r\n this._samplerDeclaration += `#endif\\n`;\r\n }\r\n\r\n if (!force) {\r\n this.samplers.push(name);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emit2DArraySampler(name: string) {\r\n if (this.samplers.indexOf(name) < 0) {\r\n this._samplerDeclaration += `uniform sampler2DArray ${name};\\n`;\r\n this.samplers.push(name);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getGLType(type: NodeMaterialBlockConnectionPointTypes): string {\r\n switch (type) {\r\n case NodeMaterialBlockConnectionPointTypes.Float:\r\n return \"float\";\r\n case NodeMaterialBlockConnectionPointTypes.Int:\r\n return \"int\";\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n return \"vec2\";\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n return \"vec3\";\r\n case NodeMaterialBlockConnectionPointTypes.Color4:\r\n case NodeMaterialBlockConnectionPointTypes.Vector4:\r\n return \"vec4\";\r\n case NodeMaterialBlockConnectionPointTypes.Matrix:\r\n return \"mat4\";\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getShaderType(type: NodeMaterialBlockConnectionPointTypes) {\r\n const isWGSL = this.shaderLanguage === ShaderLanguage.WGSL;\r\n\r\n switch (type) {\r\n case NodeMaterialBlockConnectionPointTypes.Float:\r\n return isWGSL ? \"f32\" : \"float\";\r\n case NodeMaterialBlockConnectionPointTypes.Int:\r\n return isWGSL ? \"i32\" : \"int\";\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n return isWGSL ? \"vec2f\" : \"vec2\";\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n return isWGSL ? \"vec3f\" : \"vec3\";\r\n case NodeMaterialBlockConnectionPointTypes.Color4:\r\n case NodeMaterialBlockConnectionPointTypes.Vector4:\r\n return isWGSL ? \"vec4f\" : \"vec4\";\r\n case NodeMaterialBlockConnectionPointTypes.Matrix:\r\n return isWGSL ? \"mat4x4f\" : \"mat4\";\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitExtension(name: string, extension: string, define: string = \"\") {\r\n if (this.extensions[name]) {\r\n return;\r\n }\r\n\r\n if (define) {\r\n extension = `#if ${define}\\n${extension}\\n#endif`;\r\n }\r\n this.extensions[name] = extension;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitFunction(name: string, code: string, comments: string) {\r\n if (this.functions[name]) {\r\n return;\r\n }\r\n\r\n if (this.sharedData.emitComments) {\r\n code = comments + `\\n` + code;\r\n }\r\n\r\n this.functions[name] = code;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitCodeFromInclude(\r\n includeName: string,\r\n comments: string,\r\n options?: {\r\n replaceStrings?: { search: RegExp; replace: string }[];\r\n repeatKey?: string;\r\n substitutionVars?: string;\r\n }\r\n ) {\r\n const store = EngineShaderStore.GetIncludesShadersStore(this.shaderLanguage);\r\n\r\n if (options && options.repeatKey) {\r\n return `#include<${includeName}>${options.substitutionVars ? \"(\" + options.substitutionVars + \")\" : \"\"}[0..${options.repeatKey}]\\n`;\r\n }\r\n\r\n let code = store[includeName] + \"\\n\";\r\n\r\n if (this.sharedData.emitComments) {\r\n code = comments + `\\n` + code;\r\n }\r\n\r\n if (!options) {\r\n return code;\r\n }\r\n\r\n if (options.replaceStrings) {\r\n for (let index = 0; index < options.replaceStrings.length; index++) {\r\n const replaceString = options.replaceStrings[index];\r\n code = code.replace(replaceString.search, replaceString.replace);\r\n }\r\n }\r\n\r\n return code;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitFunctionFromInclude(\r\n includeName: string,\r\n comments: string,\r\n options?: {\r\n repeatKey?: string;\r\n substitutionVars?: string;\r\n removeAttributes?: boolean;\r\n removeUniforms?: boolean;\r\n removeVaryings?: boolean;\r\n removeIfDef?: boolean;\r\n replaceStrings?: { search: RegExp; replace: string }[];\r\n },\r\n storeKey: string = \"\"\r\n ) {\r\n const key = includeName + storeKey;\r\n if (this.functions[key]) {\r\n return;\r\n }\r\n const store = EngineShaderStore.GetIncludesShadersStore(this.shaderLanguage);\r\n\r\n if (!options || (!options.removeAttributes && !options.removeUniforms && !options.removeVaryings && !options.removeIfDef && !options.replaceStrings)) {\r\n if (options && options.repeatKey) {\r\n this.functions[key] = `#include<${includeName}>${options.substitutionVars ? \"(\" + options.substitutionVars + \")\" : \"\"}[0..${options.repeatKey}]\\n`;\r\n } else {\r\n this.functions[key] = `#include<${includeName}>${options?.substitutionVars ? \"(\" + options?.substitutionVars + \")\" : \"\"}\\n`;\r\n }\r\n\r\n if (this.sharedData.emitComments) {\r\n this.functions[key] = comments + `\\n` + this.functions[key];\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.functions[key] = store[includeName];\r\n\r\n if (this.sharedData.emitComments) {\r\n this.functions[key] = comments + `\\n` + this.functions[key];\r\n }\r\n\r\n if (options.removeIfDef) {\r\n this.functions[key] = this.functions[key].replace(/^\\s*?#ifdef.+$/gm, \"\");\r\n this.functions[key] = this.functions[key].replace(/^\\s*?#endif.*$/gm, \"\");\r\n this.functions[key] = this.functions[key].replace(/^\\s*?#else.*$/gm, \"\");\r\n this.functions[key] = this.functions[key].replace(/^\\s*?#elif.*$/gm, \"\");\r\n }\r\n\r\n if (options.removeAttributes) {\r\n this.functions[key] = this.functions[key].replace(/\\s*?attribute .+?;/g, \"\\n\");\r\n }\r\n\r\n if (options.removeUniforms) {\r\n this.functions[key] = this.functions[key].replace(/\\s*?uniform .*?;/g, \"\\n\");\r\n }\r\n\r\n if (options.removeVaryings) {\r\n this.functions[key] = this.functions[key].replace(/\\s*?(varying|in) .+?;/g, \"\\n\");\r\n }\r\n\r\n if (options.replaceStrings) {\r\n for (let index = 0; index < options.replaceStrings.length; index++) {\r\n const replaceString = options.replaceStrings[index];\r\n this.functions[key] = this.functions[key].replace(replaceString.search, replaceString.replace);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _registerTempVariable(name: string) {\r\n if (this.sharedData.temps.indexOf(name) !== -1) {\r\n return false;\r\n }\r\n\r\n this.sharedData.temps.push(name);\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitVaryingFromString(name: string, type: NodeMaterialBlockConnectionPointTypes, define: string = \"\", notDefine = false) {\r\n if (this.sharedData.varyings.indexOf(name) !== -1) {\r\n return false;\r\n }\r\n\r\n this.sharedData.varyings.push(name);\r\n\r\n const shaderType = this._getShaderType(type);\r\n\r\n const emitCode = (forFragment = false) => {\r\n let code = \"\";\r\n if (define) {\r\n if (define.startsWith(\"defined(\")) {\r\n code += `#if ${define}\\n`;\r\n } else {\r\n code += `${notDefine ? \"#ifndef\" : \"#ifdef\"} ${define}\\n`;\r\n }\r\n }\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n switch (shaderType) {\r\n case \"mat4x4f\":\r\n // We can't pass a matrix as a varying in WGSL, so we need to split it into 4 vectors\r\n code += `varying ${name}_r0: vec4f;\\n`;\r\n code += `varying ${name}_r1: vec4f;\\n`;\r\n code += `varying ${name}_r2: vec4f;\\n`;\r\n code += `varying ${name}_r3: vec4f;\\n`;\r\n\r\n if (forFragment) {\r\n code += `var<private> ${name}: mat4x4f;\\n`;\r\n this.sharedData.varyingInitializationsFragment += `${name} = mat4x4f(fragmentInputs.${name}_r0, fragmentInputs.${name}_r1, fragmentInputs.${name}_r2, fragmentInputs.${name}_r3);\\n`;\r\n }\r\n break;\r\n default:\r\n code += `varying ${name}: ${shaderType};\\n`;\r\n break;\r\n }\r\n } else {\r\n code += `varying ${shaderType} ${name};\\n`;\r\n }\r\n if (define) {\r\n code += `#endif\\n`;\r\n }\r\n return code;\r\n };\r\n\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n this.sharedData.varyingDeclaration += emitCode(false);\r\n this.sharedData.varyingDeclarationFragment += emitCode(true);\r\n } else {\r\n const code = emitCode();\r\n this.sharedData.varyingDeclaration += code;\r\n this.sharedData.varyingDeclarationFragment += code;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getVaryingName(name: string): string {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return (this.target !== NodeMaterialBlockTargets.Fragment ? \"vertexOutputs.\" : \"fragmentInputs.\") + name;\r\n }\r\n\r\n return name;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitUniformFromString(name: string, type: NodeMaterialBlockConnectionPointTypes, define: string = \"\", notDefine = false, annotation?: string) {\r\n if (this.uniforms.indexOf(name) !== -1) {\r\n return;\r\n }\r\n\r\n this.uniforms.push(name);\r\n\r\n if (define) {\r\n if (define.startsWith(\"defined(\")) {\r\n this._uniformDeclaration += `#if ${define}\\n`;\r\n } else {\r\n this._uniformDeclaration += `${notDefine ? \"#ifndef\" : \"#ifdef\"} ${define}\\n`;\r\n }\r\n }\r\n if (annotation) {\r\n this._uniformDeclaration += `${annotation}\\n`;\r\n }\r\n const shaderType = this._getShaderType(type);\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n this._uniformDeclaration += `uniform ${name}: ${shaderType};\\n`;\r\n } else {\r\n this._uniformDeclaration += `uniform ${shaderType} ${name};\\n`;\r\n }\r\n if (define) {\r\n this._uniformDeclaration += `#endif\\n`;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _generateTernary(trueStatement: string, falseStatement: string, condition: string) {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return `select(${falseStatement}, ${trueStatement}, ${condition})`;\r\n }\r\n\r\n return `(${condition}) ? ${trueStatement} : ${falseStatement}`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitFloat(value: number) {\r\n if (value.toString() === value.toFixed(0)) {\r\n return `${value}.0`;\r\n }\r\n\r\n return value.toString();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _declareOutput(output: NodeMaterialConnectionPoint, isConst?: boolean): string {\r\n return this._declareLocalVar(output.associatedVariableName, output.type, isConst);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _declareLocalVar(name: string, type: NodeMaterialBlockConnectionPointTypes, isConst?: boolean): string {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return `${isConst ? \"const\" : \"var\"} ${name}: ${this._getShaderType(type)}`;\r\n } else {\r\n return `${isConst ? \"const \" : \"\"}${this._getShaderType(type)} ${name}`;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _samplerCubeFunc() {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return \"textureSample\";\r\n }\r\n return \"textureCube\";\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _samplerFunc() {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return \"textureSample\";\r\n }\r\n return \"texture2D\";\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _samplerLODFunc() {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return \"textureSampleLevel\";\r\n }\r\n return \"texture2DLodEXT\";\r\n }\r\n\r\n public _toLinearSpace(output: NodeMaterialConnectionPoint) {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n if (output.type === NodeMaterialBlockConnectionPointTypes.Color3 || output.type === NodeMaterialBlockConnectionPointTypes.Vector3) {\r\n return `toLinearSpaceVec3(${output.associatedVariableName})`;\r\n }\r\n\r\n return `toLinearSpace(${output.associatedVariableName})`;\r\n }\r\n return `toLinearSpace(${output.associatedVariableName})`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _generateTextureSample(uv: string, samplerName: string) {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return `${this._samplerFunc()}(${samplerName},${samplerName + Constants.AUTOSAMPLERSUFFIX}, ${uv})`;\r\n }\r\n return `${this._samplerFunc()}(${samplerName}, ${uv})`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _generateTextureSampleLOD(uv: string, samplerName: string, lod: string) {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return `${this._samplerLODFunc()}(${samplerName},${samplerName + Constants.AUTOSAMPLERSUFFIX}, ${uv}, ${lod})`;\r\n }\r\n return `${this._samplerLODFunc()}(${samplerName}, ${uv}, ${lod})`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _generateTextureSampleCube(uv: string, samplerName: string) {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return `${this._samplerCubeFunc()}(${samplerName},${samplerName + Constants.AUTOSAMPLERSUFFIX}, ${uv})`;\r\n }\r\n return `${this._samplerCubeFunc()}(${samplerName}, ${uv})`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _generateTextureSampleCubeLOD(uv: string, samplerName: string, lod: string) {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return `${this._samplerCubeFunc()}(${samplerName},${samplerName + Constants.AUTOSAMPLERSUFFIX}, ${uv}, ${lod})`;\r\n }\r\n return `${this._samplerCubeFunc()}(${samplerName}, ${uv}, ${lod})`;\r\n }\r\n\r\n private _convertVariableDeclarationToWGSL(type: string, dest: string, source: string): string {\r\n return source.replace(new RegExp(`(${type})\\\\s+(\\\\w+)`, \"g\"), `var $2: ${dest}`);\r\n }\r\n\r\n private _convertVariableConstructorsToWGSL(type: string, dest: string, source: string): string {\r\n return source.replace(new RegExp(`(${type})\\\\(`, \"g\"), ` ${dest}(`);\r\n }\r\n\r\n private _convertOutParametersToWGSL(source: string): string {\r\n return source.replace(new RegExp(`out\\\\s+var\\\\s+(\\\\w+)\\\\s*:\\\\s*(\\\\w+)`, \"g\"), `$1: ptr<function, $2>`);\r\n }\r\n\r\n private _convertTernaryOperandsToWGSL(source: string): string {\r\n return source.replace(new RegExp(`\\\\[(.*?)\\\\?(.*?):(.*)\\\\]`, \"g\"), (match, condition, trueCase, falseCase) => `select(${falseCase}, ${trueCase}, ${condition})`);\r\n }\r\n\r\n private _convertModOperatorsToWGSL(source: string): string {\r\n return source.replace(new RegExp(`mod\\\\((.+?),\\\\s*(.+?)\\\\)`, \"g\"), (match, left, right) => `((${left})%(${right}))`);\r\n }\r\n\r\n private _convertConstToWGSL(source: string): string {\r\n return source.replace(new RegExp(`const var`, \"g\"), `const`);\r\n }\r\n\r\n private _convertInnerFunctionsToWGSL(source: string): string {\r\n return source.replace(new RegExp(`inversesqrt`, \"g\"), `inverseSqrt`);\r\n }\r\n\r\n private _convertFunctionsToWGSL(source: string): string {\r\n const regex = /var\\s+(\\w+)\\s*:\\s*(\\w+)\\((.*)\\)/g;\r\n\r\n let match: RegExpMatchArray | null;\r\n while ((match = regex.exec(source)) !== null) {\r\n const funcName = match[1];\r\n const funcType = match[2];\r\n const params = match[3]; // All parameters as a single string\r\n\r\n // Processing the parameters to match 'name: type' format\r\n const formattedParams = params.replace(/var\\s/g, \"\");\r\n\r\n // Constructing the final output string\r\n source = source.replace(match[0], `fn ${funcName}(${formattedParams}) -> ${funcType}`);\r\n }\r\n return source;\r\n }\r\n\r\n public _babylonSLtoWGSL(code: string) {\r\n // variable declarations\r\n code = this._convertVariableDeclarationToWGSL(\"void\", \"voidnull\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"bool\", \"bool\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"int\", \"i32\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"uint\", \"u32\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"float\", \"f32\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"vec2\", \"vec2f\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"vec3\", \"vec3f\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"vec4\", \"vec4f\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"mat2\", \"mat2x2f\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"mat3\", \"mat3x3f\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"mat4\", \"mat4x4f\", code);\r\n\r\n // Type constructors\r\n code = this._convertVariableConstructorsToWGSL(\"float\", \"f32\", code);\r\n code = this._convertVariableConstructorsToWGSL(\"vec2\", \"vec2f\", code);\r\n code = this._convertVariableConstructorsToWGSL(\"vec3\", \"vec3f\", code);\r\n code = this._convertVariableConstructorsToWGSL(\"vec4\", \"vec4f\", code);\r\n code = this._convertVariableConstructorsToWGSL(\"mat2\", \"mat2x2f\", code);\r\n code = this._convertVariableConstructorsToWGSL(\"mat3\", \"mat3x3f\", code);\r\n code = this._convertVariableConstructorsToWGSL(\"mat4\", \"mat4x4f\", code);\r\n\r\n // Ternary operands\r\n code = this._convertTernaryOperandsToWGSL(code);\r\n\r\n // Mod operators\r\n code = this._convertModOperatorsToWGSL(code);\r\n\r\n // Const\r\n code = this._convertConstToWGSL(code);\r\n\r\n // Inner functions\r\n code = this._convertInnerFunctionsToWGSL(code);\r\n\r\n // Out paramters\r\n code = this._convertOutParametersToWGSL(code);\r\n code = code.replace(/\\[\\*\\]/g, \"*\");\r\n\r\n // Functions\r\n code = this._convertFunctionsToWGSL(code);\r\n\r\n // Remove voidnull\r\n code = code.replace(/\\s->\\svoidnull/g, \"\");\r\n\r\n // Derivatives\r\n code = code.replace(/dFdx/g, \"dpdx\");\r\n code = code.replace(/dFdy/g, \"dpdy\");\r\n\r\n return code;\r\n }\r\n\r\n private _convertTernaryOperandsToGLSL(source: string): string {\r\n return source.replace(new RegExp(`\\\\[(.+?)\\\\?(.+?):(.+)\\\\]`, \"g\"), (match, condition, trueCase, falseCase) => `${condition} ? ${trueCase} : ${falseCase}`);\r\n }\r\n\r\n public _babylonSLtoGLSL(code: string) {\r\n /** Remove BSL specifics */\r\n code = code.replace(/\\[\\*\\]/g, \"\");\r\n code = this._convertTernaryOperandsToGLSL(code);\r\n\r\n return code;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"nodeMaterialBuildState.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/Node/nodeMaterialBuildState.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlockConnectionPointTypes } from \"./Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport { NodeMaterialBlockTargets } from \"./Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialBuildStateSharedData } from \"./nodeMaterialBuildStateSharedData\";\r\nimport { ShaderLanguage } from \"../shaderLanguage\";\r\nimport type { NodeMaterialConnectionPoint } from \"./nodeMaterialBlockConnectionPoint\";\r\nimport { ShaderStore as EngineShaderStore } from \"../../Engines/shaderStore\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport type { NodeMaterialBlock } from \"./nodeMaterialBlock\";\r\nimport { NodeMaterialModes } from \"./Enums/nodeMaterialModes\";\r\nimport { Process } from \"core/Engines/Processors/shaderProcessor\";\r\nimport type { _IProcessingOptions } from \"core/Engines/Processors/shaderProcessingOptions\";\r\nimport { WebGLShaderProcessor } from \"core/Engines/WebGL/webGLShaderProcessors\";\r\n\r\n/** @internal */\r\nexport const SfeModeDefine = \"USE_SFE_FRAMEWORK\";\r\n\r\n/**\r\n * Class used to store node based material build state\r\n */\r\nexport class NodeMaterialBuildState {\r\n /** Gets or sets a boolean indicating if the current state can emit uniform buffers */\r\n public supportUniformBuffers = false;\r\n /**\r\n * Gets the list of emitted attributes\r\n */\r\n public attributes: string[] = [];\r\n /**\r\n * Gets the list of emitted uniforms\r\n */\r\n public uniforms: string[] = [];\r\n /**\r\n * Gets the list of emitted constants\r\n */\r\n public constants: string[] = [];\r\n /**\r\n * Gets the list of emitted samplers\r\n */\r\n public samplers: string[] = [];\r\n /**\r\n * Gets the list of emitted functions\r\n */\r\n public functions: { [key: string]: string } = {};\r\n /**\r\n * Gets the list of emitted extensions\r\n */\r\n public extensions: { [key: string]: string } = {};\r\n /**\r\n * Gets the list of emitted prePass outputs - if using the prepass\r\n */\r\n public prePassOutput: { [key: string]: string } = {};\r\n\r\n /**\r\n * Gets the target of the compilation state\r\n */\r\n public target: NodeMaterialBlockTargets;\r\n /**\r\n * Gets the list of emitted counters\r\n */\r\n public counters: { [key: string]: number } = {};\r\n\r\n /**\r\n * Shared data between multiple NodeMaterialBuildState instances\r\n */\r\n public sharedData: NodeMaterialBuildStateSharedData;\r\n\r\n /** @internal */\r\n public _terminalBlocks: Set<NodeMaterialBlock> = new Set();\r\n\r\n /** @internal */\r\n public _vertexState: NodeMaterialBuildState;\r\n\r\n /** @internal */\r\n public _attributeDeclaration = \"\";\r\n /** @internal */\r\n public _uniformDeclaration = \"\";\r\n /** @internal */\r\n public _constantDeclaration = \"\";\r\n /** @internal */\r\n public _samplerDeclaration = \"\";\r\n /** @internal */\r\n public _varyingTransfer = \"\";\r\n /** @internal */\r\n public _injectAtEnd = \"\";\r\n\r\n private _repeatableContentAnchorIndex = 0;\r\n /** @internal */\r\n public _builtCompilationString = \"\";\r\n\r\n /**\r\n * Gets the emitted compilation strings\r\n */\r\n public compilationString = \"\";\r\n\r\n /**\r\n * Gets the current shader language to use\r\n */\r\n public get shaderLanguage() {\r\n return this.sharedData.nodeMaterial.shaderLanguage;\r\n }\r\n\r\n /** Gets suffix to add behind type casting */\r\n public get fSuffix() {\r\n return this.shaderLanguage === ShaderLanguage.WGSL ? \"f\" : \"\";\r\n }\r\n\r\n /**\r\n * Gets whether the current compilation should inject SFE syntax or not\r\n */\r\n public get isSFEMode() {\r\n return this.sharedData.nodeMaterial.mode === NodeMaterialModes.SFE;\r\n }\r\n\r\n /**\r\n * Returns the processed, compiled shader code\r\n * @returns the raw shader code used by the engine\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public getProcessedShaderAsync(): Promise<string> {\r\n if (!this._builtCompilationString) {\r\n throw new Error(\"Shader not built yet.\");\r\n }\r\n\r\n const engine = this.sharedData.nodeMaterial.getScene().getEngine();\r\n const options: _IProcessingOptions = {\r\n defines: [],\r\n indexParameters: undefined,\r\n isFragment: this.target === NodeMaterialBlockTargets.Fragment,\r\n shouldUseHighPrecisionShader: engine._shouldUseHighPrecisionShader,\r\n processor: engine._getShaderProcessor(this.shaderLanguage),\r\n supportsUniformBuffers: engine.supportsUniformBuffers,\r\n shadersRepository: EngineShaderStore.GetShadersRepository(this.shaderLanguage),\r\n includesShadersStore: EngineShaderStore.GetIncludesShadersStore(this.shaderLanguage),\r\n version: (engine.version * 100).toString(),\r\n platformName: engine.shaderPlatformName,\r\n processingContext: null,\r\n isNDCHalfZRange: engine.isNDCHalfZRange,\r\n useReverseDepthBuffer: engine.useReverseDepthBuffer,\r\n };\r\n\r\n // Export WebGL2 shaders with WebGL1 syntax for max compatibility\r\n if (!engine.isWebGPU && engine.version > 1.0) {\r\n options.processor = new WebGLShaderProcessor();\r\n }\r\n\r\n // For SFE, use the SFE define to toggle the SFE syntax in the shader\r\n if (this.isSFEMode) {\r\n options.defines.push(SfeModeDefine);\r\n }\r\n\r\n return new Promise((resolve) => {\r\n Process(\r\n this._builtCompilationString,\r\n options,\r\n (migratedCode, _) => {\r\n resolve(migratedCode);\r\n },\r\n engine\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Finalize the compilation strings\r\n * @param state defines the current compilation state\r\n */\r\n public finalize(state: NodeMaterialBuildState) {\r\n const emitComments = state.sharedData.emitComments;\r\n const isFragmentMode = this.target === NodeMaterialBlockTargets.Fragment;\r\n\r\n let entryPointString = `\\n${emitComments ? \"//Entry point\\n\" : \"\"}`;\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n if (isFragmentMode) {\r\n entryPointString = `@fragment\\nfn main(input: FragmentInputs) -> FragmentOutputs {\\n${this.sharedData.varyingInitializationsFragment}`;\r\n } else {\r\n entryPointString = `@vertex\\nfn main(input: VertexInputs) -> FragmentInputs{\\n`;\r\n }\r\n } else if (this.isSFEMode) {\r\n // SFE: Replace the entry with a helper function\r\n entryPointString += `#ifdef ${SfeModeDefine}\\n`;\r\n entryPointString += `vec4 nmeMain(vec2 vUV) { // main\\n`;\r\n entryPointString += `#else\\n`;\r\n entryPointString += `void main(void) {\\n`;\r\n entryPointString += `#endif\\n`;\r\n } else {\r\n entryPointString = `void main(void) {\\n`;\r\n }\r\n\r\n this.compilationString = entryPointString + this.compilationString;\r\n\r\n if (this._constantDeclaration) {\r\n this.compilationString = `\\n${emitComments ? \"//Constants\\n\" : \"\"}${this._constantDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n let functionCode = \"\";\r\n for (const functionName in this.functions) {\r\n functionCode += this.functions[functionName] + `\\n`;\r\n }\r\n this.compilationString = `\\n${functionCode}\\n${this.compilationString}`;\r\n\r\n if (!isFragmentMode && this._varyingTransfer) {\r\n this.compilationString = `${this.compilationString}\\n${this._varyingTransfer}`;\r\n }\r\n\r\n if (this._injectAtEnd) {\r\n this.compilationString = `${this.compilationString}\\n${this._injectAtEnd}`;\r\n }\r\n\r\n this.compilationString = `${this.compilationString}\\n}`;\r\n\r\n if (this.sharedData.varyingDeclaration) {\r\n this.compilationString = `\\n${emitComments ? \"//Varyings\\n\" : \"\"}${isFragmentMode ? this.sharedData.varyingDeclarationFragment : this.sharedData.varyingDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n if (this._samplerDeclaration) {\r\n this.compilationString = `\\n${emitComments ? \"//Samplers\\n\" : \"\"}${this._samplerDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n if (this._uniformDeclaration) {\r\n this.compilationString = `\\n${emitComments ? \"//Uniforms\\n\" : \"\"}${this._uniformDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n if (this._attributeDeclaration && !isFragmentMode) {\r\n this.compilationString = `\\n${emitComments ? \"//Attributes\\n\" : \"\"}${this._attributeDeclaration}\\n${this.compilationString}`;\r\n }\r\n\r\n if (this.shaderLanguage !== ShaderLanguage.WGSL) {\r\n this.compilationString = \"precision highp float;\\n\" + this.compilationString;\r\n this.compilationString = \"#if defined(WEBGL2) || defined(WEBGPU)\\nprecision highp sampler2DArray;\\n#endif\\n\" + this.compilationString;\r\n\r\n if (isFragmentMode) {\r\n this.compilationString =\r\n \"#if defined(PREPASS)\\r\\n#extension GL_EXT_draw_buffers : require\\r\\nlayout(location = 0) out highp vec4 glFragData[SCENE_MRT_COUNT];\\r\\nhighp vec4 gl_FragColor;\\r\\n#endif\\r\\n\" +\r\n this.compilationString;\r\n }\r\n\r\n for (const extensionName in this.extensions) {\r\n const extension = this.extensions[extensionName];\r\n this.compilationString = `\\n${extension}\\n${this.compilationString}`;\r\n }\r\n }\r\n\r\n if (this.isSFEMode) {\r\n this.compilationString = `\\n// { \"smartFilterBlockType\": \"${this.sharedData.nodeMaterial.name}\", \"namespace\": \"Babylon.NME.Test\" }\\n${this.compilationString}`;\r\n }\r\n\r\n this._builtCompilationString = this.compilationString;\r\n }\r\n\r\n /** @internal */\r\n public get _repeatableContentAnchor(): string {\r\n return `###___ANCHOR${this._repeatableContentAnchorIndex++}___###`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getFreeVariableName(prefix: string): string {\r\n prefix = prefix.replace(/[^a-zA-Z_]+/g, \"\");\r\n\r\n if (this.sharedData.variableNames[prefix] === undefined) {\r\n this.sharedData.variableNames[prefix] = 0;\r\n\r\n // Check reserved words\r\n if (prefix === \"output\" || prefix === \"texture\") {\r\n return prefix + this.sharedData.variableNames[prefix];\r\n }\r\n\r\n return prefix;\r\n } else {\r\n this.sharedData.variableNames[prefix]++;\r\n }\r\n\r\n return prefix + this.sharedData.variableNames[prefix];\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getFreeDefineName(prefix: string): string {\r\n if (this.sharedData.defineNames[prefix] === undefined) {\r\n this.sharedData.defineNames[prefix] = 0;\r\n } else {\r\n this.sharedData.defineNames[prefix]++;\r\n }\r\n\r\n return prefix + this.sharedData.defineNames[prefix];\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _excludeVariableName(name: string) {\r\n this.sharedData.variableNames[name] = 0;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emit2DSampler(name: string, define = \"\", force = false, annotation?: string, unsignedSampler?: boolean, precision?: string) {\r\n if (this.samplers.indexOf(name) < 0 || force) {\r\n if (define) {\r\n this._samplerDeclaration += `#if ${define}\\n`;\r\n }\r\n\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n const unsignedSamplerPrefix = unsignedSampler ? \"u\" : \"f\";\r\n this._samplerDeclaration += `var ${name + Constants.AUTOSAMPLERSUFFIX}: sampler;\\n`;\r\n this._samplerDeclaration += `var ${name}: texture_2d<${unsignedSamplerPrefix}32>;\\n`;\r\n } else {\r\n const unsignedSamplerPrefix = unsignedSampler ? \"u\" : \"\";\r\n const precisionDecl = precision ?? \"\";\r\n this._samplerDeclaration += `uniform ${precisionDecl} ${unsignedSamplerPrefix}sampler2D ${name}; ${annotation ? annotation : \"\"}\\n`;\r\n }\r\n\r\n if (define) {\r\n this._samplerDeclaration += `#endif\\n`;\r\n }\r\n\r\n if (!force) {\r\n this.samplers.push(name);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitCubeSampler(name: string, define = \"\", force = false) {\r\n if (this.samplers.indexOf(name) < 0 || force) {\r\n if (define) {\r\n this._samplerDeclaration += `#if ${define}\\n`;\r\n }\r\n\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n this._samplerDeclaration += `var ${name + Constants.AUTOSAMPLERSUFFIX}: sampler;\\n`;\r\n this._samplerDeclaration += `var ${name}: texture_cube<f32>;\\n`;\r\n } else {\r\n this._samplerDeclaration += `uniform samplerCube ${name};\\n`;\r\n }\r\n\r\n if (define) {\r\n this._samplerDeclaration += `#endif\\n`;\r\n }\r\n\r\n if (!force) {\r\n this.samplers.push(name);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emit2DArraySampler(name: string) {\r\n if (this.samplers.indexOf(name) < 0) {\r\n this._samplerDeclaration += `uniform sampler2DArray ${name};\\n`;\r\n this.samplers.push(name);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getGLType(type: NodeMaterialBlockConnectionPointTypes): string {\r\n switch (type) {\r\n case NodeMaterialBlockConnectionPointTypes.Float:\r\n return \"float\";\r\n case NodeMaterialBlockConnectionPointTypes.Int:\r\n return \"int\";\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n return \"vec2\";\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n return \"vec3\";\r\n case NodeMaterialBlockConnectionPointTypes.Color4:\r\n case NodeMaterialBlockConnectionPointTypes.Vector4:\r\n return \"vec4\";\r\n case NodeMaterialBlockConnectionPointTypes.Matrix:\r\n return \"mat4\";\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getShaderType(type: NodeMaterialBlockConnectionPointTypes) {\r\n const isWGSL = this.shaderLanguage === ShaderLanguage.WGSL;\r\n\r\n switch (type) {\r\n case NodeMaterialBlockConnectionPointTypes.Float:\r\n return isWGSL ? \"f32\" : \"float\";\r\n case NodeMaterialBlockConnectionPointTypes.Int:\r\n return isWGSL ? \"i32\" : \"int\";\r\n case NodeMaterialBlockConnectionPointTypes.Vector2:\r\n return isWGSL ? \"vec2f\" : \"vec2\";\r\n case NodeMaterialBlockConnectionPointTypes.Color3:\r\n case NodeMaterialBlockConnectionPointTypes.Vector3:\r\n return isWGSL ? \"vec3f\" : \"vec3\";\r\n case NodeMaterialBlockConnectionPointTypes.Color4:\r\n case NodeMaterialBlockConnectionPointTypes.Vector4:\r\n return isWGSL ? \"vec4f\" : \"vec4\";\r\n case NodeMaterialBlockConnectionPointTypes.Matrix:\r\n return isWGSL ? \"mat4x4f\" : \"mat4\";\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitExtension(name: string, extension: string, define: string = \"\") {\r\n if (this.extensions[name]) {\r\n return;\r\n }\r\n\r\n if (define) {\r\n extension = `#if ${define}\\n${extension}\\n#endif`;\r\n }\r\n this.extensions[name] = extension;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitFunction(name: string, code: string, comments: string) {\r\n if (this.functions[name]) {\r\n return;\r\n }\r\n\r\n if (this.sharedData.emitComments) {\r\n code = comments + `\\n` + code;\r\n }\r\n\r\n this.functions[name] = code;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitCodeFromInclude(\r\n includeName: string,\r\n comments: string,\r\n options?: {\r\n replaceStrings?: { search: RegExp; replace: string }[];\r\n repeatKey?: string;\r\n substitutionVars?: string;\r\n }\r\n ) {\r\n const store = EngineShaderStore.GetIncludesShadersStore(this.shaderLanguage);\r\n\r\n if (options && options.repeatKey) {\r\n return `#include<${includeName}>${options.substitutionVars ? \"(\" + options.substitutionVars + \")\" : \"\"}[0..${options.repeatKey}]\\n`;\r\n }\r\n\r\n let code = store[includeName] + \"\\n\";\r\n\r\n if (this.sharedData.emitComments) {\r\n code = comments + `\\n` + code;\r\n }\r\n\r\n if (!options) {\r\n return code;\r\n }\r\n\r\n if (options.replaceStrings) {\r\n for (let index = 0; index < options.replaceStrings.length; index++) {\r\n const replaceString = options.replaceStrings[index];\r\n code = code.replace(replaceString.search, replaceString.replace);\r\n }\r\n }\r\n\r\n return code;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitFunctionFromInclude(\r\n includeName: string,\r\n comments: string,\r\n options?: {\r\n repeatKey?: string;\r\n substitutionVars?: string;\r\n removeAttributes?: boolean;\r\n removeUniforms?: boolean;\r\n removeVaryings?: boolean;\r\n removeIfDef?: boolean;\r\n replaceStrings?: { search: RegExp; replace: string }[];\r\n },\r\n storeKey: string = \"\"\r\n ) {\r\n const key = includeName + storeKey;\r\n if (this.functions[key]) {\r\n return;\r\n }\r\n const store = EngineShaderStore.GetIncludesShadersStore(this.shaderLanguage);\r\n\r\n if (!options || (!options.removeAttributes && !options.removeUniforms && !options.removeVaryings && !options.removeIfDef && !options.replaceStrings)) {\r\n if (options && options.repeatKey) {\r\n this.functions[key] = `#include<${includeName}>${options.substitutionVars ? \"(\" + options.substitutionVars + \")\" : \"\"}[0..${options.repeatKey}]\\n`;\r\n } else {\r\n this.functions[key] = `#include<${includeName}>${options?.substitutionVars ? \"(\" + options?.substitutionVars + \")\" : \"\"}\\n`;\r\n }\r\n\r\n if (this.sharedData.emitComments) {\r\n this.functions[key] = comments + `\\n` + this.functions[key];\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.functions[key] = store[includeName];\r\n\r\n if (this.sharedData.emitComments) {\r\n this.functions[key] = comments + `\\n` + this.functions[key];\r\n }\r\n\r\n if (options.removeIfDef) {\r\n this.functions[key] = this.functions[key].replace(/^\\s*?#ifdef.+$/gm, \"\");\r\n this.functions[key] = this.functions[key].replace(/^\\s*?#endif.*$/gm, \"\");\r\n this.functions[key] = this.functions[key].replace(/^\\s*?#else.*$/gm, \"\");\r\n this.functions[key] = this.functions[key].replace(/^\\s*?#elif.*$/gm, \"\");\r\n }\r\n\r\n if (options.removeAttributes) {\r\n this.functions[key] = this.functions[key].replace(/\\s*?attribute .+?;/g, \"\\n\");\r\n }\r\n\r\n if (options.removeUniforms) {\r\n this.functions[key] = this.functions[key].replace(/\\s*?uniform .*?;/g, \"\\n\");\r\n }\r\n\r\n if (options.removeVaryings) {\r\n this.functions[key] = this.functions[key].replace(/\\s*?(varying|in) .+?;/g, \"\\n\");\r\n }\r\n\r\n if (options.replaceStrings) {\r\n for (let index = 0; index < options.replaceStrings.length; index++) {\r\n const replaceString = options.replaceStrings[index];\r\n this.functions[key] = this.functions[key].replace(replaceString.search, replaceString.replace);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _registerTempVariable(name: string) {\r\n if (this.sharedData.temps.indexOf(name) !== -1) {\r\n return false;\r\n }\r\n\r\n this.sharedData.temps.push(name);\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitVaryingFromString(name: string, type: NodeMaterialBlockConnectionPointTypes, define: string = \"\", notDefine = false) {\r\n if (this.sharedData.varyings.indexOf(name) !== -1) {\r\n return false;\r\n }\r\n\r\n this.sharedData.varyings.push(name);\r\n\r\n const shaderType = this._getShaderType(type);\r\n\r\n const emitCode = (forFragment = false) => {\r\n let code = \"\";\r\n if (define) {\r\n if (define.startsWith(\"defined(\")) {\r\n code += `#if ${define}\\n`;\r\n } else {\r\n code += `${notDefine ? \"#ifndef\" : \"#ifdef\"} ${define}\\n`;\r\n }\r\n }\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n switch (shaderType) {\r\n case \"mat4x4f\":\r\n // We can't pass a matrix as a varying in WGSL, so we need to split it into 4 vectors\r\n code += `varying ${name}_r0: vec4f;\\n`;\r\n code += `varying ${name}_r1: vec4f;\\n`;\r\n code += `varying ${name}_r2: vec4f;\\n`;\r\n code += `varying ${name}_r3: vec4f;\\n`;\r\n\r\n if (forFragment) {\r\n code += `var<private> ${name}: mat4x4f;\\n`;\r\n this.sharedData.varyingInitializationsFragment += `${name} = mat4x4f(fragmentInputs.${name}_r0, fragmentInputs.${name}_r1, fragmentInputs.${name}_r2, fragmentInputs.${name}_r3);\\n`;\r\n }\r\n break;\r\n default:\r\n code += `varying ${name}: ${shaderType};\\n`;\r\n break;\r\n }\r\n } else {\r\n code += `varying ${shaderType} ${name};\\n`;\r\n }\r\n if (define) {\r\n code += `#endif\\n`;\r\n }\r\n return code;\r\n };\r\n\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n this.sharedData.varyingDeclaration += emitCode(false);\r\n this.sharedData.varyingDeclarationFragment += emitCode(true);\r\n } else {\r\n const code = emitCode();\r\n this.sharedData.varyingDeclaration += code;\r\n this.sharedData.varyingDeclarationFragment += code;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getVaryingName(name: string): string {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return (this.target !== NodeMaterialBlockTargets.Fragment ? \"vertexOutputs.\" : \"fragmentInputs.\") + name;\r\n }\r\n\r\n return name;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitUniformFromString(name: string, type: NodeMaterialBlockConnectionPointTypes, define: string = \"\", notDefine = false, annotation?: string) {\r\n if (this.uniforms.indexOf(name) !== -1) {\r\n return;\r\n }\r\n\r\n this.uniforms.push(name);\r\n\r\n if (define) {\r\n if (define.startsWith(\"defined(\")) {\r\n this._uniformDeclaration += `#if ${define}\\n`;\r\n } else {\r\n this._uniformDeclaration += `${notDefine ? \"#ifndef\" : \"#ifdef\"} ${define}\\n`;\r\n }\r\n }\r\n if (annotation) {\r\n this._uniformDeclaration += `${annotation}\\n`;\r\n }\r\n const shaderType = this._getShaderType(type);\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n this._uniformDeclaration += `uniform ${name}: ${shaderType};\\n`;\r\n } else {\r\n this._uniformDeclaration += `uniform ${shaderType} ${name};\\n`;\r\n }\r\n if (define) {\r\n this._uniformDeclaration += `#endif\\n`;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _generateTernary(trueStatement: string, falseStatement: string, condition: string) {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return `select(${falseStatement}, ${trueStatement}, ${condition})`;\r\n }\r\n\r\n return `(${condition}) ? ${trueStatement} : ${falseStatement}`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _emitFloat(value: number) {\r\n if (value.toString() === value.toFixed(0)) {\r\n return `${value}.0`;\r\n }\r\n\r\n return value.toString();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _declareOutput(output: NodeMaterialConnectionPoint, isConst?: boolean): string {\r\n return this._declareLocalVar(output.associatedVariableName, output.type, isConst);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _declareLocalVar(name: string, type: NodeMaterialBlockConnectionPointTypes, isConst?: boolean): string {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return `${isConst ? \"const\" : \"var\"} ${name}: ${this._getShaderType(type)}`;\r\n } else {\r\n return `${isConst ? \"const \" : \"\"}${this._getShaderType(type)} ${name}`;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _samplerCubeFunc() {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return \"textureSample\";\r\n }\r\n return \"textureCube\";\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _samplerFunc() {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return \"textureSample\";\r\n }\r\n return \"texture2D\";\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _samplerLODFunc() {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return \"textureSampleLevel\";\r\n }\r\n return \"texture2DLodEXT\";\r\n }\r\n\r\n public _toLinearSpace(output: NodeMaterialConnectionPoint) {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n if (output.type === NodeMaterialBlockConnectionPointTypes.Color3 || output.type === NodeMaterialBlockConnectionPointTypes.Vector3) {\r\n return `toLinearSpaceVec3(${output.associatedVariableName})`;\r\n }\r\n\r\n return `toLinearSpace(${output.associatedVariableName})`;\r\n }\r\n return `toLinearSpace(${output.associatedVariableName})`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _generateTextureSample(uv: string, samplerName: string) {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return `${this._samplerFunc()}(${samplerName},${samplerName + Constants.AUTOSAMPLERSUFFIX}, ${uv})`;\r\n }\r\n return `${this._samplerFunc()}(${samplerName}, ${uv})`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _generateTextureSampleLOD(uv: string, samplerName: string, lod: string) {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return `${this._samplerLODFunc()}(${samplerName},${samplerName + Constants.AUTOSAMPLERSUFFIX}, ${uv}, ${lod})`;\r\n }\r\n return `${this._samplerLODFunc()}(${samplerName}, ${uv}, ${lod})`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _generateTextureSampleCube(uv: string, samplerName: string) {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return `${this._samplerCubeFunc()}(${samplerName},${samplerName + Constants.AUTOSAMPLERSUFFIX}, ${uv})`;\r\n }\r\n return `${this._samplerCubeFunc()}(${samplerName}, ${uv})`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _generateTextureSampleCubeLOD(uv: string, samplerName: string, lod: string) {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n return `${this._samplerCubeFunc()}(${samplerName},${samplerName + Constants.AUTOSAMPLERSUFFIX}, ${uv}, ${lod})`;\r\n }\r\n return `${this._samplerCubeFunc()}(${samplerName}, ${uv}, ${lod})`;\r\n }\r\n\r\n private _convertVariableDeclarationToWGSL(type: string, dest: string, source: string): string {\r\n return source.replace(new RegExp(`(${type})\\\\s+(\\\\w+)`, \"g\"), `var $2: ${dest}`);\r\n }\r\n\r\n private _convertVariableConstructorsToWGSL(type: string, dest: string, source: string): string {\r\n return source.replace(new RegExp(`(${type})\\\\(`, \"g\"), ` ${dest}(`);\r\n }\r\n\r\n private _convertOutParametersToWGSL(source: string): string {\r\n return source.replace(new RegExp(`out\\\\s+var\\\\s+(\\\\w+)\\\\s*:\\\\s*(\\\\w+)`, \"g\"), `$1: ptr<function, $2>`);\r\n }\r\n\r\n private _convertTernaryOperandsToWGSL(source: string): string {\r\n return source.replace(new RegExp(`\\\\[(.*?)\\\\?(.*?):(.*)\\\\]`, \"g\"), (match, condition, trueCase, falseCase) => `select(${falseCase}, ${trueCase}, ${condition})`);\r\n }\r\n\r\n private _convertModOperatorsToWGSL(source: string): string {\r\n return source.replace(new RegExp(`mod\\\\((.+?),\\\\s*(.+?)\\\\)`, \"g\"), (match, left, right) => `((${left})%(${right}))`);\r\n }\r\n\r\n private _convertConstToWGSL(source: string): string {\r\n return source.replace(new RegExp(`const var`, \"g\"), `const`);\r\n }\r\n\r\n private _convertInnerFunctionsToWGSL(source: string): string {\r\n return source.replace(new RegExp(`inversesqrt`, \"g\"), `inverseSqrt`);\r\n }\r\n\r\n private _convertFunctionsToWGSL(source: string): string {\r\n const regex = /var\\s+(\\w+)\\s*:\\s*(\\w+)\\((.*)\\)/g;\r\n\r\n let match: RegExpMatchArray | null;\r\n while ((match = regex.exec(source)) !== null) {\r\n const funcName = match[1];\r\n const funcType = match[2];\r\n const params = match[3]; // All parameters as a single string\r\n\r\n // Processing the parameters to match 'name: type' format\r\n const formattedParams = params.replace(/var\\s/g, \"\");\r\n\r\n // Constructing the final output string\r\n source = source.replace(match[0], `fn ${funcName}(${formattedParams}) -> ${funcType}`);\r\n }\r\n return source;\r\n }\r\n\r\n public _babylonSLtoWGSL(code: string) {\r\n // variable declarations\r\n code = this._convertVariableDeclarationToWGSL(\"void\", \"voidnull\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"bool\", \"bool\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"int\", \"i32\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"uint\", \"u32\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"float\", \"f32\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"vec2\", \"vec2f\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"vec3\", \"vec3f\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"vec4\", \"vec4f\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"mat2\", \"mat2x2f\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"mat3\", \"mat3x3f\", code);\r\n code = this._convertVariableDeclarationToWGSL(\"mat4\", \"mat4x4f\", code);\r\n\r\n // Type constructors\r\n code = this._convertVariableConstructorsToWGSL(\"float\", \"f32\", code);\r\n code = this._convertVariableConstructorsToWGSL(\"vec2\", \"vec2f\", code);\r\n code = this._convertVariableConstructorsToWGSL(\"vec3\", \"vec3f\", code);\r\n code = this._convertVariableConstructorsToWGSL(\"vec4\", \"vec4f\", code);\r\n code = this._convertVariableConstructorsToWGSL(\"mat2\", \"mat2x2f\", code);\r\n code = this._convertVariableConstructorsToWGSL(\"mat3\", \"mat3x3f\", code);\r\n code = this._convertVariableConstructorsToWGSL(\"mat4\", \"mat4x4f\", code);\r\n\r\n // Ternary operands\r\n code = this._convertTernaryOperandsToWGSL(code);\r\n\r\n // Mod operators\r\n code = this._convertModOperatorsToWGSL(code);\r\n\r\n // Const\r\n code = this._convertConstToWGSL(code);\r\n\r\n // Inner functions\r\n code = this._convertInnerFunctionsToWGSL(code);\r\n\r\n // Out paramters\r\n code = this._convertOutParametersToWGSL(code);\r\n code = code.replace(/\\[\\*\\]/g, \"*\");\r\n\r\n // Functions\r\n code = this._convertFunctionsToWGSL(code);\r\n\r\n // Remove voidnull\r\n code = code.replace(/\\s->\\svoidnull/g, \"\");\r\n\r\n // Derivatives\r\n code = code.replace(/dFdx/g, \"dpdx\");\r\n code = code.replace(/dFdy/g, \"dpdy\");\r\n\r\n return code;\r\n }\r\n\r\n private _convertTernaryOperandsToGLSL(source: string): string {\r\n return source.replace(new RegExp(`\\\\[(.+?)\\\\?(.+?):(.+)\\\\]`, \"g\"), (match, condition, trueCase, falseCase) => `${condition} ? ${trueCase} : ${falseCase}`);\r\n }\r\n\r\n public _babylonSLtoGLSL(code: string) {\r\n /** Remove BSL specifics */\r\n code = code.replace(/\\[\\*\\]/g, \"\");\r\n code = this._convertTernaryOperandsToGLSL(code);\r\n\r\n return code;\r\n }\r\n}\r\n"]}
|