@onerjs/core 8.48.4 → 8.48.5

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 (116) hide show
  1. package/Cameras/Inputs/geospatialCameraPointersInput.js +10 -8
  2. package/Cameras/Inputs/geospatialCameraPointersInput.js.map +1 -1
  3. package/Cameras/geospatialCameraMovement.js +2 -2
  4. package/Cameras/geospatialCameraMovement.js.map +1 -1
  5. package/FrameGraph/Node/Blocks/Rendering/iblShadowsRendererBlock.d.ts +105 -0
  6. package/FrameGraph/Node/Blocks/Rendering/iblShadowsRendererBlock.js +318 -0
  7. package/FrameGraph/Node/Blocks/Rendering/iblShadowsRendererBlock.js.map +1 -0
  8. package/FrameGraph/Node/Blocks/index.d.ts +1 -0
  9. package/FrameGraph/Node/Blocks/index.js +1 -0
  10. package/FrameGraph/Node/Blocks/index.js.map +1 -1
  11. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.d.ts +34 -0
  12. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.js +144 -0
  13. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.js.map +1 -0
  14. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.d.ts +26 -0
  15. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.js +82 -0
  16. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.js.map +1 -0
  17. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.d.ts +61 -0
  18. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.js +207 -0
  19. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.js.map +1 -0
  20. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.d.ts +104 -0
  21. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.js +218 -0
  22. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.js.map +1 -0
  23. package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.d.ts +217 -0
  24. package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.js +640 -0
  25. package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.js.map +1 -0
  26. package/FrameGraph/frameGraph.js +1 -0
  27. package/FrameGraph/frameGraph.js.map +1 -1
  28. package/FrameGraph/index.d.ts +1 -0
  29. package/FrameGraph/index.js +1 -0
  30. package/FrameGraph/index.js.map +1 -1
  31. package/Materials/PBR/openpbrMaterial.d.ts +13 -2
  32. package/Materials/PBR/openpbrMaterial.js +47 -16
  33. package/Materials/PBR/openpbrMaterial.js.map +1 -1
  34. package/Materials/PBR/pbrBRDFConfiguration.js +1 -1
  35. package/Materials/PBR/pbrBRDFConfiguration.js.map +1 -1
  36. package/Materials/Textures/Filtering/hdrFiltering.js +6 -0
  37. package/Materials/Textures/Filtering/hdrFiltering.js.map +1 -1
  38. package/Materials/Textures/envCubeTexture.js +13 -13
  39. package/Materials/Textures/envCubeTexture.js.map +1 -1
  40. package/Materials/materialHelper.functions.js +1 -1
  41. package/Materials/materialHelper.functions.js.map +1 -1
  42. package/Misc/textureTools.d.ts +3 -1
  43. package/Misc/textureTools.js +74 -13
  44. package/Misc/textureTools.js.map +1 -1
  45. package/Particles/baseParticleSystem.d.ts +33 -1
  46. package/Particles/baseParticleSystem.js +65 -0
  47. package/Particles/baseParticleSystem.js.map +1 -1
  48. package/Particles/computeShaderParticleSystem.js +6 -0
  49. package/Particles/computeShaderParticleSystem.js.map +1 -1
  50. package/Particles/gpuParticleSystem.d.ts +24 -6
  51. package/Particles/gpuParticleSystem.js +85 -36
  52. package/Particles/gpuParticleSystem.js.map +1 -1
  53. package/Particles/particleSystem.d.ts +0 -7
  54. package/Particles/particleSystem.js +3 -15
  55. package/Particles/particleSystem.js.map +1 -1
  56. package/Particles/thinParticleSystem.d.ts +1 -3
  57. package/Particles/thinParticleSystem.js +1 -27
  58. package/Particles/thinParticleSystem.js.map +1 -1
  59. package/Particles/webgl2ParticleSystem.js +7 -0
  60. package/Particles/webgl2ParticleSystem.js.map +1 -1
  61. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +1 -1
  62. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -1
  63. package/Rendering/IBLShadows/iblShadowsPluginMaterial.d.ts +3 -1
  64. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js +11 -1
  65. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js.map +1 -1
  66. package/Rendering/IBLShadows/iblShadowsRenderPipeline.d.ts +0 -19
  67. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +21 -65
  68. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  69. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.d.ts +15 -52
  70. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +129 -220
  71. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  72. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +3 -0
  73. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
  74. package/Rendering/geometryBufferRenderer.d.ts +14 -5
  75. package/Rendering/geometryBufferRenderer.js +6 -2
  76. package/Rendering/geometryBufferRenderer.js.map +1 -1
  77. package/Rendering/geometryBufferRendererSceneComponent.d.ts +4 -6
  78. package/Rendering/geometryBufferRendererSceneComponent.js.map +1 -1
  79. package/Rendering/iblCdfGenerator.d.ts +10 -0
  80. package/Rendering/iblCdfGenerator.js +52 -17
  81. package/Rendering/iblCdfGenerator.js.map +1 -1
  82. package/Rendering/index.d.ts +0 -6
  83. package/Rendering/index.js +0 -6
  84. package/Rendering/index.js.map +1 -1
  85. package/Shaders/ShadersInclude/openpbrDirectLighting.js +6 -1
  86. package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  87. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js +1 -1
  88. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  89. package/Shaders/gpuUpdateParticles.vertex.js +12 -6
  90. package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
  91. package/Shaders/iblShadowVoxelTracing.fragment.js +5 -1
  92. package/Shaders/iblShadowVoxelTracing.fragment.js.map +1 -1
  93. package/Shaders/iblVoxelGrid.fragment.d.ts +1 -0
  94. package/Shaders/iblVoxelGrid.fragment.js +33 -5
  95. package/Shaders/iblVoxelGrid.fragment.js.map +1 -1
  96. package/Shaders/lod3D.fragment.d.ts +5 -0
  97. package/Shaders/lod3D.fragment.js +13 -0
  98. package/Shaders/lod3D.fragment.js.map +1 -0
  99. package/Shaders/openpbr.fragment.js +5 -0
  100. package/Shaders/openpbr.fragment.js.map +1 -1
  101. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +6 -1
  102. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  103. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js +1 -1
  104. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  105. package/ShadersWGSL/gpuUpdateParticles.compute.js +14 -7
  106. package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
  107. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js +5 -1
  108. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js.map +1 -1
  109. package/ShadersWGSL/iblVoxelGrid.fragment.js +1 -1
  110. package/ShadersWGSL/iblVoxelGrid.fragment.js.map +1 -1
  111. package/ShadersWGSL/lod3D.fragment.d.ts +5 -0
  112. package/ShadersWGSL/lod3D.fragment.js +13 -0
  113. package/ShadersWGSL/lod3D.fragment.js.map +1 -0
  114. package/ShadersWGSL/openpbr.fragment.js +5 -0
  115. package/ShadersWGSL/openpbr.fragment.js.map +1 -1
  116. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import { type Nullable } from "../types.js";
2
2
  import { Scene } from "../scene.js";
3
3
  import { type ISceneComponent } from "../sceneComponent.js";
4
- import { GeometryBufferRenderer } from "./geometryBufferRenderer.js";
4
+ import { GeometryBufferRenderer, type IGeometryBufferTextureTypeAndFormat } from "./geometryBufferRenderer.js";
5
5
  declare module "../scene.js" {
6
6
  interface Scene {
7
7
  /** @internal (Backing field) */
@@ -14,17 +14,15 @@ declare module "../scene.js" {
14
14
  * Enables a GeometryBufferRender and associates it with the scene
15
15
  * @param ratioOrDimensions defines the scaling ratio to apply to the renderer (1 by default which means same resolution). You can also directly pass a width and height for the generated textures
16
16
  * @param depthFormat Format of the depth texture (default: Constants.TEXTUREFORMAT_DEPTH16)
17
- * @param textureTypesAndFormats The types and formats of textures to create as render targets. If not provided, all textures will be RGBA and float or half float, depending on the engine capabilities.
17
+ * @param textureTypesAndFormats The types, formats and optional sampling modes of textures to create as render targets.
18
+ * If not provided, all textures will be RGBA and float or half float, depending on the engine capabilities.
18
19
  * @returns the GeometryBufferRenderer
19
20
  */
20
21
  enableGeometryBufferRenderer(ratioOrDimensions?: number | {
21
22
  width: number;
22
23
  height: number;
23
24
  }, depthFormat?: number, textureTypesAndFormats?: {
24
- [key: number]: {
25
- textureType: number;
26
- textureFormat: number;
27
- };
25
+ [key: number]: IGeometryBufferTextureTypeAndFormat;
28
26
  }): Nullable<GeometryBufferRenderer>;
29
27
  /**
30
28
  * Disables the GeometryBufferRender associated with the scene
@@ -1 +1 @@
1
- {"version":3,"file":"geometryBufferRendererSceneComponent.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/geometryBufferRendererSceneComponent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAwB,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAGlF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAiCjD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,wBAAwB,EAAE;IAC7D,GAAG,EAAE;QACD,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACxC,CAAC;IACD,GAAG,EAAE,UAAuB,KAAuC;QAC/D,IAAI,KAAK,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YAC7B,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;QACzC,CAAC;IACL,CAAC;IACD,UAAU,EAAE,IAAI;IAChB,YAAY,EAAE,IAAI;CACrB,CAAC,CAAC;AAEH,KAAK,CAAC,SAAS,CAAC,4BAA4B,GAAG,UAC3C,QAAoD,CAAC,EACrD,WAAW,GAAG,SAAS,CAAC,qBAAqB,EAC7C,sBAA0F;IAE1F,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,uBAAuB,GAAG,IAAI,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,sBAAsB,CAAC,CAAC;IAC5G,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;IACxC,CAAC;IAED,OAAO,IAAI,CAAC,uBAAuB,CAAC;AACxC,CAAC,CAAC;AAEF,KAAK,CAAC,SAAS,CAAC,6BAA6B,GAAG;IAC5C,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAChC,OAAO;IACX,CAAC;IAED,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,CAAC;IACvC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;AACxC,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,OAAO,oCAAoC;IAW7C;;;OAGG;IACH,YAAY,KAAY;QAdxB;;WAEG;QACa,SAAI,GAAG,uBAAuB,CAAC,2BAA2B,CAAC;QAYvE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED;;OAEG;IACI,QAAQ;QACX,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,YAAY,CAAC,uBAAuB,CAAC,+CAA+C,EAAE,IAAI,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAChK,CAAC;IAED;;;OAGG;IACI,OAAO;QACV,mCAAmC;IACvC,CAAC;IAED;;OAEG;IACI,OAAO;QACV,mCAAmC;IACvC,CAAC;IAEO,oBAAoB,CAAC,aAAyD;QAClF,IAAI,IAAI,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC;YACrC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,UAAU,EAAE,CAAC,CAAC;QACxE,CAAC;IACL,CAAC;CACJ;AAED,sBAAsB,CAAC,6BAA6B,GAAG,CAAC,KAAY,EAAE,EAAE;IACpE,gDAAgD;IAChD,IAAI,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,uBAAuB,CAAC,2BAA2B,CAAyC,CAAC;IACjI,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,SAAS,GAAG,IAAI,oCAAoC,CAAC,KAAK,CAAC,CAAC;QAC5D,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { type Nullable } from \"../types\";\r\nimport { Scene } from \"../scene\";\r\nimport { type ISceneComponent, SceneComponentConstants } from \"../sceneComponent\";\r\nimport { type SmartArrayNoDuplicate } from \"../Misc/smartArray\";\r\nimport { type RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport { GeometryBufferRenderer } from \"./geometryBufferRenderer\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\ndeclare module \"../scene\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface Scene {\r\n /** @internal (Backing field) */\r\n _geometryBufferRenderer: Nullable<GeometryBufferRenderer>;\r\n\r\n /**\r\n * Gets or Sets the current geometry buffer associated to the scene.\r\n */\r\n geometryBufferRenderer: Nullable<GeometryBufferRenderer>;\r\n\r\n /**\r\n * Enables a GeometryBufferRender and associates it with the scene\r\n * @param ratioOrDimensions defines the scaling ratio to apply to the renderer (1 by default which means same resolution). You can also directly pass a width and height for the generated textures\r\n * @param depthFormat Format of the depth texture (default: Constants.TEXTUREFORMAT_DEPTH16)\r\n * @param textureTypesAndFormats The types and formats of textures to create as render targets. If not provided, all textures will be RGBA and float or half float, depending on the engine capabilities.\r\n * @returns the GeometryBufferRenderer\r\n */\r\n enableGeometryBufferRenderer(\r\n ratioOrDimensions?: number | { width: number; height: number },\r\n depthFormat?: number,\r\n textureTypesAndFormats?: { [key: number]: { textureType: number; textureFormat: number } }\r\n ): Nullable<GeometryBufferRenderer>;\r\n\r\n /**\r\n * Disables the GeometryBufferRender associated with the scene\r\n */\r\n disableGeometryBufferRenderer(): void;\r\n }\r\n}\r\n\r\nObject.defineProperty(Scene.prototype, \"geometryBufferRenderer\", {\r\n get: function (this: Scene) {\r\n return this._geometryBufferRenderer;\r\n },\r\n set: function (this: Scene, value: Nullable<GeometryBufferRenderer>) {\r\n if (value && value.isSupported) {\r\n this._geometryBufferRenderer = value;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n});\r\n\r\nScene.prototype.enableGeometryBufferRenderer = function (\r\n ratio: number | { width: number; height: number } = 1,\r\n depthFormat = Constants.TEXTUREFORMAT_DEPTH16,\r\n textureTypesAndFormats?: { [key: number]: { textureType: number; textureFormat: number } }\r\n): Nullable<GeometryBufferRenderer> {\r\n if (this._geometryBufferRenderer) {\r\n return this._geometryBufferRenderer;\r\n }\r\n\r\n this._geometryBufferRenderer = new GeometryBufferRenderer(this, ratio, depthFormat, textureTypesAndFormats);\r\n if (!this._geometryBufferRenderer.isSupported) {\r\n this._geometryBufferRenderer = null;\r\n }\r\n\r\n return this._geometryBufferRenderer;\r\n};\r\n\r\nScene.prototype.disableGeometryBufferRenderer = function (): void {\r\n if (!this._geometryBufferRenderer) {\r\n return;\r\n }\r\n\r\n this._geometryBufferRenderer.dispose();\r\n this._geometryBufferRenderer = null;\r\n};\r\n\r\n/**\r\n * Defines the Geometry Buffer scene component responsible to manage a G-Buffer useful\r\n * in several rendering techniques.\r\n */\r\nexport class GeometryBufferRendererSceneComponent implements ISceneComponent {\r\n /**\r\n * The component name helpful to identify the component in the list of scene components.\r\n */\r\n public readonly name = SceneComponentConstants.NAME_GEOMETRYBUFFERRENDERER;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n /**\r\n * Creates a new instance of the component for the given scene\r\n * @param scene Defines the scene to register the component in\r\n */\r\n constructor(scene: Scene) {\r\n this.scene = scene;\r\n }\r\n\r\n /**\r\n * Registers the component in a given scene\r\n */\r\n public register(): void {\r\n this.scene._gatherRenderTargetsStage.registerStep(SceneComponentConstants.STEP_GATHERRENDERTARGETS_GEOMETRYBUFFERRENDERER, this, this._gatherRenderTargets);\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n // Nothing to do for this component\r\n }\r\n\r\n /**\r\n * Disposes the component and the associated resources\r\n */\r\n public dispose(): void {\r\n // Nothing to do for this component\r\n }\r\n\r\n private _gatherRenderTargets(renderTargets: SmartArrayNoDuplicate<RenderTargetTexture>): void {\r\n if (this.scene._geometryBufferRenderer) {\r\n renderTargets.push(this.scene._geometryBufferRenderer.getGBuffer());\r\n }\r\n }\r\n}\r\n\r\nGeometryBufferRenderer._SceneComponentInitialization = (scene: Scene) => {\r\n // Register the G Buffer component to the scene.\r\n let component = scene._getComponent(SceneComponentConstants.NAME_GEOMETRYBUFFERRENDERER) as GeometryBufferRendererSceneComponent;\r\n if (!component) {\r\n component = new GeometryBufferRendererSceneComponent(scene);\r\n scene._addComponent(component);\r\n }\r\n};\r\n"]}
1
+ {"version":3,"file":"geometryBufferRendererSceneComponent.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/geometryBufferRendererSceneComponent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAwB,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAGlF,OAAO,EAAE,sBAAsB,EAA4C,MAAM,0BAA0B,CAAC;AAC5G,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAkCjD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,wBAAwB,EAAE;IAC7D,GAAG,EAAE;QACD,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACxC,CAAC;IACD,GAAG,EAAE,UAAuB,KAAuC;QAC/D,IAAI,KAAK,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YAC7B,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;QACzC,CAAC;IACL,CAAC;IACD,UAAU,EAAE,IAAI;IAChB,YAAY,EAAE,IAAI;CACrB,CAAC,CAAC;AAEH,KAAK,CAAC,SAAS,CAAC,4BAA4B,GAAG,UAC3C,QAAoD,CAAC,EACrD,WAAW,GAAG,SAAS,CAAC,qBAAqB,EAC7C,sBAA+E;IAE/E,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,uBAAuB,GAAG,IAAI,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,sBAAsB,CAAC,CAAC;IAC5G,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;IACxC,CAAC;IAED,OAAO,IAAI,CAAC,uBAAuB,CAAC;AACxC,CAAC,CAAC;AAEF,KAAK,CAAC,SAAS,CAAC,6BAA6B,GAAG;IAC5C,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAChC,OAAO;IACX,CAAC;IAED,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,CAAC;IACvC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;AACxC,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,OAAO,oCAAoC;IAW7C;;;OAGG;IACH,YAAY,KAAY;QAdxB;;WAEG;QACa,SAAI,GAAG,uBAAuB,CAAC,2BAA2B,CAAC;QAYvE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED;;OAEG;IACI,QAAQ;QACX,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,YAAY,CAAC,uBAAuB,CAAC,+CAA+C,EAAE,IAAI,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAChK,CAAC;IAED;;;OAGG;IACI,OAAO;QACV,mCAAmC;IACvC,CAAC;IAED;;OAEG;IACI,OAAO;QACV,mCAAmC;IACvC,CAAC;IAEO,oBAAoB,CAAC,aAAyD;QAClF,IAAI,IAAI,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC;YACrC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,UAAU,EAAE,CAAC,CAAC;QACxE,CAAC;IACL,CAAC;CACJ;AAED,sBAAsB,CAAC,6BAA6B,GAAG,CAAC,KAAY,EAAE,EAAE;IACpE,gDAAgD;IAChD,IAAI,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,uBAAuB,CAAC,2BAA2B,CAAyC,CAAC;IACjI,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,SAAS,GAAG,IAAI,oCAAoC,CAAC,KAAK,CAAC,CAAC;QAC5D,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { type Nullable } from \"../types\";\r\nimport { Scene } from \"../scene\";\r\nimport { type ISceneComponent, SceneComponentConstants } from \"../sceneComponent\";\r\nimport { type SmartArrayNoDuplicate } from \"../Misc/smartArray\";\r\nimport { type RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport { GeometryBufferRenderer, type IGeometryBufferTextureTypeAndFormat } from \"./geometryBufferRenderer\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\ndeclare module \"../scene\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface Scene {\r\n /** @internal (Backing field) */\r\n _geometryBufferRenderer: Nullable<GeometryBufferRenderer>;\r\n\r\n /**\r\n * Gets or Sets the current geometry buffer associated to the scene.\r\n */\r\n geometryBufferRenderer: Nullable<GeometryBufferRenderer>;\r\n\r\n /**\r\n * Enables a GeometryBufferRender and associates it with the scene\r\n * @param ratioOrDimensions defines the scaling ratio to apply to the renderer (1 by default which means same resolution). You can also directly pass a width and height for the generated textures\r\n * @param depthFormat Format of the depth texture (default: Constants.TEXTUREFORMAT_DEPTH16)\r\n * @param textureTypesAndFormats The types, formats and optional sampling modes of textures to create as render targets.\r\n * If not provided, all textures will be RGBA and float or half float, depending on the engine capabilities.\r\n * @returns the GeometryBufferRenderer\r\n */\r\n enableGeometryBufferRenderer(\r\n ratioOrDimensions?: number | { width: number; height: number },\r\n depthFormat?: number,\r\n textureTypesAndFormats?: { [key: number]: IGeometryBufferTextureTypeAndFormat }\r\n ): Nullable<GeometryBufferRenderer>;\r\n\r\n /**\r\n * Disables the GeometryBufferRender associated with the scene\r\n */\r\n disableGeometryBufferRenderer(): void;\r\n }\r\n}\r\n\r\nObject.defineProperty(Scene.prototype, \"geometryBufferRenderer\", {\r\n get: function (this: Scene) {\r\n return this._geometryBufferRenderer;\r\n },\r\n set: function (this: Scene, value: Nullable<GeometryBufferRenderer>) {\r\n if (value && value.isSupported) {\r\n this._geometryBufferRenderer = value;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n});\r\n\r\nScene.prototype.enableGeometryBufferRenderer = function (\r\n ratio: number | { width: number; height: number } = 1,\r\n depthFormat = Constants.TEXTUREFORMAT_DEPTH16,\r\n textureTypesAndFormats?: { [key: number]: IGeometryBufferTextureTypeAndFormat }\r\n): Nullable<GeometryBufferRenderer> {\r\n if (this._geometryBufferRenderer) {\r\n return this._geometryBufferRenderer;\r\n }\r\n\r\n this._geometryBufferRenderer = new GeometryBufferRenderer(this, ratio, depthFormat, textureTypesAndFormats);\r\n if (!this._geometryBufferRenderer.isSupported) {\r\n this._geometryBufferRenderer = null;\r\n }\r\n\r\n return this._geometryBufferRenderer;\r\n};\r\n\r\nScene.prototype.disableGeometryBufferRenderer = function (): void {\r\n if (!this._geometryBufferRenderer) {\r\n return;\r\n }\r\n\r\n this._geometryBufferRenderer.dispose();\r\n this._geometryBufferRenderer = null;\r\n};\r\n\r\n/**\r\n * Defines the Geometry Buffer scene component responsible to manage a G-Buffer useful\r\n * in several rendering techniques.\r\n */\r\nexport class GeometryBufferRendererSceneComponent implements ISceneComponent {\r\n /**\r\n * The component name helpful to identify the component in the list of scene components.\r\n */\r\n public readonly name = SceneComponentConstants.NAME_GEOMETRYBUFFERRENDERER;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n /**\r\n * Creates a new instance of the component for the given scene\r\n * @param scene Defines the scene to register the component in\r\n */\r\n constructor(scene: Scene) {\r\n this.scene = scene;\r\n }\r\n\r\n /**\r\n * Registers the component in a given scene\r\n */\r\n public register(): void {\r\n this.scene._gatherRenderTargetsStage.registerStep(SceneComponentConstants.STEP_GATHERRENDERTARGETS_GEOMETRYBUFFERRENDERER, this, this._gatherRenderTargets);\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n // Nothing to do for this component\r\n }\r\n\r\n /**\r\n * Disposes the component and the associated resources\r\n */\r\n public dispose(): void {\r\n // Nothing to do for this component\r\n }\r\n\r\n private _gatherRenderTargets(renderTargets: SmartArrayNoDuplicate<RenderTargetTexture>): void {\r\n if (this.scene._geometryBufferRenderer) {\r\n renderTargets.push(this.scene._geometryBufferRenderer.getGBuffer());\r\n }\r\n }\r\n}\r\n\r\nGeometryBufferRenderer._SceneComponentInitialization = (scene: Scene) => {\r\n // Register the G Buffer component to the scene.\r\n let component = scene._getComponent(SceneComponentConstants.NAME_GEOMETRYBUFFERRENDERER) as GeometryBufferRendererSceneComponent;\r\n if (!component) {\r\n component = new GeometryBufferRendererSceneComponent(scene);\r\n scene._addComponent(component);\r\n }\r\n};\r\n"]}
@@ -19,6 +19,8 @@ export declare class IblCdfGenerator {
19
19
  private _dominantDirectionPT;
20
20
  private _iblSource;
21
21
  private _dummyTexture;
22
+ private _iblSourceLoadUnsubscribe;
23
+ private _iblSourceReadyRetryObserver;
22
24
  private _cachedDominantDirection;
23
25
  /**
24
26
  * Returns whether the CDF renderer is supported by the current engine
@@ -33,6 +35,8 @@ export declare class IblCdfGenerator {
33
35
  * This will trigger recreation of the CDF assets.
34
36
  */
35
37
  set iblSource(source: Nullable<BaseTexture>);
38
+ private _isIblSourceReady;
39
+ private _clearIblSourceReadinessObservers;
36
40
  private _recreateAssetsFromNewIbl;
37
41
  /**
38
42
  * Return the cumulative distribution function (CDF) texture
@@ -75,6 +79,12 @@ export declare class IblCdfGenerator {
75
79
  * Observable that triggers when the CDF renderer is ready
76
80
  */
77
81
  onGeneratedObservable: Observable<void>;
82
+ /**
83
+ * Observable that triggers when CDF texture references change.
84
+ * It is raised after disposing textures (so fallback ICDF can be used)
85
+ * and after creating new textures (so consumers can rebind immediately).
86
+ */
87
+ onTextureChangedObservable: Observable<void>;
78
88
  private _createTextures;
79
89
  private _disposeTextures;
80
90
  private _createDebugPass;
@@ -5,6 +5,7 @@ import { PostProcess } from "../PostProcesses/postProcess.js";
5
5
  import { Vector3, Vector4 } from "../Maths/math.vector.js";
6
6
  import { RawTexture } from "../Materials/Textures/rawTexture.js";
7
7
  import { Observable } from "../Misc/observable.js";
8
+ import { CubeTexture } from "../Materials/Textures/cubeTexture.js";
8
9
  import { _WarnImport } from "../Misc/devTools.js";
9
10
  import { EngineStore } from "../Engines/engineStore.js";
10
11
  import { Logger } from "../Misc/logger.js";
@@ -37,27 +38,52 @@ export class IblCdfGenerator {
37
38
  if (this._iblSource === source) {
38
39
  return;
39
40
  }
41
+ this._clearIblSourceReadinessObservers();
40
42
  this._disposeTextures();
41
43
  this._iblSource = source;
42
44
  if (!source) {
43
45
  return;
44
46
  }
45
- if (source.isCube) {
46
- if (source.isReadyOrNotBlocking()) {
47
- this._recreateAssetsFromNewIbl();
48
- }
49
- else {
50
- source.onLoadObservable.addOnce(() => this._recreateAssetsFromNewIbl());
47
+ const recreateFromObservedSourceIfReady = () => {
48
+ if (this._iblSource !== source || !this._isIblSourceReady(source)) {
49
+ return;
51
50
  }
51
+ this._clearIblSourceReadinessObservers();
52
+ this._recreateAssetsFromNewIbl();
53
+ };
54
+ if (this._isIblSourceReady(source)) {
55
+ this._recreateAssetsFromNewIbl();
56
+ return;
52
57
  }
53
- else {
54
- if (source.isReadyOrNotBlocking()) {
55
- this._recreateAssetsFromNewIbl();
58
+ if (source instanceof Texture) {
59
+ const observer = source.onLoadObservable.addOnce(recreateFromObservedSourceIfReady);
60
+ if (observer) {
61
+ this._iblSourceLoadUnsubscribe = () => source.onLoadObservable.remove(observer);
56
62
  }
57
- else {
58
- source.onLoadObservable.addOnce(() => this._recreateAssetsFromNewIbl());
63
+ }
64
+ else if (source instanceof CubeTexture) {
65
+ const observer = source.onLoadObservable.addOnce(recreateFromObservedSourceIfReady);
66
+ if (observer) {
67
+ this._iblSourceLoadUnsubscribe = () => source.onLoadObservable.remove(observer);
59
68
  }
60
69
  }
70
+ this._iblSourceReadyRetryObserver = _RetryWithInterval(() => this._iblSource !== source || this._isIblSourceReady(source), recreateFromObservedSourceIfReady, undefined, 16, 30000, false);
71
+ }
72
+ _isIblSourceReady(source) {
73
+ if (!source.isReadyOrNotBlocking()) {
74
+ return false;
75
+ }
76
+ if (!source.isCube) {
77
+ return true;
78
+ }
79
+ const internalTexture = source.getInternalTexture();
80
+ return !!internalTexture && internalTexture.isReady;
81
+ }
82
+ _clearIblSourceReadinessObservers() {
83
+ this._iblSourceReadyRetryObserver?.();
84
+ this._iblSourceReadyRetryObserver = null;
85
+ this._iblSourceLoadUnsubscribe?.();
86
+ this._iblSourceLoadUnsubscribe = null;
61
87
  }
62
88
  _recreateAssetsFromNewIbl() {
63
89
  if (this._debugPass) {
@@ -108,6 +134,8 @@ export class IblCdfGenerator {
108
134
  * @returns The CDF renderer
109
135
  */
110
136
  constructor(sceneOrEngine) {
137
+ this._iblSourceLoadUnsubscribe = null;
138
+ this._iblSourceReadyRetryObserver = null;
111
139
  this._cachedDominantDirection = null;
112
140
  /** Enable the debug view for this pass */
113
141
  this.debugEnabled = false;
@@ -117,6 +145,12 @@ export class IblCdfGenerator {
117
145
  * Observable that triggers when the CDF renderer is ready
118
146
  */
119
147
  this.onGeneratedObservable = new Observable();
148
+ /**
149
+ * Observable that triggers when CDF texture references change.
150
+ * It is raised after disposing textures (so fallback ICDF can be used)
151
+ * and after creating new textures (so consumers can rebind immediately).
152
+ */
153
+ this.onTextureChangedObservable = new Observable();
120
154
  if (sceneOrEngine) {
121
155
  if (IblCdfGenerator._IsScene(sceneOrEngine)) {
122
156
  this._scene = sceneOrEngine;
@@ -236,6 +270,7 @@ export class IblCdfGenerator {
236
270
  this._dominantDirectionPT.setTexture("icdfSampler", this._icdfPT);
237
271
  this._dominantDirectionPT.refreshRate = 0;
238
272
  this._dominantDirectionPT.defines = "#define NUM_SAMPLES 32u\n";
273
+ this.onTextureChangedObservable.notifyObservers();
239
274
  }
240
275
  _disposeTextures() {
241
276
  this._cdfyPT?.dispose();
@@ -243,6 +278,8 @@ export class IblCdfGenerator {
243
278
  this._icdfPT?.dispose();
244
279
  this._scaledLuminancePT?.dispose();
245
280
  this._dominantDirectionPT?.dispose();
281
+ this._icdfPT = null;
282
+ this.onTextureChangedObservable.notifyObservers();
246
283
  }
247
284
  _createDebugPass() {
248
285
  if (this._debugPass) {
@@ -305,7 +342,7 @@ export class IblCdfGenerator {
305
342
  * Explicitly trigger generation of CDF maps when they are ready to render.
306
343
  * @returns Promise that resolves when the CDF maps are rendered.
307
344
  */
308
- // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/promise-function-async
345
+ // eslint-disable-next-line @typescript-eslint/promise-function-async
309
346
  renderWhenReady() {
310
347
  this._cachedDominantDirection = null;
311
348
  // Even if a IBL source must be set before calling this function, _icdfPT may not yet be created because the creation may be asynchronous (see @set iblSource).
@@ -314,12 +351,9 @@ export class IblCdfGenerator {
314
351
  });
315
352
  // eslint-disable-next-line github/no-then, @typescript-eslint/promise-function-async
316
353
  return icdfPTPromise.then(() => {
317
- // Once the textures are generated, notify that they are ready to use.
318
- this._icdfPT.onGeneratedObservable.addOnce(() => {
319
- this.onGeneratedObservable.notifyObservers();
320
- });
354
+ const icdfTexture = this._icdfPT;
321
355
  const promises = [];
322
- const renderTargets = [this._cdfyPT, this._cdfxPT, this._scaledLuminancePT, this._icdfPT];
356
+ const renderTargets = [this._cdfyPT, this._cdfxPT, this._scaledLuminancePT, icdfTexture];
323
357
  for (const target of renderTargets) {
324
358
  promises.push(new Promise((resolve) => {
325
359
  if (target.isReady()) {
@@ -387,6 +421,7 @@ export class IblCdfGenerator {
387
421
  * Disposes the CDF renderer and associated resources
388
422
  */
389
423
  dispose() {
424
+ this._clearIblSourceReadinessObservers();
390
425
  this._disposeTextures();
391
426
  this._dummyTexture.dispose();
392
427
  if (this._debugPass) {
@@ -1 +1 @@
1
- {"version":3,"file":"iblCdfGenerator.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/iblCdfGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIjD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAA0C,MAAM,qDAAqD,CAAC;AAChI,OAAO,EAAE,WAAW,EAA2B,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;GAEG;AACH,MAAM,OAAO,eAAe;IAcxB;;OAEG;IACH,IAAW,WAAW;QAClB,MAAM,MAAM,GAAG,WAAW,CAAC,iBAAiB,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS,CAAC,MAA6B;QAC9C,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;YAC7B,OAAO;QACX,CAAC;QACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;QACzB,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,MAAM,CAAC,oBAAoB,EAAE,EAAE,CAAC;gBAChC,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACH,MAAsB,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC;YAC7F,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,MAAM,CAAC,oBAAoB,EAAE,EAAE,CAAC;gBAChC,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACH,MAAkB,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC;YACzF,CAAC;QACL,CAAC;IACL,CAAC;IAEO,yBAAyB;QAC7B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,sDAAsD;YACtD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,cAAc;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;IAC5D,CAAC;IAOD;;;;;;OAMG;IACI,qBAAqB,CAAC,CAAS,EAAE,CAAS,EAAE,UAAkB,EAAE,WAAmB;QACtF,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAGD;;;OAGG;IACI,cAAc;QACjB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IASD;;;;OAIG;IACH,YAAY,aAA+C;QApHnD,6BAAwB,GAAsB,IAAI,CAAC;QAqE3D,0CAA0C;QACnC,iBAAY,GAAY,KAAK,CAAC;QAE7B,qBAAgB,GAAY,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAmB5D,mBAAc,GAAW,WAAW,CAAC;QAiD7C;;WAEG;QACI,0BAAqB,GAAqB,IAAI,UAAU,EAAQ,CAAC;QA1BpE,IAAI,aAAa,EAAE,CAAC;YAChB,IAAI,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC;YACjC,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,gBAAgB,CAAC;QAC/C,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;YACpE,OAAO;QACX,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,aAAa,GAAG,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,kBAAkB,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC/J,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,eAAe,CAAC,6BAA6B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;IAOO,eAAe;QACnB,MAAM,IAAI,GAAgB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAC3J,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,cAAc,CACvC,IAAI,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,EACrB,CAAC,EACD,CAAC,EACD,IAAI,CAAC,OAAO,EACZ,KAAK,EACL,KAAK,EACL,SAAS,CAAC,4BAA4B,EACtC,SAAS,CAAC,yBAAyB,CACtC,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAChB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YACjB,iEAAiE;YACjE,qEAAqE;YACrE,yEAAyE;YACzE,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QACvC,sFAAsF;QACtF,MAAM,UAAU,GAAsC;YAClD,mBAAmB,EAAE,KAAK;YAC1B,eAAe,EAAE,KAAK;YACtB,MAAM,EAAE,SAAS,CAAC,eAAe;YACjC,IAAI,EAAE,SAAS,CAAC,iBAAiB;YACjC,YAAY,EAAE,SAAS,CAAC,4BAA4B;YACpD,cAAc,EAAE,QAAQ,CAAC,CAAC,6BAAqB,CAAC,4BAAoB;YACpE,UAAU,EAAE,KAAK;YACjB,yBAAyB,EAAE,KAAK,IAAI,EAAE;gBAClC,IAAI,QAAQ,EAAE,CAAC;oBACX,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,iCAAiC,CAAC,EAAE,MAAM,CAAC,iCAAiC,CAAC,EAAE,MAAM,CAAC,4CAA4C,CAAC,CAAC,CAAC,CAAC;gBACpK,CAAC;qBAAM,CAAC;oBACJ,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,6BAA6B,CAAC,EAAE,MAAM,CAAC,6BAA6B,CAAC,EAAE,MAAM,CAAC,wCAAwC,CAAC,CAAC,CAAC,CAAC;gBACxJ,CAAC;YACL,CAAC;SACJ,CAAC;QACF,MAAM,WAAW,GAAsC;YACnD,mBAAmB,EAAE,KAAK;YAC1B,eAAe,EAAE,KAAK;YACtB,MAAM,EAAE,SAAS,CAAC,kBAAkB;YACpC,IAAI,EAAE,SAAS,CAAC,sBAAsB;YACtC,YAAY,EAAE,SAAS,CAAC,4BAA4B;YACpD,cAAc,EAAE,QAAQ,CAAC,CAAC,6BAAqB,CAAC,4BAAoB;YACpE,UAAU,EAAE,KAAK;YACjB,yBAAyB,EAAE,KAAK,IAAI,EAAE;gBAClC,IAAI,QAAQ,EAAE,CAAC;oBACX,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,iCAAiC,CAAC,EAAE,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC,CAAC;gBAC3H,CAAC;qBAAM,CAAC;oBACJ,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,6BAA6B,CAAC,EAAE,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC,CAAC;gBACnH,CAAC;YACL,CAAC;SACJ,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACtJ,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,yBAAyB,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,4BAA4B,CAAC;QACxD,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5I,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,yBAAyB,CAAC;QAEzD,IAAI,CAAC,kBAAkB,GAAG,IAAI,iBAAiB,CAC3C,oBAAoB,EACpB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAC1C,oBAAoB,EACpB,IAAI,CAAC,MAAM,EACX,EAAE,GAAG,UAAU,EAAE,YAAY,EAAE,SAAS,CAAC,8BAA8B,EAAE,eAAe,EAAE,IAAI,EAAE,EAChG,IAAI,EACJ,KAAK,CACR,CAAC;QACF,IAAI,CAAC,kBAAkB,CAAC,SAAS,GAAG,KAAK,CAAC;QAC1C,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,kBAAkB,CAAC,WAAW,GAAG,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,kBAAkB,CAAC,OAAO,GAAG,4BAA4B,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACnJ,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,wBAAwB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC3E,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,yBAAyB,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,yBAAyB,CAAC;QACzD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,4BAA4B,CAAC;QACxD,CAAC;QACD,sEAAsE;QACtE,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,GAAG,EAAE;YAC5C,IAAI,CAAC,qBAAqB,CAAC,eAAe,EAAE,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,oBAAoB,GAAG,IAAI,iBAAiB,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,sBAAsB,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACnK,IAAI,CAAC,oBAAoB,CAAC,SAAS,GAAG,KAAK,CAAC;QAC5C,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAClE,IAAI,CAAC,oBAAoB,CAAC,WAAW,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,oBAAoB,CAAC,OAAO,GAAG,2BAA2B,CAAC;IACpE,CAAC;IAEO,gBAAgB;QACpB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,CAAC;QACnC,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC;IACzC,CAAC;IAEO,gBAAgB;QACpB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QACvC,MAAM,YAAY,GAAuB;YACrC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;YACpC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;YACtC,YAAY,EAAE,OAAO,CAAC,qBAAqB;YAC3C,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,WAAW,EAAE,SAAS,CAAC,yBAAyB;YAChD,QAAQ,EAAE,CAAC,YAAY,CAAC;YACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC;YAC/C,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE;YACpE,cAAc,EAAE,QAAQ,CAAC,CAAC,6BAAqB,CAAC,4BAAoB;YACpE,oBAAoB,EAAE,CAAC,SAAkB,EAAE,IAAoB,EAAE,EAAE;gBAC/D,IAAI,SAAS,EAAE,CAAC;oBACZ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,qCAAqC,CAAC,CAAC,CAAC;gBAC7D,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACzD,CAAC;YACL,CAAC;SACJ,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;QACpF,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAChD,IAAI,WAAW,EAAE,CAAC;YACd,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,4BAA4B,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7C,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAChD,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACvI,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;OAGG;IACI,OAAO;QACV,OAAO,CACH,IAAI,CAAC,UAAU;YACf,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,wBAAwB;YACjD,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;YACzB,IAAI,CAAC,OAAO;YACZ,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACtB,IAAI,CAAC,OAAO;YACZ,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACtB,IAAI,CAAC,OAAO;YACZ,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACtB,IAAI,CAAC,kBAAkB;YACvB,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CACpC,CAAC;IACN,CAAC;IAED;;;OAGG;IACH,2GAA2G;IACpG,eAAe;QAClB,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;QAErC,+JAA+J;QAC/J,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClD,kBAAkB,CACd,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EACpB,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EACrB,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,CACjE,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,qFAAqF;QACrF,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE;YAC3B,sEAAsE;YACtE,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC5C,IAAI,CAAC,qBAAqB,CAAC,eAAe,EAAE,CAAC;YACjD,CAAC,CAAC,CAAC;YACH,MAAM,QAAQ,GAAyB,EAAE,CAAC;YAC1C,MAAM,aAAa,GAA6B,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACpH,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;gBACjC,QAAQ,CAAC,IAAI,CACT,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBACpB,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;wBACnB,OAAO,EAAE,CAAC;oBACd,CAAC;yBAAM,CAAC;wBACJ,MAAM,CAAC,SAAS,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE;4BACxC,OAAO,EAAE,CAAC;wBACd,CAAC,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC,CAAC,CACL,CAAC;YACN,CAAC;YACD,0CAA0C;YAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBACnC,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;oBACjC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACpB,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;OAGG;IACH,qEAAqE;IAC9D,qBAAqB;QACxB,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,OAAO,CAAC,GAAG,EAAE;gBACzD,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;gBACjC,mFAAmF;gBACnF,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAE,CAAC,IAAI,CAAC,GAAG,EAAE;oBAC9D,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACjE,IAAI,CAAC,wBAAwB,GAAG,iBAAiB,CAAC;oBAClD,OAAO,CAAC,iBAAiB,CAAC,CAAC;gBAC/B,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;gBACjB,IAAI,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,EAAE,CAAC;oBACtC,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE;wBAC3D,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC;oBACvC,CAAC,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,GAAG,EAAE;oBACpC,IAAI,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,EAAE,CAAC;wBACtC,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC;oBACvC,CAAC;yBAAM,CAAC;wBACJ,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE;4BAC3D,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC;wBACvC,CAAC,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAEO,MAAM,CAAC,QAAQ,CAAC,aAAqC;QACzD,OAAO,aAAa,CAAC,YAAY,EAAE,KAAK,OAAO,CAAC;IACpD,CAAC;;AAxUD;;GAEG;AACW,6CAA6B,GAA2B,CAAC,CAAC,EAAE,EAAE;IACxE,MAAM,WAAW,CAAC,6CAA6C,CAAC,CAAC;AACrE,CAAC,AAF0C,CAEzC","sourcesContent":["import { Constants } from \"../Engines/constants\";\r\nimport { type AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\nimport { type Scene } from \"../scene\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { type TextureSize } from \"../Materials/Textures/textureCreationOptions\";\r\nimport { ProceduralTexture, type IProceduralTextureCreationOptions } from \"../Materials/Textures/Procedurals/proceduralTexture\";\r\nimport { PostProcess, type PostProcessOptions } from \"../PostProcesses/postProcess\";\r\nimport { Vector3, Vector4 } from \"../Maths/math.vector\";\r\nimport { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport { type BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { type CubeTexture } from \"../Materials/Textures/cubeTexture\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport { type Nullable } from \"../types\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { _RetryWithInterval } from \"../Misc/timingTools\";\r\n\r\n/**\r\n * Build cdf maps to be used for IBL importance sampling.\r\n */\r\nexport class IblCdfGenerator {\r\n private _scene: Nullable<Scene>;\r\n private _engine: AbstractEngine;\r\n\r\n private _cdfyPT: ProceduralTexture;\r\n private _cdfxPT: ProceduralTexture;\r\n private _icdfPT: ProceduralTexture;\r\n private _scaledLuminancePT: ProceduralTexture;\r\n private _dominantDirectionPT: ProceduralTexture;\r\n private _iblSource: Nullable<BaseTexture>;\r\n private _dummyTexture: RawTexture;\r\n\r\n private _cachedDominantDirection: Nullable<Vector3> = null;\r\n\r\n /**\r\n * Returns whether the CDF renderer is supported by the current engine\r\n */\r\n public get isSupported(): boolean {\r\n const engine = EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n return false;\r\n }\r\n return engine.getCaps().texelFetch;\r\n }\r\n\r\n /**\r\n * Gets the IBL source texture being used by the CDF renderer\r\n */\r\n public get iblSource(): Nullable<BaseTexture> {\r\n return this._iblSource;\r\n }\r\n\r\n /**\r\n * Sets the IBL source texture to be used by the CDF renderer.\r\n * This will trigger recreation of the CDF assets.\r\n */\r\n public set iblSource(source: Nullable<BaseTexture>) {\r\n if (this._iblSource === source) {\r\n return;\r\n }\r\n this._disposeTextures();\r\n this._iblSource = source;\r\n if (!source) {\r\n return;\r\n }\r\n if (source.isCube) {\r\n if (source.isReadyOrNotBlocking()) {\r\n this._recreateAssetsFromNewIbl();\r\n } else {\r\n (source as CubeTexture).onLoadObservable.addOnce(() => this._recreateAssetsFromNewIbl());\r\n }\r\n } else {\r\n if (source.isReadyOrNotBlocking()) {\r\n this._recreateAssetsFromNewIbl();\r\n } else {\r\n (source as Texture).onLoadObservable.addOnce(() => this._recreateAssetsFromNewIbl());\r\n }\r\n }\r\n }\r\n\r\n private _recreateAssetsFromNewIbl() {\r\n if (this._debugPass) {\r\n this._debugPass.dispose();\r\n }\r\n\r\n this._createTextures();\r\n\r\n if (this._debugPass) {\r\n // Recreate the debug pass because of the new textures\r\n this._createDebugPass();\r\n }\r\n }\r\n\r\n /**\r\n * Return the cumulative distribution function (CDF) texture\r\n * @returns Return the cumulative distribution function (CDF) texture\r\n */\r\n public getIcdfTexture(): Texture {\r\n return this._icdfPT ? this._icdfPT : this._dummyTexture;\r\n }\r\n\r\n /** Enable the debug view for this pass */\r\n public debugEnabled: boolean = false;\r\n private _debugPass: PostProcess;\r\n private _debugSizeParams: Vector4 = new Vector4(0.0, 0.0, 1.0, 1.0);\r\n\r\n /**\r\n * Sets params that control the position and scaling of the debug display on the screen.\r\n * @param x Screen X offset of the debug display (0-1)\r\n * @param y Screen Y offset of the debug display (0-1)\r\n * @param widthScale X scale of the debug display (0-1)\r\n * @param heightScale Y scale of the debug display (0-1)\r\n */\r\n public setDebugDisplayParams(x: number, y: number, widthScale: number, heightScale: number) {\r\n this._debugSizeParams.set(x, y, widthScale, heightScale);\r\n }\r\n\r\n /**\r\n * The name of the debug pass post process\r\n */\r\n public get debugPassName(): string {\r\n return this._debugPassName;\r\n }\r\n private _debugPassName: string = \"CDF Debug\";\r\n\r\n /**\r\n * Gets the debug pass post process\r\n * @returns The post process\r\n */\r\n public getDebugPassPP(): PostProcess {\r\n if (!this._debugPass) {\r\n this._createDebugPass();\r\n }\r\n return this._debugPass;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _SceneComponentInitialization: (scene: Scene) => void = (_) => {\r\n throw _WarnImport(\"IblCdfGeneratorSceneComponentSceneComponent\");\r\n };\r\n\r\n /**\r\n * Instanciates the CDF renderer\r\n * @param sceneOrEngine Scene to attach to\r\n * @returns The CDF renderer\r\n */\r\n constructor(sceneOrEngine: Nullable<Scene | AbstractEngine>) {\r\n if (sceneOrEngine) {\r\n if (IblCdfGenerator._IsScene(sceneOrEngine)) {\r\n this._scene = sceneOrEngine;\r\n } else {\r\n this._engine = sceneOrEngine;\r\n }\r\n } else {\r\n this._scene = EngineStore.LastCreatedScene;\r\n }\r\n if (this._scene) {\r\n this._engine = this._scene.getEngine();\r\n }\r\n if (!this.isSupported) {\r\n Logger.Warn(\"CDF renderer is not supported by the current engine.\");\r\n return;\r\n }\r\n const blackPixels = new Uint16Array([0, 0, 0, 255]);\r\n this._dummyTexture = new RawTexture(blackPixels, 1, 1, Constants.TEXTUREFORMAT_RGBA, sceneOrEngine, false, false, undefined, Constants.TEXTURETYPE_HALF_FLOAT);\r\n if (this._scene) {\r\n IblCdfGenerator._SceneComponentInitialization(this._scene);\r\n }\r\n }\r\n\r\n /**\r\n * Observable that triggers when the CDF renderer is ready\r\n */\r\n public onGeneratedObservable: Observable<void> = new Observable<void>();\r\n\r\n private _createTextures() {\r\n const size: TextureSize = this._iblSource ? { width: this._iblSource.getSize().width, height: this._iblSource.getSize().height } : { width: 1, height: 1 };\r\n if (!this._iblSource) {\r\n this._iblSource = RawTexture.CreateRTexture(\r\n new Uint8Array([255]),\r\n 1,\r\n 1,\r\n this._engine,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE\r\n );\r\n this._iblSource.name = \"Placeholder IBL Source\";\r\n }\r\n\r\n if (this._iblSource.isCube) {\r\n size.width *= 4;\r\n size.height *= 2;\r\n // Force the resolution to be a power of 2 because we rely on the\r\n // auto-mipmap generation for the scaled luminance texture to produce\r\n // a 1x1 mip that represents the true average pixel intensity of the IBL.\r\n size.width = 1 << Math.floor(Math.log2(size.width));\r\n size.height = 1 << Math.floor(Math.log2(size.height));\r\n }\r\n\r\n const isWebGPU = this._engine.isWebGPU;\r\n // Create CDF maps (Cumulative Distribution Function) to assist in importance sampling\r\n const cdfOptions: IProceduralTextureCreationOptions = {\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n format: Constants.TEXTUREFORMAT_R,\r\n type: Constants.TEXTURETYPE_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n gammaSpace: false,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../ShadersWGSL/iblCdfx.fragment\"), import(\"../ShadersWGSL/iblCdfy.fragment\"), import(\"../ShadersWGSL/iblScaledLuminance.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/iblCdfx.fragment\"), import(\"../Shaders/iblCdfy.fragment\"), import(\"../Shaders/iblScaledLuminance.fragment\")]);\r\n }\r\n },\r\n };\r\n const icdfOptions: IProceduralTextureCreationOptions = {\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n gammaSpace: false,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../ShadersWGSL/iblIcdf.fragment\"), import(\"../ShadersWGSL/iblDominantDirection.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/iblIcdf.fragment\"), import(\"../Shaders/iblDominantDirection.fragment\")]);\r\n }\r\n },\r\n };\r\n this._cdfyPT = new ProceduralTexture(\"cdfyTexture\", { width: size.width, height: size.height + 1 }, \"iblCdfy\", this._scene, cdfOptions, false, false);\r\n this._cdfyPT.autoClear = false;\r\n this._cdfyPT.setTexture(\"iblSource\", this._iblSource);\r\n this._cdfyPT.setInt(\"iblHeight\", size.height);\r\n this._cdfyPT.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._cdfyPT.refreshRate = 0;\r\n if (this._iblSource.isCube) {\r\n this._cdfyPT.defines = \"#define IBL_USE_CUBE_MAP\\n\";\r\n }\r\n\r\n this._cdfxPT = new ProceduralTexture(\"cdfxTexture\", { width: size.width + 1, height: 1 }, \"iblCdfx\", this._scene, cdfOptions, false, false);\r\n this._cdfxPT.autoClear = false;\r\n this._cdfxPT.setTexture(\"cdfy\", this._cdfyPT);\r\n this._cdfxPT.refreshRate = 0;\r\n this._cdfxPT.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n\r\n this._scaledLuminancePT = new ProceduralTexture(\r\n \"iblScaledLuminance\",\r\n { width: size.width, height: size.height },\r\n \"iblScaledLuminance\",\r\n this._scene,\r\n { ...cdfOptions, samplingMode: Constants.TEXTURE_TRILINEAR_SAMPLINGMODE, generateMipMaps: true },\r\n true,\r\n false\r\n );\r\n this._scaledLuminancePT.autoClear = false;\r\n this._scaledLuminancePT.setTexture(\"iblSource\", this._iblSource);\r\n this._scaledLuminancePT.setInt(\"iblHeight\", size.height);\r\n this._scaledLuminancePT.setInt(\"iblWidth\", size.width);\r\n this._scaledLuminancePT.refreshRate = 0;\r\n if (this._iblSource.isCube) {\r\n this._scaledLuminancePT.defines = \"#define IBL_USE_CUBE_MAP\\n\";\r\n }\r\n this._icdfPT = new ProceduralTexture(\"icdfTexture\", { width: size.width, height: size.height }, \"iblIcdf\", this._scene, icdfOptions, false, false);\r\n this._icdfPT.autoClear = false;\r\n this._icdfPT.setTexture(\"cdfy\", this._cdfyPT);\r\n this._icdfPT.setTexture(\"cdfx\", this._cdfxPT);\r\n this._icdfPT.setTexture(\"iblSource\", this._iblSource);\r\n this._icdfPT.setTexture(\"scaledLuminanceSampler\", this._scaledLuminancePT);\r\n this._icdfPT.refreshRate = 0;\r\n this._icdfPT.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._icdfPT.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n if (this._iblSource.isCube) {\r\n this._icdfPT.defines = \"#define IBL_USE_CUBE_MAP\\n\";\r\n }\r\n // Once the textures are generated, notify that they are ready to use.\r\n this._icdfPT.onGeneratedObservable.addOnce(() => {\r\n this.onGeneratedObservable.notifyObservers();\r\n });\r\n\r\n this._dominantDirectionPT = new ProceduralTexture(\"iblDominantDirection\", { width: 1, height: 1 }, \"iblDominantDirection\", this._scene, icdfOptions, false, false);\r\n this._dominantDirectionPT.autoClear = false;\r\n this._dominantDirectionPT.setTexture(\"icdfSampler\", this._icdfPT);\r\n this._dominantDirectionPT.refreshRate = 0;\r\n this._dominantDirectionPT.defines = \"#define NUM_SAMPLES 32u\\n\";\r\n }\r\n\r\n private _disposeTextures() {\r\n this._cdfyPT?.dispose();\r\n this._cdfxPT?.dispose();\r\n this._icdfPT?.dispose();\r\n this._scaledLuminancePT?.dispose();\r\n this._dominantDirectionPT?.dispose();\r\n }\r\n\r\n private _createDebugPass() {\r\n if (this._debugPass) {\r\n this._debugPass.dispose();\r\n }\r\n const isWebGPU = this._engine.isWebGPU;\r\n const debugOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n samplingMode: Texture.BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n uniforms: [\"sizeParams\"],\r\n samplers: [\"cdfy\", \"icdf\", \"cdfx\", \"iblSource\"],\r\n defines: this._iblSource?.isCube ? \"#define IBL_USE_CUBE_MAP\\n\" : \"\",\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (useWebGPU: boolean, list: Promise<any>[]) => {\r\n if (useWebGPU) {\r\n list.push(import(\"../ShadersWGSL/iblCdfDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/iblCdfDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._debugPass = new PostProcess(this._debugPassName, \"iblCdfDebug\", debugOptions);\r\n const debugEffect = this._debugPass.getEffect();\r\n if (debugEffect) {\r\n debugEffect.defines = this._iblSource?.isCube ? \"#define IBL_USE_CUBE_MAP\\n\" : \"\";\r\n }\r\n if (this._iblSource?.isCube) {\r\n this._debugPass.updateEffect(\"#define IBL_USE_CUBE_MAP\\n\");\r\n }\r\n this._debugPass.onApplyObservable.add((effect) => {\r\n effect.setTexture(\"cdfy\", this._cdfyPT);\r\n effect.setTexture(\"icdf\", this._icdfPT);\r\n effect.setTexture(\"cdfx\", this._cdfxPT);\r\n effect.setTexture(\"iblSource\", this._iblSource);\r\n effect.setFloat4(\"sizeParams\", this._debugSizeParams.x, this._debugSizeParams.y, this._debugSizeParams.z, this._debugSizeParams.w);\r\n });\r\n }\r\n\r\n /**\r\n * Checks if the CDF renderer is ready\r\n * @returns true if the CDF renderer is ready\r\n */\r\n public isReady() {\r\n return (\r\n this._iblSource &&\r\n this._iblSource.name !== \"Placeholder IBL Source\" &&\r\n this._iblSource.isReady() &&\r\n this._cdfyPT &&\r\n this._cdfyPT.isReady() &&\r\n this._icdfPT &&\r\n this._icdfPT.isReady() &&\r\n this._cdfxPT &&\r\n this._cdfxPT.isReady() &&\r\n this._scaledLuminancePT &&\r\n this._scaledLuminancePT.isReady()\r\n );\r\n }\r\n\r\n /**\r\n * Explicitly trigger generation of CDF maps when they are ready to render.\r\n * @returns Promise that resolves when the CDF maps are rendered.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/promise-function-async\r\n public renderWhenReady(): Promise<void> {\r\n this._cachedDominantDirection = null;\r\n\r\n // Even if a IBL source must be set before calling this function, _icdfPT may not yet be created because the creation may be asynchronous (see @set iblSource).\r\n const icdfPTPromise = new Promise((resolve, reject) => {\r\n _RetryWithInterval(\r\n () => !!this._icdfPT,\r\n () => resolve(void 0),\r\n () => reject(new Error(\"Waiting for _icdfPT creation failed\"))\r\n );\r\n });\r\n\r\n // eslint-disable-next-line github/no-then, @typescript-eslint/promise-function-async\r\n return icdfPTPromise.then(() => {\r\n // Once the textures are generated, notify that they are ready to use.\r\n this._icdfPT.onGeneratedObservable.addOnce(() => {\r\n this.onGeneratedObservable.notifyObservers();\r\n });\r\n const promises: Array<Promise<void>> = [];\r\n const renderTargets: Array<ProceduralTexture> = [this._cdfyPT, this._cdfxPT, this._scaledLuminancePT, this._icdfPT];\r\n for (const target of renderTargets) {\r\n promises.push(\r\n new Promise((resolve) => {\r\n if (target.isReady()) {\r\n resolve();\r\n } else {\r\n target.getEffect().executeWhenCompiled(() => {\r\n resolve();\r\n });\r\n }\r\n })\r\n );\r\n }\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(promises).then(() => {\r\n for (const target of renderTargets) {\r\n target.render();\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Finds the average direction of the highest intensity areas of the IBL source\r\n * @returns Async promise that resolves to the dominant direction of the IBL source\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n public findDominantDirection(): Promise<Vector3> {\r\n if (this._cachedDominantDirection) {\r\n return Promise.resolve(this._cachedDominantDirection);\r\n }\r\n return new Promise((resolve) => {\r\n this._dominantDirectionPT.onGeneratedObservable.addOnce(() => {\r\n const data = new Float32Array(4);\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n this._dominantDirectionPT.readPixels(0, 0, data, true)!.then(() => {\r\n const dominantDirection = new Vector3(data[0], data[1], data[2]);\r\n this._cachedDominantDirection = dominantDirection;\r\n resolve(dominantDirection);\r\n });\r\n });\r\n if (this.isReady()) {\r\n if (this._dominantDirectionPT.isReady()) {\r\n this._dominantDirectionPT.render();\r\n } else {\r\n this._dominantDirectionPT.getEffect().executeWhenCompiled(() => {\r\n this._dominantDirectionPT.render();\r\n });\r\n }\r\n } else {\r\n this.onGeneratedObservable.addOnce(() => {\r\n if (this._dominantDirectionPT.isReady()) {\r\n this._dominantDirectionPT.render();\r\n } else {\r\n this._dominantDirectionPT.getEffect().executeWhenCompiled(() => {\r\n this._dominantDirectionPT.render();\r\n });\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Disposes the CDF renderer and associated resources\r\n */\r\n public dispose() {\r\n this._disposeTextures();\r\n this._dummyTexture.dispose();\r\n if (this._debugPass) {\r\n this._debugPass.dispose();\r\n }\r\n this.onGeneratedObservable.clear();\r\n }\r\n\r\n private static _IsScene(sceneOrEngine: Scene | AbstractEngine): sceneOrEngine is Scene {\r\n return sceneOrEngine.getClassName() === \"Scene\";\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"iblCdfGenerator.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/iblCdfGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIjD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAA0C,MAAM,qDAAqD,CAAC;AAChI,OAAO,EAAE,WAAW,EAA2B,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;GAEG;AACH,MAAM,OAAO,eAAe;IAgBxB;;OAEG;IACH,IAAW,WAAW;QAClB,MAAM,MAAM,GAAG,WAAW,CAAC,iBAAiB,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAW,SAAS,CAAC,MAA6B;QAC9C,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;YAC7B,OAAO;QACX,CAAC;QAED,IAAI,CAAC,iCAAiC,EAAE,CAAC;QACzC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;QAEzB,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QAED,MAAM,iCAAiC,GAAG,GAAG,EAAE;YAC3C,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChE,OAAO;YACX,CAAC;YAED,IAAI,CAAC,iCAAiC,EAAE,CAAC;YACzC,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACrC,CAAC,CAAC;QAEF,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACjC,OAAO;QACX,CAAC;QAED,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;YACpF,IAAI,QAAQ,EAAE,CAAC;gBACX,IAAI,CAAC,yBAAyB,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACpF,CAAC;QACL,CAAC;aAAM,IAAI,MAAM,YAAY,WAAW,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;YACpF,IAAI,QAAQ,EAAE,CAAC;gBACX,IAAI,CAAC,yBAAyB,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACpF,CAAC;QACL,CAAC;QAED,IAAI,CAAC,4BAA4B,GAAG,kBAAkB,CAClD,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,MAAM,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAClE,iCAAiC,EACjC,SAAS,EACT,EAAE,EACF,KAAK,EACL,KAAK,CACR,CAAC;IACN,CAAC;IAEO,iBAAiB,CAAC,MAAmB;QACzC,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,eAAe,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;QACpD,OAAO,CAAC,CAAC,eAAe,IAAI,eAAe,CAAC,OAAO,CAAC;IACxD,CAAC;IAEO,iCAAiC;QACrC,IAAI,CAAC,4BAA4B,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC;QAEzC,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC;QACnC,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;IAC1C,CAAC;IAEO,yBAAyB;QAC7B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,sDAAsD;YACtD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,cAAc;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;IAC5D,CAAC;IAOD;;;;;;OAMG;IACI,qBAAqB,CAAC,CAAS,EAAE,CAAS,EAAE,UAAkB,EAAE,WAAmB;QACtF,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAGD;;;OAGG;IACI,cAAc;QACjB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IASD;;;;OAIG;IACH,YAAY,aAA+C;QArKnD,8BAAyB,GAAyB,IAAI,CAAC;QACvD,iCAA4B,GAAyB,IAAI,CAAC;QAE1D,6BAAwB,GAAsB,IAAI,CAAC;QAmH3D,0CAA0C;QACnC,iBAAY,GAAY,KAAK,CAAC;QAE7B,qBAAgB,GAAY,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAmB5D,mBAAc,GAAW,WAAW,CAAC;QAiD7C;;WAEG;QACI,0BAAqB,GAAqB,IAAI,UAAU,EAAQ,CAAC;QAExE;;;;WAIG;QACI,+BAA0B,GAAqB,IAAI,UAAU,EAAQ,CAAC;QAjCzE,IAAI,aAAa,EAAE,CAAC;YAChB,IAAI,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC;YACjC,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,gBAAgB,CAAC;QAC/C,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;YACpE,OAAO;QACX,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,aAAa,GAAG,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,kBAAkB,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC/J,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,eAAe,CAAC,6BAA6B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;IAcO,eAAe;QACnB,MAAM,IAAI,GAAgB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAC3J,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,cAAc,CACvC,IAAI,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,EACrB,CAAC,EACD,CAAC,EACD,IAAI,CAAC,OAAO,EACZ,KAAK,EACL,KAAK,EACL,SAAS,CAAC,4BAA4B,EACtC,SAAS,CAAC,yBAAyB,CACtC,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACpD,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAChB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YACjB,iEAAiE;YACjE,qEAAqE;YACrE,yEAAyE;YACzE,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QACvC,sFAAsF;QACtF,MAAM,UAAU,GAAsC;YAClD,mBAAmB,EAAE,KAAK;YAC1B,eAAe,EAAE,KAAK;YACtB,MAAM,EAAE,SAAS,CAAC,eAAe;YACjC,IAAI,EAAE,SAAS,CAAC,iBAAiB;YACjC,YAAY,EAAE,SAAS,CAAC,4BAA4B;YACpD,cAAc,EAAE,QAAQ,CAAC,CAAC,6BAAqB,CAAC,4BAAoB;YACpE,UAAU,EAAE,KAAK;YACjB,yBAAyB,EAAE,KAAK,IAAI,EAAE;gBAClC,IAAI,QAAQ,EAAE,CAAC;oBACX,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,iCAAiC,CAAC,EAAE,MAAM,CAAC,iCAAiC,CAAC,EAAE,MAAM,CAAC,4CAA4C,CAAC,CAAC,CAAC,CAAC;gBACpK,CAAC;qBAAM,CAAC;oBACJ,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,6BAA6B,CAAC,EAAE,MAAM,CAAC,6BAA6B,CAAC,EAAE,MAAM,CAAC,wCAAwC,CAAC,CAAC,CAAC,CAAC;gBACxJ,CAAC;YACL,CAAC;SACJ,CAAC;QACF,MAAM,WAAW,GAAsC;YACnD,mBAAmB,EAAE,KAAK;YAC1B,eAAe,EAAE,KAAK;YACtB,MAAM,EAAE,SAAS,CAAC,kBAAkB;YACpC,IAAI,EAAE,SAAS,CAAC,sBAAsB;YACtC,YAAY,EAAE,SAAS,CAAC,4BAA4B;YACpD,cAAc,EAAE,QAAQ,CAAC,CAAC,6BAAqB,CAAC,4BAAoB;YACpE,UAAU,EAAE,KAAK;YACjB,yBAAyB,EAAE,KAAK,IAAI,EAAE;gBAClC,IAAI,QAAQ,EAAE,CAAC;oBACX,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,iCAAiC,CAAC,EAAE,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC,CAAC;gBAC3H,CAAC;qBAAM,CAAC;oBACJ,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,6BAA6B,CAAC,EAAE,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC,CAAC;gBACnH,CAAC;YACL,CAAC;SACJ,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACtJ,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,yBAAyB,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,4BAA4B,CAAC;QACxD,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5I,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,yBAAyB,CAAC;QAEzD,IAAI,CAAC,kBAAkB,GAAG,IAAI,iBAAiB,CAC3C,oBAAoB,EACpB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAC1C,oBAAoB,EACpB,IAAI,CAAC,MAAM,EACX,EAAE,GAAG,UAAU,EAAE,YAAY,EAAE,SAAS,CAAC,8BAA8B,EAAE,eAAe,EAAE,IAAI,EAAE,EAChG,IAAI,EACJ,KAAK,CACR,CAAC;QACF,IAAI,CAAC,kBAAkB,CAAC,SAAS,GAAG,KAAK,CAAC;QAC1C,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,kBAAkB,CAAC,WAAW,GAAG,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,kBAAkB,CAAC,OAAO,GAAG,4BAA4B,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACnJ,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,wBAAwB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC3E,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,yBAAyB,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,yBAAyB,CAAC;QACzD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,4BAA4B,CAAC;QACxD,CAAC;QACD,sEAAsE;QACtE,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,GAAG,EAAE;YAC5C,IAAI,CAAC,qBAAqB,CAAC,eAAe,EAAE,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,oBAAoB,GAAG,IAAI,iBAAiB,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,sBAAsB,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACnK,IAAI,CAAC,oBAAoB,CAAC,SAAS,GAAG,KAAK,CAAC;QAC5C,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAClE,IAAI,CAAC,oBAAoB,CAAC,WAAW,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,oBAAoB,CAAC,OAAO,GAAG,2BAA2B,CAAC;QAEhE,IAAI,CAAC,0BAA0B,CAAC,eAAe,EAAE,CAAC;IACtD,CAAC;IAEO,gBAAgB;QACpB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,CAAC;QACnC,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,CAAC,0BAA0B,CAAC,eAAe,EAAE,CAAC;IACtD,CAAC;IAEO,gBAAgB;QACpB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QACvC,MAAM,YAAY,GAAuB;YACrC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;YACpC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;YACtC,YAAY,EAAE,OAAO,CAAC,qBAAqB;YAC3C,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,WAAW,EAAE,SAAS,CAAC,yBAAyB;YAChD,QAAQ,EAAE,CAAC,YAAY,CAAC;YACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC;YAC/C,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE;YACpE,cAAc,EAAE,QAAQ,CAAC,CAAC,6BAAqB,CAAC,4BAAoB;YACpE,oBAAoB,EAAE,CAAC,SAAkB,EAAE,IAAoB,EAAE,EAAE;gBAC/D,IAAI,SAAS,EAAE,CAAC;oBACZ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,qCAAqC,CAAC,CAAC,CAAC;gBAC7D,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACzD,CAAC;YACL,CAAC;SACJ,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;QACpF,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAChD,IAAI,WAAW,EAAE,CAAC;YACd,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,4BAA4B,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7C,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAChD,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACvI,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;OAGG;IACI,OAAO;QACV,OAAO,CACH,IAAI,CAAC,UAAU;YACf,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,wBAAwB;YACjD,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;YACzB,IAAI,CAAC,OAAO;YACZ,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACtB,IAAI,CAAC,OAAO;YACZ,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACtB,IAAI,CAAC,OAAO;YACZ,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACtB,IAAI,CAAC,kBAAkB;YACvB,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CACpC,CAAC;IACN,CAAC;IAED;;;OAGG;IACH,qEAAqE;IAC9D,eAAe;QAClB,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;QACrC,+JAA+J;QAC/J,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClD,kBAAkB,CACd,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EACpB,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EACrB,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,CACjE,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,qFAAqF;QACrF,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE;YAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC;YACjC,MAAM,QAAQ,GAAyB,EAAE,CAAC;YAC1C,MAAM,aAAa,GAA6B,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAY,CAAC,CAAC;YACpH,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;gBACjC,QAAQ,CAAC,IAAI,CACT,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBACpB,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;wBACnB,OAAO,EAAE,CAAC;oBACd,CAAC;yBAAM,CAAC;wBACJ,MAAM,CAAC,SAAS,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE;4BACxC,OAAO,EAAE,CAAC;wBACd,CAAC,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC,CAAC,CACL,CAAC;YACN,CAAC;YACD,0CAA0C;YAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBACnC,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;oBACjC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACpB,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;OAGG;IACH,qEAAqE;IAC9D,qBAAqB;QACxB,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,OAAO,CAAC,GAAG,EAAE;gBACzD,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;gBACjC,mFAAmF;gBACnF,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAE,CAAC,IAAI,CAAC,GAAG,EAAE;oBAC9D,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACjE,IAAI,CAAC,wBAAwB,GAAG,iBAAiB,CAAC;oBAClD,OAAO,CAAC,iBAAiB,CAAC,CAAC;gBAC/B,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;gBACjB,IAAI,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,EAAE,CAAC;oBACtC,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE;wBAC3D,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC;oBACvC,CAAC,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,GAAG,EAAE;oBACpC,IAAI,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,EAAE,CAAC;wBACtC,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC;oBACvC,CAAC;yBAAM,CAAC;wBACJ,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE;4BAC3D,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC;wBACvC,CAAC,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,iCAAiC,EAAE,CAAC;QACzC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAEO,MAAM,CAAC,QAAQ,CAAC,aAAqC;QACzD,OAAO,aAAa,CAAC,YAAY,EAAE,KAAK,OAAO,CAAC;IACpD,CAAC;;AAhVD;;GAEG;AACW,6CAA6B,GAA2B,CAAC,CAAC,EAAE,EAAE;IACxE,MAAM,WAAW,CAAC,6CAA6C,CAAC,CAAC;AACrE,CAAC,AAF0C,CAEzC","sourcesContent":["import { Constants } from \"../Engines/constants\";\r\nimport { type AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\nimport { type Scene } from \"../scene\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { type TextureSize } from \"../Materials/Textures/textureCreationOptions\";\r\nimport { ProceduralTexture, type IProceduralTextureCreationOptions } from \"../Materials/Textures/Procedurals/proceduralTexture\";\r\nimport { PostProcess, type PostProcessOptions } from \"../PostProcesses/postProcess\";\r\nimport { Vector3, Vector4 } from \"../Maths/math.vector\";\r\nimport { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport { type BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { CubeTexture } from \"../Materials/Textures/cubeTexture\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport { type Nullable } from \"../types\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { _RetryWithInterval } from \"../Misc/timingTools\";\r\n\r\n/**\r\n * Build cdf maps to be used for IBL importance sampling.\r\n */\r\nexport class IblCdfGenerator {\r\n private _scene: Nullable<Scene>;\r\n private _engine: AbstractEngine;\r\n\r\n private _cdfyPT: ProceduralTexture;\r\n private _cdfxPT: ProceduralTexture;\r\n private _icdfPT: Nullable<ProceduralTexture>;\r\n private _scaledLuminancePT: ProceduralTexture;\r\n private _dominantDirectionPT: ProceduralTexture;\r\n private _iblSource: Nullable<BaseTexture>;\r\n private _dummyTexture: RawTexture;\r\n private _iblSourceLoadUnsubscribe: Nullable<() => void> = null;\r\n private _iblSourceReadyRetryObserver: Nullable<() => void> = null;\r\n\r\n private _cachedDominantDirection: Nullable<Vector3> = null;\r\n\r\n /**\r\n * Returns whether the CDF renderer is supported by the current engine\r\n */\r\n public get isSupported(): boolean {\r\n const engine = EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n return false;\r\n }\r\n return engine.getCaps().texelFetch;\r\n }\r\n\r\n /**\r\n * Gets the IBL source texture being used by the CDF renderer\r\n */\r\n public get iblSource(): Nullable<BaseTexture> {\r\n return this._iblSource;\r\n }\r\n\r\n /**\r\n * Sets the IBL source texture to be used by the CDF renderer.\r\n * This will trigger recreation of the CDF assets.\r\n */\r\n public set iblSource(source: Nullable<BaseTexture>) {\r\n if (this._iblSource === source) {\r\n return;\r\n }\r\n\r\n this._clearIblSourceReadinessObservers();\r\n this._disposeTextures();\r\n this._iblSource = source;\r\n\r\n if (!source) {\r\n return;\r\n }\r\n\r\n const recreateFromObservedSourceIfReady = () => {\r\n if (this._iblSource !== source || !this._isIblSourceReady(source)) {\r\n return;\r\n }\r\n\r\n this._clearIblSourceReadinessObservers();\r\n this._recreateAssetsFromNewIbl();\r\n };\r\n\r\n if (this._isIblSourceReady(source)) {\r\n this._recreateAssetsFromNewIbl();\r\n return;\r\n }\r\n\r\n if (source instanceof Texture) {\r\n const observer = source.onLoadObservable.addOnce(recreateFromObservedSourceIfReady);\r\n if (observer) {\r\n this._iblSourceLoadUnsubscribe = () => source.onLoadObservable.remove(observer);\r\n }\r\n } else if (source instanceof CubeTexture) {\r\n const observer = source.onLoadObservable.addOnce(recreateFromObservedSourceIfReady);\r\n if (observer) {\r\n this._iblSourceLoadUnsubscribe = () => source.onLoadObservable.remove(observer);\r\n }\r\n }\r\n\r\n this._iblSourceReadyRetryObserver = _RetryWithInterval(\r\n () => this._iblSource !== source || this._isIblSourceReady(source),\r\n recreateFromObservedSourceIfReady,\r\n undefined,\r\n 16,\r\n 30000,\r\n false\r\n );\r\n }\r\n\r\n private _isIblSourceReady(source: BaseTexture): boolean {\r\n if (!source.isReadyOrNotBlocking()) {\r\n return false;\r\n }\r\n\r\n if (!source.isCube) {\r\n return true;\r\n }\r\n\r\n const internalTexture = source.getInternalTexture();\r\n return !!internalTexture && internalTexture.isReady;\r\n }\r\n\r\n private _clearIblSourceReadinessObservers() {\r\n this._iblSourceReadyRetryObserver?.();\r\n this._iblSourceReadyRetryObserver = null;\r\n\r\n this._iblSourceLoadUnsubscribe?.();\r\n this._iblSourceLoadUnsubscribe = null;\r\n }\r\n\r\n private _recreateAssetsFromNewIbl() {\r\n if (this._debugPass) {\r\n this._debugPass.dispose();\r\n }\r\n\r\n this._createTextures();\r\n\r\n if (this._debugPass) {\r\n // Recreate the debug pass because of the new textures\r\n this._createDebugPass();\r\n }\r\n }\r\n\r\n /**\r\n * Return the cumulative distribution function (CDF) texture\r\n * @returns Return the cumulative distribution function (CDF) texture\r\n */\r\n public getIcdfTexture(): Texture {\r\n return this._icdfPT ? this._icdfPT : this._dummyTexture;\r\n }\r\n\r\n /** Enable the debug view for this pass */\r\n public debugEnabled: boolean = false;\r\n private _debugPass: PostProcess;\r\n private _debugSizeParams: Vector4 = new Vector4(0.0, 0.0, 1.0, 1.0);\r\n\r\n /**\r\n * Sets params that control the position and scaling of the debug display on the screen.\r\n * @param x Screen X offset of the debug display (0-1)\r\n * @param y Screen Y offset of the debug display (0-1)\r\n * @param widthScale X scale of the debug display (0-1)\r\n * @param heightScale Y scale of the debug display (0-1)\r\n */\r\n public setDebugDisplayParams(x: number, y: number, widthScale: number, heightScale: number) {\r\n this._debugSizeParams.set(x, y, widthScale, heightScale);\r\n }\r\n\r\n /**\r\n * The name of the debug pass post process\r\n */\r\n public get debugPassName(): string {\r\n return this._debugPassName;\r\n }\r\n private _debugPassName: string = \"CDF Debug\";\r\n\r\n /**\r\n * Gets the debug pass post process\r\n * @returns The post process\r\n */\r\n public getDebugPassPP(): PostProcess {\r\n if (!this._debugPass) {\r\n this._createDebugPass();\r\n }\r\n return this._debugPass;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _SceneComponentInitialization: (scene: Scene) => void = (_) => {\r\n throw _WarnImport(\"IblCdfGeneratorSceneComponentSceneComponent\");\r\n };\r\n\r\n /**\r\n * Instanciates the CDF renderer\r\n * @param sceneOrEngine Scene to attach to\r\n * @returns The CDF renderer\r\n */\r\n constructor(sceneOrEngine: Nullable<Scene | AbstractEngine>) {\r\n if (sceneOrEngine) {\r\n if (IblCdfGenerator._IsScene(sceneOrEngine)) {\r\n this._scene = sceneOrEngine;\r\n } else {\r\n this._engine = sceneOrEngine;\r\n }\r\n } else {\r\n this._scene = EngineStore.LastCreatedScene;\r\n }\r\n if (this._scene) {\r\n this._engine = this._scene.getEngine();\r\n }\r\n if (!this.isSupported) {\r\n Logger.Warn(\"CDF renderer is not supported by the current engine.\");\r\n return;\r\n }\r\n const blackPixels = new Uint16Array([0, 0, 0, 255]);\r\n this._dummyTexture = new RawTexture(blackPixels, 1, 1, Constants.TEXTUREFORMAT_RGBA, sceneOrEngine, false, false, undefined, Constants.TEXTURETYPE_HALF_FLOAT);\r\n if (this._scene) {\r\n IblCdfGenerator._SceneComponentInitialization(this._scene);\r\n }\r\n }\r\n\r\n /**\r\n * Observable that triggers when the CDF renderer is ready\r\n */\r\n public onGeneratedObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * Observable that triggers when CDF texture references change.\r\n * It is raised after disposing textures (so fallback ICDF can be used)\r\n * and after creating new textures (so consumers can rebind immediately).\r\n */\r\n public onTextureChangedObservable: Observable<void> = new Observable<void>();\r\n\r\n private _createTextures() {\r\n const size: TextureSize = this._iblSource ? { width: this._iblSource.getSize().width, height: this._iblSource.getSize().height } : { width: 1, height: 1 };\r\n if (!this._iblSource) {\r\n this._iblSource = RawTexture.CreateRTexture(\r\n new Uint8Array([255]),\r\n 1,\r\n 1,\r\n this._engine,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE\r\n );\r\n this._iblSource.name = \"Placeholder IBL Source\";\r\n }\r\n if (this._iblSource.isCube) {\r\n size.width *= 4;\r\n size.height *= 2;\r\n // Force the resolution to be a power of 2 because we rely on the\r\n // auto-mipmap generation for the scaled luminance texture to produce\r\n // a 1x1 mip that represents the true average pixel intensity of the IBL.\r\n size.width = 1 << Math.floor(Math.log2(size.width));\r\n size.height = 1 << Math.floor(Math.log2(size.height));\r\n }\r\n\r\n const isWebGPU = this._engine.isWebGPU;\r\n // Create CDF maps (Cumulative Distribution Function) to assist in importance sampling\r\n const cdfOptions: IProceduralTextureCreationOptions = {\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n format: Constants.TEXTUREFORMAT_R,\r\n type: Constants.TEXTURETYPE_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n gammaSpace: false,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../ShadersWGSL/iblCdfx.fragment\"), import(\"../ShadersWGSL/iblCdfy.fragment\"), import(\"../ShadersWGSL/iblScaledLuminance.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/iblCdfx.fragment\"), import(\"../Shaders/iblCdfy.fragment\"), import(\"../Shaders/iblScaledLuminance.fragment\")]);\r\n }\r\n },\r\n };\r\n const icdfOptions: IProceduralTextureCreationOptions = {\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n gammaSpace: false,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../ShadersWGSL/iblIcdf.fragment\"), import(\"../ShadersWGSL/iblDominantDirection.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/iblIcdf.fragment\"), import(\"../Shaders/iblDominantDirection.fragment\")]);\r\n }\r\n },\r\n };\r\n this._cdfyPT = new ProceduralTexture(\"cdfyTexture\", { width: size.width, height: size.height + 1 }, \"iblCdfy\", this._scene, cdfOptions, false, false);\r\n this._cdfyPT.autoClear = false;\r\n this._cdfyPT.setTexture(\"iblSource\", this._iblSource);\r\n this._cdfyPT.setInt(\"iblHeight\", size.height);\r\n this._cdfyPT.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._cdfyPT.refreshRate = 0;\r\n if (this._iblSource.isCube) {\r\n this._cdfyPT.defines = \"#define IBL_USE_CUBE_MAP\\n\";\r\n }\r\n\r\n this._cdfxPT = new ProceduralTexture(\"cdfxTexture\", { width: size.width + 1, height: 1 }, \"iblCdfx\", this._scene, cdfOptions, false, false);\r\n this._cdfxPT.autoClear = false;\r\n this._cdfxPT.setTexture(\"cdfy\", this._cdfyPT);\r\n this._cdfxPT.refreshRate = 0;\r\n this._cdfxPT.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n\r\n this._scaledLuminancePT = new ProceduralTexture(\r\n \"iblScaledLuminance\",\r\n { width: size.width, height: size.height },\r\n \"iblScaledLuminance\",\r\n this._scene,\r\n { ...cdfOptions, samplingMode: Constants.TEXTURE_TRILINEAR_SAMPLINGMODE, generateMipMaps: true },\r\n true,\r\n false\r\n );\r\n this._scaledLuminancePT.autoClear = false;\r\n this._scaledLuminancePT.setTexture(\"iblSource\", this._iblSource);\r\n this._scaledLuminancePT.setInt(\"iblHeight\", size.height);\r\n this._scaledLuminancePT.setInt(\"iblWidth\", size.width);\r\n this._scaledLuminancePT.refreshRate = 0;\r\n if (this._iblSource.isCube) {\r\n this._scaledLuminancePT.defines = \"#define IBL_USE_CUBE_MAP\\n\";\r\n }\r\n this._icdfPT = new ProceduralTexture(\"icdfTexture\", { width: size.width, height: size.height }, \"iblIcdf\", this._scene, icdfOptions, false, false);\r\n this._icdfPT.autoClear = false;\r\n this._icdfPT.setTexture(\"cdfy\", this._cdfyPT);\r\n this._icdfPT.setTexture(\"cdfx\", this._cdfxPT);\r\n this._icdfPT.setTexture(\"iblSource\", this._iblSource);\r\n this._icdfPT.setTexture(\"scaledLuminanceSampler\", this._scaledLuminancePT);\r\n this._icdfPT.refreshRate = 0;\r\n this._icdfPT.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._icdfPT.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n if (this._iblSource.isCube) {\r\n this._icdfPT.defines = \"#define IBL_USE_CUBE_MAP\\n\";\r\n }\r\n // Once the textures are generated, notify that they are ready to use.\r\n this._icdfPT.onGeneratedObservable.addOnce(() => {\r\n this.onGeneratedObservable.notifyObservers();\r\n });\r\n\r\n this._dominantDirectionPT = new ProceduralTexture(\"iblDominantDirection\", { width: 1, height: 1 }, \"iblDominantDirection\", this._scene, icdfOptions, false, false);\r\n this._dominantDirectionPT.autoClear = false;\r\n this._dominantDirectionPT.setTexture(\"icdfSampler\", this._icdfPT);\r\n this._dominantDirectionPT.refreshRate = 0;\r\n this._dominantDirectionPT.defines = \"#define NUM_SAMPLES 32u\\n\";\r\n\r\n this.onTextureChangedObservable.notifyObservers();\r\n }\r\n\r\n private _disposeTextures() {\r\n this._cdfyPT?.dispose();\r\n this._cdfxPT?.dispose();\r\n this._icdfPT?.dispose();\r\n this._scaledLuminancePT?.dispose();\r\n this._dominantDirectionPT?.dispose();\r\n this._icdfPT = null;\r\n\r\n this.onTextureChangedObservable.notifyObservers();\r\n }\r\n\r\n private _createDebugPass() {\r\n if (this._debugPass) {\r\n this._debugPass.dispose();\r\n }\r\n const isWebGPU = this._engine.isWebGPU;\r\n const debugOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n samplingMode: Texture.BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n uniforms: [\"sizeParams\"],\r\n samplers: [\"cdfy\", \"icdf\", \"cdfx\", \"iblSource\"],\r\n defines: this._iblSource?.isCube ? \"#define IBL_USE_CUBE_MAP\\n\" : \"\",\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (useWebGPU: boolean, list: Promise<any>[]) => {\r\n if (useWebGPU) {\r\n list.push(import(\"../ShadersWGSL/iblCdfDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/iblCdfDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._debugPass = new PostProcess(this._debugPassName, \"iblCdfDebug\", debugOptions);\r\n const debugEffect = this._debugPass.getEffect();\r\n if (debugEffect) {\r\n debugEffect.defines = this._iblSource?.isCube ? \"#define IBL_USE_CUBE_MAP\\n\" : \"\";\r\n }\r\n if (this._iblSource?.isCube) {\r\n this._debugPass.updateEffect(\"#define IBL_USE_CUBE_MAP\\n\");\r\n }\r\n this._debugPass.onApplyObservable.add((effect) => {\r\n effect.setTexture(\"cdfy\", this._cdfyPT);\r\n effect.setTexture(\"icdf\", this._icdfPT);\r\n effect.setTexture(\"cdfx\", this._cdfxPT);\r\n effect.setTexture(\"iblSource\", this._iblSource);\r\n effect.setFloat4(\"sizeParams\", this._debugSizeParams.x, this._debugSizeParams.y, this._debugSizeParams.z, this._debugSizeParams.w);\r\n });\r\n }\r\n\r\n /**\r\n * Checks if the CDF renderer is ready\r\n * @returns true if the CDF renderer is ready\r\n */\r\n public isReady() {\r\n return (\r\n this._iblSource &&\r\n this._iblSource.name !== \"Placeholder IBL Source\" &&\r\n this._iblSource.isReady() &&\r\n this._cdfyPT &&\r\n this._cdfyPT.isReady() &&\r\n this._icdfPT &&\r\n this._icdfPT.isReady() &&\r\n this._cdfxPT &&\r\n this._cdfxPT.isReady() &&\r\n this._scaledLuminancePT &&\r\n this._scaledLuminancePT.isReady()\r\n );\r\n }\r\n\r\n /**\r\n * Explicitly trigger generation of CDF maps when they are ready to render.\r\n * @returns Promise that resolves when the CDF maps are rendered.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n public renderWhenReady(): Promise<void> {\r\n this._cachedDominantDirection = null;\r\n // Even if a IBL source must be set before calling this function, _icdfPT may not yet be created because the creation may be asynchronous (see @set iblSource).\r\n const icdfPTPromise = new Promise((resolve, reject) => {\r\n _RetryWithInterval(\r\n () => !!this._icdfPT,\r\n () => resolve(void 0),\r\n () => reject(new Error(\"Waiting for _icdfPT creation failed\"))\r\n );\r\n });\r\n\r\n // eslint-disable-next-line github/no-then, @typescript-eslint/promise-function-async\r\n return icdfPTPromise.then(() => {\r\n const icdfTexture = this._icdfPT;\r\n const promises: Array<Promise<void>> = [];\r\n const renderTargets: Array<ProceduralTexture> = [this._cdfyPT, this._cdfxPT, this._scaledLuminancePT, icdfTexture!];\r\n for (const target of renderTargets) {\r\n promises.push(\r\n new Promise((resolve) => {\r\n if (target.isReady()) {\r\n resolve();\r\n } else {\r\n target.getEffect().executeWhenCompiled(() => {\r\n resolve();\r\n });\r\n }\r\n })\r\n );\r\n }\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(promises).then(() => {\r\n for (const target of renderTargets) {\r\n target.render();\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Finds the average direction of the highest intensity areas of the IBL source\r\n * @returns Async promise that resolves to the dominant direction of the IBL source\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n public findDominantDirection(): Promise<Vector3> {\r\n if (this._cachedDominantDirection) {\r\n return Promise.resolve(this._cachedDominantDirection);\r\n }\r\n return new Promise((resolve) => {\r\n this._dominantDirectionPT.onGeneratedObservable.addOnce(() => {\r\n const data = new Float32Array(4);\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n this._dominantDirectionPT.readPixels(0, 0, data, true)!.then(() => {\r\n const dominantDirection = new Vector3(data[0], data[1], data[2]);\r\n this._cachedDominantDirection = dominantDirection;\r\n resolve(dominantDirection);\r\n });\r\n });\r\n if (this.isReady()) {\r\n if (this._dominantDirectionPT.isReady()) {\r\n this._dominantDirectionPT.render();\r\n } else {\r\n this._dominantDirectionPT.getEffect().executeWhenCompiled(() => {\r\n this._dominantDirectionPT.render();\r\n });\r\n }\r\n } else {\r\n this.onGeneratedObservable.addOnce(() => {\r\n if (this._dominantDirectionPT.isReady()) {\r\n this._dominantDirectionPT.render();\r\n } else {\r\n this._dominantDirectionPT.getEffect().executeWhenCompiled(() => {\r\n this._dominantDirectionPT.render();\r\n });\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Disposes the CDF renderer and associated resources\r\n */\r\n public dispose() {\r\n this._clearIblSourceReadinessObservers();\r\n this._disposeTextures();\r\n this._dummyTexture.dispose();\r\n if (this._debugPass) {\r\n this._debugPass.dispose();\r\n }\r\n this.onGeneratedObservable.clear();\r\n }\r\n\r\n private static _IsScene(sceneOrEngine: Scene | AbstractEngine): sceneOrEngine is Scene {\r\n return sceneOrEngine.getClassName() === \"Scene\";\r\n }\r\n}\r\n"]}
@@ -77,12 +77,6 @@ export * from "../Shaders/iblVoxelGrid.fragment.js";
77
77
  export * from "../Shaders/iblVoxelGrid.vertex.js";
78
78
  export * from "../ShadersWGSL/iblVoxelGrid.fragment.js";
79
79
  export * from "../ShadersWGSL/iblVoxelGrid.vertex.js";
80
- export * from "../Shaders/iblVoxelGrid3dDebug.fragment.js";
81
- export * from "../ShadersWGSL/iblVoxelGrid3dDebug.fragment.js";
82
- export * from "../Shaders/iblVoxelSlabDebug.vertex.js";
83
- export * from "../Shaders/iblVoxelSlabDebug.fragment.js";
84
- export * from "../ShadersWGSL/iblVoxelSlabDebug.vertex.js";
85
- export * from "../ShadersWGSL/iblVoxelSlabDebug.fragment.js";
86
80
  export * from "../Shaders/oitBackBlend.fragment.js";
87
81
  export * from "../Shaders/oitFinal.fragment.js";
88
82
  export * from "../ShadersWGSL/oitBackBlend.fragment.js";
@@ -84,12 +84,6 @@ export * from "../Shaders/iblVoxelGrid.fragment.js";
84
84
  export * from "../Shaders/iblVoxelGrid.vertex.js";
85
85
  export * from "../ShadersWGSL/iblVoxelGrid.fragment.js";
86
86
  export * from "../ShadersWGSL/iblVoxelGrid.vertex.js";
87
- export * from "../Shaders/iblVoxelGrid3dDebug.fragment.js";
88
- export * from "../ShadersWGSL/iblVoxelGrid3dDebug.fragment.js";
89
- export * from "../Shaders/iblVoxelSlabDebug.vertex.js";
90
- export * from "../Shaders/iblVoxelSlabDebug.fragment.js";
91
- export * from "../ShadersWGSL/iblVoxelSlabDebug.vertex.js";
92
- export * from "../ShadersWGSL/iblVoxelSlabDebug.fragment.js";
93
87
  // Depth Peeling Renderer
94
88
  export * from "../Shaders/oitBackBlend.fragment.js";
95
89
  export * from "../Shaders/oitFinal.fragment.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/index.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nexport * from \"./boundingBoxRenderer\";\r\nexport * from \"./depthRenderer\";\r\nexport * from \"./depthRendererSceneComponent\";\r\nexport * from \"./depthPeelingRenderer\";\r\nexport * from \"./thinDepthPeelingRenderer\";\r\nexport * from \"./depthPeelingSceneComponent\";\r\nexport * from \"./edgesRenderer\";\r\nexport * from \"./geometryBufferRenderer\";\r\nexport * from \"./geometryBufferRendererSceneComponent\";\r\nexport * from \"./iblCdfGenerator\";\r\nexport * from \"./iblCdfGeneratorSceneComponent\";\r\nexport * from \"./IBLShadows/iblShadowsRenderPipeline\";\r\nexport * from \"./prePassRenderer\";\r\nexport * from \"./prePassRendererSceneComponent\";\r\nexport * from \"./subSurfaceSceneComponent\";\r\nexport * from \"./outlineRenderer\";\r\nexport * from \"./renderingGroup\";\r\nexport * from \"./renderingManager\";\r\nexport * from \"./utilityLayerRenderer\";\r\nexport * from \"./fluidRenderer/index\";\r\nexport * from \"./reflectiveShadowMap\";\r\nexport * from \"./objectRenderer\";\r\nexport * from \"./GlobalIllumination/index\";\r\n\r\n// Depth\r\nexport * from \"../Shaders/depth.fragment\";\r\nexport * from \"../Shaders/depth.vertex\";\r\nexport * from \"../ShadersWGSL/depth.fragment\";\r\nexport * from \"../ShadersWGSL/depth.vertex\";\r\n\r\n// Geometry\r\nexport * from \"../Shaders/geometry.fragment\";\r\nexport * from \"../Shaders/geometry.vertex\";\r\nexport * from \"../ShadersWGSL/geometry.fragment\";\r\nexport * from \"../ShadersWGSL/geometry.vertex\";\r\n\r\n// Bounding Box Renderer\r\nexport * from \"../Shaders/boundingBoxRenderer.fragment\";\r\nexport * from \"../Shaders/boundingBoxRenderer.vertex\";\r\nexport * from \"../ShadersWGSL/boundingBoxRenderer.fragment\";\r\nexport * from \"../ShadersWGSL/boundingBoxRenderer.vertex\";\r\n\r\n// Edges Renderer\r\nexport * from \"../Shaders/line.fragment\";\r\nexport * from \"../Shaders/line.vertex\";\r\nexport * from \"../ShadersWGSL/line.fragment\";\r\nexport * from \"../ShadersWGSL/line.vertex\";\r\n\r\n// Outline Renderer\r\nexport * from \"../Shaders/outline.fragment\";\r\nexport * from \"../Shaders/outline.vertex\";\r\nexport * from \"../ShadersWGSL/outline.fragment\";\r\nexport * from \"../ShadersWGSL/outline.vertex\";\r\n\r\n// IBL Shadows\r\nexport * from \"../Shaders/copyTexture3DLayerToTexture.fragment\";\r\nexport * from \"../ShadersWGSL/copyTexture3DLayerToTexture.fragment\";\r\nexport * from \"../Shaders/iblShadowVoxelTracing.fragment\";\r\nexport * from \"../ShadersWGSL/iblShadowVoxelTracing.fragment\";\r\nexport * from \"../Shaders/iblShadowDebug.fragment\";\r\nexport * from \"../ShadersWGSL/iblShadowDebug.fragment\";\r\nexport * from \"../ShadersWGSL/iblShadowSpatialBlur.fragment\";\r\nexport * from \"../Shaders/iblShadowSpatialBlur.fragment\";\r\nexport * from \"../ShadersWGSL/iblShadowAccumulation.fragment\";\r\nexport * from \"../Shaders/iblShadowAccumulation.fragment\";\r\nexport * from \"../Shaders/iblShadowsCombine.fragment\";\r\nexport * from \"../ShadersWGSL/iblShadowsCombine.fragment\";\r\nexport * from \"../ShadersWGSL/iblCombineVoxelGrids.fragment\";\r\nexport * from \"../Shaders/iblCombineVoxelGrids.fragment\";\r\nexport * from \"../Shaders/iblGenerateVoxelMip.fragment\";\r\nexport * from \"../ShadersWGSL/iblGenerateVoxelMip.fragment\";\r\nexport * from \"../Shaders/iblShadowGBufferDebug.fragment\";\r\nexport * from \"../ShadersWGSL/iblShadowGBufferDebug.fragment\";\r\nexport * from \"../ShadersWGSL/iblCdfx.fragment\";\r\nexport * from \"../Shaders/iblCdfx.fragment\";\r\nexport * from \"../ShadersWGSL/iblCdfy.fragment\";\r\nexport * from \"../Shaders/iblCdfy.fragment\";\r\nexport * from \"../ShadersWGSL/iblIcdf.fragment\";\r\nexport * from \"../Shaders/iblIcdf.fragment\";\r\nexport * from \"../ShadersWGSL/iblCdfDebug.fragment\";\r\nexport * from \"../Shaders/iblCdfDebug.fragment\";\r\nexport * from \"../ShadersWGSL/iblScaledLuminance.fragment\";\r\nexport * from \"../Shaders/iblScaledLuminance.fragment\";\r\nexport * from \"../ShadersWGSL/iblDominantDirection.fragment\";\r\nexport * from \"../Shaders/iblDominantDirection.fragment\";\r\nexport * from \"../Shaders/iblVoxelGrid2dArrayDebug.fragment\";\r\nexport * from \"../ShadersWGSL/iblVoxelGrid2dArrayDebug.fragment\";\r\nexport * from \"../Shaders/iblVoxelGrid.fragment\";\r\nexport * from \"../Shaders/iblVoxelGrid.vertex\";\r\nexport * from \"../ShadersWGSL/iblVoxelGrid.fragment\";\r\nexport * from \"../ShadersWGSL/iblVoxelGrid.vertex\";\r\nexport * from \"../Shaders/iblVoxelGrid3dDebug.fragment\";\r\nexport * from \"../ShadersWGSL/iblVoxelGrid3dDebug.fragment\";\r\nexport * from \"../Shaders/iblVoxelSlabDebug.vertex\";\r\nexport * from \"../Shaders/iblVoxelSlabDebug.fragment\";\r\nexport * from \"../ShadersWGSL/iblVoxelSlabDebug.vertex\";\r\nexport * from \"../ShadersWGSL/iblVoxelSlabDebug.fragment\";\r\n\r\n// Depth Peeling Renderer\r\nexport * from \"../Shaders/oitBackBlend.fragment\";\r\nexport * from \"../Shaders/oitFinal.fragment\";\r\nexport * from \"../ShadersWGSL/oitBackBlend.fragment\";\r\nexport * from \"../ShadersWGSL/oitFinal.fragment\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/index.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nexport * from \"./boundingBoxRenderer\";\r\nexport * from \"./depthRenderer\";\r\nexport * from \"./depthRendererSceneComponent\";\r\nexport * from \"./depthPeelingRenderer\";\r\nexport * from \"./thinDepthPeelingRenderer\";\r\nexport * from \"./depthPeelingSceneComponent\";\r\nexport * from \"./edgesRenderer\";\r\nexport * from \"./geometryBufferRenderer\";\r\nexport * from \"./geometryBufferRendererSceneComponent\";\r\nexport * from \"./iblCdfGenerator\";\r\nexport * from \"./iblCdfGeneratorSceneComponent\";\r\nexport * from \"./IBLShadows/iblShadowsRenderPipeline\";\r\nexport * from \"./prePassRenderer\";\r\nexport * from \"./prePassRendererSceneComponent\";\r\nexport * from \"./subSurfaceSceneComponent\";\r\nexport * from \"./outlineRenderer\";\r\nexport * from \"./renderingGroup\";\r\nexport * from \"./renderingManager\";\r\nexport * from \"./utilityLayerRenderer\";\r\nexport * from \"./fluidRenderer/index\";\r\nexport * from \"./reflectiveShadowMap\";\r\nexport * from \"./objectRenderer\";\r\nexport * from \"./GlobalIllumination/index\";\r\n\r\n// Depth\r\nexport * from \"../Shaders/depth.fragment\";\r\nexport * from \"../Shaders/depth.vertex\";\r\nexport * from \"../ShadersWGSL/depth.fragment\";\r\nexport * from \"../ShadersWGSL/depth.vertex\";\r\n\r\n// Geometry\r\nexport * from \"../Shaders/geometry.fragment\";\r\nexport * from \"../Shaders/geometry.vertex\";\r\nexport * from \"../ShadersWGSL/geometry.fragment\";\r\nexport * from \"../ShadersWGSL/geometry.vertex\";\r\n\r\n// Bounding Box Renderer\r\nexport * from \"../Shaders/boundingBoxRenderer.fragment\";\r\nexport * from \"../Shaders/boundingBoxRenderer.vertex\";\r\nexport * from \"../ShadersWGSL/boundingBoxRenderer.fragment\";\r\nexport * from \"../ShadersWGSL/boundingBoxRenderer.vertex\";\r\n\r\n// Edges Renderer\r\nexport * from \"../Shaders/line.fragment\";\r\nexport * from \"../Shaders/line.vertex\";\r\nexport * from \"../ShadersWGSL/line.fragment\";\r\nexport * from \"../ShadersWGSL/line.vertex\";\r\n\r\n// Outline Renderer\r\nexport * from \"../Shaders/outline.fragment\";\r\nexport * from \"../Shaders/outline.vertex\";\r\nexport * from \"../ShadersWGSL/outline.fragment\";\r\nexport * from \"../ShadersWGSL/outline.vertex\";\r\n\r\n// IBL Shadows\r\nexport * from \"../Shaders/copyTexture3DLayerToTexture.fragment\";\r\nexport * from \"../ShadersWGSL/copyTexture3DLayerToTexture.fragment\";\r\nexport * from \"../Shaders/iblShadowVoxelTracing.fragment\";\r\nexport * from \"../ShadersWGSL/iblShadowVoxelTracing.fragment\";\r\nexport * from \"../Shaders/iblShadowDebug.fragment\";\r\nexport * from \"../ShadersWGSL/iblShadowDebug.fragment\";\r\nexport * from \"../ShadersWGSL/iblShadowSpatialBlur.fragment\";\r\nexport * from \"../Shaders/iblShadowSpatialBlur.fragment\";\r\nexport * from \"../ShadersWGSL/iblShadowAccumulation.fragment\";\r\nexport * from \"../Shaders/iblShadowAccumulation.fragment\";\r\nexport * from \"../Shaders/iblShadowsCombine.fragment\";\r\nexport * from \"../ShadersWGSL/iblShadowsCombine.fragment\";\r\nexport * from \"../ShadersWGSL/iblCombineVoxelGrids.fragment\";\r\nexport * from \"../Shaders/iblCombineVoxelGrids.fragment\";\r\nexport * from \"../Shaders/iblGenerateVoxelMip.fragment\";\r\nexport * from \"../ShadersWGSL/iblGenerateVoxelMip.fragment\";\r\nexport * from \"../Shaders/iblShadowGBufferDebug.fragment\";\r\nexport * from \"../ShadersWGSL/iblShadowGBufferDebug.fragment\";\r\nexport * from \"../ShadersWGSL/iblCdfx.fragment\";\r\nexport * from \"../Shaders/iblCdfx.fragment\";\r\nexport * from \"../ShadersWGSL/iblCdfy.fragment\";\r\nexport * from \"../Shaders/iblCdfy.fragment\";\r\nexport * from \"../ShadersWGSL/iblIcdf.fragment\";\r\nexport * from \"../Shaders/iblIcdf.fragment\";\r\nexport * from \"../ShadersWGSL/iblCdfDebug.fragment\";\r\nexport * from \"../Shaders/iblCdfDebug.fragment\";\r\nexport * from \"../ShadersWGSL/iblScaledLuminance.fragment\";\r\nexport * from \"../Shaders/iblScaledLuminance.fragment\";\r\nexport * from \"../ShadersWGSL/iblDominantDirection.fragment\";\r\nexport * from \"../Shaders/iblDominantDirection.fragment\";\r\nexport * from \"../Shaders/iblVoxelGrid2dArrayDebug.fragment\";\r\nexport * from \"../ShadersWGSL/iblVoxelGrid2dArrayDebug.fragment\";\r\nexport * from \"../Shaders/iblVoxelGrid.fragment\";\r\nexport * from \"../Shaders/iblVoxelGrid.vertex\";\r\nexport * from \"../ShadersWGSL/iblVoxelGrid.fragment\";\r\nexport * from \"../ShadersWGSL/iblVoxelGrid.vertex\";\r\n\r\n// Depth Peeling Renderer\r\nexport * from \"../Shaders/oitBackBlend.fragment\";\r\nexport * from \"../Shaders/oitFinal.fragment\";\r\nexport * from \"../ShadersWGSL/oitBackBlend.fragment\";\r\nexport * from \"../ShadersWGSL/oitFinal.fragment\";\r\n"]}
@@ -89,10 +89,15 @@ forwardScatteredLight=mix(forwardScatteredLight,0.25*preInfoTrans.attenuation*li
89
89
  forwardScatteredLight=max(slab_translucent_background.rgb,mix(slab_translucent_background.rgb,forwardScatteredLight,roughness_alpha_modified_for_scatter));
90
90
  #endif
91
91
  #ifdef SCATTERING
92
+ #ifdef USE_IRRADIANCE_TEXTURE_FOR_SCATTERING
93
+ vec3 diffused_forward_scattered_light=scattered_light_from_irradiance_texture;
94
+ #else
95
+ preInfoTrans.roughness=1.0;vec3 diffused_forward_scattered_light=computeSpecularLighting(preInfoTrans,normalW,vec3(1.0),vec3(1.0),1.0,lightColor{X}.rgb)*volume_absorption;
96
+ #endif
92
97
  #ifdef GEOMETRY_THIN_WALLED
93
98
  vec3 forward_scattered_light=forwardScatteredLight*transmission_tint*volumeParams.multi_scatter_color*volumeParams.multi_scatter_color;vec3 back_scattered_light=slab_diffuse*volumeParams.multi_scatter_color;slab_translucent=mix(back_scattered_light,forward_scattered_light,0.5+0.5*volumeParams.anisotropy);
94
99
  #else
95
- preInfoTrans.roughness=1.0;vec3 diffused_forward_scattered_light=computeSpecularLighting(preInfoTrans,normalW,vec3(1.0),vec3(1.0),1.0,lightColor{X}.rgb)*volume_absorption;vec3 back_scattered_normal=normalize(normalW+viewDirectionW);preInfoTrans.NdotL=max(dot(back_scattered_normal,preInfoTrans.L),0.0);preInfoTrans.NdotV=dot(back_scattered_normal,viewDirectionW);preInfoTrans.H=normalize(viewDirectionW+preInfoTrans.L);preInfoTrans.VdotH=clamp(dot(viewDirectionW,preInfoTrans.H),0.0,1.0);preInfoTrans.roughness=0.05;vec3 back_scattered_light=computeSpecularLighting(preInfoTrans,viewDirectionW,vec3(1.0),vec3(1.0),0.025,lightColor{X}.rgb);vec3 forward_scattered_light=(forwardScatteredLight*volume_absorption);vec3 iso_scattered_light=slab_diffuse;vec3 back_scattering=mix(forward_scattered_light,forward_scattered_light+back_scattered_light*backscatter_color,iso_scatter_density);vec3 iso_scattering=mix(forward_scattered_light,(diffused_forward_scattered_light+iso_scattered_light)*volumeParams.multi_scatter_color,iso_scatter_density);slab_translucent=mix(back_scattering,iso_scattering,back_to_iso_scattering_blend);slab_translucent=mix(slab_translucent,forward_scattered_light,iso_to_forward_scattering_blend)*transmission_tint;
100
+ vec3 back_scattered_normal=normalize(normalW+viewDirectionW);preInfoTrans.NdotL=max(dot(back_scattered_normal,preInfoTrans.L),0.0);preInfoTrans.NdotV=dot(back_scattered_normal,viewDirectionW);preInfoTrans.H=normalize(viewDirectionW+preInfoTrans.L);preInfoTrans.VdotH=clamp(dot(viewDirectionW,preInfoTrans.H),0.0,1.0);preInfoTrans.roughness=0.2;vec3 back_scattered_light=computeSpecularLighting(preInfoTrans,viewDirectionW,vec3(1.0),vec3(0.08),0.0,lightColor{X}.rgb);vec3 forward_scattered_light=(forwardScatteredLight*volume_absorption);vec3 iso_scattered_light=slab_diffuse;vec3 back_scattering=mix(forward_scattered_light,forward_scattered_light+back_scattered_light*backscatter_color,iso_scatter_density);vec3 iso_scattering=mix(forward_scattered_light,(diffused_forward_scattered_light+iso_scattered_light)*volumeParams.multi_scatter_color,iso_scatter_density);slab_translucent=mix(back_scattering,iso_scattering,back_to_iso_scattering_blend);slab_translucent=mix(slab_translucent,forward_scattered_light,iso_to_forward_scattering_blend)*transmission_tint;
96
101
  #endif
97
102
  #else
98
103
  slab_translucent=forwardScatteredLight*transmission_tint*volume_absorption;
@@ -1 +1 @@
1
- {"version":3,"file":"openpbrDirectLighting.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/openpbrDirectLighting.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,uBAAuB,CAAC;AACrC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Id,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"openpbrDirectLighting\";\nconst shader = `#ifdef LIGHT{X}\n{vec3 slab_diffuse=vec3(0.,0.,0.);vec3 slab_translucent=vec3(0.,0.,0.);vec3 slab_glossy=vec3(0.,0.,0.);float specularFresnel=0.0;vec3 specularColoredFresnel=vec3(0.,0.,0.);vec3 slab_metal=vec3(0.,0.,0.);vec3 slab_coat=vec3(0.,0.,0.);float coatFresnel=0.0;vec3 slab_fuzz=vec3(0.,0.,0.);float fuzzFresnel=0.0;\n#ifdef HEMILIGHT{X}\nslab_diffuse=computeHemisphericDiffuseLighting(preInfo{X},lightColor{X}.rgb,light{X}.vLightGround);\n#elif defined(AREALIGHT{X}) && defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED)\nslab_diffuse=computeAreaDiffuseLighting(preInfo{X},lightColor{X}.rgb);\n#else\nslab_diffuse=computeDiffuseLighting(preInfo{X},lightColor{X}.rgb);\n#endif\n#ifdef PROJECTEDLIGHTTEXTURE{X}\nslab_diffuse*=computeProjectionTextureDiffuseLighting(projectionLightTexture{X},textureProjectionMatrix{X},vPositionW);\n#endif\n#ifdef FUZZ\nfloat fuzzNdotH=max(dot(fuzzNormalW,preInfo{X}.H),0.0);vec3 fuzzBrdf=getFuzzBRDFLookup(fuzzNdotH,sqrt(fuzz_roughness));\n#endif\n#ifdef THIN_FILM\nfloat thin_film_desaturation_scale=(thin_film_ior-1.0)*sqrt(thin_film_thickness*0.001);\n#endif\n#if defined(AREALIGHT{X}) && defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED)\nslab_glossy=computeAreaSpecularLighting(preInfo{X},light{X}.vLightSpecular.rgb,baseConductorReflectance.F0,baseConductorReflectance.F90);\n#else\n{\n#ifdef ANISOTROPIC_BASE\nslab_glossy=computeAnisotropicSpecularLighting(preInfo{X},viewDirectionW,normalW,\nbaseGeoInfo.anisotropicTangent,baseGeoInfo.anisotropicBitangent,baseGeoInfo.anisotropy,\n0.0,lightColor{X}.rgb);\n#else\nslab_glossy=computeSpecularLighting(preInfo{X},normalW,vec3(1.0),vec3(1.0),specular_roughness,lightColor{X}.rgb);\n#endif\nspecularFresnel=fresnelSchlickGGX(preInfo{X}.VdotH,baseDielectricReflectance.F0,baseDielectricReflectance.F90);specularColoredFresnel=specularFresnel*specular_color;\n#ifdef THIN_FILM\nvec3 thinFilmDielectricFresnel=evalIridescence(thin_film_outside_ior,thin_film_ior,preInfo{X}.VdotH,thin_film_thickness,baseDielectricReflectance.coloredF0);thinFilmDielectricFresnel=mix(thinFilmDielectricFresnel,vec3(dot(thinFilmDielectricFresnel,vec3(0.3333))),thin_film_desaturation_scale);specularColoredFresnel=mix(specularColoredFresnel,thinFilmDielectricFresnel*specular_color,thin_film_weight*thin_film_ior_scale);\n#endif\n}\n#endif\n#ifdef REFRACTED_LIGHTS\nvec3 forwardScatteredLight=vec3(0.0);\n#if AREALIGHT{X}\n#else\n{preLightingInfo preInfoTrans=preInfo{X};\n#ifdef SCATTERING\npreInfoTrans.roughness=sqrt(sqrt(max(refractionAlphaG,0.05)));\n#else\npreInfoTrans.roughness=transmission_roughness;\n#endif\nif (preInfoTrans.NdotLUnclamped<=0.0) {specularFresnel=0.0;specularColoredFresnel=specularFresnel*specular_color;}\n#ifdef GEOMETRY_THIN_WALLED\nvec3 refractNormalW=viewDirectionW;\n#else\nvec3 refractNormalW=normalW;\n#endif\npreInfoTrans.NdotL=0.5*max(dot(-refractNormalW,preInfoTrans.L),0.0)+0.5;\n#if defined(DISPERSION) && !defined(GEOMETRY_THIN_WALLED)\nfloat diff=min(dispersion_iors[2]-dispersion_iors[0],max(dispersion_iors[0]-1.0,1.0));dispersion_iors[2]+=diff;dispersion_iors[0]-=diff;for (int i=0; i<3; i++) {float eta=1.0/dispersion_iors[i];\n#elif defined(GEOMETRY_THIN_WALLED)\nfloat eta=1.0;\n#else\nfloat eta=1.0/specular_ior;\n#endif\npreInfoTrans.H=preInfoTrans.L+min(eta,0.95)*viewDirectionW;float len2=dot(preInfoTrans.H,preInfoTrans.H);if (len2<1e-6) {preInfoTrans.H=preInfoTrans.L;} else {preInfoTrans.H=preInfoTrans.H*inversesqrt(len2);}\n#ifdef ANISOTROPIC_BASE\npreInfoTrans.H=-preInfoTrans.H;\n#endif\npreInfoTrans.VdotH=dot(viewDirectionW,preInfoTrans.H);\n#if defined(DISPERSION) && !defined(GEOMETRY_THIN_WALLED)\nforwardScatteredLight[i]+=\n#else\nforwardScatteredLight+=\n#endif\n#if defined(ANISOTROPIC_BASE)\ncomputeAnisotropicSpecularLighting(preInfoTrans,viewDirectionW,refractNormalW,\nbaseGeoInfo.anisotropicTangent,baseGeoInfo.anisotropicBitangent,baseGeoInfo.anisotropy,\nroughness_alpha_modified_for_scatter,lightColor{X}.rgb\n#else\ncomputeSpecularLighting(preInfoTrans,-refractNormalW,vec3(1.0),vec3(1.0),roughness_alpha_modified_for_scatter,lightColor{X}.rgb\n#endif\n#if defined(DISPERSION) && !defined(GEOMETRY_THIN_WALLED)\n)[i];}\n#else\n);\n#endif\n#if !defined(GEOMETRY_THIN_WALLED)\nforwardScatteredLight=mix(forwardScatteredLight,0.25*preInfoTrans.attenuation*lightColor{X}.rgb,clamp(1.0-pow(baseGeoInfo.NdotV,roughness_alpha_modified_for_scatter),0.0,1.0));\n#endif\n#ifdef REFRACTED_BACKGROUND\nforwardScatteredLight=max(slab_translucent_background.rgb,mix(slab_translucent_background.rgb,forwardScatteredLight,roughness_alpha_modified_for_scatter));\n#endif\n#ifdef SCATTERING\n#ifdef GEOMETRY_THIN_WALLED\nvec3 forward_scattered_light=forwardScatteredLight*transmission_tint*volumeParams.multi_scatter_color*volumeParams.multi_scatter_color;vec3 back_scattered_light=slab_diffuse*volumeParams.multi_scatter_color;slab_translucent=mix(back_scattered_light,forward_scattered_light,0.5+0.5*volumeParams.anisotropy);\n#else\npreInfoTrans.roughness=1.0;vec3 diffused_forward_scattered_light=computeSpecularLighting(preInfoTrans,normalW,vec3(1.0),vec3(1.0),1.0,lightColor{X}.rgb)*volume_absorption;vec3 back_scattered_normal=normalize(normalW+viewDirectionW);preInfoTrans.NdotL=max(dot(back_scattered_normal,preInfoTrans.L),0.0);preInfoTrans.NdotV=dot(back_scattered_normal,viewDirectionW);preInfoTrans.H=normalize(viewDirectionW+preInfoTrans.L);preInfoTrans.VdotH=clamp(dot(viewDirectionW,preInfoTrans.H),0.0,1.0);preInfoTrans.roughness=0.05;vec3 back_scattered_light=computeSpecularLighting(preInfoTrans,viewDirectionW,vec3(1.0),vec3(1.0),0.025,lightColor{X}.rgb);vec3 forward_scattered_light=(forwardScatteredLight*volume_absorption);vec3 iso_scattered_light=slab_diffuse;vec3 back_scattering=mix(forward_scattered_light,forward_scattered_light+back_scattered_light*backscatter_color,iso_scatter_density);vec3 iso_scattering=mix(forward_scattered_light,(diffused_forward_scattered_light+iso_scattered_light)*volumeParams.multi_scatter_color,iso_scatter_density);slab_translucent=mix(back_scattering,iso_scattering,back_to_iso_scattering_blend);slab_translucent=mix(slab_translucent,forward_scattered_light,iso_to_forward_scattering_blend)*transmission_tint;\n#endif\n#else\nslab_translucent=forwardScatteredLight*transmission_tint*volume_absorption;\n#endif\n}\n#endif\n#endif\n#if defined(AREALIGHT{X}) && defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED)\nslab_metal=computeAreaSpecularLighting(preInfo{X},light{X}.vLightSpecular.rgb,baseConductorReflectance.F0,baseConductorReflectance.F90);\n#else\n{\n#if (CONDUCTOR_SPECULAR_MODEL==CONDUCTOR_SPECULAR_MODEL_OPENPBR)\nvec3 coloredFresnel=getF82Specular(preInfo{X}.VdotH,baseConductorReflectance.coloredF0,baseConductorReflectance.coloredF90,specular_roughness);\n#else\nvec3 coloredFresnel=fresnelSchlickGGX(preInfo{X}.VdotH,baseConductorReflectance.coloredF0,baseConductorReflectance.coloredF90);\n#endif\n#ifdef THIN_FILM\nvec3 thinFilmConductorFresnel=evalIridescence(thin_film_outside_ior,thin_film_ior,preInfo{X}.VdotH,thin_film_thickness,baseConductorReflectance.coloredF0);thinFilmConductorFresnel=mix(thinFilmConductorFresnel,vec3(dot(thinFilmConductorFresnel,vec3(0.3333))),thin_film_desaturation_scale);coloredFresnel=mix(coloredFresnel,specular_weight*thin_film_ior_scale*thinFilmConductorFresnel,thin_film_weight);\n#endif\n#ifdef ANISOTROPIC_BASE\nslab_metal=computeAnisotropicSpecularLighting(preInfo{X},viewDirectionW,normalW,baseGeoInfo.anisotropicTangent,baseGeoInfo.anisotropicBitangent,baseGeoInfo.anisotropy,0.0,lightColor{X}.rgb);\n#else\nslab_metal=computeSpecularLighting(preInfo{X},normalW,vec3(1.0),coloredFresnel,specular_roughness,lightColor{X}.rgb);\n#endif\n}\n#endif\n#if defined(AREALIGHT{X}) && defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED)\nslab_coat=computeAreaSpecularLighting(preInfoCoat{X},light{X}.vLightSpecular.rgb,coatReflectance.F0,coatReflectance.F90);\n#else\n{\n#ifdef ANISOTROPIC_COAT\nslab_coat=computeAnisotropicSpecularLighting(preInfoCoat{X},viewDirectionW,coatNormalW,\ncoatGeoInfo.anisotropicTangent,coatGeoInfo.anisotropicBitangent,coatGeoInfo.anisotropy,\n0.0,lightColor{X}.rgb);\n#else\nslab_coat=computeSpecularLighting(preInfoCoat{X},coatNormalW,vec3(coatReflectance.F0),vec3(1.0),coat_roughness,lightColor{X}.rgb);\n#endif\nfloat NdotH=max(dot(coatNormalW,preInfoCoat{X}.H),0.0);coatFresnel=fresnelSchlickGGX(NdotH,coatReflectance.F0,coatReflectance.F90);}\n#endif\nvec3 coatAbsorption=vec3(1.0);if (coat_weight>0.0) {float cosTheta_view=max(preInfoCoat{X}.NdotV,0.001);float cosTheta_light=max(preInfoCoat{X}.NdotL,0.001);float fresnel_view=coatReflectance.F0+(1.0-coatReflectance.F0)*pow(1.0-cosTheta_view,5.0);float fresnel_light=coatReflectance.F0+(1.0-coatReflectance.F0)*pow(1.0-cosTheta_light,5.0);float averageReflectance=(fresnel_view+fresnel_light)*0.5;float darkened_transmission=(1.0-averageReflectance)/(1.0+averageReflectance);darkened_transmission=mix(1.0,darkened_transmission,coat_darkening);float sin2=1.0-cosTheta_view*cosTheta_view;sin2=sin2/(coat_ior*coat_ior);float cos_t=sqrt(1.0-sin2);float coatPathLength=1.0/cos_t;vec3 colored_transmission=pow(coat_color,vec3(coatPathLength));coatAbsorption=mix(vec3(1.0),colored_transmission*darkened_transmission,coat_weight);}\n#ifdef FUZZ\nfuzzFresnel=fuzzBrdf.z;vec3 fuzzNormalW=mix(normalW,coatNormalW,coat_weight);float fuzzNdotV=max(dot(fuzzNormalW,viewDirectionW.xyz),0.0);float fuzzNdotL=max(dot(fuzzNormalW,preInfo{X}.L),0.0);slab_fuzz=lightColor{X}.rgb*preInfo{X}.attenuation*evalFuzz(preInfo{X}.L,fuzzNdotL,fuzzNdotV,fuzzTangent,fuzzBitangent,fuzzBrdf);\n#else\nvec3 fuzz_color=vec3(0.0);\n#endif\n#ifdef PREPASS_IRRADIANCE\ntotal_direct_diffuse+=slab_diffuse;\n#endif\nvec3 material_dielectric_base=mix(slab_diffuse*base_color.rgb,slab_translucent,surface_translucency_weight);vec3 material_dielectric_gloss=material_dielectric_base*(1.0-specularFresnel)+slab_glossy*specularColoredFresnel;vec3 material_base_substrate=mix(material_dielectric_gloss,slab_metal,base_metalness);vec3 material_coated_base=layer(material_base_substrate,slab_coat,coatFresnel,coatAbsorption,vec3(1.0));material_surface_direct+=layer(material_coated_base,slab_fuzz,fuzzFresnel*fuzz_weight,vec3(1.0),fuzz_color);}\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const openpbrDirectLighting = { name, shader };\n"]}
1
+ {"version":3,"file":"openpbrDirectLighting.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/openpbrDirectLighting.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,uBAAuB,CAAC;AACrC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmJd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"openpbrDirectLighting\";\nconst shader = `#ifdef LIGHT{X}\n{vec3 slab_diffuse=vec3(0.,0.,0.);vec3 slab_translucent=vec3(0.,0.,0.);vec3 slab_glossy=vec3(0.,0.,0.);float specularFresnel=0.0;vec3 specularColoredFresnel=vec3(0.,0.,0.);vec3 slab_metal=vec3(0.,0.,0.);vec3 slab_coat=vec3(0.,0.,0.);float coatFresnel=0.0;vec3 slab_fuzz=vec3(0.,0.,0.);float fuzzFresnel=0.0;\n#ifdef HEMILIGHT{X}\nslab_diffuse=computeHemisphericDiffuseLighting(preInfo{X},lightColor{X}.rgb,light{X}.vLightGround);\n#elif defined(AREALIGHT{X}) && defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED)\nslab_diffuse=computeAreaDiffuseLighting(preInfo{X},lightColor{X}.rgb);\n#else\nslab_diffuse=computeDiffuseLighting(preInfo{X},lightColor{X}.rgb);\n#endif\n#ifdef PROJECTEDLIGHTTEXTURE{X}\nslab_diffuse*=computeProjectionTextureDiffuseLighting(projectionLightTexture{X},textureProjectionMatrix{X},vPositionW);\n#endif\n#ifdef FUZZ\nfloat fuzzNdotH=max(dot(fuzzNormalW,preInfo{X}.H),0.0);vec3 fuzzBrdf=getFuzzBRDFLookup(fuzzNdotH,sqrt(fuzz_roughness));\n#endif\n#ifdef THIN_FILM\nfloat thin_film_desaturation_scale=(thin_film_ior-1.0)*sqrt(thin_film_thickness*0.001);\n#endif\n#if defined(AREALIGHT{X}) && defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED)\nslab_glossy=computeAreaSpecularLighting(preInfo{X},light{X}.vLightSpecular.rgb,baseConductorReflectance.F0,baseConductorReflectance.F90);\n#else\n{\n#ifdef ANISOTROPIC_BASE\nslab_glossy=computeAnisotropicSpecularLighting(preInfo{X},viewDirectionW,normalW,\nbaseGeoInfo.anisotropicTangent,baseGeoInfo.anisotropicBitangent,baseGeoInfo.anisotropy,\n0.0,lightColor{X}.rgb);\n#else\nslab_glossy=computeSpecularLighting(preInfo{X},normalW,vec3(1.0),vec3(1.0),specular_roughness,lightColor{X}.rgb);\n#endif\nspecularFresnel=fresnelSchlickGGX(preInfo{X}.VdotH,baseDielectricReflectance.F0,baseDielectricReflectance.F90);specularColoredFresnel=specularFresnel*specular_color;\n#ifdef THIN_FILM\nvec3 thinFilmDielectricFresnel=evalIridescence(thin_film_outside_ior,thin_film_ior,preInfo{X}.VdotH,thin_film_thickness,baseDielectricReflectance.coloredF0);thinFilmDielectricFresnel=mix(thinFilmDielectricFresnel,vec3(dot(thinFilmDielectricFresnel,vec3(0.3333))),thin_film_desaturation_scale);specularColoredFresnel=mix(specularColoredFresnel,thinFilmDielectricFresnel*specular_color,thin_film_weight*thin_film_ior_scale);\n#endif\n}\n#endif\n#ifdef REFRACTED_LIGHTS\nvec3 forwardScatteredLight=vec3(0.0);\n#if AREALIGHT{X}\n#else\n{preLightingInfo preInfoTrans=preInfo{X};\n#ifdef SCATTERING\npreInfoTrans.roughness=sqrt(sqrt(max(refractionAlphaG,0.05)));\n#else\npreInfoTrans.roughness=transmission_roughness;\n#endif\nif (preInfoTrans.NdotLUnclamped<=0.0) {specularFresnel=0.0;specularColoredFresnel=specularFresnel*specular_color;}\n#ifdef GEOMETRY_THIN_WALLED\nvec3 refractNormalW=viewDirectionW;\n#else\nvec3 refractNormalW=normalW;\n#endif\npreInfoTrans.NdotL=0.5*max(dot(-refractNormalW,preInfoTrans.L),0.0)+0.5;\n#if defined(DISPERSION) && !defined(GEOMETRY_THIN_WALLED)\nfloat diff=min(dispersion_iors[2]-dispersion_iors[0],max(dispersion_iors[0]-1.0,1.0));dispersion_iors[2]+=diff;dispersion_iors[0]-=diff;for (int i=0; i<3; i++) {float eta=1.0/dispersion_iors[i];\n#elif defined(GEOMETRY_THIN_WALLED)\nfloat eta=1.0;\n#else\nfloat eta=1.0/specular_ior;\n#endif\npreInfoTrans.H=preInfoTrans.L+min(eta,0.95)*viewDirectionW;float len2=dot(preInfoTrans.H,preInfoTrans.H);if (len2<1e-6) {preInfoTrans.H=preInfoTrans.L;} else {preInfoTrans.H=preInfoTrans.H*inversesqrt(len2);}\n#ifdef ANISOTROPIC_BASE\npreInfoTrans.H=-preInfoTrans.H;\n#endif\npreInfoTrans.VdotH=dot(viewDirectionW,preInfoTrans.H);\n#if defined(DISPERSION) && !defined(GEOMETRY_THIN_WALLED)\nforwardScatteredLight[i]+=\n#else\nforwardScatteredLight+=\n#endif\n#if defined(ANISOTROPIC_BASE)\ncomputeAnisotropicSpecularLighting(preInfoTrans,viewDirectionW,refractNormalW,\nbaseGeoInfo.anisotropicTangent,baseGeoInfo.anisotropicBitangent,baseGeoInfo.anisotropy,\nroughness_alpha_modified_for_scatter,lightColor{X}.rgb\n#else\ncomputeSpecularLighting(preInfoTrans,-refractNormalW,vec3(1.0),vec3(1.0),roughness_alpha_modified_for_scatter,lightColor{X}.rgb\n#endif\n#if defined(DISPERSION) && !defined(GEOMETRY_THIN_WALLED)\n)[i];}\n#else\n);\n#endif\n#if !defined(GEOMETRY_THIN_WALLED)\nforwardScatteredLight=mix(forwardScatteredLight,0.25*preInfoTrans.attenuation*lightColor{X}.rgb,clamp(1.0-pow(baseGeoInfo.NdotV,roughness_alpha_modified_for_scatter),0.0,1.0));\n#endif\n#ifdef REFRACTED_BACKGROUND\nforwardScatteredLight=max(slab_translucent_background.rgb,mix(slab_translucent_background.rgb,forwardScatteredLight,roughness_alpha_modified_for_scatter));\n#endif\n#ifdef SCATTERING\n#ifdef USE_IRRADIANCE_TEXTURE_FOR_SCATTERING\nvec3 diffused_forward_scattered_light=scattered_light_from_irradiance_texture;\n#else\npreInfoTrans.roughness=1.0;vec3 diffused_forward_scattered_light=computeSpecularLighting(preInfoTrans,normalW,vec3(1.0),vec3(1.0),1.0,lightColor{X}.rgb)*volume_absorption;\n#endif\n#ifdef GEOMETRY_THIN_WALLED\nvec3 forward_scattered_light=forwardScatteredLight*transmission_tint*volumeParams.multi_scatter_color*volumeParams.multi_scatter_color;vec3 back_scattered_light=slab_diffuse*volumeParams.multi_scatter_color;slab_translucent=mix(back_scattered_light,forward_scattered_light,0.5+0.5*volumeParams.anisotropy);\n#else\nvec3 back_scattered_normal=normalize(normalW+viewDirectionW);preInfoTrans.NdotL=max(dot(back_scattered_normal,preInfoTrans.L),0.0);preInfoTrans.NdotV=dot(back_scattered_normal,viewDirectionW);preInfoTrans.H=normalize(viewDirectionW+preInfoTrans.L);preInfoTrans.VdotH=clamp(dot(viewDirectionW,preInfoTrans.H),0.0,1.0);preInfoTrans.roughness=0.2;vec3 back_scattered_light=computeSpecularLighting(preInfoTrans,viewDirectionW,vec3(1.0),vec3(0.08),0.0,lightColor{X}.rgb);vec3 forward_scattered_light=(forwardScatteredLight*volume_absorption);vec3 iso_scattered_light=slab_diffuse;vec3 back_scattering=mix(forward_scattered_light,forward_scattered_light+back_scattered_light*backscatter_color,iso_scatter_density);vec3 iso_scattering=mix(forward_scattered_light,(diffused_forward_scattered_light+iso_scattered_light)*volumeParams.multi_scatter_color,iso_scatter_density);slab_translucent=mix(back_scattering,iso_scattering,back_to_iso_scattering_blend);slab_translucent=mix(slab_translucent,forward_scattered_light,iso_to_forward_scattering_blend)*transmission_tint;\n#endif\n#else\nslab_translucent=forwardScatteredLight*transmission_tint*volume_absorption;\n#endif\n}\n#endif\n#endif\n#if defined(AREALIGHT{X}) && defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED)\nslab_metal=computeAreaSpecularLighting(preInfo{X},light{X}.vLightSpecular.rgb,baseConductorReflectance.F0,baseConductorReflectance.F90);\n#else\n{\n#if (CONDUCTOR_SPECULAR_MODEL==CONDUCTOR_SPECULAR_MODEL_OPENPBR)\nvec3 coloredFresnel=getF82Specular(preInfo{X}.VdotH,baseConductorReflectance.coloredF0,baseConductorReflectance.coloredF90,specular_roughness);\n#else\nvec3 coloredFresnel=fresnelSchlickGGX(preInfo{X}.VdotH,baseConductorReflectance.coloredF0,baseConductorReflectance.coloredF90);\n#endif\n#ifdef THIN_FILM\nvec3 thinFilmConductorFresnel=evalIridescence(thin_film_outside_ior,thin_film_ior,preInfo{X}.VdotH,thin_film_thickness,baseConductorReflectance.coloredF0);thinFilmConductorFresnel=mix(thinFilmConductorFresnel,vec3(dot(thinFilmConductorFresnel,vec3(0.3333))),thin_film_desaturation_scale);coloredFresnel=mix(coloredFresnel,specular_weight*thin_film_ior_scale*thinFilmConductorFresnel,thin_film_weight);\n#endif\n#ifdef ANISOTROPIC_BASE\nslab_metal=computeAnisotropicSpecularLighting(preInfo{X},viewDirectionW,normalW,baseGeoInfo.anisotropicTangent,baseGeoInfo.anisotropicBitangent,baseGeoInfo.anisotropy,0.0,lightColor{X}.rgb);\n#else\nslab_metal=computeSpecularLighting(preInfo{X},normalW,vec3(1.0),coloredFresnel,specular_roughness,lightColor{X}.rgb);\n#endif\n}\n#endif\n#if defined(AREALIGHT{X}) && defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED)\nslab_coat=computeAreaSpecularLighting(preInfoCoat{X},light{X}.vLightSpecular.rgb,coatReflectance.F0,coatReflectance.F90);\n#else\n{\n#ifdef ANISOTROPIC_COAT\nslab_coat=computeAnisotropicSpecularLighting(preInfoCoat{X},viewDirectionW,coatNormalW,\ncoatGeoInfo.anisotropicTangent,coatGeoInfo.anisotropicBitangent,coatGeoInfo.anisotropy,\n0.0,lightColor{X}.rgb);\n#else\nslab_coat=computeSpecularLighting(preInfoCoat{X},coatNormalW,vec3(coatReflectance.F0),vec3(1.0),coat_roughness,lightColor{X}.rgb);\n#endif\nfloat NdotH=max(dot(coatNormalW,preInfoCoat{X}.H),0.0);coatFresnel=fresnelSchlickGGX(NdotH,coatReflectance.F0,coatReflectance.F90);}\n#endif\nvec3 coatAbsorption=vec3(1.0);if (coat_weight>0.0) {float cosTheta_view=max(preInfoCoat{X}.NdotV,0.001);float cosTheta_light=max(preInfoCoat{X}.NdotL,0.001);float fresnel_view=coatReflectance.F0+(1.0-coatReflectance.F0)*pow(1.0-cosTheta_view,5.0);float fresnel_light=coatReflectance.F0+(1.0-coatReflectance.F0)*pow(1.0-cosTheta_light,5.0);float averageReflectance=(fresnel_view+fresnel_light)*0.5;float darkened_transmission=(1.0-averageReflectance)/(1.0+averageReflectance);darkened_transmission=mix(1.0,darkened_transmission,coat_darkening);float sin2=1.0-cosTheta_view*cosTheta_view;sin2=sin2/(coat_ior*coat_ior);float cos_t=sqrt(1.0-sin2);float coatPathLength=1.0/cos_t;vec3 colored_transmission=pow(coat_color,vec3(coatPathLength));coatAbsorption=mix(vec3(1.0),colored_transmission*darkened_transmission,coat_weight);}\n#ifdef FUZZ\nfuzzFresnel=fuzzBrdf.z;vec3 fuzzNormalW=mix(normalW,coatNormalW,coat_weight);float fuzzNdotV=max(dot(fuzzNormalW,viewDirectionW.xyz),0.0);float fuzzNdotL=max(dot(fuzzNormalW,preInfo{X}.L),0.0);slab_fuzz=lightColor{X}.rgb*preInfo{X}.attenuation*evalFuzz(preInfo{X}.L,fuzzNdotL,fuzzNdotV,fuzzTangent,fuzzBitangent,fuzzBrdf);\n#else\nvec3 fuzz_color=vec3(0.0);\n#endif\n#ifdef PREPASS_IRRADIANCE\ntotal_direct_diffuse+=slab_diffuse;\n#endif\nvec3 material_dielectric_base=mix(slab_diffuse*base_color.rgb,slab_translucent,surface_translucency_weight);vec3 material_dielectric_gloss=material_dielectric_base*(1.0-specularFresnel)+slab_glossy*specularColoredFresnel;vec3 material_base_substrate=mix(material_dielectric_gloss,slab_metal,base_metalness);vec3 material_coated_base=layer(material_base_substrate,slab_coat,coatFresnel,coatAbsorption,vec3(1.0));material_surface_direct+=layer(material_coated_base,slab_fuzz,fuzzFresnel*fuzz_weight,vec3(1.0),fuzz_color);}\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const openpbrDirectLighting = { name, shader };\n"]}
@@ -195,7 +195,7 @@ forwardScatteredEnvironmentLight=max(slab_translucent_background.rgb,mix(slab_tr
195
195
  #endif
196
196
  #ifdef SCATTERING
197
197
  #ifdef USE_IRRADIANCE_TEXTURE_FOR_SCATTERING
198
- vec3 mfp=vec3(100.0)/volumeParams.extinction_coeff;vec3 scatteredEnvironmentLight=sss_convolve(sceneIrradianceSampler,sceneDepthSampler,renderTargetSize,mfp,projection,inverseProjection,16,noise.xy);
198
+ vec3 scatteredEnvironmentLight=scattered_light_from_irradiance_texture;
199
199
  #else
200
200
  #ifdef GEOMETRY_THIN_WALLED
201
201
  vec3 scatterVector=normalW;