@babylonjs/core 7.16.0 → 7.16.1

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 (211) hide show
  1. package/Animations/animationGroup.d.ts +1 -0
  2. package/Animations/animationGroup.js +4 -1
  3. package/Animations/animationGroup.js.map +1 -1
  4. package/Collisions/gpuPicker.js +1 -1
  5. package/Collisions/gpuPicker.js.map +1 -1
  6. package/Compute/computeEffect.js +1 -1
  7. package/Compute/computeEffect.js.map +1 -1
  8. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +32 -0
  9. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +32 -0
  10. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  11. package/Engines/abstractEngine.js +2 -2
  12. package/Engines/abstractEngine.js.map +1 -1
  13. package/Engines/engine.d.ts +1993 -1993
  14. package/Engines/nativeEngine.d.ts +7 -0
  15. package/Engines/nativeEngine.js +24 -1
  16. package/Engines/nativeEngine.js.map +1 -1
  17. package/Engines/thinEngine.js +2 -2
  18. package/Engines/thinEngine.js.map +1 -1
  19. package/Engines/webgpuEngine.js +3 -3
  20. package/Engines/webgpuEngine.js.map +1 -1
  21. package/Materials/Node/Blocks/Dual/clipPlanesBlock.js +6 -6
  22. package/Materials/Node/Blocks/Dual/clipPlanesBlock.js.map +1 -1
  23. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js +4 -7
  24. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
  25. package/Materials/Node/Blocks/Dual/textureBlock.js +1 -1
  26. package/Materials/Node/Blocks/Dual/textureBlock.js.map +1 -1
  27. package/Materials/Node/Blocks/PBR/anisotropyBlock.js +4 -4
  28. package/Materials/Node/Blocks/PBR/anisotropyBlock.js.map +1 -1
  29. package/Materials/Node/Blocks/PBR/clearCoatBlock.js +46 -40
  30. package/Materials/Node/Blocks/PBR/clearCoatBlock.js.map +1 -1
  31. package/Materials/Node/Blocks/PBR/iridescenceBlock.d.ts +2 -1
  32. package/Materials/Node/Blocks/PBR/iridescenceBlock.js +10 -9
  33. package/Materials/Node/Blocks/PBR/iridescenceBlock.js.map +1 -1
  34. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.d.ts +1 -0
  35. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +85 -69
  36. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  37. package/Materials/Node/Blocks/PBR/reflectionBlock.js +54 -38
  38. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  39. package/Materials/Node/Blocks/PBR/refractionBlock.js +2 -2
  40. package/Materials/Node/Blocks/PBR/refractionBlock.js.map +1 -1
  41. package/Materials/Node/Blocks/PBR/sheenBlock.d.ts +2 -1
  42. package/Materials/Node/Blocks/PBR/sheenBlock.js +40 -32
  43. package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
  44. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js +53 -45
  45. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js.map +1 -1
  46. package/Materials/Node/nodeMaterial.d.ts +2 -1
  47. package/Materials/Node/nodeMaterial.js +4 -1
  48. package/Materials/Node/nodeMaterial.js.map +1 -1
  49. package/Materials/Node/nodeMaterialBuildState.d.ts +1 -0
  50. package/Materials/Node/nodeMaterialBuildState.js +12 -3
  51. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  52. package/Materials/effect.js +2 -2
  53. package/Materials/effect.js.map +1 -1
  54. package/Meshes/Builders/decalBuilder.js +12 -12
  55. package/Meshes/Builders/decalBuilder.js.map +1 -1
  56. package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +10 -1
  57. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +50 -11
  58. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  59. package/Meshes/Node/nodeGeometry.d.ts +6 -0
  60. package/Meshes/Node/nodeGeometry.js +7 -0
  61. package/Meshes/Node/nodeGeometry.js.map +1 -1
  62. package/Meshes/mesh.d.ts +1 -0
  63. package/Meshes/mesh.js +138 -134
  64. package/Meshes/mesh.js.map +1 -1
  65. package/Meshes/subMesh.js +1 -1
  66. package/Meshes/subMesh.js.map +1 -1
  67. package/Misc/khronosTextureContainer2.js +1 -1
  68. package/Misc/khronosTextureContainer2.js.map +1 -1
  69. package/Rendering/GlobalIllumination/giRSMManager.js +1 -1
  70. package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
  71. package/Rendering/edgesRenderer.js +1 -1
  72. package/Rendering/edgesRenderer.js.map +1 -1
  73. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +1 -1
  74. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
  75. package/Shaders/ShadersInclude/lightFragment.js +3 -3
  76. package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
  77. package/Shaders/ShadersInclude/lightsFragmentFunctions.js +1 -1
  78. package/Shaders/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  79. package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js +13 -14
  80. package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js.map +1 -1
  81. package/Shaders/ShadersInclude/pbrBlockAlphaFresnel.js +4 -5
  82. package/Shaders/ShadersInclude/pbrBlockAlphaFresnel.js.map +1 -1
  83. package/Shaders/ShadersInclude/pbrBlockAmbientOcclusion.js +4 -5
  84. package/Shaders/ShadersInclude/pbrBlockAmbientOcclusion.js.map +1 -1
  85. package/Shaders/ShadersInclude/pbrBlockAnisotropic.js +4 -5
  86. package/Shaders/ShadersInclude/pbrBlockAnisotropic.js.map +1 -1
  87. package/Shaders/ShadersInclude/pbrBlockClearcoat.js +34 -35
  88. package/Shaders/ShadersInclude/pbrBlockClearcoat.js.map +1 -1
  89. package/Shaders/ShadersInclude/pbrBlockIridescence.js +10 -11
  90. package/Shaders/ShadersInclude/pbrBlockIridescence.js.map +1 -1
  91. package/Shaders/ShadersInclude/pbrBlockReflection.js +23 -24
  92. package/Shaders/ShadersInclude/pbrBlockReflection.js.map +1 -1
  93. package/Shaders/ShadersInclude/pbrBlockReflectivity.js +12 -13
  94. package/Shaders/ShadersInclude/pbrBlockReflectivity.js.map +1 -1
  95. package/Shaders/ShadersInclude/pbrBlockSheen.js +31 -32
  96. package/Shaders/ShadersInclude/pbrBlockSheen.js.map +1 -1
  97. package/Shaders/ShadersInclude/pbrBlockSubSurface.js +43 -44
  98. package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  99. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +1 -1
  100. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  101. package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js +1 -1
  102. package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
  103. package/Shaders/pbr.fragment.js +143 -153
  104. package/Shaders/pbr.fragment.js.map +1 -1
  105. package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js +3 -3
  106. package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js.map +1 -1
  107. package/ShadersWGSL/ShadersInclude/decalFragment.d.ts +5 -0
  108. package/ShadersWGSL/ShadersInclude/decalFragment.js +18 -0
  109. package/ShadersWGSL/ShadersInclude/decalFragment.js.map +1 -0
  110. package/ShadersWGSL/ShadersInclude/depthPrePass.d.ts +5 -0
  111. package/ShadersWGSL/ShadersInclude/depthPrePass.js +12 -0
  112. package/ShadersWGSL/ShadersInclude/depthPrePass.js.map +1 -0
  113. package/ShadersWGSL/ShadersInclude/harmonicsFunctions.d.ts +5 -0
  114. package/ShadersWGSL/ShadersInclude/harmonicsFunctions.js +24 -0
  115. package/ShadersWGSL/ShadersInclude/harmonicsFunctions.js.map +1 -0
  116. package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.d.ts +5 -0
  117. package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js +39 -0
  118. package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js.map +1 -0
  119. package/ShadersWGSL/ShadersInclude/helperFunctions.js +6 -2
  120. package/ShadersWGSL/ShadersInclude/helperFunctions.js.map +1 -1
  121. package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js +2 -2
  122. package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js.map +1 -1
  123. package/ShadersWGSL/ShadersInclude/importanceSampling.d.ts +5 -0
  124. package/ShadersWGSL/ShadersInclude/importanceSampling.js +12 -0
  125. package/ShadersWGSL/ShadersInclude/importanceSampling.js.map +1 -0
  126. package/ShadersWGSL/ShadersInclude/lightFragment.js +3 -3
  127. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  128. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js +1 -1
  129. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  130. package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.d.ts +5 -0
  131. package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js +139 -0
  132. package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js.map +1 -0
  133. package/ShadersWGSL/ShadersInclude/pbrBlockAlbedoOpacity.d.ts +6 -0
  134. package/ShadersWGSL/ShadersInclude/pbrBlockAlbedoOpacity.js +81 -0
  135. package/ShadersWGSL/ShadersInclude/pbrBlockAlbedoOpacity.js.map +1 -0
  136. package/ShadersWGSL/ShadersInclude/pbrBlockAlphaFresnel.d.ts +5 -0
  137. package/ShadersWGSL/ShadersInclude/pbrBlockAlphaFresnel.js +37 -0
  138. package/ShadersWGSL/ShadersInclude/pbrBlockAlphaFresnel.js.map +1 -0
  139. package/ShadersWGSL/ShadersInclude/pbrBlockAmbientOcclusion.d.ts +5 -0
  140. package/ShadersWGSL/ShadersInclude/pbrBlockAmbientOcclusion.js +35 -0
  141. package/ShadersWGSL/ShadersInclude/pbrBlockAmbientOcclusion.js.map +1 -0
  142. package/ShadersWGSL/ShadersInclude/pbrBlockAnisotropic.d.ts +5 -0
  143. package/ShadersWGSL/ShadersInclude/pbrBlockAnisotropic.js +46 -0
  144. package/ShadersWGSL/ShadersInclude/pbrBlockAnisotropic.js.map +1 -0
  145. package/ShadersWGSL/ShadersInclude/pbrBlockClearcoat.d.ts +5 -0
  146. package/ShadersWGSL/ShadersInclude/pbrBlockClearcoat.js +267 -0
  147. package/ShadersWGSL/ShadersInclude/pbrBlockClearcoat.js.map +1 -0
  148. package/ShadersWGSL/ShadersInclude/pbrBlockDirectLighting.d.ts +5 -0
  149. package/ShadersWGSL/ShadersInclude/pbrBlockDirectLighting.js +24 -0
  150. package/ShadersWGSL/ShadersInclude/pbrBlockDirectLighting.js.map +1 -0
  151. package/ShadersWGSL/ShadersInclude/pbrBlockFinalColorComposition.d.ts +5 -0
  152. package/ShadersWGSL/ShadersInclude/pbrBlockFinalColorComposition.js +51 -0
  153. package/ShadersWGSL/ShadersInclude/pbrBlockFinalColorComposition.js.map +1 -0
  154. package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.d.ts +5 -0
  155. package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js +96 -0
  156. package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -0
  157. package/ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.d.ts +5 -0
  158. package/ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.js +26 -0
  159. package/ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.js.map +1 -0
  160. package/ShadersWGSL/ShadersInclude/pbrBlockGeometryInfo.d.ts +5 -0
  161. package/ShadersWGSL/ShadersInclude/pbrBlockGeometryInfo.js +33 -0
  162. package/ShadersWGSL/ShadersInclude/pbrBlockGeometryInfo.js.map +1 -0
  163. package/ShadersWGSL/ShadersInclude/pbrBlockImageProcessing.d.ts +5 -0
  164. package/ShadersWGSL/ShadersInclude/pbrBlockImageProcessing.js +20 -0
  165. package/ShadersWGSL/ShadersInclude/pbrBlockImageProcessing.js.map +1 -0
  166. package/ShadersWGSL/ShadersInclude/pbrBlockIridescence.d.ts +5 -0
  167. package/ShadersWGSL/ShadersInclude/pbrBlockIridescence.js +51 -0
  168. package/ShadersWGSL/ShadersInclude/pbrBlockIridescence.js.map +1 -0
  169. package/ShadersWGSL/ShadersInclude/pbrBlockLightmapInit.d.ts +5 -0
  170. package/ShadersWGSL/ShadersInclude/pbrBlockLightmapInit.js +19 -0
  171. package/ShadersWGSL/ShadersInclude/pbrBlockLightmapInit.js.map +1 -0
  172. package/ShadersWGSL/ShadersInclude/pbrBlockNormalFinal.d.ts +5 -0
  173. package/ShadersWGSL/ShadersInclude/pbrBlockNormalFinal.js +19 -0
  174. package/ShadersWGSL/ShadersInclude/pbrBlockNormalFinal.js.map +1 -0
  175. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.d.ts +5 -0
  176. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js +30 -0
  177. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js.map +1 -0
  178. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance0.d.ts +5 -0
  179. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance0.js +18 -0
  180. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance0.js.map +1 -0
  181. package/ShadersWGSL/ShadersInclude/pbrBlockReflection.d.ts +5 -0
  182. package/ShadersWGSL/ShadersInclude/pbrBlockReflection.js +277 -0
  183. package/ShadersWGSL/ShadersInclude/pbrBlockReflection.js.map +1 -0
  184. package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.d.ts +5 -0
  185. package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js +120 -0
  186. package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js.map +1 -0
  187. package/ShadersWGSL/ShadersInclude/pbrBlockSheen.d.ts +5 -0
  188. package/ShadersWGSL/ShadersInclude/pbrBlockSheen.js +195 -0
  189. package/ShadersWGSL/ShadersInclude/pbrBlockSheen.js.map +1 -0
  190. package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.d.ts +5 -0
  191. package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js +425 -0
  192. package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js.map +1 -0
  193. package/ShadersWGSL/ShadersInclude/pbrDebug.d.ts +5 -0
  194. package/ShadersWGSL/ShadersInclude/pbrDebug.js +193 -0
  195. package/ShadersWGSL/ShadersInclude/pbrDebug.js.map +1 -0
  196. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFalloffFunctions.d.ts +5 -0
  197. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFalloffFunctions.js +43 -0
  198. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFalloffFunctions.js.map +1 -0
  199. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.d.ts +5 -0
  200. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +68 -0
  201. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -0
  202. package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.d.ts +5 -0
  203. package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js +30 -0
  204. package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -0
  205. package/ShadersWGSL/ShadersInclude/pbrHelperFunctions.d.ts +5 -0
  206. package/ShadersWGSL/ShadersInclude/pbrHelperFunctions.js +41 -0
  207. package/ShadersWGSL/ShadersInclude/pbrHelperFunctions.js.map +1 -0
  208. package/ShadersWGSL/ShadersInclude/pbrIBLFunctions.d.ts +5 -0
  209. package/ShadersWGSL/ShadersInclude/pbrIBLFunctions.js +23 -0
  210. package/ShadersWGSL/ShadersInclude/pbrIBLFunctions.js.map +1 -0
  211. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"computeEffect.js","sourceRoot":"","sources":["../../../../dev/core/src/Compute/computeEffect.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../Misc/logger\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { IComputePipelineContext } from \"./IComputePipelineContext\";\r\nimport { GetDOMTextContent, IsWindowObjectExist } from \"../Misc/domManagement\";\r\nimport { Finalize, Initialize, PreProcess } from \"../Engines/Processors/shaderProcessor\";\r\nimport type { ProcessingOptions } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport { ShaderStore } from \"../Engines/shaderStore\";\r\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\n\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport type { ComputeCompilationMessages } from \"../Engines/Extensions/engine.computeShader\";\r\n\r\n/**\r\n * Defines the route to the shader code. The priority is as follows:\r\n * * object: `{ computeSource: \"compute shader code string\"}` for directly passing the shader code\r\n * * object: `{ computeElement: \"vertexShaderCode\" }`, used with shader code in script tags\r\n * * object: `{ compute: \"custom\" }`, used with `Effect.ShadersStore[\"customVertexShader\"]` and `Effect.ShadersStore[\"customFragmentShader\"]`\r\n * * string: `\"./COMMON_NAME\"`, used with external files COMMON_NAME.vertex.fx and COMMON_NAME.fragment.fx in index.html folder.\r\n */\r\nexport type IComputeShaderPath = {\r\n /**\r\n * Directly pass the shader code\r\n */\r\n computeSource?: string;\r\n /**\r\n * Used with Effect.ShadersStore. If the `vertex` is set to `\"custom`, then\r\n * Babylon.js will read from Effect.ShadersStore[\"customVertexShader\"]\r\n */\r\n compute?: string;\r\n /**\r\n * Used with shader code in script tags\r\n */\r\n computeElement?: string;\r\n};\r\n\r\n/**\r\n * Options to be used when creating a compute effect.\r\n */\r\nexport interface IComputeEffectCreationOptions {\r\n /**\r\n * Define statements that will be set in the shader.\r\n */\r\n defines: any;\r\n /**\r\n * The name of the entry point in the shader source (default: \"main\")\r\n */\r\n entryPoint?: string;\r\n /**\r\n * Callback that will be called when the shader is compiled.\r\n */\r\n onCompiled: Nullable<(effect: ComputeEffect) => void>;\r\n /**\r\n * Callback that will be called if an error occurs during shader compilation.\r\n */\r\n onError: Nullable<(effect: ComputeEffect, errors: string) => void>;\r\n /**\r\n * If provided, will be called with the shader code so that this code can be updated before it is compiled by the GPU\r\n */\r\n processFinalCode?: Nullable<(code: string) => string>;\r\n}\r\n\r\n/**\r\n * Effect wrapping a compute shader and let execute (dispatch) the shader\r\n */\r\nexport class ComputeEffect {\r\n private static _UniqueIdSeed = 0;\r\n\r\n /**\r\n * Enable logging of the shader code when a compilation error occurs\r\n */\r\n public static LogShaderCodeOnCompilationError = true;\r\n /**\r\n * Name of the effect.\r\n */\r\n public name: IComputeShaderPath | string;\r\n /**\r\n * String container all the define statements that should be set on the shader.\r\n */\r\n public defines: string = \"\";\r\n /**\r\n * Callback that will be called when the shader is compiled.\r\n */\r\n public onCompiled: Nullable<(effect: ComputeEffect) => void> = null;\r\n /**\r\n * Callback that will be called if an error occurs during shader compilation.\r\n */\r\n public onError: Nullable<(effect: ComputeEffect, errors: string) => void> = null;\r\n /**\r\n * Unique ID of the effect.\r\n */\r\n public uniqueId = 0;\r\n /**\r\n * Observable that will be called when the shader is compiled.\r\n * It is recommended to use executeWhenCompile() or to make sure that scene.isReady() is called to get this observable raised.\r\n */\r\n public onCompileObservable = new Observable<ComputeEffect>();\r\n /**\r\n * Observable that will be called if an error occurs during shader compilation.\r\n */\r\n public onErrorObservable = new Observable<ComputeEffect>();\r\n /**\r\n * Observable that will be called when effect is bound.\r\n */\r\n public onBindObservable = new Observable<ComputeEffect>();\r\n\r\n /**\r\n * @internal\r\n * Specifies if the effect was previously ready\r\n */\r\n public _wasPreviouslyReady = false;\r\n\r\n private _engine: AbstractEngine;\r\n private _isReady = false;\r\n private _compilationError = \"\";\r\n /** @internal */\r\n public _key: string = \"\";\r\n private _computeSourceCodeOverride: string = \"\";\r\n /** @internal */\r\n public _pipelineContext: Nullable<IComputePipelineContext> = null;\r\n /** @internal */\r\n public _computeSourceCode: string = \"\";\r\n private _rawComputeSourceCode: string = \"\";\r\n private _entryPoint: string;\r\n private _shaderLanguage = ShaderLanguage.WGSL;\r\n private _shaderStore: { [key: string]: string };\r\n private _shaderRepository: string;\r\n private _includeShaderStore: { [key: string]: string };\r\n\r\n /**\r\n * Creates a compute effect that can be used to execute a compute shader\r\n * @param baseName Name of the effect\r\n * @param options Set of all options to create the effect\r\n * @param engine The engine the effect is created for\r\n * @param key Effect Key identifying uniquely compiled shader variants\r\n */\r\n constructor(baseName: IComputeShaderPath | string, options: IComputeEffectCreationOptions, engine: AbstractEngine, key = \"\") {\r\n this.name = baseName;\r\n this._key = key;\r\n\r\n this._engine = engine;\r\n this.uniqueId = ComputeEffect._UniqueIdSeed++;\r\n\r\n this.defines = options.defines ?? \"\";\r\n this.onError = options.onError;\r\n this.onCompiled = options.onCompiled;\r\n this._entryPoint = options.entryPoint ?? \"main\";\r\n\r\n this._shaderStore = ShaderStore.GetShadersStore(this._shaderLanguage);\r\n this._shaderRepository = ShaderStore.GetShadersRepository(this._shaderLanguage);\r\n this._includeShaderStore = ShaderStore.GetIncludesShadersStore(this._shaderLanguage);\r\n\r\n let computeSource: IComputeShaderPath | HTMLElement | string;\r\n\r\n const hostDocument = IsWindowObjectExist() ? this._engine.getHostDocument() : null;\r\n\r\n if (typeof baseName === \"string\") {\r\n computeSource = baseName;\r\n } else if (baseName.computeSource) {\r\n computeSource = \"source:\" + baseName.computeSource;\r\n } else if (baseName.computeElement) {\r\n computeSource = hostDocument?.getElementById(baseName.computeElement) || baseName.computeElement;\r\n } else {\r\n computeSource = baseName.compute || baseName;\r\n }\r\n\r\n const processorOptions: ProcessingOptions = {\r\n defines: this.defines.split(\"\\n\"),\r\n indexParameters: undefined,\r\n isFragment: false,\r\n shouldUseHighPrecisionShader: false,\r\n processor: null,\r\n supportsUniformBuffers: this._engine.supportsUniformBuffers,\r\n shadersRepository: this._shaderRepository,\r\n includesShadersStore: this._includeShaderStore,\r\n version: (this._engine.version * 100).toString(),\r\n platformName: this._engine.shaderPlatformName,\r\n processingContext: null,\r\n isNDCHalfZRange: this._engine.isNDCHalfZRange,\r\n useReverseDepthBuffer: this._engine.useReverseDepthBuffer,\r\n processCodeAfterIncludes: (shaderType: string, code: string, defines?: string[]) => {\r\n if (!defines) {\r\n return code;\r\n }\r\n // We need to convert #define key value to a const\r\n for (const define of defines) {\r\n const keyValue = define.replace(\"#define\", \"\").replace(\";\", \"\").trim();\r\n const split = keyValue.split(\" \");\r\n if (split.length === 2) {\r\n const key = split[0];\r\n const value = split[1];\r\n if (!isNaN(parseInt(value)) || !isNaN(parseFloat(value))) {\r\n code = `const ${key} = ${value};\\n` + code;\r\n }\r\n }\r\n }\r\n return code;\r\n },\r\n };\r\n\r\n this._loadShader(computeSource, \"Compute\", \"\", (computeCode) => {\r\n Initialize(processorOptions);\r\n PreProcess(\r\n computeCode,\r\n processorOptions,\r\n (migratedComputeCode) => {\r\n this._rawComputeSourceCode = computeCode;\r\n if (options.processFinalCode) {\r\n migratedComputeCode = options.processFinalCode(migratedComputeCode);\r\n }\r\n const finalShaders = Finalize(migratedComputeCode, \"\", processorOptions);\r\n this._useFinalCode(finalShaders.vertexCode, baseName);\r\n },\r\n this._engine\r\n );\r\n });\r\n }\r\n\r\n private _useFinalCode(migratedCommputeCode: string, baseName: any) {\r\n if (baseName) {\r\n const compute = baseName.computeElement || baseName.compute || baseName.spectorName || baseName;\r\n\r\n this._computeSourceCode = \"//#define SHADER_NAME compute:\" + compute + \"\\n\" + migratedCommputeCode;\r\n } else {\r\n this._computeSourceCode = migratedCommputeCode;\r\n }\r\n this._prepareEffect();\r\n }\r\n\r\n /**\r\n * Unique key for this effect\r\n */\r\n public get key(): string {\r\n return this._key;\r\n }\r\n\r\n /**\r\n * If the effect has been compiled and prepared.\r\n * @returns if the effect is compiled and prepared.\r\n */\r\n public isReady(): boolean {\r\n try {\r\n return this._isReadyInternal();\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private _isReadyInternal(): boolean {\r\n if (this._isReady) {\r\n return true;\r\n }\r\n if (this._pipelineContext) {\r\n return this._pipelineContext.isReady;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * The engine the effect was initialized with.\r\n * @returns the engine.\r\n */\r\n public getEngine(): AbstractEngine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * The pipeline context for this effect\r\n * @returns the associated pipeline context\r\n */\r\n public getPipelineContext(): Nullable<IComputePipelineContext> {\r\n return this._pipelineContext;\r\n }\r\n\r\n /**\r\n * The error from the last compilation.\r\n * @returns the error string.\r\n */\r\n public getCompilationError(): string {\r\n return this._compilationError;\r\n }\r\n\r\n /**\r\n * Adds a callback to the onCompiled observable and call the callback immediately if already ready.\r\n * @param func The callback to be used.\r\n */\r\n public executeWhenCompiled(func: (effect: ComputeEffect) => void): void {\r\n if (this.isReady()) {\r\n func(this);\r\n return;\r\n }\r\n\r\n this.onCompileObservable.add((effect) => {\r\n func(effect);\r\n });\r\n\r\n if (!this._pipelineContext || this._pipelineContext.isAsync) {\r\n setTimeout(() => {\r\n this._checkIsReady(null);\r\n }, 16);\r\n }\r\n }\r\n\r\n private _checkIsReady(previousPipelineContext: Nullable<IComputePipelineContext>) {\r\n try {\r\n if (this._isReadyInternal()) {\r\n return;\r\n }\r\n } catch (e) {\r\n this._processCompilationErrors(e, previousPipelineContext);\r\n return;\r\n }\r\n\r\n setTimeout(() => {\r\n this._checkIsReady(previousPipelineContext);\r\n }, 16);\r\n }\r\n\r\n private _loadShader(shader: any, key: string, optionalKey: string, callback: (data: any) => void): void {\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.substr(0, 7) === \"source:\") {\r\n callback(shader.substr(7));\r\n return;\r\n }\r\n\r\n // Base64 encoded ?\r\n if (shader.substr(0, 7) === \"base64:\") {\r\n const shaderBinary = window.atob(shader.substr(7));\r\n callback(shaderBinary);\r\n return;\r\n }\r\n\r\n // Is in local store ?\r\n if (this._shaderStore[shader + key + \"Shader\"]) {\r\n callback(this._shaderStore[shader + key + \"Shader\"]);\r\n return;\r\n }\r\n\r\n if (optionalKey && this._shaderStore[shader + optionalKey + \"Shader\"]) {\r\n callback(this._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 = this._shaderRepository + shader;\r\n }\r\n\r\n this._engine._loadFile(shaderUrl + \".\" + key.toLowerCase() + \".fx\", callback);\r\n }\r\n\r\n /**\r\n * Gets the compute shader source code of this effect\r\n */\r\n public get computeSourceCode(): string {\r\n return this._computeSourceCodeOverride ? this._computeSourceCodeOverride : this._pipelineContext?._getComputeShaderCode() ?? this._computeSourceCode;\r\n }\r\n\r\n /**\r\n * Gets the compute shader source code before it has been processed by the preprocessor\r\n */\r\n public get rawComputeSourceCode(): string {\r\n return this._rawComputeSourceCode;\r\n }\r\n\r\n /**\r\n * Prepares the effect\r\n * @internal\r\n */\r\n public _prepareEffect() {\r\n const defines = this.defines;\r\n\r\n const previousPipelineContext = this._pipelineContext;\r\n\r\n this._isReady = false;\r\n\r\n try {\r\n const engine = this._engine;\r\n\r\n this._pipelineContext = engine.createComputePipelineContext();\r\n this._pipelineContext._name = this._key;\r\n\r\n engine._prepareComputePipelineContext(\r\n this._pipelineContext,\r\n this._computeSourceCodeOverride ? this._computeSourceCodeOverride : this._computeSourceCode,\r\n this._rawComputeSourceCode,\r\n this._computeSourceCodeOverride ? null : defines,\r\n this._entryPoint\r\n );\r\n\r\n engine._executeWhenComputeStateIsCompiled(this._pipelineContext, (messages: Nullable<ComputeCompilationMessages>) => {\r\n if (messages && messages.numErrors > 0) {\r\n this._processCompilationErrors(messages, previousPipelineContext);\r\n return;\r\n }\r\n this._compilationError = \"\";\r\n this._isReady = true;\r\n if (this.onCompiled) {\r\n this.onCompiled(this);\r\n }\r\n this.onCompileObservable.notifyObservers(this);\r\n this.onCompileObservable.clear();\r\n\r\n if (previousPipelineContext) {\r\n this.getEngine()._deleteComputePipelineContext(previousPipelineContext);\r\n }\r\n });\r\n\r\n if (this._pipelineContext.isAsync) {\r\n this._checkIsReady(previousPipelineContext);\r\n }\r\n } catch (e) {\r\n this._processCompilationErrors(e, previousPipelineContext);\r\n }\r\n }\r\n\r\n private _processCompilationErrors(e: ComputeCompilationMessages | string, previousPipelineContext: Nullable<IComputePipelineContext> = null) {\r\n this._compilationError = \"\";\r\n\r\n Logger.Error(\"Unable to compile compute effect:\");\r\n if (this.defines) {\r\n Logger.Error(\"Defines:\\n\" + this.defines);\r\n }\r\n\r\n if (ComputeEffect.LogShaderCodeOnCompilationError) {\r\n const code = this._pipelineContext?._getComputeShaderCode();\r\n if (code) {\r\n Logger.Error(\"Compute code:\");\r\n Logger.Error(code);\r\n }\r\n }\r\n\r\n if (typeof e === \"string\") {\r\n this._compilationError = e;\r\n Logger.Error(\"Error: \" + this._compilationError);\r\n } else {\r\n for (const message of e.messages) {\r\n let msg = \"\";\r\n if (message.line !== undefined) {\r\n msg += \"Line \" + message.line + \", \";\r\n }\r\n if (message.offset !== undefined) {\r\n msg += \"Offset \" + message.offset + \", \";\r\n }\r\n if (message.length !== undefined) {\r\n msg += \"Length \" + message.length + \", \";\r\n }\r\n msg += message.type + \": \" + message.text;\r\n\r\n if (this._compilationError) {\r\n this._compilationError += \"\\n\";\r\n }\r\n this._compilationError += msg;\r\n Logger.Error(msg);\r\n }\r\n }\r\n\r\n if (previousPipelineContext) {\r\n this._pipelineContext = previousPipelineContext;\r\n this._isReady = true;\r\n }\r\n\r\n if (this.onError) {\r\n this.onError(this, this._compilationError);\r\n }\r\n this.onErrorObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Release all associated resources.\r\n **/\r\n public dispose() {\r\n if (this._pipelineContext) {\r\n this._pipelineContext.dispose();\r\n }\r\n this._engine._releaseComputeEffect(this);\r\n }\r\n\r\n /**\r\n * This function will add a new compute shader to the shader store\r\n * @param name the name of the shader\r\n * @param computeShader compute shader content\r\n */\r\n public static RegisterShader(name: string, computeShader: string) {\r\n ShaderStore.GetShadersStore(ShaderLanguage.WGSL)[`${name}ComputeShader`] = computeShader;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"computeEffect.js","sourceRoot":"","sources":["../../../../dev/core/src/Compute/computeEffect.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../Misc/logger\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { IComputePipelineContext } from \"./IComputePipelineContext\";\r\nimport { GetDOMTextContent, IsWindowObjectExist } from \"../Misc/domManagement\";\r\nimport { Finalize, Initialize, PreProcess } from \"../Engines/Processors/shaderProcessor\";\r\nimport type { ProcessingOptions } from \"../Engines/Processors/shaderProcessingOptions\";\r\nimport { ShaderStore } from \"../Engines/shaderStore\";\r\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\r\n\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport type { ComputeCompilationMessages } from \"../Engines/Extensions/engine.computeShader\";\r\n\r\n/**\r\n * Defines the route to the shader code. The priority is as follows:\r\n * * object: `{ computeSource: \"compute shader code string\"}` for directly passing the shader code\r\n * * object: `{ computeElement: \"vertexShaderCode\" }`, used with shader code in script tags\r\n * * object: `{ compute: \"custom\" }`, used with `Effect.ShadersStore[\"customVertexShader\"]` and `Effect.ShadersStore[\"customFragmentShader\"]`\r\n * * string: `\"./COMMON_NAME\"`, used with external files COMMON_NAME.vertex.fx and COMMON_NAME.fragment.fx in index.html folder.\r\n */\r\nexport type IComputeShaderPath = {\r\n /**\r\n * Directly pass the shader code\r\n */\r\n computeSource?: string;\r\n /**\r\n * Used with Effect.ShadersStore. If the `vertex` is set to `\"custom`, then\r\n * Babylon.js will read from Effect.ShadersStore[\"customVertexShader\"]\r\n */\r\n compute?: string;\r\n /**\r\n * Used with shader code in script tags\r\n */\r\n computeElement?: string;\r\n};\r\n\r\n/**\r\n * Options to be used when creating a compute effect.\r\n */\r\nexport interface IComputeEffectCreationOptions {\r\n /**\r\n * Define statements that will be set in the shader.\r\n */\r\n defines: any;\r\n /**\r\n * The name of the entry point in the shader source (default: \"main\")\r\n */\r\n entryPoint?: string;\r\n /**\r\n * Callback that will be called when the shader is compiled.\r\n */\r\n onCompiled: Nullable<(effect: ComputeEffect) => void>;\r\n /**\r\n * Callback that will be called if an error occurs during shader compilation.\r\n */\r\n onError: Nullable<(effect: ComputeEffect, errors: string) => void>;\r\n /**\r\n * If provided, will be called with the shader code so that this code can be updated before it is compiled by the GPU\r\n */\r\n processFinalCode?: Nullable<(code: string) => string>;\r\n}\r\n\r\n/**\r\n * Effect wrapping a compute shader and let execute (dispatch) the shader\r\n */\r\nexport class ComputeEffect {\r\n private static _UniqueIdSeed = 0;\r\n\r\n /**\r\n * Enable logging of the shader code when a compilation error occurs\r\n */\r\n public static LogShaderCodeOnCompilationError = true;\r\n /**\r\n * Name of the effect.\r\n */\r\n public name: IComputeShaderPath | string;\r\n /**\r\n * String container all the define statements that should be set on the shader.\r\n */\r\n public defines: string = \"\";\r\n /**\r\n * Callback that will be called when the shader is compiled.\r\n */\r\n public onCompiled: Nullable<(effect: ComputeEffect) => void> = null;\r\n /**\r\n * Callback that will be called if an error occurs during shader compilation.\r\n */\r\n public onError: Nullable<(effect: ComputeEffect, errors: string) => void> = null;\r\n /**\r\n * Unique ID of the effect.\r\n */\r\n public uniqueId = 0;\r\n /**\r\n * Observable that will be called when the shader is compiled.\r\n * It is recommended to use executeWhenCompile() or to make sure that scene.isReady() is called to get this observable raised.\r\n */\r\n public onCompileObservable = new Observable<ComputeEffect>();\r\n /**\r\n * Observable that will be called if an error occurs during shader compilation.\r\n */\r\n public onErrorObservable = new Observable<ComputeEffect>();\r\n /**\r\n * Observable that will be called when effect is bound.\r\n */\r\n public onBindObservable = new Observable<ComputeEffect>();\r\n\r\n /**\r\n * @internal\r\n * Specifies if the effect was previously ready\r\n */\r\n public _wasPreviouslyReady = false;\r\n\r\n private _engine: AbstractEngine;\r\n private _isReady = false;\r\n private _compilationError = \"\";\r\n /** @internal */\r\n public _key: string = \"\";\r\n private _computeSourceCodeOverride: string = \"\";\r\n /** @internal */\r\n public _pipelineContext: Nullable<IComputePipelineContext> = null;\r\n /** @internal */\r\n public _computeSourceCode: string = \"\";\r\n private _rawComputeSourceCode: string = \"\";\r\n private _entryPoint: string;\r\n private _shaderLanguage = ShaderLanguage.WGSL;\r\n private _shaderStore: { [key: string]: string };\r\n private _shaderRepository: string;\r\n private _includeShaderStore: { [key: string]: string };\r\n\r\n /**\r\n * Creates a compute effect that can be used to execute a compute shader\r\n * @param baseName Name of the effect\r\n * @param options Set of all options to create the effect\r\n * @param engine The engine the effect is created for\r\n * @param key Effect Key identifying uniquely compiled shader variants\r\n */\r\n constructor(baseName: IComputeShaderPath | string, options: IComputeEffectCreationOptions, engine: AbstractEngine, key = \"\") {\r\n this.name = baseName;\r\n this._key = key;\r\n\r\n this._engine = engine;\r\n this.uniqueId = ComputeEffect._UniqueIdSeed++;\r\n\r\n this.defines = options.defines ?? \"\";\r\n this.onError = options.onError;\r\n this.onCompiled = options.onCompiled;\r\n this._entryPoint = options.entryPoint ?? \"main\";\r\n\r\n this._shaderStore = ShaderStore.GetShadersStore(this._shaderLanguage);\r\n this._shaderRepository = ShaderStore.GetShadersRepository(this._shaderLanguage);\r\n this._includeShaderStore = ShaderStore.GetIncludesShadersStore(this._shaderLanguage);\r\n\r\n let computeSource: IComputeShaderPath | HTMLElement | string;\r\n\r\n const hostDocument = IsWindowObjectExist() ? this._engine.getHostDocument() : null;\r\n\r\n if (typeof baseName === \"string\") {\r\n computeSource = baseName;\r\n } else if (baseName.computeSource) {\r\n computeSource = \"source:\" + baseName.computeSource;\r\n } else if (baseName.computeElement) {\r\n computeSource = hostDocument?.getElementById(baseName.computeElement) || baseName.computeElement;\r\n } else {\r\n computeSource = baseName.compute || baseName;\r\n }\r\n\r\n const processorOptions: ProcessingOptions = {\r\n defines: this.defines.split(\"\\n\"),\r\n indexParameters: undefined,\r\n isFragment: false,\r\n shouldUseHighPrecisionShader: false,\r\n processor: null,\r\n supportsUniformBuffers: this._engine.supportsUniformBuffers,\r\n shadersRepository: this._shaderRepository,\r\n includesShadersStore: this._includeShaderStore,\r\n version: (this._engine.version * 100).toString(),\r\n platformName: this._engine.shaderPlatformName,\r\n processingContext: null,\r\n isNDCHalfZRange: this._engine.isNDCHalfZRange,\r\n useReverseDepthBuffer: this._engine.useReverseDepthBuffer,\r\n processCodeAfterIncludes: (shaderType: string, code: string, defines?: string[]) => {\r\n if (!defines) {\r\n return code;\r\n }\r\n // We need to convert #define key value to a const\r\n for (const define of defines) {\r\n const keyValue = define.replace(\"#define\", \"\").replace(\";\", \"\").trim();\r\n const split = keyValue.split(\" \");\r\n if (split.length === 2) {\r\n const key = split[0];\r\n const value = split[1];\r\n if (!isNaN(parseInt(value)) || !isNaN(parseFloat(value))) {\r\n code = `const ${key} = ${value};\\n` + code;\r\n }\r\n }\r\n }\r\n return code;\r\n },\r\n };\r\n\r\n this._loadShader(computeSource, \"Compute\", \"\", (computeCode) => {\r\n Initialize(processorOptions);\r\n PreProcess(\r\n computeCode,\r\n processorOptions,\r\n (migratedComputeCode) => {\r\n this._rawComputeSourceCode = computeCode;\r\n if (options.processFinalCode) {\r\n migratedComputeCode = options.processFinalCode(migratedComputeCode);\r\n }\r\n const finalShaders = Finalize(migratedComputeCode, \"\", processorOptions);\r\n this._useFinalCode(finalShaders.vertexCode, baseName);\r\n },\r\n this._engine\r\n );\r\n });\r\n }\r\n\r\n private _useFinalCode(migratedCommputeCode: string, baseName: any) {\r\n if (baseName) {\r\n const compute = baseName.computeElement || baseName.compute || baseName.spectorName || baseName;\r\n\r\n this._computeSourceCode = \"//#define SHADER_NAME compute:\" + compute + \"\\n\" + migratedCommputeCode;\r\n } else {\r\n this._computeSourceCode = migratedCommputeCode;\r\n }\r\n this._prepareEffect();\r\n }\r\n\r\n /**\r\n * Unique key for this effect\r\n */\r\n public get key(): string {\r\n return this._key;\r\n }\r\n\r\n /**\r\n * If the effect has been compiled and prepared.\r\n * @returns if the effect is compiled and prepared.\r\n */\r\n public isReady(): boolean {\r\n try {\r\n return this._isReadyInternal();\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private _isReadyInternal(): boolean {\r\n if (this._isReady) {\r\n return true;\r\n }\r\n if (this._pipelineContext) {\r\n return this._pipelineContext.isReady;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * The engine the effect was initialized with.\r\n * @returns the engine.\r\n */\r\n public getEngine(): AbstractEngine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * The pipeline context for this effect\r\n * @returns the associated pipeline context\r\n */\r\n public getPipelineContext(): Nullable<IComputePipelineContext> {\r\n return this._pipelineContext;\r\n }\r\n\r\n /**\r\n * The error from the last compilation.\r\n * @returns the error string.\r\n */\r\n public getCompilationError(): string {\r\n return this._compilationError;\r\n }\r\n\r\n /**\r\n * Adds a callback to the onCompiled observable and call the callback immediately if already ready.\r\n * @param func The callback to be used.\r\n */\r\n public executeWhenCompiled(func: (effect: ComputeEffect) => void): void {\r\n if (this.isReady()) {\r\n func(this);\r\n return;\r\n }\r\n\r\n this.onCompileObservable.add((effect) => {\r\n func(effect);\r\n });\r\n\r\n if (!this._pipelineContext || this._pipelineContext.isAsync) {\r\n setTimeout(() => {\r\n this._checkIsReady(null);\r\n }, 16);\r\n }\r\n }\r\n\r\n private _checkIsReady(previousPipelineContext: Nullable<IComputePipelineContext>) {\r\n try {\r\n if (this._isReadyInternal()) {\r\n return;\r\n }\r\n } catch (e) {\r\n this._processCompilationErrors(e, previousPipelineContext);\r\n return;\r\n }\r\n\r\n setTimeout(() => {\r\n this._checkIsReady(previousPipelineContext);\r\n }, 16);\r\n }\r\n\r\n private _loadShader(shader: any, key: string, optionalKey: string, callback: (data: any) => void): void {\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.substr(0, 7) === \"source:\") {\r\n callback(shader.substr(7));\r\n return;\r\n }\r\n\r\n // Base64 encoded ?\r\n if (shader.substr(0, 7) === \"base64:\") {\r\n const shaderBinary = window.atob(shader.substr(7));\r\n callback(shaderBinary);\r\n return;\r\n }\r\n\r\n // Is in local store ?\r\n if (this._shaderStore[shader + key + \"Shader\"]) {\r\n callback(this._shaderStore[shader + key + \"Shader\"]);\r\n return;\r\n }\r\n\r\n if (optionalKey && this._shaderStore[shader + optionalKey + \"Shader\"]) {\r\n callback(this._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 = this._shaderRepository + shader;\r\n }\r\n\r\n this._engine._loadFile(shaderUrl + \".\" + key.toLowerCase() + \".fx\", callback);\r\n }\r\n\r\n /**\r\n * Gets the compute shader source code of this effect\r\n */\r\n public get computeSourceCode(): string {\r\n return this._computeSourceCodeOverride ? this._computeSourceCodeOverride : (this._pipelineContext?._getComputeShaderCode() ?? this._computeSourceCode);\r\n }\r\n\r\n /**\r\n * Gets the compute shader source code before it has been processed by the preprocessor\r\n */\r\n public get rawComputeSourceCode(): string {\r\n return this._rawComputeSourceCode;\r\n }\r\n\r\n /**\r\n * Prepares the effect\r\n * @internal\r\n */\r\n public _prepareEffect() {\r\n const defines = this.defines;\r\n\r\n const previousPipelineContext = this._pipelineContext;\r\n\r\n this._isReady = false;\r\n\r\n try {\r\n const engine = this._engine;\r\n\r\n this._pipelineContext = engine.createComputePipelineContext();\r\n this._pipelineContext._name = this._key;\r\n\r\n engine._prepareComputePipelineContext(\r\n this._pipelineContext,\r\n this._computeSourceCodeOverride ? this._computeSourceCodeOverride : this._computeSourceCode,\r\n this._rawComputeSourceCode,\r\n this._computeSourceCodeOverride ? null : defines,\r\n this._entryPoint\r\n );\r\n\r\n engine._executeWhenComputeStateIsCompiled(this._pipelineContext, (messages: Nullable<ComputeCompilationMessages>) => {\r\n if (messages && messages.numErrors > 0) {\r\n this._processCompilationErrors(messages, previousPipelineContext);\r\n return;\r\n }\r\n this._compilationError = \"\";\r\n this._isReady = true;\r\n if (this.onCompiled) {\r\n this.onCompiled(this);\r\n }\r\n this.onCompileObservable.notifyObservers(this);\r\n this.onCompileObservable.clear();\r\n\r\n if (previousPipelineContext) {\r\n this.getEngine()._deleteComputePipelineContext(previousPipelineContext);\r\n }\r\n });\r\n\r\n if (this._pipelineContext.isAsync) {\r\n this._checkIsReady(previousPipelineContext);\r\n }\r\n } catch (e) {\r\n this._processCompilationErrors(e, previousPipelineContext);\r\n }\r\n }\r\n\r\n private _processCompilationErrors(e: ComputeCompilationMessages | string, previousPipelineContext: Nullable<IComputePipelineContext> = null) {\r\n this._compilationError = \"\";\r\n\r\n Logger.Error(\"Unable to compile compute effect:\");\r\n if (this.defines) {\r\n Logger.Error(\"Defines:\\n\" + this.defines);\r\n }\r\n\r\n if (ComputeEffect.LogShaderCodeOnCompilationError) {\r\n const code = this._pipelineContext?._getComputeShaderCode();\r\n if (code) {\r\n Logger.Error(\"Compute code:\");\r\n Logger.Error(code);\r\n }\r\n }\r\n\r\n if (typeof e === \"string\") {\r\n this._compilationError = e;\r\n Logger.Error(\"Error: \" + this._compilationError);\r\n } else {\r\n for (const message of e.messages) {\r\n let msg = \"\";\r\n if (message.line !== undefined) {\r\n msg += \"Line \" + message.line + \", \";\r\n }\r\n if (message.offset !== undefined) {\r\n msg += \"Offset \" + message.offset + \", \";\r\n }\r\n if (message.length !== undefined) {\r\n msg += \"Length \" + message.length + \", \";\r\n }\r\n msg += message.type + \": \" + message.text;\r\n\r\n if (this._compilationError) {\r\n this._compilationError += \"\\n\";\r\n }\r\n this._compilationError += msg;\r\n Logger.Error(msg);\r\n }\r\n }\r\n\r\n if (previousPipelineContext) {\r\n this._pipelineContext = previousPipelineContext;\r\n this._isReady = true;\r\n }\r\n\r\n if (this.onError) {\r\n this.onError(this, this._compilationError);\r\n }\r\n this.onErrorObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Release all associated resources.\r\n **/\r\n public dispose() {\r\n if (this._pipelineContext) {\r\n this._pipelineContext.dispose();\r\n }\r\n this._engine._releaseComputeEffect(this);\r\n }\r\n\r\n /**\r\n * This function will add a new compute shader to the shader store\r\n * @param name the name of the shader\r\n * @param computeShader compute shader content\r\n */\r\n public static RegisterShader(name: string, computeShader: string) {\r\n ShaderStore.GetShadersStore(ShaderLanguage.WGSL)[`${name}ComputeShader`] = computeShader;\r\n }\r\n}\r\n"]}
@@ -38,6 +38,38 @@ import "../../ShadersWGSL/ShadersInclude/reflectionFunction";
38
38
  import "../../ShadersWGSL/ShadersInclude/shadowMapVertexMetric";
39
39
  import "../../ShadersWGSL/ShadersInclude/packingFunctions";
40
40
  import "../../ShadersWGSL/ShadersInclude/shadowMapFragment";
41
+ import "../../ShadersWGSL/ShadersInclude/decalFragment";
42
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockClearcoat";
43
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockIridescence";
44
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockReflection";
45
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockSheen";
46
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockSubSurface";
47
+ import "../../ShadersWGSL/ShadersInclude/pbrBRDFFunctions";
48
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockDirectLighting";
49
+ import "../../ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions";
50
+ import "../../ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions";
51
+ import "../../ShadersWGSL/ShadersInclude/depthPrePass";
52
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockFinalColorComposition";
53
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents";
54
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents";
55
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockGeometryInfo";
56
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockImageProcessing";
57
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockLightmapInit";
58
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockNormalFinal";
59
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockReflectance";
60
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockReflectance0";
61
+ import "../../ShadersWGSL/ShadersInclude/pbrDebug";
62
+ import "../../ShadersWGSL/ShadersInclude/pbrDirectLightingFalloffFunctions";
63
+ import "../../ShadersWGSL/ShadersInclude/hdrFilteringFunctions";
64
+ import "../../ShadersWGSL/ShadersInclude/importanceSampling";
65
+ import "../../ShadersWGSL/ShadersInclude/pbrHelperFunctions";
66
+ import "../../ShadersWGSL/ShadersInclude/pbrIBLFunctions";
67
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockAlbedoOpacity";
68
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockReflectivity";
69
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockAmbientOcclusion";
70
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockAlphaFresnel";
71
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockAnisotropic";
72
+ import "../../ShadersWGSL/ShadersInclude/harmonicsFunctions";
41
73
  import "../../ShadersWGSL/particles.vertex";
42
74
  /** @internal */
43
75
  export declare class WebGPUShaderProcessorWGSL extends WebGPUShaderProcessor {
@@ -38,6 +38,38 @@ import "../../ShadersWGSL/ShadersInclude/reflectionFunction.js";
38
38
  import "../../ShadersWGSL/ShadersInclude/shadowMapVertexMetric.js";
39
39
  import "../../ShadersWGSL/ShadersInclude/packingFunctions.js";
40
40
  import "../../ShadersWGSL/ShadersInclude/shadowMapFragment.js";
41
+ import "../../ShadersWGSL/ShadersInclude/decalFragment.js";
42
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockClearcoat.js";
43
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockIridescence.js";
44
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockReflection.js";
45
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockSheen.js";
46
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js";
47
+ import "../../ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js";
48
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockDirectLighting.js";
49
+ import "../../ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js";
50
+ import "../../ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js";
51
+ import "../../ShadersWGSL/ShadersInclude/depthPrePass.js";
52
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockFinalColorComposition.js";
53
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js";
54
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.js";
55
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockGeometryInfo.js";
56
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockImageProcessing.js";
57
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockLightmapInit.js";
58
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockNormalFinal.js";
59
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockReflectance.js";
60
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockReflectance0.js";
61
+ import "../../ShadersWGSL/ShadersInclude/pbrDebug.js";
62
+ import "../../ShadersWGSL/ShadersInclude/pbrDirectLightingFalloffFunctions.js";
63
+ import "../../ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js";
64
+ import "../../ShadersWGSL/ShadersInclude/importanceSampling.js";
65
+ import "../../ShadersWGSL/ShadersInclude/pbrHelperFunctions.js";
66
+ import "../../ShadersWGSL/ShadersInclude/pbrIBLFunctions.js";
67
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockAlbedoOpacity.js";
68
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js";
69
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockAmbientOcclusion.js";
70
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockAlphaFresnel.js";
71
+ import "../../ShadersWGSL/ShadersInclude/pbrBlockAnisotropic.js";
72
+ import "../../ShadersWGSL/ShadersInclude/harmonicsFunctions.js";
41
73
  import "../../ShadersWGSL/particles.vertex.js";
42
74
  const builtInName_frag_depth = "fragmentOutputs.fragDepth";
43
75
  const leftOverVarName = "uniforms";
@@ -1 +1 @@
1
- {"version":3,"file":"webgpuShaderProcessorsWGSL.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuShaderProcessorsWGSL.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\n/* eslint-disable babylonjs/available */\r\n/* eslint-disable jsdoc/require-jsdoc */\r\nimport type { Nullable } from \"../../types\";\r\nimport type { ShaderProcessingContext } from \"../Processors/shaderProcessingOptions\";\r\nimport type { WebGPUBufferDescription } from \"./webgpuShaderProcessingContext\";\r\nimport { WebGPUShaderProcessingContext } from \"./webgpuShaderProcessingContext\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { WebGPUShaderProcessor } from \"./webgpuShaderProcessor\";\r\nimport { RemoveComments, InjectStartingAndEndingCode } from \"../../Misc/codeStringParsingTools\";\r\nimport { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\n\r\nimport { Constants } from \"../constants\";\r\n\r\nimport \"../../ShadersWGSL/ShadersInclude/bonesDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bonesVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bakedVertexAnimationDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bakedVertexAnimation\";\r\nimport \"../../ShadersWGSL/ShadersInclude/clipPlaneFragment\";\r\nimport \"../../ShadersWGSL/ShadersInclude/clipPlaneFragmentDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/clipPlaneVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/clipPlaneVertexDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/instancesDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/instancesVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/helperFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/fresnelFunction\";\r\nimport \"../../ShadersWGSL/ShadersInclude/meshUboDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/morphTargetsVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/morphTargetsVertexDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/morphTargetsVertexGlobal\";\r\nimport \"../../ShadersWGSL/ShadersInclude/morphTargetsVertexGlobalDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/sceneUboDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/lightsFragmentFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/lightFragment\";\r\nimport \"../../ShadersWGSL/ShadersInclude/lightUboDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/lightVxUboDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/shadowsFragmentFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/shadowsVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/fogFragmentDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bumpFragment\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bumpFragmentFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/samplerFragmentDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/imageProcessingDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/imageProcessingFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/reflectionFunction\";\r\nimport \"../../ShadersWGSL/ShadersInclude/shadowMapVertexMetric\";\r\nimport \"../../ShadersWGSL/ShadersInclude/packingFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/shadowMapFragment\";\r\nimport \"../../ShadersWGSL/particles.vertex\";\r\n\r\nconst builtInName_frag_depth = \"fragmentOutputs.fragDepth\";\r\n\r\nconst leftOverVarName = \"uniforms\";\r\nconst internalsVarName = \"internals\";\r\n\r\nconst gpuTextureViewDimensionByWebGPUTextureFunction: { [key: string]: Nullable<GPUTextureViewDimension> } = {\r\n texture_1d: WebGPUConstants.TextureViewDimension.E1d,\r\n texture_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_2d_array: WebGPUConstants.TextureViewDimension.E2dArray,\r\n texture_3d: WebGPUConstants.TextureViewDimension.E3d,\r\n texture_cube: WebGPUConstants.TextureViewDimension.Cube,\r\n texture_cube_array: WebGPUConstants.TextureViewDimension.CubeArray,\r\n texture_multisampled_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_depth_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_depth_2d_array: WebGPUConstants.TextureViewDimension.E2dArray,\r\n texture_depth_cube: WebGPUConstants.TextureViewDimension.Cube,\r\n texture_depth_cube_array: WebGPUConstants.TextureViewDimension.CubeArray,\r\n texture_depth_multisampled_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_storage_1d: WebGPUConstants.TextureViewDimension.E1d,\r\n texture_storage_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_storage_2d_array: WebGPUConstants.TextureViewDimension.E2dArray,\r\n texture_storage_3d: WebGPUConstants.TextureViewDimension.E3d,\r\n texture_external: null,\r\n};\r\n\r\n/** @internal */\r\nexport class WebGPUShaderProcessorWGSL extends WebGPUShaderProcessor {\r\n protected _attributesInputWGSL: string[];\r\n protected _attributesWGSL: string[];\r\n protected _attributesConversionCodeWGSL: string[];\r\n protected _hasNonFloatAttribute: boolean;\r\n protected _varyingsWGSL: string[];\r\n protected _varyingNamesWGSL: string[];\r\n protected _stridedUniformArrays: string[];\r\n\r\n public override shaderLanguage = ShaderLanguage.WGSL;\r\n public uniformRegexp = /uniform\\s+(\\w+)\\s*:\\s*(.+)\\s*;/;\r\n public textureRegexp = /var\\s+(\\w+)\\s*:\\s*((array<\\s*)?(texture_\\w+)\\s*(<\\s*(.+)\\s*>)?\\s*(,\\s*\\w+\\s*>\\s*)?);/;\r\n public noPrecision = true;\r\n\r\n public preProcessor(code: string, defines: string[], preProcessors: { [key: string]: string }, isFragment: boolean, processingContext: Nullable<ShaderProcessingContext>) {\r\n // Convert defines into const\r\n for (const key in preProcessors) {\r\n if (key === \"__VERSION__\") {\r\n continue;\r\n }\r\n const value = preProcessors[key];\r\n if (!isNaN(parseInt(value)) || !isNaN(parseFloat(value))) {\r\n code = `const ${key} = ${value};\\n` + code;\r\n }\r\n }\r\n\r\n return code;\r\n }\r\n\r\n protected _getArraySize(name: string, uniformType: string, preProcessors: { [key: string]: string }): [string, string, number] {\r\n let length = 0;\r\n\r\n const endArray = uniformType.lastIndexOf(\">\");\r\n if (uniformType.indexOf(\"array\") >= 0 && endArray > 0) {\r\n let startArray = endArray;\r\n while (startArray > 0 && uniformType.charAt(startArray) !== \" \" && uniformType.charAt(startArray) !== \",\") {\r\n startArray--;\r\n }\r\n const lengthInString = uniformType.substring(startArray + 1, endArray);\r\n length = +lengthInString;\r\n if (isNaN(length)) {\r\n length = +preProcessors[lengthInString.trim()];\r\n }\r\n while (startArray > 0 && (uniformType.charAt(startArray) === \" \" || uniformType.charAt(startArray) === \",\")) {\r\n startArray--;\r\n }\r\n uniformType = uniformType.substring(uniformType.indexOf(\"<\") + 1, startArray + 1);\r\n }\r\n\r\n return [name, uniformType, length];\r\n }\r\n\r\n public initializeShaders(processingContext: Nullable<ShaderProcessingContext>): void {\r\n this._webgpuProcessingContext = processingContext as WebGPUShaderProcessingContext;\r\n\r\n this._attributesInputWGSL = [];\r\n this._attributesWGSL = [];\r\n this._attributesConversionCodeWGSL = [];\r\n this._hasNonFloatAttribute = false;\r\n this._varyingsWGSL = [];\r\n this._varyingNamesWGSL = [];\r\n this._stridedUniformArrays = [];\r\n }\r\n\r\n public preProcessShaderCode(code: string): string {\r\n // Same check as in webgpuShaderProcessorsGLSL to avoid same ubDelcaration to be injected twice.\r\n const ubDeclaration = `struct ${WebGPUShaderProcessor.InternalsUBOName} {\\n yFactor_: f32,\\n textureOutputHeight_: f32,\\n};\\nvar<uniform> ${internalsVarName} : ${WebGPUShaderProcessor.InternalsUBOName};\\n`;\r\n const alreadyInjected = code.indexOf(ubDeclaration) !== -1;\r\n return alreadyInjected ? code : ubDeclaration + RemoveComments(code);\r\n }\r\n\r\n public varyingCheck(varying: string, isFragment: boolean): boolean {\r\n const regex = /(flat|linear|perspective)?\\s*(center|centroid|sample)?\\s*\\bvarying\\b/;\r\n\r\n return regex.test(varying);\r\n }\r\n\r\n public varyingProcessor(varying: string, isFragment: boolean, preProcessors: { [key: string]: string }) {\r\n const varyingRegex = /\\s*(flat|linear|perspective)?\\s*(center|centroid|sample)?\\s*varying\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s*:\\s*(.+)\\s*;/gm;\r\n const match = varyingRegex.exec(varying);\r\n if (match !== null) {\r\n const interpolationType = match[1] ?? \"perspective\";\r\n const interpolationSampling = match[2] ?? \"center\";\r\n const varyingType = match[4];\r\n const name = match[3];\r\n const interpolation = interpolationType === \"flat\" ? `@interpolate(${interpolationType})` : `@interpolate(${interpolationType}, ${interpolationSampling})`;\r\n let location: number;\r\n if (isFragment) {\r\n location = this._webgpuProcessingContext.availableVaryings[name];\r\n if (location === undefined) {\r\n Logger.Warn(`Invalid fragment shader: The varying named \"${name}\" is not declared in the vertex shader! This declaration will be ignored.`);\r\n }\r\n } else {\r\n location = this._webgpuProcessingContext.getVaryingNextLocation(varyingType, this._getArraySize(name, varyingType, preProcessors)[2]);\r\n this._webgpuProcessingContext.availableVaryings[name] = location;\r\n this._varyingsWGSL.push(` @location(${location}) ${interpolation} ${name} : ${varyingType},`);\r\n this._varyingNamesWGSL.push(name);\r\n }\r\n\r\n varying = \"\";\r\n }\r\n return varying;\r\n }\r\n\r\n public attributeProcessor(attribute: string, preProcessors: { [key: string]: string }) {\r\n const attribRegex = /\\s*attribute\\s+(\\S+)\\s*:\\s*(.+)\\s*;/gm;\r\n const match = attribRegex.exec(attribute);\r\n if (match !== null) {\r\n const attributeType = match[2];\r\n const name = match[1];\r\n const location = this._webgpuProcessingContext.getAttributeNextLocation(attributeType, this._getArraySize(name, attributeType, preProcessors)[2]);\r\n\r\n this._webgpuProcessingContext.availableAttributes[name] = location;\r\n this._webgpuProcessingContext.orderedAttributes[location] = name;\r\n\r\n const numComponents = this._webgpuProcessingContext.vertexBufferKindToNumberOfComponents[name];\r\n if (numComponents !== undefined) {\r\n // Special case for an int/ivecX vertex buffer that is used as a float/vecX attribute in the shader.\r\n const newType =\r\n numComponents < 0 ? (numComponents === -1 ? \"i32\" : \"vec\" + -numComponents + \"<i32>\") : numComponents === 1 ? \"u32\" : \"vec\" + numComponents + \"<u32>\";\r\n const newName = `_int_${name}_`;\r\n\r\n this._attributesInputWGSL.push(`@location(${location}) ${newName} : ${newType},`);\r\n this._attributesWGSL.push(`${name} : ${attributeType},`);\r\n this._attributesConversionCodeWGSL.push(`vertexInputs.${name} = ${attributeType}(vertexInputs_.${newName});`);\r\n this._hasNonFloatAttribute = true;\r\n } else {\r\n this._attributesInputWGSL.push(`@location(${location}) ${name} : ${attributeType},`);\r\n this._attributesWGSL.push(`${name} : ${attributeType},`);\r\n this._attributesConversionCodeWGSL.push(`vertexInputs.${name} = vertexInputs_.${name};`);\r\n }\r\n attribute = \"\";\r\n }\r\n return attribute;\r\n }\r\n\r\n public uniformProcessor(uniform: string, isFragment: boolean, preProcessors: { [key: string]: string }): string {\r\n const match = this.uniformRegexp.exec(uniform);\r\n if (match !== null) {\r\n const uniformType = match[2];\r\n const name = match[1];\r\n\r\n this._addUniformToLeftOverUBO(name, uniformType, preProcessors);\r\n\r\n uniform = \"\";\r\n }\r\n return uniform;\r\n }\r\n\r\n public textureProcessor(texture: string, isFragment: boolean, preProcessors: { [key: string]: string }): string {\r\n const match = this.textureRegexp.exec(texture);\r\n if (match !== null) {\r\n const name = match[1]; // name of the variable\r\n const type = match[2]; // texture_2d<f32> or array<texture_2d_array<f32>, 5> for eg\r\n const isArrayOfTexture = !!match[3];\r\n const textureFunc = match[4]; // texture_2d, texture_depth_2d, etc\r\n const isStorageTexture = textureFunc.indexOf(\"storage\") > 0;\r\n const componentType = match[6]; // f32 or i32 or u32 or undefined\r\n const storageTextureFormat = isStorageTexture ? (componentType.substring(0, componentType.indexOf(\",\")).trim() as GPUTextureFormat) : null;\r\n\r\n let arraySize = isArrayOfTexture ? this._getArraySize(name, type, preProcessors)[2] : 0;\r\n let textureInfo = this._webgpuProcessingContext.availableTextures[name];\r\n if (!textureInfo) {\r\n textureInfo = {\r\n isTextureArray: arraySize > 0,\r\n isStorageTexture,\r\n textures: [],\r\n sampleType: WebGPUConstants.TextureSampleType.Float,\r\n };\r\n arraySize = arraySize || 1;\r\n for (let i = 0; i < arraySize; ++i) {\r\n textureInfo.textures.push(this._webgpuProcessingContext.getNextFreeUBOBinding());\r\n }\r\n } else {\r\n arraySize = textureInfo.textures.length;\r\n }\r\n\r\n this._webgpuProcessingContext.availableTextures[name] = textureInfo;\r\n\r\n const isDepthTexture = textureFunc.indexOf(\"depth\") > 0;\r\n const textureDimension = gpuTextureViewDimensionByWebGPUTextureFunction[textureFunc];\r\n const sampleType = isDepthTexture\r\n ? WebGPUConstants.TextureSampleType.Depth\r\n : componentType === \"u32\"\r\n ? WebGPUConstants.TextureSampleType.Uint\r\n : componentType === \"i32\"\r\n ? WebGPUConstants.TextureSampleType.Sint\r\n : WebGPUConstants.TextureSampleType.Float;\r\n\r\n textureInfo.sampleType = sampleType;\r\n\r\n if (textureDimension === undefined) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw `Can't get the texture dimension corresponding to the texture function \"${textureFunc}\"!`;\r\n }\r\n\r\n for (let i = 0; i < arraySize; ++i) {\r\n const { groupIndex, bindingIndex } = textureInfo.textures[i];\r\n\r\n if (i === 0) {\r\n texture = `@group(${groupIndex}) @binding(${bindingIndex}) ${texture}`;\r\n }\r\n\r\n this._addTextureBindingDescription(name, textureInfo, i, textureDimension, storageTextureFormat, !isFragment);\r\n }\r\n }\r\n\r\n return texture;\r\n }\r\n\r\n // Ignore for now as we inject const for numeric defines\r\n // public postProcessor(code: string, defines: string[]) {\r\n // const defineToValue: { [key: string]: string } = {};\r\n // for (const define of defines) {\r\n // const parts = define.split(/ +/);\r\n // defineToValue[parts[1]] = parts.length > 2 ? parts[2] : \"\";\r\n // }\r\n // return code.replace(/\\$(\\w+)\\$/g, (_, p1) => {\r\n // return defineToValue[p1] ?? p1;\r\n // });\r\n // }\r\n\r\n public finalizeShaders(vertexCode: string, fragmentCode: string): { vertexCode: string; fragmentCode: string } {\r\n const fragCoordCode =\r\n fragmentCode.indexOf(\"fragmentInputs.position\") >= 0\r\n ? `\r\n if (internals.yFactor_ == 1.) {\r\n fragmentInputs.position.y = internals.textureOutputHeight_ - fragmentInputs.position.y;\r\n }\r\n `\r\n : \"\";\r\n\r\n // Add the group/binding info to the sampler declaration (var xxx: sampler|sampler_comparison)\r\n vertexCode = this._processSamplers(vertexCode, true);\r\n fragmentCode = this._processSamplers(fragmentCode, false);\r\n\r\n // Add the group/binding info to the uniform/storage buffer declarations (var<uniform> XXX:YYY or var<storage(,read_write|read)> XXX:YYY)\r\n vertexCode = this._processCustomBuffers(vertexCode, true);\r\n fragmentCode = this._processCustomBuffers(fragmentCode, false);\r\n\r\n // Builds the leftover UBOs.\r\n const leftOverUBO = this._buildLeftOverUBO();\r\n\r\n vertexCode = leftOverUBO + vertexCode;\r\n fragmentCode = leftOverUBO + fragmentCode;\r\n\r\n // Vertex code\r\n vertexCode = vertexCode.replace(/#define (\\w+)\\s+(\\d+\\.?\\d*)/g, \"const $1 = $2;\");\r\n vertexCode = vertexCode.replace(/#define /g, \"//#define \");\r\n vertexCode = this._processStridedUniformArrays(vertexCode);\r\n\r\n let vertexInputs = \"struct VertexInputs {\\n @builtin(vertex_index) vertexIndex : u32,\\n @builtin(instance_index) instanceIndex : u32,\\n\";\r\n if (this._attributesInputWGSL.length > 0) {\r\n vertexInputs += this._attributesInputWGSL.join(\"\\n\");\r\n }\r\n vertexInputs += \"\\n};\\nvar<private> vertexInputs\" + (this._hasNonFloatAttribute ? \"_\" : \"\") + \" : VertexInputs;\\n\";\r\n if (this._hasNonFloatAttribute) {\r\n vertexInputs += \"struct VertexInputs_ {\\n vertexIndex : u32, instanceIndex : u32,\\n\";\r\n vertexInputs += this._attributesWGSL.join(\"\\n\");\r\n vertexInputs += \"\\n};\\nvar<private> vertexInputs : VertexInputs_;\\n\";\r\n }\r\n\r\n let vertexOutputs = \"struct FragmentInputs {\\n @builtin(position) position : vec4<f32>,\\n\";\r\n if (this._varyingsWGSL.length > 0) {\r\n vertexOutputs += this._varyingsWGSL.join(\"\\n\");\r\n }\r\n vertexOutputs += \"\\n};\\nvar<private> vertexOutputs : FragmentInputs;\\n\";\r\n\r\n vertexCode = vertexInputs + vertexOutputs + vertexCode;\r\n\r\n let vertexMainStartingCode = `\\n vertexInputs${this._hasNonFloatAttribute ? \"_\" : \"\"} = input;\\n`;\r\n if (this._hasNonFloatAttribute) {\r\n vertexMainStartingCode += \"vertexInputs.vertexIndex = vertexInputs_.vertexIndex;\\nvertexInputs.instanceIndex = vertexInputs_.instanceIndex;\\n\";\r\n vertexMainStartingCode += this._attributesConversionCodeWGSL.join(\"\\n\");\r\n vertexMainStartingCode += \"\\n\";\r\n }\r\n const vertexMainEndingCode = ` vertexOutputs.position.y = vertexOutputs.position.y * internals.yFactor_;\\n return vertexOutputs;`;\r\n let needDiagnosticOff = vertexCode.indexOf(Constants.DISABLEUA) !== -1;\r\n\r\n vertexCode =\r\n (needDiagnosticOff ? \"diagnostic(off, derivative_uniformity);\\n\" : \"\") +\r\n InjectStartingAndEndingCode(vertexCode, \"fn main\", vertexMainStartingCode, vertexMainEndingCode);\r\n\r\n // fragment code\r\n fragmentCode = fragmentCode.replace(/#define (\\w+)\\s+(\\d+\\.?\\d*)/g, \"const $1 = $2;\");\r\n fragmentCode = fragmentCode.replace(/#define /g, \"//#define \");\r\n fragmentCode = this._processStridedUniformArrays(fragmentCode);\r\n fragmentCode = fragmentCode.replace(/dpdy/g, \"(-internals.yFactor_)*dpdy\"); // will also handle dpdyCoarse and dpdyFine\r\n\r\n let fragmentInputs = \"struct FragmentInputs {\\n @builtin(position) position : vec4<f32>,\\n @builtin(front_facing) frontFacing : bool,\\n\";\r\n if (this._varyingsWGSL.length > 0) {\r\n fragmentInputs += this._varyingsWGSL.join(\"\\n\");\r\n }\r\n fragmentInputs += \"\\n};\\nvar<private> fragmentInputs : FragmentInputs;\\n\";\r\n\r\n let fragmentOutputs = \"struct FragmentOutputs {\\n\";\r\n\r\n const regex = /const SCENE_MRT_COUNT = (\\d+);/;\r\n const match = fragmentCode.match(regex);\r\n let mrt = false;\r\n\r\n if (match) {\r\n const number = parseInt(match[1]);\r\n if (number > 0) {\r\n mrt = true;\r\n for (let index = 0; index < number; index++) {\r\n fragmentOutputs += ` @location(${index}) fragData${index} : vec4<f32>,\\n`;\r\n }\r\n }\r\n }\r\n\r\n if (!mrt) {\r\n fragmentOutputs += \" @location(0) color : vec4<f32>,\\n\";\r\n }\r\n\r\n let hasFragDepth = false;\r\n let idx = 0;\r\n while (!hasFragDepth) {\r\n idx = fragmentCode.indexOf(builtInName_frag_depth, idx);\r\n if (idx < 0) {\r\n break;\r\n }\r\n const saveIndex = idx;\r\n hasFragDepth = true;\r\n while (idx > 1 && fragmentCode.charAt(idx) !== \"\\n\") {\r\n if (fragmentCode.charAt(idx) === \"/\" && fragmentCode.charAt(idx - 1) === \"/\") {\r\n hasFragDepth = false;\r\n break;\r\n }\r\n idx--;\r\n }\r\n idx = saveIndex + builtInName_frag_depth.length;\r\n }\r\n\r\n if (hasFragDepth) {\r\n fragmentOutputs += \" @builtin(frag_depth) fragDepth: f32,\\n\";\r\n }\r\n\r\n fragmentOutputs += \"};\\nvar<private> fragmentOutputs : FragmentOutputs;\\n\";\r\n\r\n fragmentCode = fragmentInputs + fragmentOutputs + fragmentCode;\r\n\r\n const fragmentStartingCode = \" fragmentInputs = input;\\n \" + fragCoordCode;\r\n const fragmentEndingCode = \" return fragmentOutputs;\";\r\n needDiagnosticOff = fragmentCode.indexOf(Constants.DISABLEUA) !== -1;\r\n\r\n fragmentCode =\r\n (needDiagnosticOff ? \"diagnostic(off, derivative_uniformity);\\n\" : \"\") + InjectStartingAndEndingCode(fragmentCode, \"fn main\", fragmentStartingCode, fragmentEndingCode);\r\n\r\n this._collectBindingNames();\r\n this._preCreateBindGroupEntries();\r\n\r\n this._webgpuProcessingContext.vertexBufferKindToNumberOfComponents = {};\r\n\r\n return { vertexCode, fragmentCode };\r\n }\r\n\r\n protected _generateLeftOverUBOCode(name: string, uniformBufferDescription: WebGPUBufferDescription): string {\r\n let stridedArrays = \"\";\r\n let ubo = `struct ${name} {\\n`;\r\n for (const leftOverUniform of this._webgpuProcessingContext.leftOverUniforms) {\r\n const type = leftOverUniform.type.replace(/^(.*?)(<.*>)?$/, \"$1\");\r\n const size = WebGPUShaderProcessor.UniformSizes[type];\r\n\r\n if (leftOverUniform.length > 0) {\r\n if (size <= 2) {\r\n const stridedArrayType = `${name}_${this._stridedUniformArrays.length}_strided_arr`;\r\n stridedArrays += `struct ${stridedArrayType} {\r\n @size(16)\r\n el: ${type},\r\n }`;\r\n this._stridedUniformArrays.push(leftOverUniform.name);\r\n\r\n ubo += ` @align(16) ${leftOverUniform.name} : array<${stridedArrayType}, ${leftOverUniform.length}>,\\n`;\r\n } else {\r\n ubo += ` ${leftOverUniform.name} : array<${leftOverUniform.type}, ${leftOverUniform.length}>,\\n`;\r\n }\r\n } else {\r\n ubo += ` ${leftOverUniform.name} : ${leftOverUniform.type},\\n`;\r\n }\r\n }\r\n ubo += \"};\\n\";\r\n ubo = `${stridedArrays}\\n${ubo}`;\r\n ubo += `@group(${uniformBufferDescription.binding.groupIndex}) @binding(${uniformBufferDescription.binding.bindingIndex}) var<uniform> ${leftOverVarName} : ${name};\\n`;\r\n\r\n return ubo;\r\n }\r\n\r\n private _processSamplers(code: string, isVertex: boolean): string {\r\n const samplerRegexp = /var\\s+(\\w+Sampler)\\s*:\\s*(sampler|sampler_comparison)\\s*;/gm;\r\n\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n const match = samplerRegexp.exec(code);\r\n if (match === null) {\r\n break;\r\n }\r\n\r\n const name = match[1]; // name of the variable\r\n const samplerType = match[2]; // sampler or sampler_comparison\r\n const suffixLessLength = name.length - Constants.AUTOSAMPLERSUFFIX.length;\r\n const textureName = name.lastIndexOf(Constants.AUTOSAMPLERSUFFIX) === suffixLessLength ? name.substring(0, suffixLessLength) : null;\r\n const samplerBindingType = samplerType === \"sampler_comparison\" ? WebGPUConstants.SamplerBindingType.Comparison : WebGPUConstants.SamplerBindingType.Filtering;\r\n\r\n if (textureName) {\r\n const textureInfo = this._webgpuProcessingContext.availableTextures[textureName];\r\n if (textureInfo) {\r\n textureInfo.autoBindSampler = true;\r\n }\r\n }\r\n\r\n let samplerInfo = this._webgpuProcessingContext.availableSamplers[name];\r\n if (!samplerInfo) {\r\n samplerInfo = {\r\n binding: this._webgpuProcessingContext.getNextFreeUBOBinding(),\r\n type: samplerBindingType,\r\n };\r\n this._webgpuProcessingContext.availableSamplers[name] = samplerInfo;\r\n }\r\n\r\n this._addSamplerBindingDescription(name, samplerInfo, isVertex);\r\n\r\n const part1 = code.substring(0, match.index);\r\n const insertPart = `@group(${samplerInfo.binding.groupIndex}) @binding(${samplerInfo.binding.bindingIndex}) `;\r\n const part2 = code.substring(match.index);\r\n\r\n code = part1 + insertPart + part2;\r\n\r\n samplerRegexp.lastIndex += insertPart.length;\r\n }\r\n\r\n return code;\r\n }\r\n\r\n private _processCustomBuffers(code: string, isVertex: boolean): string {\r\n const instantiateBufferRegexp = /var<\\s*(uniform|storage)\\s*(,\\s*(read|read_write)\\s*)?>\\s+(\\S+)\\s*:\\s*(\\S+)\\s*;/gm;\r\n\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n const match = instantiateBufferRegexp.exec(code);\r\n if (match === null) {\r\n break;\r\n }\r\n\r\n const type = match[1];\r\n const decoration = match[3];\r\n let name = match[4];\r\n const structName = match[5];\r\n\r\n let bufferInfo = this._webgpuProcessingContext.availableBuffers[name];\r\n if (!bufferInfo) {\r\n const knownUBO = type === \"uniform\" ? WebGPUShaderProcessingContext.KnownUBOs[structName] : null;\r\n\r\n let binding;\r\n if (knownUBO) {\r\n name = structName;\r\n binding = knownUBO.binding;\r\n if (binding.groupIndex === -1) {\r\n binding = this._webgpuProcessingContext.availableBuffers[name]?.binding;\r\n if (!binding) {\r\n binding = this._webgpuProcessingContext.getNextFreeUBOBinding();\r\n }\r\n }\r\n } else {\r\n binding = this._webgpuProcessingContext.getNextFreeUBOBinding();\r\n }\r\n\r\n bufferInfo = { binding };\r\n this._webgpuProcessingContext.availableBuffers[name] = bufferInfo;\r\n }\r\n\r\n this._addBufferBindingDescription(\r\n name,\r\n this._webgpuProcessingContext.availableBuffers[name],\r\n decoration === \"read_write\"\r\n ? WebGPUConstants.BufferBindingType.Storage\r\n : type === \"storage\"\r\n ? WebGPUConstants.BufferBindingType.ReadOnlyStorage\r\n : WebGPUConstants.BufferBindingType.Uniform,\r\n isVertex\r\n );\r\n\r\n const groupIndex = bufferInfo.binding.groupIndex;\r\n const bindingIndex = bufferInfo.binding.bindingIndex;\r\n\r\n const part1 = code.substring(0, match.index);\r\n const insertPart = `@group(${groupIndex}) @binding(${bindingIndex}) `;\r\n const part2 = code.substring(match.index);\r\n\r\n code = part1 + insertPart + part2;\r\n\r\n instantiateBufferRegexp.lastIndex += insertPart.length;\r\n }\r\n\r\n return code;\r\n }\r\n\r\n private _processStridedUniformArrays(code: string): string {\r\n for (const uniformArrayName of this._stridedUniformArrays) {\r\n code = code.replace(new RegExp(`${uniformArrayName}\\\\s*\\\\[(.*?)\\\\]`, \"g\"), `${uniformArrayName}[$1].el`);\r\n }\r\n return code;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webgpuShaderProcessorsWGSL.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuShaderProcessorsWGSL.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\n/* eslint-disable babylonjs/available */\r\n/* eslint-disable jsdoc/require-jsdoc */\r\nimport type { Nullable } from \"../../types\";\r\nimport type { ShaderProcessingContext } from \"../Processors/shaderProcessingOptions\";\r\nimport type { WebGPUBufferDescription } from \"./webgpuShaderProcessingContext\";\r\nimport { WebGPUShaderProcessingContext } from \"./webgpuShaderProcessingContext\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { WebGPUShaderProcessor } from \"./webgpuShaderProcessor\";\r\nimport { RemoveComments, InjectStartingAndEndingCode } from \"../../Misc/codeStringParsingTools\";\r\nimport { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\n\r\nimport { Constants } from \"../constants\";\r\n\r\nimport \"../../ShadersWGSL/ShadersInclude/bonesDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bonesVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bakedVertexAnimationDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bakedVertexAnimation\";\r\nimport \"../../ShadersWGSL/ShadersInclude/clipPlaneFragment\";\r\nimport \"../../ShadersWGSL/ShadersInclude/clipPlaneFragmentDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/clipPlaneVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/clipPlaneVertexDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/instancesDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/instancesVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/helperFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/fresnelFunction\";\r\nimport \"../../ShadersWGSL/ShadersInclude/meshUboDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/morphTargetsVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/morphTargetsVertexDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/morphTargetsVertexGlobal\";\r\nimport \"../../ShadersWGSL/ShadersInclude/morphTargetsVertexGlobalDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/sceneUboDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/lightsFragmentFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/lightFragment\";\r\nimport \"../../ShadersWGSL/ShadersInclude/lightUboDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/lightVxUboDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/shadowsFragmentFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/shadowsVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/fogFragmentDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bumpFragment\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bumpFragmentFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/samplerFragmentDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/imageProcessingDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/imageProcessingFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/reflectionFunction\";\r\nimport \"../../ShadersWGSL/ShadersInclude/shadowMapVertexMetric\";\r\nimport \"../../ShadersWGSL/ShadersInclude/packingFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/shadowMapFragment\";\r\nimport \"../../ShadersWGSL/ShadersInclude/decalFragment\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockClearcoat\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockIridescence\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockReflection\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockSheen\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockSubSurface\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBRDFFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockDirectLighting\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/depthPrePass\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockFinalColorComposition\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockGeometryInfo\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockImageProcessing\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockLightmapInit\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockNormalFinal\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockReflectance\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockReflectance0\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrDebug\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrDirectLightingFalloffFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/hdrFilteringFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/importanceSampling\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrHelperFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrIBLFunctions\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockAlbedoOpacity\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockReflectivity\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockAmbientOcclusion\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockAlphaFresnel\";\r\nimport \"../../ShadersWGSL/ShadersInclude/pbrBlockAnisotropic\";\r\nimport \"../../ShadersWGSL/ShadersInclude/harmonicsFunctions\";\r\nimport \"../../ShadersWGSL/particles.vertex\";\r\n\r\nconst builtInName_frag_depth = \"fragmentOutputs.fragDepth\";\r\n\r\nconst leftOverVarName = \"uniforms\";\r\nconst internalsVarName = \"internals\";\r\n\r\nconst gpuTextureViewDimensionByWebGPUTextureFunction: { [key: string]: Nullable<GPUTextureViewDimension> } = {\r\n texture_1d: WebGPUConstants.TextureViewDimension.E1d,\r\n texture_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_2d_array: WebGPUConstants.TextureViewDimension.E2dArray,\r\n texture_3d: WebGPUConstants.TextureViewDimension.E3d,\r\n texture_cube: WebGPUConstants.TextureViewDimension.Cube,\r\n texture_cube_array: WebGPUConstants.TextureViewDimension.CubeArray,\r\n texture_multisampled_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_depth_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_depth_2d_array: WebGPUConstants.TextureViewDimension.E2dArray,\r\n texture_depth_cube: WebGPUConstants.TextureViewDimension.Cube,\r\n texture_depth_cube_array: WebGPUConstants.TextureViewDimension.CubeArray,\r\n texture_depth_multisampled_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_storage_1d: WebGPUConstants.TextureViewDimension.E1d,\r\n texture_storage_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_storage_2d_array: WebGPUConstants.TextureViewDimension.E2dArray,\r\n texture_storage_3d: WebGPUConstants.TextureViewDimension.E3d,\r\n texture_external: null,\r\n};\r\n\r\n/** @internal */\r\nexport class WebGPUShaderProcessorWGSL extends WebGPUShaderProcessor {\r\n protected _attributesInputWGSL: string[];\r\n protected _attributesWGSL: string[];\r\n protected _attributesConversionCodeWGSL: string[];\r\n protected _hasNonFloatAttribute: boolean;\r\n protected _varyingsWGSL: string[];\r\n protected _varyingNamesWGSL: string[];\r\n protected _stridedUniformArrays: string[];\r\n\r\n public override shaderLanguage = ShaderLanguage.WGSL;\r\n public uniformRegexp = /uniform\\s+(\\w+)\\s*:\\s*(.+)\\s*;/;\r\n public textureRegexp = /var\\s+(\\w+)\\s*:\\s*((array<\\s*)?(texture_\\w+)\\s*(<\\s*(.+)\\s*>)?\\s*(,\\s*\\w+\\s*>\\s*)?);/;\r\n public noPrecision = true;\r\n\r\n public preProcessor(code: string, defines: string[], preProcessors: { [key: string]: string }, isFragment: boolean, processingContext: Nullable<ShaderProcessingContext>) {\r\n // Convert defines into const\r\n for (const key in preProcessors) {\r\n if (key === \"__VERSION__\") {\r\n continue;\r\n }\r\n const value = preProcessors[key];\r\n if (!isNaN(parseInt(value)) || !isNaN(parseFloat(value))) {\r\n code = `const ${key} = ${value};\\n` + code;\r\n }\r\n }\r\n\r\n return code;\r\n }\r\n\r\n protected _getArraySize(name: string, uniformType: string, preProcessors: { [key: string]: string }): [string, string, number] {\r\n let length = 0;\r\n\r\n const endArray = uniformType.lastIndexOf(\">\");\r\n if (uniformType.indexOf(\"array\") >= 0 && endArray > 0) {\r\n let startArray = endArray;\r\n while (startArray > 0 && uniformType.charAt(startArray) !== \" \" && uniformType.charAt(startArray) !== \",\") {\r\n startArray--;\r\n }\r\n const lengthInString = uniformType.substring(startArray + 1, endArray);\r\n length = +lengthInString;\r\n if (isNaN(length)) {\r\n length = +preProcessors[lengthInString.trim()];\r\n }\r\n while (startArray > 0 && (uniformType.charAt(startArray) === \" \" || uniformType.charAt(startArray) === \",\")) {\r\n startArray--;\r\n }\r\n uniformType = uniformType.substring(uniformType.indexOf(\"<\") + 1, startArray + 1);\r\n }\r\n\r\n return [name, uniformType, length];\r\n }\r\n\r\n public initializeShaders(processingContext: Nullable<ShaderProcessingContext>): void {\r\n this._webgpuProcessingContext = processingContext as WebGPUShaderProcessingContext;\r\n\r\n this._attributesInputWGSL = [];\r\n this._attributesWGSL = [];\r\n this._attributesConversionCodeWGSL = [];\r\n this._hasNonFloatAttribute = false;\r\n this._varyingsWGSL = [];\r\n this._varyingNamesWGSL = [];\r\n this._stridedUniformArrays = [];\r\n }\r\n\r\n public preProcessShaderCode(code: string): string {\r\n // Same check as in webgpuShaderProcessorsGLSL to avoid same ubDelcaration to be injected twice.\r\n const ubDeclaration = `struct ${WebGPUShaderProcessor.InternalsUBOName} {\\n yFactor_: f32,\\n textureOutputHeight_: f32,\\n};\\nvar<uniform> ${internalsVarName} : ${WebGPUShaderProcessor.InternalsUBOName};\\n`;\r\n const alreadyInjected = code.indexOf(ubDeclaration) !== -1;\r\n return alreadyInjected ? code : ubDeclaration + RemoveComments(code);\r\n }\r\n\r\n public varyingCheck(varying: string, isFragment: boolean): boolean {\r\n const regex = /(flat|linear|perspective)?\\s*(center|centroid|sample)?\\s*\\bvarying\\b/;\r\n\r\n return regex.test(varying);\r\n }\r\n\r\n public varyingProcessor(varying: string, isFragment: boolean, preProcessors: { [key: string]: string }) {\r\n const varyingRegex = /\\s*(flat|linear|perspective)?\\s*(center|centroid|sample)?\\s*varying\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s*:\\s*(.+)\\s*;/gm;\r\n const match = varyingRegex.exec(varying);\r\n if (match !== null) {\r\n const interpolationType = match[1] ?? \"perspective\";\r\n const interpolationSampling = match[2] ?? \"center\";\r\n const varyingType = match[4];\r\n const name = match[3];\r\n const interpolation = interpolationType === \"flat\" ? `@interpolate(${interpolationType})` : `@interpolate(${interpolationType}, ${interpolationSampling})`;\r\n let location: number;\r\n if (isFragment) {\r\n location = this._webgpuProcessingContext.availableVaryings[name];\r\n if (location === undefined) {\r\n Logger.Warn(`Invalid fragment shader: The varying named \"${name}\" is not declared in the vertex shader! This declaration will be ignored.`);\r\n }\r\n } else {\r\n location = this._webgpuProcessingContext.getVaryingNextLocation(varyingType, this._getArraySize(name, varyingType, preProcessors)[2]);\r\n this._webgpuProcessingContext.availableVaryings[name] = location;\r\n this._varyingsWGSL.push(` @location(${location}) ${interpolation} ${name} : ${varyingType},`);\r\n this._varyingNamesWGSL.push(name);\r\n }\r\n\r\n varying = \"\";\r\n }\r\n return varying;\r\n }\r\n\r\n public attributeProcessor(attribute: string, preProcessors: { [key: string]: string }) {\r\n const attribRegex = /\\s*attribute\\s+(\\S+)\\s*:\\s*(.+)\\s*;/gm;\r\n const match = attribRegex.exec(attribute);\r\n if (match !== null) {\r\n const attributeType = match[2];\r\n const name = match[1];\r\n const location = this._webgpuProcessingContext.getAttributeNextLocation(attributeType, this._getArraySize(name, attributeType, preProcessors)[2]);\r\n\r\n this._webgpuProcessingContext.availableAttributes[name] = location;\r\n this._webgpuProcessingContext.orderedAttributes[location] = name;\r\n\r\n const numComponents = this._webgpuProcessingContext.vertexBufferKindToNumberOfComponents[name];\r\n if (numComponents !== undefined) {\r\n // Special case for an int/ivecX vertex buffer that is used as a float/vecX attribute in the shader.\r\n const newType =\r\n numComponents < 0 ? (numComponents === -1 ? \"i32\" : \"vec\" + -numComponents + \"<i32>\") : numComponents === 1 ? \"u32\" : \"vec\" + numComponents + \"<u32>\";\r\n const newName = `_int_${name}_`;\r\n\r\n this._attributesInputWGSL.push(`@location(${location}) ${newName} : ${newType},`);\r\n this._attributesWGSL.push(`${name} : ${attributeType},`);\r\n this._attributesConversionCodeWGSL.push(`vertexInputs.${name} = ${attributeType}(vertexInputs_.${newName});`);\r\n this._hasNonFloatAttribute = true;\r\n } else {\r\n this._attributesInputWGSL.push(`@location(${location}) ${name} : ${attributeType},`);\r\n this._attributesWGSL.push(`${name} : ${attributeType},`);\r\n this._attributesConversionCodeWGSL.push(`vertexInputs.${name} = vertexInputs_.${name};`);\r\n }\r\n attribute = \"\";\r\n }\r\n return attribute;\r\n }\r\n\r\n public uniformProcessor(uniform: string, isFragment: boolean, preProcessors: { [key: string]: string }): string {\r\n const match = this.uniformRegexp.exec(uniform);\r\n if (match !== null) {\r\n const uniformType = match[2];\r\n const name = match[1];\r\n\r\n this._addUniformToLeftOverUBO(name, uniformType, preProcessors);\r\n\r\n uniform = \"\";\r\n }\r\n return uniform;\r\n }\r\n\r\n public textureProcessor(texture: string, isFragment: boolean, preProcessors: { [key: string]: string }): string {\r\n const match = this.textureRegexp.exec(texture);\r\n if (match !== null) {\r\n const name = match[1]; // name of the variable\r\n const type = match[2]; // texture_2d<f32> or array<texture_2d_array<f32>, 5> for eg\r\n const isArrayOfTexture = !!match[3];\r\n const textureFunc = match[4]; // texture_2d, texture_depth_2d, etc\r\n const isStorageTexture = textureFunc.indexOf(\"storage\") > 0;\r\n const componentType = match[6]; // f32 or i32 or u32 or undefined\r\n const storageTextureFormat = isStorageTexture ? (componentType.substring(0, componentType.indexOf(\",\")).trim() as GPUTextureFormat) : null;\r\n\r\n let arraySize = isArrayOfTexture ? this._getArraySize(name, type, preProcessors)[2] : 0;\r\n let textureInfo = this._webgpuProcessingContext.availableTextures[name];\r\n if (!textureInfo) {\r\n textureInfo = {\r\n isTextureArray: arraySize > 0,\r\n isStorageTexture,\r\n textures: [],\r\n sampleType: WebGPUConstants.TextureSampleType.Float,\r\n };\r\n arraySize = arraySize || 1;\r\n for (let i = 0; i < arraySize; ++i) {\r\n textureInfo.textures.push(this._webgpuProcessingContext.getNextFreeUBOBinding());\r\n }\r\n } else {\r\n arraySize = textureInfo.textures.length;\r\n }\r\n\r\n this._webgpuProcessingContext.availableTextures[name] = textureInfo;\r\n\r\n const isDepthTexture = textureFunc.indexOf(\"depth\") > 0;\r\n const textureDimension = gpuTextureViewDimensionByWebGPUTextureFunction[textureFunc];\r\n const sampleType = isDepthTexture\r\n ? WebGPUConstants.TextureSampleType.Depth\r\n : componentType === \"u32\"\r\n ? WebGPUConstants.TextureSampleType.Uint\r\n : componentType === \"i32\"\r\n ? WebGPUConstants.TextureSampleType.Sint\r\n : WebGPUConstants.TextureSampleType.Float;\r\n\r\n textureInfo.sampleType = sampleType;\r\n\r\n if (textureDimension === undefined) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw `Can't get the texture dimension corresponding to the texture function \"${textureFunc}\"!`;\r\n }\r\n\r\n for (let i = 0; i < arraySize; ++i) {\r\n const { groupIndex, bindingIndex } = textureInfo.textures[i];\r\n\r\n if (i === 0) {\r\n texture = `@group(${groupIndex}) @binding(${bindingIndex}) ${texture}`;\r\n }\r\n\r\n this._addTextureBindingDescription(name, textureInfo, i, textureDimension, storageTextureFormat, !isFragment);\r\n }\r\n }\r\n\r\n return texture;\r\n }\r\n\r\n // Ignore for now as we inject const for numeric defines\r\n // public postProcessor(code: string, defines: string[]) {\r\n // const defineToValue: { [key: string]: string } = {};\r\n // for (const define of defines) {\r\n // const parts = define.split(/ +/);\r\n // defineToValue[parts[1]] = parts.length > 2 ? parts[2] : \"\";\r\n // }\r\n // return code.replace(/\\$(\\w+)\\$/g, (_, p1) => {\r\n // return defineToValue[p1] ?? p1;\r\n // });\r\n // }\r\n\r\n public finalizeShaders(vertexCode: string, fragmentCode: string): { vertexCode: string; fragmentCode: string } {\r\n const fragCoordCode =\r\n fragmentCode.indexOf(\"fragmentInputs.position\") >= 0\r\n ? `\r\n if (internals.yFactor_ == 1.) {\r\n fragmentInputs.position.y = internals.textureOutputHeight_ - fragmentInputs.position.y;\r\n }\r\n `\r\n : \"\";\r\n\r\n // Add the group/binding info to the sampler declaration (var xxx: sampler|sampler_comparison)\r\n vertexCode = this._processSamplers(vertexCode, true);\r\n fragmentCode = this._processSamplers(fragmentCode, false);\r\n\r\n // Add the group/binding info to the uniform/storage buffer declarations (var<uniform> XXX:YYY or var<storage(,read_write|read)> XXX:YYY)\r\n vertexCode = this._processCustomBuffers(vertexCode, true);\r\n fragmentCode = this._processCustomBuffers(fragmentCode, false);\r\n\r\n // Builds the leftover UBOs.\r\n const leftOverUBO = this._buildLeftOverUBO();\r\n\r\n vertexCode = leftOverUBO + vertexCode;\r\n fragmentCode = leftOverUBO + fragmentCode;\r\n\r\n // Vertex code\r\n vertexCode = vertexCode.replace(/#define (\\w+)\\s+(\\d+\\.?\\d*)/g, \"const $1 = $2;\");\r\n vertexCode = vertexCode.replace(/#define /g, \"//#define \");\r\n vertexCode = this._processStridedUniformArrays(vertexCode);\r\n\r\n let vertexInputs = \"struct VertexInputs {\\n @builtin(vertex_index) vertexIndex : u32,\\n @builtin(instance_index) instanceIndex : u32,\\n\";\r\n if (this._attributesInputWGSL.length > 0) {\r\n vertexInputs += this._attributesInputWGSL.join(\"\\n\");\r\n }\r\n vertexInputs += \"\\n};\\nvar<private> vertexInputs\" + (this._hasNonFloatAttribute ? \"_\" : \"\") + \" : VertexInputs;\\n\";\r\n if (this._hasNonFloatAttribute) {\r\n vertexInputs += \"struct VertexInputs_ {\\n vertexIndex : u32, instanceIndex : u32,\\n\";\r\n vertexInputs += this._attributesWGSL.join(\"\\n\");\r\n vertexInputs += \"\\n};\\nvar<private> vertexInputs : VertexInputs_;\\n\";\r\n }\r\n\r\n let vertexOutputs = \"struct FragmentInputs {\\n @builtin(position) position : vec4<f32>,\\n\";\r\n if (this._varyingsWGSL.length > 0) {\r\n vertexOutputs += this._varyingsWGSL.join(\"\\n\");\r\n }\r\n vertexOutputs += \"\\n};\\nvar<private> vertexOutputs : FragmentInputs;\\n\";\r\n\r\n vertexCode = vertexInputs + vertexOutputs + vertexCode;\r\n\r\n let vertexMainStartingCode = `\\n vertexInputs${this._hasNonFloatAttribute ? \"_\" : \"\"} = input;\\n`;\r\n if (this._hasNonFloatAttribute) {\r\n vertexMainStartingCode += \"vertexInputs.vertexIndex = vertexInputs_.vertexIndex;\\nvertexInputs.instanceIndex = vertexInputs_.instanceIndex;\\n\";\r\n vertexMainStartingCode += this._attributesConversionCodeWGSL.join(\"\\n\");\r\n vertexMainStartingCode += \"\\n\";\r\n }\r\n const vertexMainEndingCode = ` vertexOutputs.position.y = vertexOutputs.position.y * internals.yFactor_;\\n return vertexOutputs;`;\r\n let needDiagnosticOff = vertexCode.indexOf(Constants.DISABLEUA) !== -1;\r\n\r\n vertexCode =\r\n (needDiagnosticOff ? \"diagnostic(off, derivative_uniformity);\\n\" : \"\") +\r\n InjectStartingAndEndingCode(vertexCode, \"fn main\", vertexMainStartingCode, vertexMainEndingCode);\r\n\r\n // fragment code\r\n fragmentCode = fragmentCode.replace(/#define (\\w+)\\s+(\\d+\\.?\\d*)/g, \"const $1 = $2;\");\r\n fragmentCode = fragmentCode.replace(/#define /g, \"//#define \");\r\n fragmentCode = this._processStridedUniformArrays(fragmentCode);\r\n fragmentCode = fragmentCode.replace(/dpdy/g, \"(-internals.yFactor_)*dpdy\"); // will also handle dpdyCoarse and dpdyFine\r\n\r\n let fragmentInputs = \"struct FragmentInputs {\\n @builtin(position) position : vec4<f32>,\\n @builtin(front_facing) frontFacing : bool,\\n\";\r\n if (this._varyingsWGSL.length > 0) {\r\n fragmentInputs += this._varyingsWGSL.join(\"\\n\");\r\n }\r\n fragmentInputs += \"\\n};\\nvar<private> fragmentInputs : FragmentInputs;\\n\";\r\n\r\n let fragmentOutputs = \"struct FragmentOutputs {\\n\";\r\n\r\n const regex = /const SCENE_MRT_COUNT = (\\d+);/;\r\n const match = fragmentCode.match(regex);\r\n let mrt = false;\r\n\r\n if (match) {\r\n const number = parseInt(match[1]);\r\n if (number > 0) {\r\n mrt = true;\r\n for (let index = 0; index < number; index++) {\r\n fragmentOutputs += ` @location(${index}) fragData${index} : vec4<f32>,\\n`;\r\n }\r\n }\r\n }\r\n\r\n if (!mrt) {\r\n fragmentOutputs += \" @location(0) color : vec4<f32>,\\n\";\r\n }\r\n\r\n let hasFragDepth = false;\r\n let idx = 0;\r\n while (!hasFragDepth) {\r\n idx = fragmentCode.indexOf(builtInName_frag_depth, idx);\r\n if (idx < 0) {\r\n break;\r\n }\r\n const saveIndex = idx;\r\n hasFragDepth = true;\r\n while (idx > 1 && fragmentCode.charAt(idx) !== \"\\n\") {\r\n if (fragmentCode.charAt(idx) === \"/\" && fragmentCode.charAt(idx - 1) === \"/\") {\r\n hasFragDepth = false;\r\n break;\r\n }\r\n idx--;\r\n }\r\n idx = saveIndex + builtInName_frag_depth.length;\r\n }\r\n\r\n if (hasFragDepth) {\r\n fragmentOutputs += \" @builtin(frag_depth) fragDepth: f32,\\n\";\r\n }\r\n\r\n fragmentOutputs += \"};\\nvar<private> fragmentOutputs : FragmentOutputs;\\n\";\r\n\r\n fragmentCode = fragmentInputs + fragmentOutputs + fragmentCode;\r\n\r\n const fragmentStartingCode = \" fragmentInputs = input;\\n \" + fragCoordCode;\r\n const fragmentEndingCode = \" return fragmentOutputs;\";\r\n needDiagnosticOff = fragmentCode.indexOf(Constants.DISABLEUA) !== -1;\r\n\r\n fragmentCode =\r\n (needDiagnosticOff ? \"diagnostic(off, derivative_uniformity);\\n\" : \"\") + InjectStartingAndEndingCode(fragmentCode, \"fn main\", fragmentStartingCode, fragmentEndingCode);\r\n\r\n this._collectBindingNames();\r\n this._preCreateBindGroupEntries();\r\n\r\n this._webgpuProcessingContext.vertexBufferKindToNumberOfComponents = {};\r\n\r\n return { vertexCode, fragmentCode };\r\n }\r\n\r\n protected _generateLeftOverUBOCode(name: string, uniformBufferDescription: WebGPUBufferDescription): string {\r\n let stridedArrays = \"\";\r\n let ubo = `struct ${name} {\\n`;\r\n for (const leftOverUniform of this._webgpuProcessingContext.leftOverUniforms) {\r\n const type = leftOverUniform.type.replace(/^(.*?)(<.*>)?$/, \"$1\");\r\n const size = WebGPUShaderProcessor.UniformSizes[type];\r\n\r\n if (leftOverUniform.length > 0) {\r\n if (size <= 2) {\r\n const stridedArrayType = `${name}_${this._stridedUniformArrays.length}_strided_arr`;\r\n stridedArrays += `struct ${stridedArrayType} {\r\n @size(16)\r\n el: ${type},\r\n }`;\r\n this._stridedUniformArrays.push(leftOverUniform.name);\r\n\r\n ubo += ` @align(16) ${leftOverUniform.name} : array<${stridedArrayType}, ${leftOverUniform.length}>,\\n`;\r\n } else {\r\n ubo += ` ${leftOverUniform.name} : array<${leftOverUniform.type}, ${leftOverUniform.length}>,\\n`;\r\n }\r\n } else {\r\n ubo += ` ${leftOverUniform.name} : ${leftOverUniform.type},\\n`;\r\n }\r\n }\r\n ubo += \"};\\n\";\r\n ubo = `${stridedArrays}\\n${ubo}`;\r\n ubo += `@group(${uniformBufferDescription.binding.groupIndex}) @binding(${uniformBufferDescription.binding.bindingIndex}) var<uniform> ${leftOverVarName} : ${name};\\n`;\r\n\r\n return ubo;\r\n }\r\n\r\n private _processSamplers(code: string, isVertex: boolean): string {\r\n const samplerRegexp = /var\\s+(\\w+Sampler)\\s*:\\s*(sampler|sampler_comparison)\\s*;/gm;\r\n\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n const match = samplerRegexp.exec(code);\r\n if (match === null) {\r\n break;\r\n }\r\n\r\n const name = match[1]; // name of the variable\r\n const samplerType = match[2]; // sampler or sampler_comparison\r\n const suffixLessLength = name.length - Constants.AUTOSAMPLERSUFFIX.length;\r\n const textureName = name.lastIndexOf(Constants.AUTOSAMPLERSUFFIX) === suffixLessLength ? name.substring(0, suffixLessLength) : null;\r\n const samplerBindingType = samplerType === \"sampler_comparison\" ? WebGPUConstants.SamplerBindingType.Comparison : WebGPUConstants.SamplerBindingType.Filtering;\r\n\r\n if (textureName) {\r\n const textureInfo = this._webgpuProcessingContext.availableTextures[textureName];\r\n if (textureInfo) {\r\n textureInfo.autoBindSampler = true;\r\n }\r\n }\r\n\r\n let samplerInfo = this._webgpuProcessingContext.availableSamplers[name];\r\n if (!samplerInfo) {\r\n samplerInfo = {\r\n binding: this._webgpuProcessingContext.getNextFreeUBOBinding(),\r\n type: samplerBindingType,\r\n };\r\n this._webgpuProcessingContext.availableSamplers[name] = samplerInfo;\r\n }\r\n\r\n this._addSamplerBindingDescription(name, samplerInfo, isVertex);\r\n\r\n const part1 = code.substring(0, match.index);\r\n const insertPart = `@group(${samplerInfo.binding.groupIndex}) @binding(${samplerInfo.binding.bindingIndex}) `;\r\n const part2 = code.substring(match.index);\r\n\r\n code = part1 + insertPart + part2;\r\n\r\n samplerRegexp.lastIndex += insertPart.length;\r\n }\r\n\r\n return code;\r\n }\r\n\r\n private _processCustomBuffers(code: string, isVertex: boolean): string {\r\n const instantiateBufferRegexp = /var<\\s*(uniform|storage)\\s*(,\\s*(read|read_write)\\s*)?>\\s+(\\S+)\\s*:\\s*(\\S+)\\s*;/gm;\r\n\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n const match = instantiateBufferRegexp.exec(code);\r\n if (match === null) {\r\n break;\r\n }\r\n\r\n const type = match[1];\r\n const decoration = match[3];\r\n let name = match[4];\r\n const structName = match[5];\r\n\r\n let bufferInfo = this._webgpuProcessingContext.availableBuffers[name];\r\n if (!bufferInfo) {\r\n const knownUBO = type === \"uniform\" ? WebGPUShaderProcessingContext.KnownUBOs[structName] : null;\r\n\r\n let binding;\r\n if (knownUBO) {\r\n name = structName;\r\n binding = knownUBO.binding;\r\n if (binding.groupIndex === -1) {\r\n binding = this._webgpuProcessingContext.availableBuffers[name]?.binding;\r\n if (!binding) {\r\n binding = this._webgpuProcessingContext.getNextFreeUBOBinding();\r\n }\r\n }\r\n } else {\r\n binding = this._webgpuProcessingContext.getNextFreeUBOBinding();\r\n }\r\n\r\n bufferInfo = { binding };\r\n this._webgpuProcessingContext.availableBuffers[name] = bufferInfo;\r\n }\r\n\r\n this._addBufferBindingDescription(\r\n name,\r\n this._webgpuProcessingContext.availableBuffers[name],\r\n decoration === \"read_write\"\r\n ? WebGPUConstants.BufferBindingType.Storage\r\n : type === \"storage\"\r\n ? WebGPUConstants.BufferBindingType.ReadOnlyStorage\r\n : WebGPUConstants.BufferBindingType.Uniform,\r\n isVertex\r\n );\r\n\r\n const groupIndex = bufferInfo.binding.groupIndex;\r\n const bindingIndex = bufferInfo.binding.bindingIndex;\r\n\r\n const part1 = code.substring(0, match.index);\r\n const insertPart = `@group(${groupIndex}) @binding(${bindingIndex}) `;\r\n const part2 = code.substring(match.index);\r\n\r\n code = part1 + insertPart + part2;\r\n\r\n instantiateBufferRegexp.lastIndex += insertPart.length;\r\n }\r\n\r\n return code;\r\n }\r\n\r\n private _processStridedUniformArrays(code: string): string {\r\n for (const uniformArrayName of this._stridedUniformArrays) {\r\n code = code.replace(new RegExp(`${uniformArrayName}\\\\s*\\\\[(.*?)\\\\]`, \"g\"), `${uniformArrayName}[$1].el`);\r\n }\r\n return code;\r\n }\r\n}\r\n"]}
@@ -745,13 +745,13 @@ export class AbstractEngine {
745
745
  */
746
746
  // Not mixed with Version for tooling purpose.
747
747
  static get NpmPackage() {
748
- return "babylonjs@7.16.0";
748
+ return "babylonjs@7.16.1";
749
749
  }
750
750
  /**
751
751
  * Returns the current version of the framework
752
752
  */
753
753
  static get Version() {
754
- return "7.16.0";
754
+ return "7.16.1";
755
755
  }
756
756
  /**
757
757
  * Gets the HTML canvas attached with the current webGL context