@babylonjs/core 9.5.0 → 9.5.2

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.
Files changed (92) hide show
  1. package/Compute/computeEffect.js +2 -2
  2. package/Compute/computeEffect.js.map +1 -1
  3. package/Debug/debugLayer.js +1 -1
  4. package/Debug/debugLayer.js.map +1 -1
  5. package/Engines/abstractEngine.js +2 -2
  6. package/Engines/abstractEngine.js.map +1 -1
  7. package/FrameGraph/Node/nodeRenderGraph.js +11 -3
  8. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  9. package/Lights/Clustered/clusteredLightContainer.js +9 -1
  10. package/Lights/Clustered/clusteredLightContainer.js.map +1 -1
  11. package/Lights/light.d.ts +5 -0
  12. package/Lights/light.js +18 -2
  13. package/Lights/light.js.map +1 -1
  14. package/Materials/Background/backgroundMaterial.js +1 -0
  15. package/Materials/Background/backgroundMaterial.js.map +1 -1
  16. package/Materials/Node/Blocks/Dual/imageSourceBlock.d.ts +2 -0
  17. package/Materials/Node/Blocks/Dual/imageSourceBlock.js +14 -0
  18. package/Materials/Node/Blocks/Dual/imageSourceBlock.js.map +1 -1
  19. package/Materials/Node/Blocks/Dual/lightBlock.js +1 -1
  20. package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
  21. package/Materials/Node/Blocks/Dual/textureBlock.d.ts +2 -0
  22. package/Materials/Node/Blocks/Dual/textureBlock.js +19 -4
  23. package/Materials/Node/Blocks/Dual/textureBlock.js.map +1 -1
  24. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +11 -6
  25. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  26. package/Materials/Node/nodeMaterial.js +10 -2
  27. package/Materials/Node/nodeMaterial.js.map +1 -1
  28. package/Materials/PBR/openpbrMaterial.d.ts +31 -0
  29. package/Materials/PBR/openpbrMaterial.js +51 -2
  30. package/Materials/PBR/openpbrMaterial.js.map +1 -1
  31. package/Materials/PBR/pbrBaseMaterial.js +1 -0
  32. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  33. package/Materials/effect.functions.js +4 -4
  34. package/Materials/effect.functions.js.map +1 -1
  35. package/Materials/materialHelper.functions.d.ts +2 -1
  36. package/Materials/materialHelper.functions.js +8 -3
  37. package/Materials/materialHelper.functions.js.map +1 -1
  38. package/Materials/standardMaterial.js +1 -0
  39. package/Materials/standardMaterial.js.map +1 -1
  40. package/Meshes/Node/Blocks/bevelBlock.d.ts +52 -0
  41. package/Meshes/Node/Blocks/bevelBlock.js +1327 -0
  42. package/Meshes/Node/Blocks/bevelBlock.js.map +1 -0
  43. package/Meshes/Node/index.d.ts +1 -0
  44. package/Meshes/Node/index.js +1 -0
  45. package/Meshes/Node/index.js.map +1 -1
  46. package/Meshes/Node/nodeGeometry.js +10 -2
  47. package/Meshes/Node/nodeGeometry.js.map +1 -1
  48. package/Misc/snapshotRenderingHelper.d.ts +22 -1
  49. package/Misc/snapshotRenderingHelper.js +101 -0
  50. package/Misc/snapshotRenderingHelper.js.map +1 -1
  51. package/Misc/tools.js +1 -1
  52. package/Misc/tools.js.map +1 -1
  53. package/Particles/Node/nodeParticleSystemSet.js +10 -2
  54. package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
  55. package/Particles/thinParticleSystem.d.ts +13 -0
  56. package/Particles/thinParticleSystem.js +41 -6
  57. package/Particles/thinParticleSystem.js.map +1 -1
  58. package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js +20 -7
  59. package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
  60. package/Shaders/ShadersInclude/openpbrDirectLighting.js +2 -2
  61. package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  62. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js +8 -2
  63. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  64. package/Shaders/ShadersInclude/openpbrFragmentDeclaration.js +4 -1
  65. package/Shaders/ShadersInclude/openpbrFragmentDeclaration.js.map +1 -1
  66. package/Shaders/ShadersInclude/openpbrNormalMapFragment.js +2 -0
  67. package/Shaders/ShadersInclude/openpbrNormalMapFragment.js.map +1 -1
  68. package/Shaders/ShadersInclude/openpbrVolumeFunctions.js +1 -1
  69. package/Shaders/ShadersInclude/openpbrVolumeFunctions.js.map +1 -1
  70. package/Shaders/ShadersInclude/pbrBRDFFunctions.js +2 -1
  71. package/Shaders/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
  72. package/Shaders/openpbr.fragment.js +1 -1
  73. package/Shaders/openpbr.fragment.js.map +1 -1
  74. package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js +20 -7
  75. package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
  76. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +2 -2
  77. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  78. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js +9 -3
  79. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  80. package/ShadersWGSL/ShadersInclude/openpbrNormalMapFragment.js +2 -0
  81. package/ShadersWGSL/ShadersInclude/openpbrNormalMapFragment.js.map +1 -1
  82. package/ShadersWGSL/ShadersInclude/openpbrNormalMapFragmentMainFunctions.js +1 -1
  83. package/ShadersWGSL/ShadersInclude/openpbrNormalMapFragmentMainFunctions.js.map +1 -1
  84. package/ShadersWGSL/ShadersInclude/openpbrVolumeFunctions.js +1 -1
  85. package/ShadersWGSL/ShadersInclude/openpbrVolumeFunctions.js.map +1 -1
  86. package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js +5 -4
  87. package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
  88. package/ShadersWGSL/ShadersInclude/shadowsVertex.js +4 -0
  89. package/ShadersWGSL/ShadersInclude/shadowsVertex.js.map +1 -1
  90. package/ShadersWGSL/openpbr.fragment.js +1 -1
  91. package/ShadersWGSL/openpbr.fragment.js.map +1 -1
  92. package/package.json +1 -1
@@ -40,10 +40,10 @@ export function _ProcessShaderCode(processorOptions, baseName, processFinalCode,
40
40
  if (typeof baseName === "string") {
41
41
  vertexSource = baseName;
42
42
  }
43
- else if (baseName.vertexSource) {
43
+ else if (typeof baseName.vertexSource === "string") {
44
44
  vertexSource = "source:" + baseName.vertexSource;
45
45
  }
46
- else if (baseName.vertexElement) {
46
+ else if (typeof baseName.vertexElement === "string") {
47
47
  vertexSource = hostDocument?.getElementById(baseName.vertexElement) || baseName.vertexElement;
48
48
  }
49
49
  else {
@@ -52,10 +52,10 @@ export function _ProcessShaderCode(processorOptions, baseName, processFinalCode,
52
52
  if (typeof baseName === "string") {
53
53
  fragmentSource = baseName;
54
54
  }
55
- else if (baseName.fragmentSource) {
55
+ else if (typeof baseName.fragmentSource === "string") {
56
56
  fragmentSource = "source:" + baseName.fragmentSource;
57
57
  }
58
- else if (baseName.fragmentElement) {
58
+ else if (typeof baseName.fragmentElement === "string") {
59
59
  fragmentSource = hostDocument?.getElementById(baseName.fragmentElement) || baseName.fragmentElement;
60
60
  }
61
61
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"effect.functions.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/effect.functions.ts"],"names":[],"mappings":"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","sourcesContent":["import { type _IProcessingOptions, type ShaderCustomProcessingFunction, type _IShaderProcessingContext } from \"core/Engines/Processors/shaderProcessingOptions\";\r\nimport { GetDOMTextContent, IsWindowObjectExist } from \"core/Misc/domManagement\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { ShaderLanguage } from \"./shaderLanguage\";\r\nimport { type WebGLContext, getStateObject } from \"core/Engines/thinEngine.functions\";\r\nimport { ShaderStore } from \"core/Engines/shaderStore\";\r\nimport { type AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { type Effect, type IShaderPath } from \"./effect\";\r\nimport { type IPipelineContext } from \"core/Engines/IPipelineContext\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { Finalize, Initialize, Process } from \"core/Engines/Processors/shaderProcessor\";\r\nimport { _LoadFile } from \"core/Engines/abstractEngine.functions\";\r\nimport { type WebGLPipelineContext } from \"core/Engines/WebGL/webGLPipelineContext\";\r\n\r\n/**\r\n * Options to be used when creating a pipeline\r\n */\r\nexport interface IPipelineGenerationOptions {\r\n /**\r\n * The definition of the shader content.\r\n * Can be either a unified name, name per vertex and frament or the shader code content itself\r\n */\r\n shaderNameOrContent: string | IShaderPath;\r\n /**\r\n * Unique key to identify the pipeline.\r\n * Note that though not mandatory, it's recommended to provide a key to be able to use the automated pipeline loading system.\r\n */\r\n key?: string;\r\n /**\r\n * The list of defines to be used in the shader\r\n */\r\n defines?: string[];\r\n\r\n /**\r\n * If true, the global defines will be added to the defines array\r\n */\r\n addGlobalDefines?: boolean;\r\n /**\r\n * The shader language.\r\n * Defaults to the language suiting the platform name (GLSL for WEBGL2, WGSL for WEBGPU)\r\n */\r\n shaderLanguage?: ShaderLanguage;\r\n\r\n /**\r\n * The name of the platform to be used when processing the shader\r\n * defaults to WEBGL2\r\n */\r\n platformName?: string /* \"WEBGL2\" | \"WEBGL1\" | \"WEBGPU\" */;\r\n\r\n /**\r\n * extend the processing options when running code processing\r\n */\r\n extendedProcessingOptions?: Partial<_IProcessingOptions>;\r\n\r\n /**\r\n * extend the pipeline generation options\r\n */\r\n extendedCreatePipelineOptions?: Partial<ICreateAndPreparePipelineContextOptions>;\r\n\r\n /**\r\n * If true, generating a new pipeline will return when the pipeline is ready to be used\r\n */\r\n waitForIsReady?: boolean;\r\n\r\n /**\r\n * If true, the pipeline will be created synchronously, even if parallel shader compilation is available\r\n */\r\n disableParallelCompilation?: boolean;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface ICreateAndPreparePipelineContextOptions {\r\n parallelShaderCompile?: { COMPLETION_STATUS_KHR: number };\r\n shaderProcessingContext: Nullable<_IShaderProcessingContext>;\r\n existingPipelineContext?: Nullable<IPipelineContext>;\r\n name?: string;\r\n rebuildRebind?: (vertexSourceCode: string, fragmentSourceCode: string, onCompiled: (pipelineContext: IPipelineContext) => void, onError: (message: string) => void) => void;\r\n onRenderingStateCompiled?: (pipelineContext?: IPipelineContext) => void;\r\n context?: WebGL2RenderingContext | WebGLRenderingContext;\r\n // preparePipeline options\r\n createAsRaw?: boolean;\r\n vertex: string;\r\n fragment: string;\r\n defines: Nullable<string>;\r\n transformFeedbackVaryings: Nullable<string[]>;\r\n disableParallelCompilation?: boolean;\r\n}\r\n\r\n/**\r\n * Get a cached pipeline context\r\n * @param name the pipeline name\r\n * @param context the context to be used when creating the pipeline\r\n * @returns the cached pipeline context if it exists\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function getCachedPipeline(name: string, context: WebGLContext): IPipelineContext | undefined {\r\n const stateObject = getStateObject(context);\r\n return stateObject.cachedPipelines[name];\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function resetCachedPipeline(pipeline: IPipelineContext): void {\r\n const name = pipeline._name;\r\n const context = (pipeline as WebGLPipelineContext).context;\r\n if (name && context) {\r\n const stateObject = getStateObject(context);\r\n const cachedPipeline = stateObject.cachedPipelines[name];\r\n cachedPipeline?.dispose();\r\n delete stateObject.cachedPipelines[name];\r\n }\r\n}\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function _ProcessShaderCode(\r\n processorOptions: _IProcessingOptions,\r\n baseName: any,\r\n processFinalCode?: Nullable<ShaderCustomProcessingFunction>,\r\n onFinalCodeReady?: (vertexCode: string, fragmentCode: string) => void,\r\n shaderLanguage?: ShaderLanguage,\r\n engine?: AbstractEngine,\r\n effectContext?: Effect\r\n) {\r\n let vertexSource: string | HTMLElement | IShaderPath;\r\n let fragmentSource: string | HTMLElement | IShaderPath;\r\n\r\n // const baseName = this.name;\r\n const hostDocument = IsWindowObjectExist() ? engine?.getHostDocument() : null;\r\n\r\n if (typeof baseName === \"string\") {\r\n vertexSource = baseName;\r\n } else if (baseName.vertexSource) {\r\n vertexSource = \"source:\" + baseName.vertexSource;\r\n } else if (baseName.vertexElement) {\r\n vertexSource = hostDocument?.getElementById(baseName.vertexElement) || baseName.vertexElement;\r\n } else {\r\n vertexSource = baseName.vertex || baseName;\r\n }\r\n if (typeof baseName === \"string\") {\r\n fragmentSource = baseName;\r\n } else if (baseName.fragmentSource) {\r\n fragmentSource = \"source:\" + baseName.fragmentSource;\r\n } else if (baseName.fragmentElement) {\r\n fragmentSource = hostDocument?.getElementById(baseName.fragmentElement) || baseName.fragmentElement;\r\n } else {\r\n fragmentSource = baseName.fragment || baseName;\r\n }\r\n\r\n // Important:\r\n // The vertex shader must be compiled before the fragment shader, as processing the fragment shader may require information from the vertex shader.\r\n // Also, they should be processed in the same JS tick because the shader processor is a singleton and stores information about the current processing in its internal state.\r\n // Processing the vertex and fragment shaders in different ticks may cause issues as the internal state may be overridden by another shader being processed in between.\r\n // This means that the shaders must be processed in sequence and synchronously, but the loading of the shader code can be done in parallel\r\n // as long as we wait for both shaders to be loaded before starting the processing.\r\n const shaderCodes: [string | undefined, string | undefined] = [undefined, undefined];\r\n const shadersLoaded = () => {\r\n if (shaderCodes[0] && shaderCodes[1]) {\r\n const [vertexCode, fragmentCode] = shaderCodes;\r\n Initialize(processorOptions);\r\n Process(\r\n vertexCode,\r\n processorOptions,\r\n (migratedVertexCode, codeBeforeMigration) => {\r\n if (effectContext) {\r\n effectContext._vertexSourceCodeBeforeMigration = codeBeforeMigration;\r\n }\r\n if (processFinalCode) {\r\n migratedVertexCode = processFinalCode(\"vertex\", migratedVertexCode);\r\n }\r\n processorOptions.isFragment = true;\r\n Process(\r\n fragmentCode,\r\n processorOptions,\r\n (migratedFragmentCode: string, codeBeforeMigration: string) => {\r\n if (effectContext) {\r\n effectContext._fragmentSourceCodeBeforeMigration = codeBeforeMigration;\r\n }\r\n if (processFinalCode) {\r\n migratedFragmentCode = processFinalCode(\"fragment\", migratedFragmentCode);\r\n }\r\n const finalShaders = Finalize(migratedVertexCode, migratedFragmentCode, processorOptions);\r\n processorOptions = null as any;\r\n const finalCode = UseFinalCode(finalShaders.vertexCode, finalShaders.fragmentCode, baseName, shaderLanguage);\r\n onFinalCodeReady?.(finalCode.vertexSourceCode, finalCode.fragmentSourceCode);\r\n },\r\n engine\r\n );\r\n },\r\n engine\r\n );\r\n }\r\n };\r\n LoadShader(\r\n vertexSource,\r\n \"Vertex\",\r\n \"\",\r\n (vertexCode) => {\r\n if (effectContext) {\r\n effectContext._rawVertexSourceCode = vertexCode;\r\n }\r\n shaderCodes[0] = vertexCode;\r\n shadersLoaded();\r\n },\r\n shaderLanguage\r\n );\r\n LoadShader(\r\n fragmentSource,\r\n \"Fragment\",\r\n \"Pixel\",\r\n (fragmentCode) => {\r\n if (effectContext) {\r\n effectContext._rawFragmentSourceCode = fragmentCode;\r\n }\r\n shaderCodes[1] = fragmentCode;\r\n shadersLoaded();\r\n },\r\n shaderLanguage\r\n );\r\n}\r\n\r\nfunction LoadShader(shader: any, key: string, optionalKey: string, callback: (data: any) => void, shaderLanguage?: ShaderLanguage, _loadFileInjection?: typeof _LoadFile) {\r\n if (typeof HTMLElement !== \"undefined\") {\r\n // DOM element ?\r\n if (shader instanceof HTMLElement) {\r\n const shaderCode = GetDOMTextContent(shader);\r\n callback(shaderCode);\r\n return;\r\n }\r\n }\r\n\r\n // Direct source ?\r\n if (shader.substring(0, 7) === \"source:\") {\r\n callback(shader.substring(7));\r\n return;\r\n }\r\n\r\n // Base64 encoded ?\r\n if (shader.substring(0, 7) === \"base64:\") {\r\n const shaderBinary = window.atob(shader.substring(7));\r\n callback(shaderBinary);\r\n return;\r\n }\r\n\r\n const shaderStore = ShaderStore.GetShadersStore(shaderLanguage);\r\n\r\n // Is in local store ?\r\n if (shaderStore[shader + key + \"Shader\"]) {\r\n callback(shaderStore[shader + key + \"Shader\"]);\r\n return;\r\n }\r\n\r\n if (optionalKey && shaderStore[shader + optionalKey + \"Shader\"]) {\r\n callback(shaderStore[shader + optionalKey + \"Shader\"]);\r\n return;\r\n }\r\n\r\n let shaderUrl;\r\n\r\n if (shader[0] === \".\" || shader[0] === \"/\" || shader.indexOf(\"http\") > -1) {\r\n shaderUrl = shader;\r\n } else {\r\n shaderUrl = ShaderStore.GetShadersRepository(shaderLanguage) + shader;\r\n }\r\n _loadFileInjection = _loadFileInjection || _LoadFile;\r\n if (!_loadFileInjection) {\r\n // we got to this point and loadFile was not injected - throw an error\r\n throw new Error(\"loadFileInjection is not defined\");\r\n }\r\n // Vertex shader\r\n _loadFileInjection(shaderUrl + \".\" + key.toLowerCase() + \".fx\", callback);\r\n}\r\n\r\nfunction UseFinalCode(migratedVertexCode: string, migratedFragmentCode: string, baseName: any, shaderLanguage?: ShaderLanguage) {\r\n if (baseName) {\r\n const vertex = baseName.vertexElement || baseName.vertex || baseName.spectorName || baseName;\r\n const fragment = baseName.fragmentElement || baseName.fragment || baseName.spectorName || baseName;\r\n\r\n return {\r\n vertexSourceCode: (shaderLanguage === ShaderLanguage.WGSL ? \"//\" : \"\") + \"#define SHADER_NAME vertex:\" + vertex + \"\\n\" + migratedVertexCode,\r\n fragmentSourceCode: (shaderLanguage === ShaderLanguage.WGSL ? \"//\" : \"\") + \"#define SHADER_NAME fragment:\" + fragment + \"\\n\" + migratedFragmentCode,\r\n };\r\n } else {\r\n return {\r\n vertexSourceCode: migratedVertexCode,\r\n fragmentSourceCode: migratedFragmentCode,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Creates and prepares a pipeline context\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport const createAndPreparePipelineContext = (\r\n options: ICreateAndPreparePipelineContextOptions,\r\n createPipelineContext: typeof AbstractEngine.prototype.createPipelineContext,\r\n _preparePipelineContext: typeof AbstractEngine.prototype._preparePipelineContextAsync,\r\n _executeWhenRenderingStateIsCompiled: typeof AbstractEngine.prototype._executeWhenRenderingStateIsCompiled\r\n): IPipelineContext => {\r\n try {\r\n const stateObject = options.context ? getStateObject(options.context) : null;\r\n if (stateObject) {\r\n // will not remove the reference to parallelShaderPrecompile, but will prevent it from being used in the next shader compilation\r\n stateObject.disableParallelShaderCompile = options.disableParallelCompilation;\r\n }\r\n const pipelineContext: IPipelineContext = options.existingPipelineContext || createPipelineContext(options.shaderProcessingContext);\r\n pipelineContext._name = options.name;\r\n if (options.name && stateObject) {\r\n stateObject.cachedPipelines[options.name] = pipelineContext;\r\n }\r\n\r\n // Flagged as async as we may need to delay load some processing tools\r\n // This does not break anything as the execution is waiting for _executeWhenRenderingStateIsCompiled\r\n _preparePipelineContext(\r\n pipelineContext,\r\n options.vertex,\r\n options.fragment,\r\n !!options.createAsRaw,\r\n \"\",\r\n \"\",\r\n options.rebuildRebind,\r\n options.defines,\r\n options.transformFeedbackVaryings,\r\n \"\",\r\n () => {\r\n _executeWhenRenderingStateIsCompiled(pipelineContext, () => {\r\n options.onRenderingStateCompiled?.(pipelineContext);\r\n });\r\n }\r\n );\r\n\r\n return pipelineContext;\r\n } catch (e) {\r\n Logger.Error(\"Error compiling effect\");\r\n throw e;\r\n }\r\n};\r\n"]}
1
+ {"version":3,"file":"effect.functions.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/effect.functions.ts"],"names":[],"mappings":"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","sourcesContent":["import { type _IProcessingOptions, type ShaderCustomProcessingFunction, type _IShaderProcessingContext } from \"core/Engines/Processors/shaderProcessingOptions\";\r\nimport { GetDOMTextContent, IsWindowObjectExist } from \"core/Misc/domManagement\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { ShaderLanguage } from \"./shaderLanguage\";\r\nimport { type WebGLContext, getStateObject } from \"core/Engines/thinEngine.functions\";\r\nimport { ShaderStore } from \"core/Engines/shaderStore\";\r\nimport { type AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { type Effect, type IShaderPath } from \"./effect\";\r\nimport { type IPipelineContext } from \"core/Engines/IPipelineContext\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { Finalize, Initialize, Process } from \"core/Engines/Processors/shaderProcessor\";\r\nimport { _LoadFile } from \"core/Engines/abstractEngine.functions\";\r\nimport { type WebGLPipelineContext } from \"core/Engines/WebGL/webGLPipelineContext\";\r\n\r\n/**\r\n * Options to be used when creating a pipeline\r\n */\r\nexport interface IPipelineGenerationOptions {\r\n /**\r\n * The definition of the shader content.\r\n * Can be either a unified name, name per vertex and frament or the shader code content itself\r\n */\r\n shaderNameOrContent: string | IShaderPath;\r\n /**\r\n * Unique key to identify the pipeline.\r\n * Note that though not mandatory, it's recommended to provide a key to be able to use the automated pipeline loading system.\r\n */\r\n key?: string;\r\n /**\r\n * The list of defines to be used in the shader\r\n */\r\n defines?: string[];\r\n\r\n /**\r\n * If true, the global defines will be added to the defines array\r\n */\r\n addGlobalDefines?: boolean;\r\n /**\r\n * The shader language.\r\n * Defaults to the language suiting the platform name (GLSL for WEBGL2, WGSL for WEBGPU)\r\n */\r\n shaderLanguage?: ShaderLanguage;\r\n\r\n /**\r\n * The name of the platform to be used when processing the shader\r\n * defaults to WEBGL2\r\n */\r\n platformName?: string /* \"WEBGL2\" | \"WEBGL1\" | \"WEBGPU\" */;\r\n\r\n /**\r\n * extend the processing options when running code processing\r\n */\r\n extendedProcessingOptions?: Partial<_IProcessingOptions>;\r\n\r\n /**\r\n * extend the pipeline generation options\r\n */\r\n extendedCreatePipelineOptions?: Partial<ICreateAndPreparePipelineContextOptions>;\r\n\r\n /**\r\n * If true, generating a new pipeline will return when the pipeline is ready to be used\r\n */\r\n waitForIsReady?: boolean;\r\n\r\n /**\r\n * If true, the pipeline will be created synchronously, even if parallel shader compilation is available\r\n */\r\n disableParallelCompilation?: boolean;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface ICreateAndPreparePipelineContextOptions {\r\n parallelShaderCompile?: { COMPLETION_STATUS_KHR: number };\r\n shaderProcessingContext: Nullable<_IShaderProcessingContext>;\r\n existingPipelineContext?: Nullable<IPipelineContext>;\r\n name?: string;\r\n rebuildRebind?: (vertexSourceCode: string, fragmentSourceCode: string, onCompiled: (pipelineContext: IPipelineContext) => void, onError: (message: string) => void) => void;\r\n onRenderingStateCompiled?: (pipelineContext?: IPipelineContext) => void;\r\n context?: WebGL2RenderingContext | WebGLRenderingContext;\r\n // preparePipeline options\r\n createAsRaw?: boolean;\r\n vertex: string;\r\n fragment: string;\r\n defines: Nullable<string>;\r\n transformFeedbackVaryings: Nullable<string[]>;\r\n disableParallelCompilation?: boolean;\r\n}\r\n\r\n/**\r\n * Get a cached pipeline context\r\n * @param name the pipeline name\r\n * @param context the context to be used when creating the pipeline\r\n * @returns the cached pipeline context if it exists\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function getCachedPipeline(name: string, context: WebGLContext): IPipelineContext | undefined {\r\n const stateObject = getStateObject(context);\r\n return stateObject.cachedPipelines[name];\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function resetCachedPipeline(pipeline: IPipelineContext): void {\r\n const name = pipeline._name;\r\n const context = (pipeline as WebGLPipelineContext).context;\r\n if (name && context) {\r\n const stateObject = getStateObject(context);\r\n const cachedPipeline = stateObject.cachedPipelines[name];\r\n cachedPipeline?.dispose();\r\n delete stateObject.cachedPipelines[name];\r\n }\r\n}\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function _ProcessShaderCode(\r\n processorOptions: _IProcessingOptions,\r\n baseName: any,\r\n processFinalCode?: Nullable<ShaderCustomProcessingFunction>,\r\n onFinalCodeReady?: (vertexCode: string, fragmentCode: string) => void,\r\n shaderLanguage?: ShaderLanguage,\r\n engine?: AbstractEngine,\r\n effectContext?: Effect\r\n) {\r\n let vertexSource: string | HTMLElement | IShaderPath;\r\n let fragmentSource: string | HTMLElement | IShaderPath;\r\n\r\n // const baseName = this.name;\r\n const hostDocument = IsWindowObjectExist() ? engine?.getHostDocument() : null;\r\n\r\n if (typeof baseName === \"string\") {\r\n vertexSource = baseName;\r\n } else if (typeof baseName.vertexSource === \"string\") {\r\n vertexSource = \"source:\" + baseName.vertexSource;\r\n } else if (typeof baseName.vertexElement === \"string\") {\r\n vertexSource = hostDocument?.getElementById(baseName.vertexElement) || baseName.vertexElement;\r\n } else {\r\n vertexSource = baseName.vertex || baseName;\r\n }\r\n if (typeof baseName === \"string\") {\r\n fragmentSource = baseName;\r\n } else if (typeof baseName.fragmentSource === \"string\") {\r\n fragmentSource = \"source:\" + baseName.fragmentSource;\r\n } else if (typeof baseName.fragmentElement === \"string\") {\r\n fragmentSource = hostDocument?.getElementById(baseName.fragmentElement) || baseName.fragmentElement;\r\n } else {\r\n fragmentSource = baseName.fragment || baseName;\r\n }\r\n\r\n // Important:\r\n // The vertex shader must be compiled before the fragment shader, as processing the fragment shader may require information from the vertex shader.\r\n // Also, they should be processed in the same JS tick because the shader processor is a singleton and stores information about the current processing in its internal state.\r\n // Processing the vertex and fragment shaders in different ticks may cause issues as the internal state may be overridden by another shader being processed in between.\r\n // This means that the shaders must be processed in sequence and synchronously, but the loading of the shader code can be done in parallel\r\n // as long as we wait for both shaders to be loaded before starting the processing.\r\n const shaderCodes: [string | undefined, string | undefined] = [undefined, undefined];\r\n const shadersLoaded = () => {\r\n if (shaderCodes[0] && shaderCodes[1]) {\r\n const [vertexCode, fragmentCode] = shaderCodes;\r\n Initialize(processorOptions);\r\n Process(\r\n vertexCode,\r\n processorOptions,\r\n (migratedVertexCode, codeBeforeMigration) => {\r\n if (effectContext) {\r\n effectContext._vertexSourceCodeBeforeMigration = codeBeforeMigration;\r\n }\r\n if (processFinalCode) {\r\n migratedVertexCode = processFinalCode(\"vertex\", migratedVertexCode);\r\n }\r\n processorOptions.isFragment = true;\r\n Process(\r\n fragmentCode,\r\n processorOptions,\r\n (migratedFragmentCode: string, codeBeforeMigration: string) => {\r\n if (effectContext) {\r\n effectContext._fragmentSourceCodeBeforeMigration = codeBeforeMigration;\r\n }\r\n if (processFinalCode) {\r\n migratedFragmentCode = processFinalCode(\"fragment\", migratedFragmentCode);\r\n }\r\n const finalShaders = Finalize(migratedVertexCode, migratedFragmentCode, processorOptions);\r\n processorOptions = null as any;\r\n const finalCode = UseFinalCode(finalShaders.vertexCode, finalShaders.fragmentCode, baseName, shaderLanguage);\r\n onFinalCodeReady?.(finalCode.vertexSourceCode, finalCode.fragmentSourceCode);\r\n },\r\n engine\r\n );\r\n },\r\n engine\r\n );\r\n }\r\n };\r\n LoadShader(\r\n vertexSource,\r\n \"Vertex\",\r\n \"\",\r\n (vertexCode) => {\r\n if (effectContext) {\r\n effectContext._rawVertexSourceCode = vertexCode;\r\n }\r\n shaderCodes[0] = vertexCode;\r\n shadersLoaded();\r\n },\r\n shaderLanguage\r\n );\r\n LoadShader(\r\n fragmentSource,\r\n \"Fragment\",\r\n \"Pixel\",\r\n (fragmentCode) => {\r\n if (effectContext) {\r\n effectContext._rawFragmentSourceCode = fragmentCode;\r\n }\r\n shaderCodes[1] = fragmentCode;\r\n shadersLoaded();\r\n },\r\n shaderLanguage\r\n );\r\n}\r\n\r\nfunction LoadShader(shader: any, key: string, optionalKey: string, callback: (data: any) => void, shaderLanguage?: ShaderLanguage, _loadFileInjection?: typeof _LoadFile) {\r\n if (typeof HTMLElement !== \"undefined\") {\r\n // DOM element ?\r\n if (shader instanceof HTMLElement) {\r\n const shaderCode = GetDOMTextContent(shader);\r\n callback(shaderCode);\r\n return;\r\n }\r\n }\r\n\r\n // Direct source ?\r\n if (shader.substring(0, 7) === \"source:\") {\r\n callback(shader.substring(7));\r\n return;\r\n }\r\n\r\n // Base64 encoded ?\r\n if (shader.substring(0, 7) === \"base64:\") {\r\n const shaderBinary = window.atob(shader.substring(7));\r\n callback(shaderBinary);\r\n return;\r\n }\r\n\r\n const shaderStore = ShaderStore.GetShadersStore(shaderLanguage);\r\n\r\n // Is in local store ?\r\n if (shaderStore[shader + key + \"Shader\"]) {\r\n callback(shaderStore[shader + key + \"Shader\"]);\r\n return;\r\n }\r\n\r\n if (optionalKey && shaderStore[shader + optionalKey + \"Shader\"]) {\r\n callback(shaderStore[shader + optionalKey + \"Shader\"]);\r\n return;\r\n }\r\n\r\n let shaderUrl;\r\n\r\n if (shader[0] === \".\" || shader[0] === \"/\" || shader.indexOf(\"http\") > -1) {\r\n shaderUrl = shader;\r\n } else {\r\n shaderUrl = ShaderStore.GetShadersRepository(shaderLanguage) + shader;\r\n }\r\n _loadFileInjection = _loadFileInjection || _LoadFile;\r\n if (!_loadFileInjection) {\r\n // we got to this point and loadFile was not injected - throw an error\r\n throw new Error(\"loadFileInjection is not defined\");\r\n }\r\n // Vertex shader\r\n _loadFileInjection(shaderUrl + \".\" + key.toLowerCase() + \".fx\", callback);\r\n}\r\n\r\nfunction UseFinalCode(migratedVertexCode: string, migratedFragmentCode: string, baseName: any, shaderLanguage?: ShaderLanguage) {\r\n if (baseName) {\r\n const vertex = baseName.vertexElement || baseName.vertex || baseName.spectorName || baseName;\r\n const fragment = baseName.fragmentElement || baseName.fragment || baseName.spectorName || baseName;\r\n\r\n return {\r\n vertexSourceCode: (shaderLanguage === ShaderLanguage.WGSL ? \"//\" : \"\") + \"#define SHADER_NAME vertex:\" + vertex + \"\\n\" + migratedVertexCode,\r\n fragmentSourceCode: (shaderLanguage === ShaderLanguage.WGSL ? \"//\" : \"\") + \"#define SHADER_NAME fragment:\" + fragment + \"\\n\" + migratedFragmentCode,\r\n };\r\n } else {\r\n return {\r\n vertexSourceCode: migratedVertexCode,\r\n fragmentSourceCode: migratedFragmentCode,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Creates and prepares a pipeline context\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport const createAndPreparePipelineContext = (\r\n options: ICreateAndPreparePipelineContextOptions,\r\n createPipelineContext: typeof AbstractEngine.prototype.createPipelineContext,\r\n _preparePipelineContext: typeof AbstractEngine.prototype._preparePipelineContextAsync,\r\n _executeWhenRenderingStateIsCompiled: typeof AbstractEngine.prototype._executeWhenRenderingStateIsCompiled\r\n): IPipelineContext => {\r\n try {\r\n const stateObject = options.context ? getStateObject(options.context) : null;\r\n if (stateObject) {\r\n // will not remove the reference to parallelShaderPrecompile, but will prevent it from being used in the next shader compilation\r\n stateObject.disableParallelShaderCompile = options.disableParallelCompilation;\r\n }\r\n const pipelineContext: IPipelineContext = options.existingPipelineContext || createPipelineContext(options.shaderProcessingContext);\r\n pipelineContext._name = options.name;\r\n if (options.name && stateObject) {\r\n stateObject.cachedPipelines[options.name] = pipelineContext;\r\n }\r\n\r\n // Flagged as async as we may need to delay load some processing tools\r\n // This does not break anything as the execution is waiting for _executeWhenRenderingStateIsCompiled\r\n _preparePipelineContext(\r\n pipelineContext,\r\n options.vertex,\r\n options.fragment,\r\n !!options.createAsRaw,\r\n \"\",\r\n \"\",\r\n options.rebuildRebind,\r\n options.defines,\r\n options.transformFeedbackVaryings,\r\n \"\",\r\n () => {\r\n _executeWhenRenderingStateIsCompiled(pipelineContext, () => {\r\n options.onRenderingStateCompiled?.(pipelineContext);\r\n });\r\n }\r\n );\r\n\r\n return pipelineContext;\r\n } catch (e) {\r\n Logger.Error(\"Error compiling effect\");\r\n throw e;\r\n }\r\n};\r\n"]}
@@ -329,8 +329,9 @@ export declare function PrepareDefinesForCamera(scene: Scene, defines: any): boo
329
329
  * @param iesLightTexture defines if IES texture must be used
330
330
  * @param clusteredLightTextures defines if the clustered light textures must be used
331
331
  * @param rectAreaLightTexture defines if rect area light is using a emission texture.
332
+ * @param clusteredLightStorageBuffer defines if the clustered light tile mask uses a storage buffer instead of a texture
332
333
  */
333
- export declare function PrepareUniformsAndSamplersForLight(lightIndex: number, uniformsList: string[], samplersList: string[], projectedLightTexture?: any, uniformBuffersList?: Nullable<string[]>, updateOnlyBuffersList?: boolean, iesLightTexture?: boolean, clusteredLightTextures?: boolean, rectAreaLightTexture?: boolean): void;
334
+ export declare function PrepareUniformsAndSamplersForLight(lightIndex: number, uniformsList: string[], samplersList: string[], projectedLightTexture?: any, uniformBuffersList?: Nullable<string[]>, updateOnlyBuffersList?: boolean, iesLightTexture?: boolean, clusteredLightTextures?: boolean, rectAreaLightTexture?: boolean, clusteredLightStorageBuffer?: boolean): void;
334
335
  /**
335
336
  * Append uniforms and samplers related to IBL to the provided lists
336
337
  * @param uniformsList The list of uniforms to append to
@@ -1161,8 +1161,9 @@ export function PrepareDefinesForCamera(scene, defines) {
1161
1161
  * @param iesLightTexture defines if IES texture must be used
1162
1162
  * @param clusteredLightTextures defines if the clustered light textures must be used
1163
1163
  * @param rectAreaLightTexture defines if rect area light is using a emission texture.
1164
+ * @param clusteredLightStorageBuffer defines if the clustered light tile mask uses a storage buffer instead of a texture
1164
1165
  */
1165
- export function PrepareUniformsAndSamplersForLight(lightIndex, uniformsList, samplersList, projectedLightTexture, uniformBuffersList = null, updateOnlyBuffersList = false, iesLightTexture = false, clusteredLightTextures = false, rectAreaLightTexture = false) {
1166
+ export function PrepareUniformsAndSamplersForLight(lightIndex, uniformsList, samplersList, projectedLightTexture, uniformBuffersList = null, updateOnlyBuffersList = false, iesLightTexture = false, clusteredLightTextures = false, rectAreaLightTexture = false, clusteredLightStorageBuffer = false) {
1166
1167
  if (uniformBuffersList) {
1167
1168
  uniformBuffersList.push("Light" + lightIndex);
1168
1169
  }
@@ -1185,7 +1186,9 @@ export function PrepareUniformsAndSamplersForLight(lightIndex, uniformsList, sam
1185
1186
  }
1186
1187
  if (clusteredLightTextures) {
1187
1188
  samplersList.push("lightDataTexture" + lightIndex);
1188
- samplersList.push("tileMaskTexture" + lightIndex);
1189
+ if (!clusteredLightStorageBuffer) {
1190
+ samplersList.push("tileMaskTexture" + lightIndex);
1191
+ }
1189
1192
  }
1190
1193
  }
1191
1194
  /**
@@ -1222,6 +1225,7 @@ export function PrepareUniformsAndSamplersForIBL(uniformsList, samplersList, use
1222
1225
  export function PrepareUniformsAndSamplersList(uniformsListOrOptions, samplersList, defines, maxSimultaneousLights = 4) {
1223
1226
  let uniformsList;
1224
1227
  let uniformBuffersList;
1228
+ let shaderLanguage = null;
1225
1229
  if (uniformsListOrOptions.uniformsNames) {
1226
1230
  const options = uniformsListOrOptions;
1227
1231
  uniformsList = options.uniformsNames;
@@ -1229,6 +1233,7 @@ export function PrepareUniformsAndSamplersList(uniformsListOrOptions, samplersLi
1229
1233
  samplersList = options.samplers;
1230
1234
  defines = options.defines;
1231
1235
  maxSimultaneousLights = options.maxSimultaneousLights || 0;
1236
+ shaderLanguage = options.shaderLanguage ?? null;
1232
1237
  }
1233
1238
  else {
1234
1239
  uniformsList = uniformsListOrOptions;
@@ -1240,7 +1245,7 @@ export function PrepareUniformsAndSamplersList(uniformsListOrOptions, samplersLi
1240
1245
  if (!defines["LIGHT" + lightIndex]) {
1241
1246
  break;
1242
1247
  }
1243
- PrepareUniformsAndSamplersForLight(lightIndex, uniformsList, samplersList, defines["PROJECTEDLIGHTTEXTURE" + lightIndex], uniformBuffersList, false, defines["IESLIGHTTEXTURE" + lightIndex], defines["CLUSTLIGHT" + lightIndex], defines["RECTAREALIGHTEMISSIONTEXTURE" + lightIndex]);
1248
+ PrepareUniformsAndSamplersForLight(lightIndex, uniformsList, samplersList, defines["PROJECTEDLIGHTTEXTURE" + lightIndex], uniformBuffersList, false, defines["IESLIGHTTEXTURE" + lightIndex], defines["CLUSTLIGHT" + lightIndex], defines["RECTAREALIGHTEMISSIONTEXTURE" + lightIndex], shaderLanguage === 1 /* ShaderLanguage.WGSL */);
1244
1249
  }
1245
1250
  if (defines["NUM_MORPH_INFLUENCERS"]) {
1246
1251
  uniformsList.push("morphTargetInfluences");