@onerjs/core 8.46.6 → 8.46.8

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 (160) hide show
  1. package/Engines/Extensions/engine.multiview.js +6 -0
  2. package/Engines/Extensions/engine.multiview.js.map +1 -1
  3. package/Engines/constants.d.ts +9 -4
  4. package/Engines/constants.js +9 -4
  5. package/Engines/constants.js.map +1 -1
  6. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.d.ts +6 -0
  7. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js +38 -11
  8. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js.map +1 -1
  9. package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +4 -0
  10. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +4 -0
  11. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
  12. package/Materials/PBR/openpbrMaterial.d.ts +155 -53
  13. package/Materials/PBR/openpbrMaterial.js +149 -61
  14. package/Materials/PBR/openpbrMaterial.js.map +1 -1
  15. package/Materials/PBR/pbrBaseMaterial.d.ts +36 -31
  16. package/Materials/PBR/pbrBaseMaterial.js +4 -34
  17. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  18. package/Materials/environmentLighting.defines.d.ts +31 -0
  19. package/Materials/environmentLighting.defines.js +33 -0
  20. package/Materials/environmentLighting.defines.js.map +1 -0
  21. package/Materials/material.js +1 -0
  22. package/Materials/material.js.map +1 -1
  23. package/Materials/materialHelper.functions.js +8 -2
  24. package/Materials/materialHelper.functions.js.map +1 -1
  25. package/Materials/materialHelper.geometryrendering.js +10 -3
  26. package/Materials/materialHelper.geometryrendering.js.map +1 -1
  27. package/Materials/prepass.defines.d.ts +43 -0
  28. package/Materials/prepass.defines.js +45 -0
  29. package/Materials/prepass.defines.js.map +1 -0
  30. package/Materials/standardMaterial.d.ts +36 -31
  31. package/Materials/standardMaterial.js +2 -32
  32. package/Materials/standardMaterial.js.map +1 -1
  33. package/Physics/v2/Plugins/havokPlugin.js +8 -4
  34. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  35. package/PostProcesses/subSurfaceScatteringPostProcess.js.map +1 -1
  36. package/Rendering/IBLShadows/iblShadowsPluginMaterial.d.ts +3 -9
  37. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js +35 -12
  38. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js.map +1 -1
  39. package/Rendering/geometryBufferRenderer.d.ts +20 -0
  40. package/Rendering/geometryBufferRenderer.js +203 -14
  41. package/Rendering/geometryBufferRenderer.js.map +1 -1
  42. package/Rendering/objectRenderer.js +1 -0
  43. package/Rendering/objectRenderer.js.map +1 -1
  44. package/Rendering/prePassRenderer.js +7 -1
  45. package/Rendering/prePassRenderer.js.map +1 -1
  46. package/Rendering/subSurfaceConfiguration.js.map +1 -1
  47. package/Shaders/ShadersInclude/helperFunctions.js +5 -0
  48. package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
  49. package/Shaders/ShadersInclude/openpbrBaseLayerData.js +1 -1
  50. package/Shaders/ShadersInclude/openpbrBaseLayerData.js.map +1 -1
  51. package/Shaders/ShadersInclude/openpbrBlockPrePass.d.ts +5 -0
  52. package/Shaders/ShadersInclude/openpbrBlockPrePass.js +77 -0
  53. package/Shaders/ShadersInclude/openpbrBlockPrePass.js.map +1 -0
  54. package/Shaders/ShadersInclude/openpbrDirectLighting.js +37 -17
  55. package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  56. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js +43 -17
  57. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  58. package/Shaders/ShadersInclude/openpbrFragmentDeclaration.js +10 -1
  59. package/Shaders/ShadersInclude/openpbrFragmentDeclaration.js.map +1 -1
  60. package/Shaders/ShadersInclude/openpbrFragmentSamplersDeclaration.d.ts +1 -0
  61. package/Shaders/ShadersInclude/openpbrFragmentSamplersDeclaration.js +14 -38
  62. package/Shaders/ShadersInclude/openpbrFragmentSamplersDeclaration.js.map +1 -1
  63. package/Shaders/ShadersInclude/openpbrIblFunctions.js +4 -2
  64. package/Shaders/ShadersInclude/openpbrIblFunctions.js.map +1 -1
  65. package/Shaders/ShadersInclude/openpbrSubsurfaceLayerData.d.ts +5 -0
  66. package/Shaders/ShadersInclude/openpbrSubsurfaceLayerData.js +35 -0
  67. package/Shaders/ShadersInclude/openpbrSubsurfaceLayerData.js.map +1 -0
  68. package/Shaders/ShadersInclude/openpbrTransmissionLayerData.js +1 -1
  69. package/Shaders/ShadersInclude/openpbrTransmissionLayerData.js.map +1 -1
  70. package/Shaders/ShadersInclude/openpbrUboDeclaration.js +1 -1
  71. package/Shaders/ShadersInclude/openpbrUboDeclaration.js.map +1 -1
  72. package/Shaders/ShadersInclude/openpbrVertexDeclaration.js +9 -0
  73. package/Shaders/ShadersInclude/openpbrVertexDeclaration.js.map +1 -1
  74. package/Shaders/ShadersInclude/openpbrVolumeFunctions.d.ts +5 -0
  75. package/Shaders/ShadersInclude/openpbrVolumeFunctions.js +67 -0
  76. package/Shaders/ShadersInclude/openpbrVolumeFunctions.js.map +1 -0
  77. package/Shaders/ShadersInclude/pbrBlockPrePass.js +14 -3
  78. package/Shaders/ShadersInclude/pbrBlockPrePass.js.map +1 -1
  79. package/Shaders/ShadersInclude/pbrFragmentReflectionDeclaration.d.ts +5 -0
  80. package/Shaders/ShadersInclude/pbrFragmentReflectionDeclaration.js +43 -0
  81. package/Shaders/ShadersInclude/pbrFragmentReflectionDeclaration.js.map +1 -0
  82. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.d.ts +1 -0
  83. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js +2 -32
  84. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
  85. package/Shaders/ShadersInclude/sceneFragmentDeclaration.js +1 -1
  86. package/Shaders/ShadersInclude/sceneFragmentDeclaration.js.map +1 -1
  87. package/Shaders/ShadersInclude/sceneUboDeclaration.js +1 -1
  88. package/Shaders/ShadersInclude/sceneUboDeclaration.js.map +1 -1
  89. package/Shaders/geometry.fragment.d.ts +12 -0
  90. package/Shaders/geometry.fragment.js +102 -1
  91. package/Shaders/geometry.fragment.js.map +1 -1
  92. package/Shaders/geometry.vertex.d.ts +1 -0
  93. package/Shaders/geometry.vertex.js +46 -2
  94. package/Shaders/geometry.vertex.js.map +1 -1
  95. package/Shaders/iblShadowVoxelTracing.fragment.d.ts +1 -0
  96. package/Shaders/iblShadowVoxelTracing.fragment.js +2 -5
  97. package/Shaders/iblShadowVoxelTracing.fragment.js.map +1 -1
  98. package/Shaders/openpbr.fragment.d.ts +3 -1
  99. package/Shaders/openpbr.fragment.js +69 -8
  100. package/Shaders/openpbr.fragment.js.map +1 -1
  101. package/Shaders/openpbr.vertex.js +11 -5
  102. package/Shaders/openpbr.vertex.js.map +1 -1
  103. package/ShadersWGSL/ShadersInclude/helperFunctions.js +5 -0
  104. package/ShadersWGSL/ShadersInclude/helperFunctions.js.map +1 -1
  105. package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js +3 -2
  106. package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
  107. package/ShadersWGSL/ShadersInclude/openpbrBaseLayerData.js +1 -1
  108. package/ShadersWGSL/ShadersInclude/openpbrBaseLayerData.js.map +1 -1
  109. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.d.ts +5 -0
  110. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js +101 -0
  111. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js.map +1 -0
  112. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +39 -19
  113. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  114. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js +39 -13
  115. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  116. package/ShadersWGSL/ShadersInclude/openpbrFragmentSamplersDeclaration.d.ts +1 -0
  117. package/ShadersWGSL/ShadersInclude/openpbrFragmentSamplersDeclaration.js +14 -34
  118. package/ShadersWGSL/ShadersInclude/openpbrFragmentSamplersDeclaration.js.map +1 -1
  119. package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js +5 -3
  120. package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js.map +1 -1
  121. package/ShadersWGSL/ShadersInclude/openpbrSubsurfaceLayerData.d.ts +5 -0
  122. package/ShadersWGSL/ShadersInclude/openpbrSubsurfaceLayerData.js +35 -0
  123. package/ShadersWGSL/ShadersInclude/openpbrSubsurfaceLayerData.js.map +1 -0
  124. package/ShadersWGSL/ShadersInclude/openpbrTransmissionLayerData.js +1 -1
  125. package/ShadersWGSL/ShadersInclude/openpbrTransmissionLayerData.js.map +1 -1
  126. package/ShadersWGSL/ShadersInclude/openpbrUboDeclaration.js +1 -1
  127. package/ShadersWGSL/ShadersInclude/openpbrUboDeclaration.js.map +1 -1
  128. package/ShadersWGSL/ShadersInclude/openpbrVolumeFunctions.d.ts +5 -0
  129. package/ShadersWGSL/ShadersInclude/openpbrVolumeFunctions.js +68 -0
  130. package/ShadersWGSL/ShadersInclude/openpbrVolumeFunctions.js.map +1 -0
  131. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js +15 -4
  132. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js.map +1 -1
  133. package/ShadersWGSL/ShadersInclude/pbrBlockReflection.js +2 -2
  134. package/ShadersWGSL/ShadersInclude/pbrBlockReflection.js.map +1 -1
  135. package/ShadersWGSL/ShadersInclude/pbrFragmentReflectionDeclaration.d.ts +5 -0
  136. package/ShadersWGSL/ShadersInclude/pbrFragmentReflectionDeclaration.js +39 -0
  137. package/ShadersWGSL/ShadersInclude/pbrFragmentReflectionDeclaration.js.map +1 -0
  138. package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.d.ts +1 -0
  139. package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js +2 -28
  140. package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
  141. package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js +2 -1
  142. package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js.map +1 -1
  143. package/ShadersWGSL/geometry.fragment.d.ts +11 -0
  144. package/ShadersWGSL/geometry.fragment.js +103 -1
  145. package/ShadersWGSL/geometry.fragment.js.map +1 -1
  146. package/ShadersWGSL/geometry.vertex.d.ts +1 -0
  147. package/ShadersWGSL/geometry.vertex.js +47 -3
  148. package/ShadersWGSL/geometry.vertex.js.map +1 -1
  149. package/ShadersWGSL/iblShadowVoxelTracing.fragment.d.ts +1 -0
  150. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js +3 -7
  151. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js.map +1 -1
  152. package/ShadersWGSL/openpbr.fragment.d.ts +3 -1
  153. package/ShadersWGSL/openpbr.fragment.js +70 -9
  154. package/ShadersWGSL/openpbr.fragment.js.map +1 -1
  155. package/ShadersWGSL/openpbr.vertex.js +6 -0
  156. package/ShadersWGSL/openpbr.vertex.js.map +1 -1
  157. package/package.json +1 -1
  158. package/scene.d.ts +7 -0
  159. package/scene.js +13 -0
  160. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"subSurfaceScatteringPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/subSurfaceScatteringPostProcess.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"../types\";\r\nimport { type Camera } from \"../Cameras/camera\";\r\nimport { type Effect } from \"../Materials/effect\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { type PostProcessOptions, PostProcess } from \"./postProcess\";\r\nimport { type AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { type Scene } from \"../scene\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Logger } from \"../Misc/logger\";\r\n\r\nimport \"../Shaders/imageProcessing.fragment\";\r\nimport \"../Shaders/subSurfaceScattering.fragment\";\r\nimport \"../Shaders/postprocess.vertex\";\r\n\r\nimport \"../ShadersWGSL/imageProcessing.fragment\";\r\nimport \"../ShadersWGSL/subSurfaceScattering.fragment\";\r\nimport \"../ShadersWGSL/postprocess.vertex\";\r\n\r\n/**\r\n * Sub surface scattering post process\r\n */\r\nexport class SubSurfaceScatteringPostProcess extends PostProcess {\r\n /**\r\n * Gets a string identifying the name of the class\r\n * @returns \"SubSurfaceScatteringPostProcess\" string\r\n */\r\n public override getClassName(): string {\r\n return \"SubSurfaceScatteringPostProcess\";\r\n }\r\n\r\n constructor(\r\n name: string,\r\n scene: Scene,\r\n options: number | PostProcessOptions,\r\n camera: Nullable<Camera> = null,\r\n samplingMode?: number,\r\n engine?: AbstractEngine,\r\n reusable?: boolean,\r\n textureType: number = Constants.TEXTURETYPE_UNSIGNED_BYTE\r\n ) {\r\n const localOptions = {\r\n uniforms: [\"texelSize\", \"viewportSize\", \"metersPerUnit\"],\r\n samplers: [\"diffusionS\", \"diffusionD\", \"filterRadii\", \"irradianceSampler\", \"depthSampler\", \"albedoSampler\"],\r\n size: typeof options === \"number\" ? options : undefined,\r\n camera,\r\n samplingMode,\r\n engine,\r\n reusable,\r\n textureType,\r\n ...(options as PostProcessOptions),\r\n blockCompilation: true,\r\n };\r\n\r\n super(name, \"subSurfaceScattering\", { ...localOptions, samplingMode: samplingMode || Texture.BILINEAR_SAMPLINGMODE });\r\n this._scene = scene;\r\n\r\n this.updateEffect();\r\n\r\n this.onApplyObservable.add((effect: Effect) => {\r\n if (!scene.prePassRenderer || !scene.subSurfaceConfiguration) {\r\n Logger.Error(\"PrePass and subsurface configuration needs to be enabled for subsurface scattering.\");\r\n return;\r\n }\r\n const texelSize = this.texelSize;\r\n effect.setFloat(\"metersPerUnit\", scene.subSurfaceConfiguration.metersPerUnit);\r\n effect.setFloat2(\"texelSize\", texelSize.x, texelSize.y);\r\n effect.setTexture(\"irradianceSampler\", scene.prePassRenderer.getRenderTarget().textures[scene.prePassRenderer.getIndex(Constants.PREPASS_IRRADIANCE_TEXTURE_TYPE)]);\r\n effect.setTexture(\"depthSampler\", scene.prePassRenderer.getRenderTarget().textures[scene.prePassRenderer.getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE)]);\r\n effect.setTexture(\"albedoSampler\", scene.prePassRenderer.getRenderTarget().textures[scene.prePassRenderer.getIndex(Constants.PREPASS_ALBEDO_SQRT_TEXTURE_TYPE)]);\r\n effect.setFloat2(\r\n \"viewportSize\",\r\n Math.tan(scene.activeCamera!.fov / 2) * scene.getEngine().getAspectRatio(scene.activeCamera!, true),\r\n Math.tan(scene.activeCamera!.fov / 2)\r\n );\r\n effect.setArray3(\"diffusionS\", scene.subSurfaceConfiguration.ssDiffusionS);\r\n effect.setArray(\"diffusionD\", scene.subSurfaceConfiguration.ssDiffusionD);\r\n effect.setArray(\"filterRadii\", scene.subSurfaceConfiguration.ssFilterRadii);\r\n });\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"subSurfaceScatteringPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/subSurfaceScatteringPostProcess.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"../types\";\r\nimport { type Camera } from \"../Cameras/camera\";\r\nimport { type Effect } from \"../Materials/effect\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { type PostProcessOptions, PostProcess } from \"./postProcess\";\r\nimport { type AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { type Scene } from \"../scene\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Logger } from \"../Misc/logger\";\r\n\r\nimport \"../Shaders/imageProcessing.fragment\";\r\nimport \"../Shaders/subSurfaceScattering.fragment\";\r\nimport \"../Shaders/postprocess.vertex\";\r\n\r\nimport \"../ShadersWGSL/imageProcessing.fragment\";\r\nimport \"../ShadersWGSL/subSurfaceScattering.fragment\";\r\nimport \"../ShadersWGSL/postprocess.vertex\";\r\n\r\n/**\r\n * Sub surface scattering post process\r\n */\r\nexport class SubSurfaceScatteringPostProcess extends PostProcess {\r\n /**\r\n * Gets a string identifying the name of the class\r\n * @returns \"SubSurfaceScatteringPostProcess\" string\r\n */\r\n public override getClassName(): string {\r\n return \"SubSurfaceScatteringPostProcess\";\r\n }\r\n\r\n constructor(\r\n name: string,\r\n scene: Scene,\r\n options: number | PostProcessOptions,\r\n camera: Nullable<Camera> = null,\r\n samplingMode?: number,\r\n engine?: AbstractEngine,\r\n reusable?: boolean,\r\n textureType: number = Constants.TEXTURETYPE_UNSIGNED_BYTE\r\n ) {\r\n const localOptions = {\r\n uniforms: [\"texelSize\", \"viewportSize\", \"metersPerUnit\"],\r\n samplers: [\"diffusionS\", \"diffusionD\", \"filterRadii\", \"irradianceSampler\", \"depthSampler\", \"albedoSampler\"],\r\n size: typeof options === \"number\" ? options : undefined,\r\n camera,\r\n samplingMode,\r\n engine,\r\n reusable,\r\n textureType,\r\n ...(options as PostProcessOptions),\r\n blockCompilation: true,\r\n };\r\n\r\n super(name, \"subSurfaceScattering\", { ...localOptions, samplingMode: samplingMode || Texture.BILINEAR_SAMPLINGMODE });\r\n this._scene = scene;\r\n\r\n this.updateEffect();\r\n\r\n this.onApplyObservable.add((effect: Effect) => {\r\n if (!scene.prePassRenderer || !scene.subSurfaceConfiguration) {\r\n Logger.Error(\"PrePass and subsurface configuration needs to be enabled for subsurface scattering.\");\r\n return;\r\n }\r\n const texelSize = this.texelSize;\r\n effect.setFloat(\"metersPerUnit\", scene.subSurfaceConfiguration.metersPerUnit);\r\n effect.setFloat2(\"texelSize\", texelSize.x, texelSize.y);\r\n effect.setTexture(\r\n \"irradianceSampler\",\r\n scene.prePassRenderer.getRenderTarget().textures[scene.prePassRenderer.getIndex(Constants.PREPASS_IRRADIANCE_LEGACY_TEXTURE_TYPE)]\r\n );\r\n effect.setTexture(\"depthSampler\", scene.prePassRenderer.getRenderTarget().textures[scene.prePassRenderer.getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE)]);\r\n effect.setTexture(\"albedoSampler\", scene.prePassRenderer.getRenderTarget().textures[scene.prePassRenderer.getIndex(Constants.PREPASS_ALBEDO_SQRT_TEXTURE_TYPE)]);\r\n effect.setFloat2(\r\n \"viewportSize\",\r\n Math.tan(scene.activeCamera!.fov / 2) * scene.getEngine().getAspectRatio(scene.activeCamera!, true),\r\n Math.tan(scene.activeCamera!.fov / 2)\r\n );\r\n effect.setArray3(\"diffusionS\", scene.subSurfaceConfiguration.ssDiffusionS);\r\n effect.setArray(\"diffusionD\", scene.subSurfaceConfiguration.ssDiffusionD);\r\n effect.setArray(\"filterRadii\", scene.subSurfaceConfiguration.ssFilterRadii);\r\n });\r\n }\r\n}\r\n"]}
@@ -6,7 +6,7 @@ import { type StandardMaterial } from "../../Materials/standardMaterial.js";
6
6
  import { PBRBaseMaterial } from "../../Materials/PBR/pbrBaseMaterial.js";
7
7
  import { type UniformBuffer } from "../../Materials/uniformBuffer.js";
8
8
  import { ShaderLanguage } from "../../Materials/shaderLanguage.js";
9
- import { OpenPBRMaterial } from "../../Materials/PBR/openpbrMaterial.js";
9
+ import { type OpenPBRMaterial } from "../../Materials/PBR/openpbrMaterial.js";
10
10
  /**
11
11
  * @internal
12
12
  */
@@ -46,16 +46,10 @@ export declare class IBLShadowsPluginMaterial extends MaterialPluginBase {
46
46
  */
47
47
  isCompatible(): boolean;
48
48
  constructor(material: Material | StandardMaterial | PBRBaseMaterial | OpenPBRMaterial);
49
+ private _isOpenPBRMaterial;
49
50
  prepareDefines(defines: MaterialIBLShadowsRenderDefines): void;
50
51
  getClassName(): string;
51
- getUniforms(): {
52
- ubo: {
53
- name: string;
54
- size: number;
55
- type: string;
56
- }[];
57
- fragment: string;
58
- };
52
+ getUniforms(_shaderLanguage: ShaderLanguage): any;
59
53
  getSamplers(samplers: string[]): void;
60
54
  bindForSubMesh(uniformBuffer: UniformBuffer): void;
61
55
  getCustomCode(shaderType: string, shaderLanguage: ShaderLanguage): {
@@ -5,7 +5,6 @@ import { MaterialPluginBase } from "../../Materials/materialPluginBase.js";
5
5
  import { PBRBaseMaterial } from "../../Materials/PBR/pbrBaseMaterial.js";
6
6
  import { expandToProperty, serialize } from "../../Misc/decorators.js";
7
7
  import { RegisterClass } from "../../Misc/typeStore.js";
8
- import { OpenPBRMaterial } from "../../Materials/PBR/openpbrMaterial.js";
9
8
  /**
10
9
  * @internal
11
10
  */
@@ -55,6 +54,9 @@ export class IBLShadowsPluginMaterial extends MaterialPluginBase {
55
54
  this.isEnabled = false;
56
55
  this._internalMarkAllSubMeshesAsTexturesDirty = material._dirtyCallbacks[1];
57
56
  }
57
+ _isOpenPBRMaterial() {
58
+ return this._material.getClassName() === "OpenPBRMaterial";
59
+ }
58
60
  prepareDefines(defines) {
59
61
  defines.RENDER_WITH_IBL_SHADOWS = this._isEnabled;
60
62
  defines.COLORED_IBL_SHADOWS = this.isColored;
@@ -62,17 +64,38 @@ export class IBLShadowsPluginMaterial extends MaterialPluginBase {
62
64
  getClassName() {
63
65
  return "IBLShadowsPluginMaterial";
64
66
  }
65
- getUniforms() {
66
- return {
67
- ubo: [
68
- { name: "renderTargetSize", size: 2, type: "vec2" },
69
- { name: "shadowOpacity", size: 1, type: "float" },
70
- ],
71
- fragment: `#ifdef RENDER_WITH_IBL_SHADOWS
67
+ getUniforms(_shaderLanguage) {
68
+ const result = {};
69
+ result.ubo = [];
70
+ if (this._isOpenPBRMaterial()) {
71
+ if (_shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
72
+ result.fragment = `#ifdef RENDER_WITH_IBL_SHADOWS
73
+ var shadowOpacity: f32;
74
+ #endif`;
75
+ }
76
+ else {
77
+ result.fragment = `#ifdef RENDER_WITH_IBL_SHADOWS
78
+ uniform float shadowOpacity;
79
+ #endif`;
80
+ }
81
+ }
82
+ else {
83
+ result.ubo.push({ name: "renderTargetSize", size: 2, type: "vec2" });
84
+ if (_shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
85
+ result.fragment = `#ifdef RENDER_WITH_IBL_SHADOWS
86
+ var renderTargetSize: vec2f;
87
+ var shadowOpacity: f32;
88
+ #endif`;
89
+ }
90
+ else {
91
+ result.fragment = `#ifdef RENDER_WITH_IBL_SHADOWS
72
92
  uniform vec2 renderTargetSize;
73
93
  uniform float shadowOpacity;
74
- #endif`,
75
- };
94
+ #endif`;
95
+ }
96
+ }
97
+ result.ubo.push({ name: "shadowOpacity", size: 1, type: "float" });
98
+ return result;
76
99
  }
77
100
  getSamplers(samplers) {
78
101
  samplers.push("iblShadowsTexture");
@@ -132,7 +155,7 @@ export class IBLShadowsPluginMaterial extends MaterialPluginBase {
132
155
  #endif
133
156
  `;
134
157
  }
135
- else if (this._material instanceof OpenPBRMaterial) {
158
+ else if (this._isOpenPBRMaterial()) {
136
159
  // eslint-disable-next-line @typescript-eslint/naming-convention
137
160
  frag["CUSTOM_FRAGMENT_BEFORE_IBLLAYERCOMPOSITION"] = `
138
161
  #ifdef RENDER_WITH_IBL_SHADOWS
@@ -211,7 +234,7 @@ export class IBLShadowsPluginMaterial extends MaterialPluginBase {
211
234
  #endif
212
235
  `;
213
236
  }
214
- else if (this._material instanceof OpenPBRMaterial) {
237
+ else if (this._isOpenPBRMaterial()) {
215
238
  // eslint-disable-next-line @typescript-eslint/naming-convention
216
239
  frag["CUSTOM_FRAGMENT_BEFORE_IBLLAYERCOMPOSITION"] = `
217
240
  #ifdef RENDER_WITH_IBL_SHADOWS
@@ -1 +1 @@
1
- {"version":3,"file":"iblShadowsPluginMaterial.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsPluginMaterial.ts"],"names":[],"mappings":"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","sourcesContent":["import { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport { type InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { type StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport { type UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { expandToProperty, serialize } from \"core/Misc/decorators\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\n\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial\";\r\n/**\r\n * @internal\r\n */\r\nclass MaterialIBLShadowsRenderDefines extends MaterialDefines {\r\n public RENDER_WITH_IBL_SHADOWS = false;\r\n public COLORED_IBL_SHADOWS = false;\r\n}\r\n\r\n/**\r\n * Plugin used to render the contribution from IBL shadows.\r\n */\r\nexport class IBLShadowsPluginMaterial extends MaterialPluginBase {\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public static readonly Name = \"IBLShadowsPluginMaterial\";\r\n\r\n /**\r\n * The texture containing the contribution from IBL shadows.\r\n */\r\n public iblShadowsTexture: InternalTexture;\r\n\r\n /**\r\n * The opacity of the shadows.\r\n */\r\n @serialize()\r\n public shadowOpacity: number = 1.0;\r\n\r\n private _isEnabled = false;\r\n private _isColored = false;\r\n public get isColored(): boolean {\r\n return this._isColored;\r\n }\r\n public set isColored(value: boolean) {\r\n if (this._isColored === value) {\r\n return;\r\n }\r\n this._isColored = value;\r\n this._markAllSubMeshesAsTexturesDirty();\r\n }\r\n /**\r\n * Defines if the plugin is enabled in the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public isEnabled = false;\r\n\r\n protected _markAllSubMeshesAsTexturesDirty(): void {\r\n this._enable(this._isEnabled);\r\n this._internalMarkAllSubMeshesAsTexturesDirty();\r\n }\r\n\r\n private _internalMarkAllSubMeshesAsTexturesDirty: () => void;\r\n\r\n /**\r\n * Gets a boolean indicating that the plugin is compatible with a give shader language.\r\n * @returns true if the plugin is compatible with the shader language\r\n */\r\n public override isCompatible(): boolean {\r\n return true;\r\n }\r\n\r\n constructor(material: Material | StandardMaterial | PBRBaseMaterial | OpenPBRMaterial) {\r\n super(material, IBLShadowsPluginMaterial.Name, 310, new MaterialIBLShadowsRenderDefines());\r\n this._internalMarkAllSubMeshesAsTexturesDirty = material._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag];\r\n }\r\n\r\n public override prepareDefines(defines: MaterialIBLShadowsRenderDefines) {\r\n defines.RENDER_WITH_IBL_SHADOWS = this._isEnabled;\r\n defines.COLORED_IBL_SHADOWS = this.isColored;\r\n }\r\n\r\n public override getClassName() {\r\n return \"IBLShadowsPluginMaterial\";\r\n }\r\n\r\n public override getUniforms() {\r\n return {\r\n ubo: [\r\n { name: \"renderTargetSize\", size: 2, type: \"vec2\" },\r\n { name: \"shadowOpacity\", size: 1, type: \"float\" },\r\n ],\r\n fragment: `#ifdef RENDER_WITH_IBL_SHADOWS\r\n uniform vec2 renderTargetSize;\r\n uniform float shadowOpacity;\r\n #endif`,\r\n };\r\n }\r\n\r\n public override getSamplers(samplers: string[]) {\r\n samplers.push(\"iblShadowsTexture\");\r\n }\r\n\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer) {\r\n if (this._isEnabled) {\r\n uniformBuffer.bindTexture(\"iblShadowsTexture\", this.iblShadowsTexture);\r\n uniformBuffer.updateFloat2(\"renderTargetSize\", this._material.getScene().getEngine().getRenderWidth(), this._material.getScene().getEngine().getRenderHeight());\r\n uniformBuffer.updateFloat(\"shadowOpacity\", this.shadowOpacity);\r\n }\r\n }\r\n\r\n public override getCustomCode(shaderType: string, shaderLanguage: ShaderLanguage) {\r\n let frag: { [name: string]: string };\r\n\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n frag = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n var iblShadowsTextureSampler: sampler;\r\n var iblShadowsTexture: texture_2d<f32>;\r\n\r\n #ifdef COLORED_IBL_SHADOWS\r\n fn computeIndirectShadow() -> vec3f {\r\n var uv = fragmentInputs.position.xy / uniforms.renderTargetSize;\r\n var shadowValue: vec3f = textureSample(iblShadowsTexture, iblShadowsTextureSampler, uv).rgb;\r\n return mix(shadowValue, vec3f(1.0), 1.0 - uniforms.shadowOpacity);\r\n }\r\n #else\r\n fn computeIndirectShadow() -> vec2f {\r\n var uv = fragmentInputs.position.xy / uniforms.renderTargetSize;\r\n var shadowValue: vec2f = textureSample(iblShadowsTexture, iblShadowsTextureSampler, uv).rg;\r\n return mix(shadowValue, vec2f(1.0), 1.0 - uniforms.shadowOpacity);\r\n }\r\n #endif\r\n #endif\r\n `,\r\n };\r\n\r\n if (this._material instanceof PBRBaseMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifndef UNLIT\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n var shadowValue: vec3f = computeIndirectShadow();\r\n finalIrradiance *= shadowValue;\r\n finalRadianceScaled *= mix(vec3f(1.0), shadowValue, roughness);\r\n #else\r\n var shadowValue: vec2f = computeIndirectShadow();\r\n finalIrradiance *= vec3f(shadowValue.x);\r\n finalRadianceScaled *= vec3f(mix(pow(shadowValue.y, 4.0), shadowValue.x, roughness));\r\n #endif\r\n #endif\r\n #else\r\n finalDiffuse *= computeIndirectShadow().x;\r\n #endif\r\n #endif\r\n `;\r\n } else if (this._material instanceof OpenPBRMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_IBLLAYERCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifndef UNLIT\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n var shadowValue: vec3f = computeIndirectShadow();\r\n ambient_occlusion = min(ambient_occlusion, shadowValue);\r\n #else\r\n var shadowValue: vec2f = computeIndirectShadow();\r\n ambient_occlusion = min(ambient_occlusion, vec3f(shadowValue.x));\r\n specular_ambient_occlusion = min(specular_ambient_occlusion, pow(shadowValue.y, 4.0));\r\n #endif\r\n #endif\r\n #else\r\n ambient_occlusion = min(ambient_occlusion, vec3f(computeIndirectShadow().x));\r\n #endif\r\n #endif\r\n `;\r\n } else {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifdef COLORED_IBL_SHADOWS\r\n var shadowValue: vec3f = computeIndirectShadow();\r\n color *= toGammaSpace(vec4f(shadowValue, 1.0f));\r\n #else\r\n var shadowValue: vec2f = computeIndirectShadow();\r\n color *= toGammaSpace(vec4f(shadowValue.x, shadowValue.x, shadowValue.x, 1.0f));\r\n #endif\r\n #endif\r\n `;\r\n }\r\n } else {\r\n frag = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n uniform sampler2D iblShadowsTexture;\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 computeIndirectShadow() {\r\n vec2 uv = gl_FragCoord.xy / renderTargetSize;\r\n vec3 shadowValue = texture2D(iblShadowsTexture, uv).rgb;\r\n return mix(shadowValue.rgb, vec3(1.0), 1.0 - shadowOpacity);\r\n }\r\n #else\r\n vec2 computeIndirectShadow() {\r\n vec2 uv = gl_FragCoord.xy / renderTargetSize;\r\n vec2 shadowValue = texture2D(iblShadowsTexture, uv).rg;\r\n return mix(shadowValue.rg, vec2(1.0), 1.0 - shadowOpacity);\r\n }\r\n #endif\r\n #endif\r\n `,\r\n };\r\n\r\n if (this._material instanceof PBRBaseMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifndef UNLIT\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 shadowValue = computeIndirectShadow();\r\n finalIrradiance.rgb *= shadowValue.rgb;\r\n finalRadianceScaled *= mix(vec3(1.0), shadowValue.rgb, roughness);\r\n #else\r\n vec2 shadowValue = computeIndirectShadow();\r\n finalIrradiance *= shadowValue.x;\r\n finalRadianceScaled *= mix(pow(shadowValue.y, 4.0), shadowValue.x, roughness);\r\n #endif\r\n #endif\r\n #else\r\n finalDiffuse *= computeIndirectShadow().x;\r\n #endif\r\n #endif\r\n `;\r\n } else if (this._material instanceof OpenPBRMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_IBLLAYERCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifndef UNLIT\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 shadowValue = computeIndirectShadow();\r\n ambient_occlusion = min(ambient_occlusion, shadowValue);\r\n #else\r\n vec2 shadowValue = computeIndirectShadow();\r\n ambient_occlusion = min(ambient_occlusion, vec3(shadowValue.x));\r\n specular_ambient_occlusion = min(specular_ambient_occlusion, pow(shadowValue.y, 4.0));\r\n #endif\r\n #endif\r\n #else\r\n ambient_occlusion = min(ambient_occlusion, vec3(computeIndirectShadow().x));\r\n #endif\r\n #endif\r\n `;\r\n } else {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 shadowValue = computeIndirectShadow();\r\n color.rgb *= toGammaSpace(shadowValue.rgb);\r\n #else\r\n vec2 shadowValue = computeIndirectShadow();\r\n color.rgb *= toGammaSpace(shadowValue.x);\r\n #endif\r\n #endif\r\n `;\r\n }\r\n }\r\n\r\n return shaderType === \"vertex\" ? null : frag;\r\n }\r\n}\r\n\r\nRegisterClass(`BABYLON.IBLShadowsPluginMaterial`, IBLShadowsPluginMaterial);\r\n"]}
1
+ {"version":3,"file":"iblShadowsPluginMaterial.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsPluginMaterial.ts"],"names":[],"mappings":"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","sourcesContent":["import { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport { type InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { type StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport { type UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { expandToProperty, serialize } from \"core/Misc/decorators\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\n\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { type OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial\";\r\n/**\r\n * @internal\r\n */\r\nclass MaterialIBLShadowsRenderDefines extends MaterialDefines {\r\n public RENDER_WITH_IBL_SHADOWS = false;\r\n public COLORED_IBL_SHADOWS = false;\r\n}\r\n\r\n/**\r\n * Plugin used to render the contribution from IBL shadows.\r\n */\r\nexport class IBLShadowsPluginMaterial extends MaterialPluginBase {\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public static readonly Name = \"IBLShadowsPluginMaterial\";\r\n\r\n /**\r\n * The texture containing the contribution from IBL shadows.\r\n */\r\n public iblShadowsTexture: InternalTexture;\r\n\r\n /**\r\n * The opacity of the shadows.\r\n */\r\n @serialize()\r\n public shadowOpacity: number = 1.0;\r\n\r\n private _isEnabled = false;\r\n private _isColored = false;\r\n public get isColored(): boolean {\r\n return this._isColored;\r\n }\r\n public set isColored(value: boolean) {\r\n if (this._isColored === value) {\r\n return;\r\n }\r\n this._isColored = value;\r\n this._markAllSubMeshesAsTexturesDirty();\r\n }\r\n /**\r\n * Defines if the plugin is enabled in the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public isEnabled = false;\r\n\r\n protected _markAllSubMeshesAsTexturesDirty(): void {\r\n this._enable(this._isEnabled);\r\n this._internalMarkAllSubMeshesAsTexturesDirty();\r\n }\r\n\r\n private _internalMarkAllSubMeshesAsTexturesDirty: () => void;\r\n\r\n /**\r\n * Gets a boolean indicating that the plugin is compatible with a give shader language.\r\n * @returns true if the plugin is compatible with the shader language\r\n */\r\n public override isCompatible(): boolean {\r\n return true;\r\n }\r\n\r\n constructor(material: Material | StandardMaterial | PBRBaseMaterial | OpenPBRMaterial) {\r\n super(material, IBLShadowsPluginMaterial.Name, 310, new MaterialIBLShadowsRenderDefines());\r\n this._internalMarkAllSubMeshesAsTexturesDirty = material._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag];\r\n }\r\n\r\n private _isOpenPBRMaterial(): boolean {\r\n return this._material.getClassName() === \"OpenPBRMaterial\";\r\n }\r\n\r\n public override prepareDefines(defines: MaterialIBLShadowsRenderDefines) {\r\n defines.RENDER_WITH_IBL_SHADOWS = this._isEnabled;\r\n defines.COLORED_IBL_SHADOWS = this.isColored;\r\n }\r\n\r\n public override getClassName() {\r\n return \"IBLShadowsPluginMaterial\";\r\n }\r\n\r\n public override getUniforms(_shaderLanguage: ShaderLanguage) {\r\n const result: any = {};\r\n result.ubo = [];\r\n if (this._isOpenPBRMaterial()) {\r\n if (_shaderLanguage === ShaderLanguage.WGSL) {\r\n result.fragment = `#ifdef RENDER_WITH_IBL_SHADOWS\r\n var shadowOpacity: f32;\r\n #endif`;\r\n } else {\r\n result.fragment = `#ifdef RENDER_WITH_IBL_SHADOWS\r\n uniform float shadowOpacity;\r\n #endif`;\r\n }\r\n } else {\r\n result.ubo.push({ name: \"renderTargetSize\", size: 2, type: \"vec2\" });\r\n if (_shaderLanguage === ShaderLanguage.WGSL) {\r\n result.fragment = `#ifdef RENDER_WITH_IBL_SHADOWS\r\n var renderTargetSize: vec2f;\r\n var shadowOpacity: f32;\r\n #endif`;\r\n } else {\r\n result.fragment = `#ifdef RENDER_WITH_IBL_SHADOWS\r\n uniform vec2 renderTargetSize;\r\n uniform float shadowOpacity;\r\n #endif`;\r\n }\r\n }\r\n result.ubo.push({ name: \"shadowOpacity\", size: 1, type: \"float\" });\r\n return result;\r\n }\r\n\r\n public override getSamplers(samplers: string[]) {\r\n samplers.push(\"iblShadowsTexture\");\r\n }\r\n\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer) {\r\n if (this._isEnabled) {\r\n uniformBuffer.bindTexture(\"iblShadowsTexture\", this.iblShadowsTexture);\r\n uniformBuffer.updateFloat2(\"renderTargetSize\", this._material.getScene().getEngine().getRenderWidth(), this._material.getScene().getEngine().getRenderHeight());\r\n uniformBuffer.updateFloat(\"shadowOpacity\", this.shadowOpacity);\r\n }\r\n }\r\n\r\n public override getCustomCode(shaderType: string, shaderLanguage: ShaderLanguage) {\r\n let frag: { [name: string]: string };\r\n\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n frag = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n var iblShadowsTextureSampler: sampler;\r\n var iblShadowsTexture: texture_2d<f32>;\r\n\r\n #ifdef COLORED_IBL_SHADOWS\r\n fn computeIndirectShadow() -> vec3f {\r\n var uv = fragmentInputs.position.xy / uniforms.renderTargetSize;\r\n var shadowValue: vec3f = textureSample(iblShadowsTexture, iblShadowsTextureSampler, uv).rgb;\r\n return mix(shadowValue, vec3f(1.0), 1.0 - uniforms.shadowOpacity);\r\n }\r\n #else\r\n fn computeIndirectShadow() -> vec2f {\r\n var uv = fragmentInputs.position.xy / uniforms.renderTargetSize;\r\n var shadowValue: vec2f = textureSample(iblShadowsTexture, iblShadowsTextureSampler, uv).rg;\r\n return mix(shadowValue, vec2f(1.0), 1.0 - uniforms.shadowOpacity);\r\n }\r\n #endif\r\n #endif\r\n `,\r\n };\r\n\r\n if (this._material instanceof PBRBaseMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifndef UNLIT\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n var shadowValue: vec3f = computeIndirectShadow();\r\n finalIrradiance *= shadowValue;\r\n finalRadianceScaled *= mix(vec3f(1.0), shadowValue, roughness);\r\n #else\r\n var shadowValue: vec2f = computeIndirectShadow();\r\n finalIrradiance *= vec3f(shadowValue.x);\r\n finalRadianceScaled *= vec3f(mix(pow(shadowValue.y, 4.0), shadowValue.x, roughness));\r\n #endif\r\n #endif\r\n #else\r\n finalDiffuse *= computeIndirectShadow().x;\r\n #endif\r\n #endif\r\n `;\r\n } else if (this._isOpenPBRMaterial()) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_IBLLAYERCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifndef UNLIT\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n var shadowValue: vec3f = computeIndirectShadow();\r\n ambient_occlusion = min(ambient_occlusion, shadowValue);\r\n #else\r\n var shadowValue: vec2f = computeIndirectShadow();\r\n ambient_occlusion = min(ambient_occlusion, vec3f(shadowValue.x));\r\n specular_ambient_occlusion = min(specular_ambient_occlusion, pow(shadowValue.y, 4.0));\r\n #endif\r\n #endif\r\n #else\r\n ambient_occlusion = min(ambient_occlusion, vec3f(computeIndirectShadow().x));\r\n #endif\r\n #endif\r\n `;\r\n } else {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifdef COLORED_IBL_SHADOWS\r\n var shadowValue: vec3f = computeIndirectShadow();\r\n color *= toGammaSpace(vec4f(shadowValue, 1.0f));\r\n #else\r\n var shadowValue: vec2f = computeIndirectShadow();\r\n color *= toGammaSpace(vec4f(shadowValue.x, shadowValue.x, shadowValue.x, 1.0f));\r\n #endif\r\n #endif\r\n `;\r\n }\r\n } else {\r\n frag = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n uniform sampler2D iblShadowsTexture;\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 computeIndirectShadow() {\r\n vec2 uv = gl_FragCoord.xy / renderTargetSize;\r\n vec3 shadowValue = texture2D(iblShadowsTexture, uv).rgb;\r\n return mix(shadowValue.rgb, vec3(1.0), 1.0 - shadowOpacity);\r\n }\r\n #else\r\n vec2 computeIndirectShadow() {\r\n vec2 uv = gl_FragCoord.xy / renderTargetSize;\r\n vec2 shadowValue = texture2D(iblShadowsTexture, uv).rg;\r\n return mix(shadowValue.rg, vec2(1.0), 1.0 - shadowOpacity);\r\n }\r\n #endif\r\n #endif\r\n `,\r\n };\r\n\r\n if (this._material instanceof PBRBaseMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifndef UNLIT\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 shadowValue = computeIndirectShadow();\r\n finalIrradiance.rgb *= shadowValue.rgb;\r\n finalRadianceScaled *= mix(vec3(1.0), shadowValue.rgb, roughness);\r\n #else\r\n vec2 shadowValue = computeIndirectShadow();\r\n finalIrradiance *= shadowValue.x;\r\n finalRadianceScaled *= mix(pow(shadowValue.y, 4.0), shadowValue.x, roughness);\r\n #endif\r\n #endif\r\n #else\r\n finalDiffuse *= computeIndirectShadow().x;\r\n #endif\r\n #endif\r\n `;\r\n } else if (this._isOpenPBRMaterial()) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_IBLLAYERCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifndef UNLIT\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 shadowValue = computeIndirectShadow();\r\n ambient_occlusion = min(ambient_occlusion, shadowValue);\r\n #else\r\n vec2 shadowValue = computeIndirectShadow();\r\n ambient_occlusion = min(ambient_occlusion, vec3(shadowValue.x));\r\n specular_ambient_occlusion = min(specular_ambient_occlusion, pow(shadowValue.y, 4.0));\r\n #endif\r\n #endif\r\n #else\r\n ambient_occlusion = min(ambient_occlusion, vec3(computeIndirectShadow().x));\r\n #endif\r\n #endif\r\n `;\r\n } else {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 shadowValue = computeIndirectShadow();\r\n color.rgb *= toGammaSpace(shadowValue.rgb);\r\n #else\r\n vec2 shadowValue = computeIndirectShadow();\r\n color.rgb *= toGammaSpace(shadowValue.x);\r\n #endif\r\n #endif\r\n `;\r\n }\r\n }\r\n\r\n return shaderType === \"vertex\" ? null : frag;\r\n }\r\n}\r\n\r\nRegisterClass(`BABYLON.IBLShadowsPluginMaterial`, IBLShadowsPluginMaterial);\r\n"]}
@@ -59,6 +59,11 @@ export declare class GeometryBufferRenderer {
59
59
  * using getIndex(GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE)
60
60
  */
61
61
  static readonly VELOCITY_LINEAR_TEXTURE_TYPE = 6;
62
+ /**
63
+ * Constant used to retrieve the irradiance texture index in the G-Buffer textures array
64
+ * using getIndex(GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE)
65
+ */
66
+ static readonly IRRADIANCE_TEXTURE_TYPE = 7;
62
67
  /**
63
68
  * Dictionary used to store the previous transformation matrices of each rendered mesh
64
69
  * in order to compute objects velocities when enableVelocity is set to "true"
@@ -103,6 +108,7 @@ export declare class GeometryBufferRenderer {
103
108
  private _enableVelocityLinear;
104
109
  private _enableReflectivity;
105
110
  private _enableScreenspaceDepth;
111
+ private _enableIrradiance;
106
112
  private _depthFormat;
107
113
  private _clearColor;
108
114
  private _clearDepthColor;
@@ -113,6 +119,7 @@ export declare class GeometryBufferRenderer {
113
119
  private _depthIndex;
114
120
  private _normalIndex;
115
121
  private _screenspaceDepthIndex;
122
+ private _irradianceIndex;
116
123
  private _linkedWithPrePass;
117
124
  private _prePassRenderer;
118
125
  private _attachmentsFromPrePass;
@@ -229,6 +236,19 @@ export declare class GeometryBufferRenderer {
229
236
  */
230
237
  get enableScreenspaceDepth(): boolean;
231
238
  set enableScreenspaceDepth(enable: boolean);
239
+ /**
240
+ * Gets a boolean indicating if objects irradiance are enabled in the G buffer.
241
+ */
242
+ get enableIrradiance(): boolean;
243
+ /**
244
+ * Sets whether or not objects irradiance are enabled for the G buffer.
245
+ */
246
+ set enableIrradiance(enable: boolean);
247
+ /**
248
+ * This will store a mask in the alpha channel of the irradiance texture to indicate which pixels have
249
+ * scattering and should be taken into account when applying image-based lighting.
250
+ */
251
+ generateIrradianceWithScatterMask: boolean;
232
252
  /**
233
253
  * If set to true (default: false), the depth texture will be cleared with the depth value corresponding to the far plane (1 in normal mode, 0 in reverse depth buffer mode)
234
254
  * If set to false, the depth texture is always cleared with 0.
@@ -10,8 +10,19 @@ import "../Shaders/geometry.fragment.js";
10
10
  import "../Shaders/geometry.vertex.js";
11
11
  import { MaterialFlags } from "../Materials/materialFlags.js";
12
12
  import { AddClipPlaneUniforms, BindClipPlane, PrepareStringDefinesForClipPlanes } from "../Materials/clipPlaneMaterialHelper.js";
13
- import { BindMorphTargetParameters, BindSceneUniformBuffer, PrepareDefinesAndAttributesForMorphTargets, PushAttributesForInstances } from "../Materials/materialHelper.functions.js";
13
+ import { BindMorphTargetParameters, BindSceneUniformBuffer, PrepareDefinesAndAttributesForMorphTargets, PushAttributesForInstances, PrepareUniformsAndSamplersForIBL, PrepareDefinesForIBL, } from "../Materials/materialHelper.functions.js";
14
14
  import "../Engines/Extensions/engine.multiRender.js";
15
+ const Samplers = [
16
+ "diffuseSampler",
17
+ "bumpSampler",
18
+ "reflectivitySampler",
19
+ "albedoSampler",
20
+ "morphTargets",
21
+ "boneSampler",
22
+ "transmissionWeightSampler",
23
+ "subsurfaceWeightSampler",
24
+ "iblShadowSampler",
25
+ ];
15
26
  /** list the uniforms used by the geometry renderer */
16
27
  const Uniforms = [
17
28
  "world",
@@ -27,6 +38,13 @@ const Uniforms = [
27
38
  "albedoMatrix",
28
39
  "reflectivityColor",
29
40
  "albedoColor",
41
+ "reflectionMatrix",
42
+ "vTransmissionWeight",
43
+ "vSubsurfaceWeight",
44
+ "vEyePosition",
45
+ "vTransmissionScatterAnisotropy",
46
+ "vSubsurfaceScatterAnisotropy",
47
+ "shadowTextureSize",
30
48
  "metallic",
31
49
  "glossiness",
32
50
  "vTangentSpaceParams",
@@ -37,6 +55,7 @@ const Uniforms = [
37
55
  "morphTargetTextureIndices",
38
56
  "boneTextureInfo",
39
57
  ];
58
+ PrepareUniformsAndSamplersForIBL(Uniforms, Samplers, true);
40
59
  AddClipPlaneUniforms(Uniforms);
41
60
  /**
42
61
  * This renderer is helpful to fill one of the render target with a geometry buffer.
@@ -85,6 +104,7 @@ export class GeometryBufferRenderer {
85
104
  this._enableVelocity = false;
86
105
  this._enableVelocityLinear = false;
87
106
  this._enableScreenspaceDepth = false;
107
+ this._enableIrradiance = false;
88
108
  this._attachmentsFromPrePass = [];
89
109
  }
90
110
  /**
@@ -121,6 +141,10 @@ export class GeometryBufferRenderer {
121
141
  this._screenspaceDepthIndex = index;
122
142
  this._enableScreenspaceDepth = true;
123
143
  }
144
+ else if (geometryBufferType === GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE) {
145
+ this._irradianceIndex = index;
146
+ this._enableIrradiance = true;
147
+ }
124
148
  }
125
149
  /**
126
150
  * @internal
@@ -178,6 +202,8 @@ export class GeometryBufferRenderer {
178
202
  return this._normalIndex;
179
203
  case GeometryBufferRenderer.SCREENSPACE_DEPTH_TEXTURE_TYPE:
180
204
  return this._screenspaceDepthIndex;
205
+ case GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE:
206
+ return this._irradianceIndex;
181
207
  default:
182
208
  return -1;
183
209
  }
@@ -300,6 +326,22 @@ export class GeometryBufferRenderer {
300
326
  this._createRenderTargets();
301
327
  }
302
328
  }
329
+ /**
330
+ * Gets a boolean indicating if objects irradiance are enabled in the G buffer.
331
+ */
332
+ get enableIrradiance() {
333
+ return this._enableIrradiance;
334
+ }
335
+ /**
336
+ * Sets whether or not objects irradiance are enabled for the G buffer.
337
+ */
338
+ set enableIrradiance(enable) {
339
+ this._enableIrradiance = enable;
340
+ if (!this._linkedWithPrePass) {
341
+ this.dispose();
342
+ this._createRenderTargets();
343
+ }
344
+ }
303
345
  /**
304
346
  * Gets the scene associated with the buffer.
305
347
  */
@@ -359,6 +401,7 @@ export class GeometryBufferRenderer {
359
401
  this._enableVelocityLinear = false;
360
402
  this._enableReflectivity = false;
361
403
  this._enableScreenspaceDepth = false;
404
+ this._enableIrradiance = false;
362
405
  this._clearColor = new Color4(0, 0, 0, 0);
363
406
  this._clearDepthColor = new Color4(0, 0, 0, 1); // sets an invalid value by default - depth in the depth texture is view.z, so 0 is not possible because view.z can't be less than camera.minZ
364
407
  this._positionIndex = -1;
@@ -368,7 +411,13 @@ export class GeometryBufferRenderer {
368
411
  this._depthIndex = -1;
369
412
  this._normalIndex = -1;
370
413
  this._screenspaceDepthIndex = -1;
414
+ this._irradianceIndex = -1;
371
415
  this._linkedWithPrePass = false;
416
+ /**
417
+ * This will store a mask in the alpha channel of the irradiance texture to indicate which pixels have
418
+ * scattering and should be taken into account when applying image-based lighting.
419
+ */
420
+ this.generateIrradianceWithScatterMask = false;
372
421
  /**
373
422
  * If set to true (default: false), the depth texture will be cleared with the depth value corresponding to the far plane (1 in normal mode, 0 in reverse depth buffer mode)
374
423
  * If set to false, the depth texture is always cleared with 0.
@@ -565,38 +614,57 @@ export class GeometryBufferRenderer {
565
614
  }
566
615
  }
567
616
  else if (material.getClassName() === "OpenPBRMaterial") {
568
- const pbrMaterial = material;
569
- defines.push("#define METALLICWORKFLOW");
617
+ const openpbrMaterial = material;
570
618
  defines.push("#define METALLIC");
571
619
  defines.push("#define ROUGHNESS");
572
- if (pbrMaterial._useRoughnessFromMetallicTextureGreen && pbrMaterial.baseMetalnessTexture) {
620
+ if (openpbrMaterial._useRoughnessFromMetallicTextureGreen && openpbrMaterial.baseMetalnessTexture) {
573
621
  defines.push("#define ORMTEXTURE");
574
- defines.push(`#define REFLECTIVITY_UV${pbrMaterial.baseMetalnessTexture.coordinatesIndex + 1}`);
622
+ defines.push(`#define REFLECTIVITY_UV${openpbrMaterial.baseMetalnessTexture.coordinatesIndex + 1}`);
575
623
  needUv = true;
576
624
  }
577
- else if (pbrMaterial.baseMetalnessTexture) {
625
+ else if (openpbrMaterial.baseMetalnessTexture) {
578
626
  defines.push("#define METALLIC_TEXTURE");
579
- defines.push(`#define METALLIC_UV${pbrMaterial.baseMetalnessTexture.coordinatesIndex + 1}`);
627
+ defines.push(`#define METALLIC_UV${openpbrMaterial.baseMetalnessTexture.coordinatesIndex + 1}`);
580
628
  needUv = true;
581
629
  }
582
- else if (pbrMaterial.specularRoughnessTexture) {
630
+ else if (openpbrMaterial.specularRoughnessTexture) {
583
631
  defines.push("#define ROUGHNESS_TEXTURE");
584
- defines.push(`#define ROUGHNESS_UV${pbrMaterial.specularRoughnessTexture.coordinatesIndex + 1}`);
632
+ defines.push(`#define ROUGHNESS_UV${openpbrMaterial.specularRoughnessTexture.coordinatesIndex + 1}`);
585
633
  needUv = true;
586
634
  }
587
- if (pbrMaterial.baseColorTexture) {
635
+ if (openpbrMaterial.baseColorTexture) {
588
636
  defines.push("#define ALBEDOTEXTURE");
589
- defines.push(`#define ALBEDO_UV${pbrMaterial.baseColorTexture.coordinatesIndex + 1}`);
590
- if (pbrMaterial.baseColorTexture.gammaSpace) {
637
+ defines.push(`#define ALBEDO_UV${openpbrMaterial.baseColorTexture.coordinatesIndex + 1}`);
638
+ if (openpbrMaterial.baseColorTexture.gammaSpace) {
591
639
  defines.push("#define GAMMAALBEDO");
592
640
  }
593
641
  needUv = true;
594
642
  }
595
- if (pbrMaterial.baseColor) {
643
+ if (openpbrMaterial.baseColor) {
596
644
  defines.push("#define ALBEDOCOLOR");
597
645
  }
598
646
  }
599
647
  }
648
+ if (this._enableIrradiance && this.generateIrradianceWithScatterMask) {
649
+ defines.push("#define IRRADIANCE_SCATTER_MASK");
650
+ if (material.getClassName() === "OpenPBRMaterial") {
651
+ const openpbrMaterial = material;
652
+ if (openpbrMaterial.subsurfaceWeight > 0) {
653
+ if (openpbrMaterial.subsurfaceWeightTexture) {
654
+ defines.push("#define SUBSURFACE_WEIGHT");
655
+ defines.push(`#define SUBSURFACEWEIGHT_UV${openpbrMaterial.subsurfaceWeightTexture.coordinatesIndex + 1}`);
656
+ needUv = true;
657
+ }
658
+ }
659
+ if (openpbrMaterial.transmissionWeight > 0) {
660
+ if (openpbrMaterial.transmissionWeightTexture) {
661
+ defines.push("#define TRANSMISSION_WEIGHT");
662
+ defines.push(`#define TRANSMISSIONWEIGHT_UV${openpbrMaterial.transmissionWeightTexture.coordinatesIndex + 1}`);
663
+ needUv = true;
664
+ }
665
+ }
666
+ }
667
+ }
600
668
  if (needUv) {
601
669
  defines.push("#define NEED_UV");
602
670
  if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {
@@ -648,6 +716,47 @@ export class GeometryBufferRenderer {
648
716
  defines.push("#define SCREENSPACE_DEPTH");
649
717
  }
650
718
  }
719
+ if (this._enableIrradiance) {
720
+ if (this._irradianceIndex !== -1) {
721
+ defines.push("#define IRRADIANCE_INDEX " + this._irradianceIndex);
722
+ defines.push("#define IRRADIANCE");
723
+ // Check if scene has IBL setup
724
+ const scene = this._scene;
725
+ if (scene.environmentTexture) {
726
+ const iblDefines = {};
727
+ let realtime = false;
728
+ let realtimeQuality = 0;
729
+ if (material.getClassName() === "OpenPBRMaterial" ||
730
+ material.getClassName() === "StandardMaterial" ||
731
+ material.getClassName() === "PBRMetallicRoughnessMaterial" ||
732
+ material.getClassName() === "PBRSpecularGlossinessMaterial" ||
733
+ material.getClassName() === "PBRMaterial") {
734
+ realtime = material.realtimeFiltering ? true : false;
735
+ realtimeQuality = material.realtimeFilteringQuality || 0;
736
+ }
737
+ PrepareDefinesForIBL(scene, scene.environmentTexture, iblDefines, realtime, realtimeQuality, true);
738
+ for (const define in iblDefines) {
739
+ if (iblDefines[define]) {
740
+ defines.push("#define " + define);
741
+ }
742
+ }
743
+ if (!iblDefines.USEIRRADIANCEMAP) {
744
+ defines.push("#define SPHERICAL_HARMONICS");
745
+ }
746
+ const iblShadowsPipeline = scene.postProcessRenderPipelineManager.supportedPipelines.find((p) => p.getClassName() === "IBLShadowsRenderPipeline");
747
+ if (iblShadowsPipeline) {
748
+ const pipeline = iblShadowsPipeline;
749
+ const shadowTexture = pipeline._getAccumulatedTexture();
750
+ if (shadowTexture) {
751
+ defines.push("#define IBL_SHADOW_TEXTURE");
752
+ if (pipeline.coloredShadows) {
753
+ defines.push("#define COLORED_IBL_SHADOWS");
754
+ }
755
+ }
756
+ }
757
+ }
758
+ }
759
+ }
651
760
  if (this.generateNormalsInWorldSpace) {
652
761
  defines.push("#define NORMAL_WORLDSPACE");
653
762
  }
@@ -706,7 +815,7 @@ export class GeometryBufferRenderer {
706
815
  drawWrapper.setEffect(engine.createEffect("geometry", {
707
816
  attributes: attribs,
708
817
  uniformsNames: Uniforms,
709
- samplers: ["diffuseSampler", "bumpSampler", "reflectivitySampler", "albedoSampler", "morphTargets", "boneSampler"],
818
+ samplers: Samplers,
710
819
  defines: join,
711
820
  onCompiled: null,
712
821
  fallbacks: null,
@@ -797,6 +906,12 @@ export class GeometryBufferRenderer {
797
906
  textureNames.push("gBuffer_ScreenspaceDepth");
798
907
  textureTypesAndFormats.push(this._textureTypesAndFormats[GeometryBufferRenderer.SCREENSPACE_DEPTH_TEXTURE_TYPE]);
799
908
  }
909
+ if (this._enableIrradiance) {
910
+ this._irradianceIndex = count;
911
+ count++;
912
+ textureNames.push("gBuffer_Irradiance");
913
+ textureTypesAndFormats.push(this._textureTypesAndFormats[GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE]);
914
+ }
800
915
  return [count, textureNames, textureTypesAndFormats];
801
916
  }
802
917
  _createRenderTargets() {
@@ -907,6 +1022,7 @@ export class GeometryBufferRenderer {
907
1022
  if (!this._useUbo) {
908
1023
  effect.setMatrix("viewProjection", scene.getTransformMatrix());
909
1024
  effect.setMatrix("view", scene.getViewMatrix());
1025
+ this._scene.bindEyePosition(effect, "vEyePosition");
910
1026
  }
911
1027
  else {
912
1028
  BindSceneUniformBuffer(effect, this._scene.getSceneUniformBuffer());
@@ -1053,6 +1169,74 @@ export class GeometryBufferRenderer {
1053
1169
  }
1054
1170
  }
1055
1171
  }
1172
+ // IBL binding for irradiance
1173
+ if (this._enableIrradiance && scene.environmentTexture) {
1174
+ const reflectionTexture = scene.environmentTexture;
1175
+ const iblShadowsPipeline = scene.postProcessRenderPipelineManager.supportedPipelines.find((p) => p.getClassName() === "IBLShadowsRenderPipeline");
1176
+ if (iblShadowsPipeline) {
1177
+ const pipeline = iblShadowsPipeline;
1178
+ const shadowTexture = pipeline._getAccumulatedTexture();
1179
+ if (shadowTexture) {
1180
+ effect.setTexture("iblShadowSampler", shadowTexture);
1181
+ effect.setFloat2("shadowTextureSize", shadowTexture.getSize().width, shadowTexture.getSize().height);
1182
+ }
1183
+ }
1184
+ // Bind reflection matrix
1185
+ effect.setMatrix("reflectionMatrix", reflectionTexture.getReflectionTextureMatrix());
1186
+ // Bind reflection info (intensity and other parameters)
1187
+ effect.setFloat2("vReflectionInfos", reflectionTexture.level * scene.iblIntensity, 0.0);
1188
+ // Bind reflection sampler
1189
+ effect.setTexture("reflectionSampler", reflectionTexture);
1190
+ // Bind irradiance sampler if available
1191
+ if (reflectionTexture.irradianceTexture) {
1192
+ effect.setTexture("irradianceSampler", reflectionTexture.irradianceTexture);
1193
+ if (reflectionTexture.irradianceTexture._dominantDirection) {
1194
+ effect.setVector3("vReflectionDominantDirection", reflectionTexture.irradianceTexture._dominantDirection);
1195
+ }
1196
+ }
1197
+ // Bind spherical harmonics uniforms if available
1198
+ if (reflectionTexture.sphericalPolynomial) {
1199
+ const polynomials = reflectionTexture.sphericalPolynomial;
1200
+ if (polynomials.preScaledHarmonics) {
1201
+ const harmonics = polynomials.preScaledHarmonics;
1202
+ effect.setVector3("vSphericalL00", harmonics.l00);
1203
+ effect.setVector3("vSphericalL1_1", harmonics.l1_1);
1204
+ effect.setVector3("vSphericalL10", harmonics.l10);
1205
+ effect.setVector3("vSphericalL11", harmonics.l11);
1206
+ effect.setVector3("vSphericalL2_2", harmonics.l2_2);
1207
+ effect.setVector3("vSphericalL2_1", harmonics.l2_1);
1208
+ effect.setVector3("vSphericalL20", harmonics.l20);
1209
+ effect.setVector3("vSphericalL21", harmonics.l21);
1210
+ effect.setVector3("vSphericalL22", harmonics.l22);
1211
+ }
1212
+ else {
1213
+ effect.setFloat3("vSphericalX", polynomials.x.x, polynomials.x.y, polynomials.x.z);
1214
+ effect.setFloat3("vSphericalY", polynomials.y.x, polynomials.y.y, polynomials.y.z);
1215
+ effect.setFloat3("vSphericalZ", polynomials.z.x, polynomials.z.y, polynomials.z.z);
1216
+ effect.setFloat3("vSphericalXX_ZZ", polynomials.xx.x - polynomials.zz.x, polynomials.xx.y - polynomials.zz.y, polynomials.xx.z - polynomials.zz.z);
1217
+ effect.setFloat3("vSphericalYY_ZZ", polynomials.yy.x - polynomials.zz.x, polynomials.yy.y - polynomials.zz.y, polynomials.yy.z - polynomials.zz.z);
1218
+ effect.setFloat3("vSphericalZZ", polynomials.zz.x, polynomials.zz.y, polynomials.zz.z);
1219
+ effect.setFloat3("vSphericalXY", polynomials.xy.x, polynomials.xy.y, polynomials.xy.z);
1220
+ effect.setFloat3("vSphericalYZ", polynomials.yz.x, polynomials.yz.y, polynomials.yz.z);
1221
+ effect.setFloat3("vSphericalZX", polynomials.zx.x, polynomials.zx.y, polynomials.zx.z);
1222
+ }
1223
+ }
1224
+ if (this.generateIrradianceWithScatterMask && material.getClassName() === "OpenPBRMaterial") {
1225
+ const openpbrMaterial = material;
1226
+ effect.setFloat("vSubsurfaceWeight", openpbrMaterial.subsurfaceWeight);
1227
+ if (openpbrMaterial.subsurfaceWeightTexture) {
1228
+ effect.setTexture("subsurfaceWeightSampler", openpbrMaterial.subsurfaceWeightTexture);
1229
+ effect.setMatrix("subsurfaceWeightMatrix", openpbrMaterial.subsurfaceWeightTexture.getTextureMatrix());
1230
+ }
1231
+ effect.setFloat("vTransmissionWeight", openpbrMaterial.transmissionWeight);
1232
+ if (openpbrMaterial.transmissionWeightTexture) {
1233
+ effect.setTexture("transmissionWeightSampler", openpbrMaterial.transmissionWeightTexture);
1234
+ effect.setMatrix("transmissionWeightMatrix", openpbrMaterial.transmissionWeightTexture.getTextureMatrix());
1235
+ }
1236
+ effect.setFloat("vTransmissionScatterAnisotropy", openpbrMaterial.transmissionScatterAnisotropy);
1237
+ effect.setFloat("vSubsurfaceScatterAnisotropy", openpbrMaterial.subsurfaceScatterAnisotropy);
1238
+ }
1239
+ }
1056
1240
  // Clip plane
1057
1241
  BindClipPlane(effect, material, this._scene);
1058
1242
  // Bones
@@ -1195,6 +1379,11 @@ GeometryBufferRenderer.SCREENSPACE_DEPTH_TEXTURE_TYPE = 5;
1195
1379
  * using getIndex(GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE)
1196
1380
  */
1197
1381
  GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE = 6;
1382
+ /**
1383
+ * Constant used to retrieve the irradiance texture index in the G-Buffer textures array
1384
+ * using getIndex(GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE)
1385
+ */
1386
+ GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE = 7;
1198
1387
  /**
1199
1388
  * @internal
1200
1389
  */