@babylonjs/core 7.32.2 → 7.32.4

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 (69) hide show
  1. package/Engines/abstractEngine.js +2 -2
  2. package/Engines/abstractEngine.js.map +1 -1
  3. package/Materials/Node/Blocks/Input/inputBlock.js +17 -9
  4. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  5. package/Materials/Node/nodeMaterial.js +3 -0
  6. package/Materials/Node/nodeMaterial.js.map +1 -1
  7. package/Misc/webRequest.d.ts +4 -0
  8. package/Misc/webRequest.js +6 -0
  9. package/Misc/webRequest.js.map +1 -1
  10. package/Rendering/IBLShadows/iblShadowsAccumulationPass.d.ts +35 -11
  11. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +131 -117
  12. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -1
  13. package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js +0 -1
  14. package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js.map +1 -1
  15. package/Rendering/IBLShadows/iblShadowsPluginMaterial.d.ts +60 -0
  16. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js +166 -0
  17. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js.map +1 -0
  18. package/Rendering/IBLShadows/iblShadowsRenderPipeline.d.ts +97 -56
  19. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +356 -308
  20. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  21. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.d.ts +20 -6
  22. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js +67 -35
  23. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js.map +1 -1
  24. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.d.ts +9 -4
  25. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +84 -66
  26. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  27. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.d.ts +31 -6
  28. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +108 -60
  29. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
  30. package/Rendering/geometryBufferRenderer.d.ts +15 -0
  31. package/Rendering/geometryBufferRenderer.js +48 -5
  32. package/Rendering/geometryBufferRenderer.js.map +1 -1
  33. package/Shaders/ShadersInclude/instancesDeclaration.js +2 -4
  34. package/Shaders/ShadersInclude/instancesDeclaration.js.map +1 -1
  35. package/Shaders/ShadersInclude/instancesVertex.js +3 -6
  36. package/Shaders/ShadersInclude/instancesVertex.js.map +1 -1
  37. package/Shaders/geometry.fragment.js +5 -1
  38. package/Shaders/geometry.fragment.js.map +1 -1
  39. package/Shaders/geometry.vertex.js +3 -3
  40. package/Shaders/geometry.vertex.js.map +1 -1
  41. package/Shaders/iblShadowAccumulation.fragment.js +7 -11
  42. package/Shaders/iblShadowAccumulation.fragment.js.map +1 -1
  43. package/Shaders/iblShadowGBufferDebug.fragment.js +2 -3
  44. package/Shaders/iblShadowGBufferDebug.fragment.js.map +1 -1
  45. package/Shaders/iblShadowSpatialBlur.fragment.js +5 -5
  46. package/Shaders/iblShadowSpatialBlur.fragment.js.map +1 -1
  47. package/Shaders/iblShadowVoxelTracing.fragment.js +31 -32
  48. package/Shaders/iblShadowVoxelTracing.fragment.js.map +1 -1
  49. package/Shaders/iblShadowsCombine.fragment.js +2 -2
  50. package/Shaders/iblShadowsCombine.fragment.js.map +1 -1
  51. package/ShadersWGSL/ShadersInclude/instancesDeclaration.js +2 -4
  52. package/ShadersWGSL/ShadersInclude/instancesDeclaration.js.map +1 -1
  53. package/ShadersWGSL/ShadersInclude/instancesVertex.js +3 -6
  54. package/ShadersWGSL/ShadersInclude/instancesVertex.js.map +1 -1
  55. package/ShadersWGSL/geometry.fragment.js +7 -1
  56. package/ShadersWGSL/geometry.fragment.js.map +1 -1
  57. package/ShadersWGSL/geometry.vertex.js +3 -3
  58. package/ShadersWGSL/geometry.vertex.js.map +1 -1
  59. package/ShadersWGSL/iblShadowAccumulation.fragment.js +5 -10
  60. package/ShadersWGSL/iblShadowAccumulation.fragment.js.map +1 -1
  61. package/ShadersWGSL/iblShadowGBufferDebug.fragment.js +2 -3
  62. package/ShadersWGSL/iblShadowGBufferDebug.fragment.js.map +1 -1
  63. package/ShadersWGSL/iblShadowSpatialBlur.fragment.js +5 -5
  64. package/ShadersWGSL/iblShadowSpatialBlur.fragment.js.map +1 -1
  65. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js +45 -33
  66. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js.map +1 -1
  67. package/ShadersWGSL/iblShadowsCombine.fragment.js +6 -2
  68. package/ShadersWGSL/iblShadowsCombine.fragment.js.map +1 -1
  69. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"iblShadowsSpatialBlurPass.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsSpatialBlurPass.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\r\nimport type { AbstractEngine } from \"../../Engines/abstractEngine\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Vector4 } from \"../../Maths/math.vector\";\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport type { PostProcessOptions } from \"../../PostProcesses/postProcess\";\r\nimport type { Effect } from \"../../Materials/effect\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * This should not be instanciated directly, as it is part of a scene component\r\n * @internal\r\n */\r\nexport class _IblShadowsSpatialBlurPass {\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n // private _renderPipeline: IblShadowsRenderPipeline;\r\n private _outputPP: PostProcess;\r\n private _worldScale: number = 1.0;\r\n\r\n /**\r\n * Gets the pass post process\r\n * @returns The post process\r\n */\r\n public getPassPP(): PostProcess {\r\n return this._outputPP;\r\n }\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._debugPassPP) {\r\n this._createDebugPass();\r\n }\r\n return this._debugPassPP;\r\n }\r\n private _debugPassName: string = \"Spatial Blur Debug Pass\";\r\n /**\r\n * Sets the name of the debug pass\r\n */\r\n public get debugPassName(): string {\r\n return this._debugPassName;\r\n }\r\n\r\n /**\r\n * The scale of the voxel grid in world space. This is used to scale the blur radius in world space.\r\n * @param scale The scale of the voxel grid in world space.\r\n */\r\n public setWorldScale(scale: number) {\r\n this._worldScale = scale;\r\n }\r\n\r\n /** Enable the debug view for this pass */\r\n public debugEnabled: boolean = false;\r\n private _debugPassPP: PostProcess;\r\n private _debugSizeParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.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 * Creates the debug post process effect for this pass\r\n */\r\n private _createDebugPass() {\r\n if (!this._debugPassPP) {\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 textureFormat: Constants.TEXTUREFORMAT_R,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n uniforms: [\"sizeParams\"],\r\n samplers: [\"debugSampler\"],\r\n engine: this._engine,\r\n reusable: false,\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/iblShadowDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/iblShadowDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._debugPassPP = new PostProcess(this.debugPassName, \"iblShadowDebug\", debugOptions);\r\n this._debugPassPP.autoClear = false;\r\n this._debugPassPP.onApplyObservable.add((effect) => {\r\n // update the caustic texture with what we just rendered.\r\n effect.setTextureFromPostProcessOutput(\"debugSampler\", this._outputPP);\r\n effect.setVector4(\"sizeParams\", this._debugSizeParams);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Instanciates the importance sampling renderer\r\n * @param scene Scene to attach to\r\n * @returns The importance sampling renderer\r\n */\r\n constructor(scene: Scene) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._createTextures();\r\n }\r\n\r\n private _createTextures() {\r\n const isWebGPU = this._engine.isWebGPU;\r\n const ppOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n textureFormat: Constants.TEXTUREFORMAT_RG,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n uniforms: [\"blurParameters\"],\r\n samplers: [\"shadowSampler\", \"worldNormalSampler\", \"linearDepthSampler\"],\r\n engine: this._engine,\r\n reusable: false,\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/iblShadowSpatialBlur.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/iblShadowSpatialBlur.fragment\"));\r\n }\r\n },\r\n };\r\n this._outputPP = new PostProcess(\"spacialBlurPP\", \"iblShadowSpatialBlur\", ppOptions);\r\n this._outputPP.autoClear = false;\r\n this._outputPP.onApplyObservable.add((effect) => {\r\n this._updatePostProcess(effect);\r\n });\r\n }\r\n\r\n private _updatePostProcess(effect: Effect) {\r\n const iterationCount = 1;\r\n effect.setVector4(\"blurParameters\", new Vector4(iterationCount, this._worldScale, 0.0, 0.0));\r\n const prePassRenderer = this._scene.prePassRenderer;\r\n if (prePassRenderer) {\r\n const wnormalIndex = prePassRenderer.getIndex(Constants.PREPASS_WORLD_NORMAL_TEXTURE_TYPE);\r\n const depthIndex = prePassRenderer.getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE);\r\n if (wnormalIndex >= 0) effect.setTexture(\"worldNormalSampler\", prePassRenderer.getRenderTarget().textures[wnormalIndex]);\r\n if (depthIndex >= 0) effect.setTexture(\"linearDepthSampler\", prePassRenderer.getRenderTarget().textures[depthIndex]);\r\n }\r\n }\r\n\r\n /**\r\n * Checks if the pass is ready\r\n * @returns true if the pass is ready\r\n */\r\n public isReady() {\r\n return this._outputPP.isReady() && !(this._debugPassPP && !this._debugPassPP.isReady());\r\n }\r\n\r\n /**\r\n * Disposes the associated resources\r\n */\r\n public dispose() {\r\n this._outputPP.dispose();\r\n if (this._debugPassPP) {\r\n this._debugPassPP.dispose();\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"iblShadowsSpatialBlurPass.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsSpatialBlurPass.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\r\nimport type { AbstractEngine } from \"../../Engines/abstractEngine\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Vector4 } from \"../../Maths/math.vector\";\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport type { PostProcessOptions } from \"../../PostProcesses/postProcess\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { GeometryBufferRenderer } from \"../../Rendering/geometryBufferRenderer\";\r\nimport { ProceduralTexture } from \"core/Materials/Textures/Procedurals/proceduralTexture\";\r\nimport type { IProceduralTextureCreationOptions } from \"core/Materials/Textures/Procedurals/proceduralTexture\";\r\nimport type { IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline\";\r\n\r\n/**\r\n * This should not be instanciated directly, as it is part of a scene component\r\n * @internal\r\n */\r\nexport class _IblShadowsSpatialBlurPass {\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n private _renderPipeline: IblShadowsRenderPipeline;\r\n private _outputTexture: ProceduralTexture;\r\n private _worldScale: number = 1.0;\r\n private _blurParameters: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /**\r\n * Is the effect enabled\r\n */\r\n public enabled: boolean = true;\r\n\r\n /**\r\n * Returns the output texture of the pass.\r\n * @returns The output texture.\r\n */\r\n public getOutputTexture(): ProceduralTexture {\r\n return this._outputTexture;\r\n }\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._debugPassPP) {\r\n this._createDebugPass();\r\n }\r\n return this._debugPassPP;\r\n }\r\n private _debugPassName: string = \"Spatial Blur Debug Pass\";\r\n /**\r\n * Sets the name of the debug pass\r\n */\r\n public get debugPassName(): string {\r\n return this._debugPassName;\r\n }\r\n\r\n /**\r\n * The scale of the voxel grid in world space. This is used to scale the blur radius in world space.\r\n * @param scale The scale of the voxel grid in world space.\r\n */\r\n public setWorldScale(scale: number) {\r\n this._worldScale = scale;\r\n }\r\n\r\n /** Enable the debug view for this pass */\r\n public debugEnabled: boolean = false;\r\n private _debugPassPP: PostProcess;\r\n private _debugSizeParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.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 * Creates the debug post process effect for this pass\r\n */\r\n private _createDebugPass() {\r\n if (!this._debugPassPP) {\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 textureFormat: Constants.TEXTUREFORMAT_R,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n uniforms: [\"sizeParams\"],\r\n samplers: [\"debugSampler\"],\r\n engine: this._engine,\r\n reusable: false,\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/iblShadowDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/iblShadowDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._debugPassPP = new PostProcess(this.debugPassName, \"iblShadowDebug\", debugOptions);\r\n this._debugPassPP.autoClear = false;\r\n this._debugPassPP.onApplyObservable.add((effect) => {\r\n // update the caustic texture with what we just rendered.\r\n effect.setTexture(\"debugSampler\", this._outputTexture);\r\n effect.setVector4(\"sizeParams\", this._debugSizeParams);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Instanciates the importance sampling renderer\r\n * @param scene Scene to attach to\r\n * @param iblShadowsRenderPipeline The IBL shadows render pipeline\r\n * @returns The importance sampling renderer\r\n */\r\n constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._renderPipeline = iblShadowsRenderPipeline;\r\n this._createTextures();\r\n }\r\n\r\n private _createTextures() {\r\n const isWebGPU = this._engine.isWebGPU;\r\n const textureOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/iblShadowSpatialBlur.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/iblShadowSpatialBlur.fragment\")]);\r\n }\r\n },\r\n };\r\n this._outputTexture = new ProceduralTexture(\r\n \"spatialBlurPass\",\r\n {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n },\r\n \"iblShadowSpatialBlur\",\r\n this._scene,\r\n textureOptions,\r\n false,\r\n false,\r\n Constants.TEXTURETYPE_UNSIGNED_INT\r\n );\r\n this._outputTexture.refreshRate = -1;\r\n this._outputTexture.autoClear = false;\r\n\r\n // Need to set all the textures first so that the effect gets created with the proper uniforms.\r\n this._setBindings();\r\n\r\n let counter = 0;\r\n this._scene.onBeforeRenderObservable.add(() => {\r\n counter = 0;\r\n });\r\n this._scene.onAfterRenderTargetsRenderObservable.add(() => {\r\n if (++counter == 2) {\r\n if (this.enabled && this._outputTexture.isReady()) {\r\n this._setBindings();\r\n this._outputTexture.render();\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _setBindings() {\r\n this._outputTexture.setTexture(\"voxelTracingSampler\", this._renderPipeline._getVoxelTracingTexture());\r\n const iterationCount = 1;\r\n this._blurParameters.set(iterationCount, this._worldScale, 0.0, 0.0);\r\n this._outputTexture.setVector4(\"blurParameters\", this._blurParameters);\r\n const geometryBufferRenderer = this._scene.geometryBufferRenderer;\r\n if (!geometryBufferRenderer) {\r\n return;\r\n }\r\n const depthIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.SCREENSPACE_DEPTH_TEXTURE_TYPE);\r\n this._outputTexture.setTexture(\"depthSampler\", geometryBufferRenderer.getGBuffer().textures[depthIndex]);\r\n const wnormalIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.NORMAL_TEXTURE_TYPE);\r\n this._outputTexture.setTexture(\"worldNormalSampler\", geometryBufferRenderer.getGBuffer().textures[wnormalIndex]);\r\n }\r\n\r\n /**\r\n * Called by render pipeline when canvas resized.\r\n * @param scaleFactor The factor by which to scale the canvas size.\r\n */\r\n public resize(scaleFactor: number = 1.0) {\r\n const newSize = {\r\n width: Math.max(1.0, Math.floor(this._engine.getRenderWidth() * scaleFactor)),\r\n height: Math.max(1.0, Math.floor(this._engine.getRenderHeight() * scaleFactor)),\r\n };\r\n this._outputTexture.resize(newSize, false);\r\n }\r\n\r\n /**\r\n * Checks if the pass is ready\r\n * @returns true if the pass is ready\r\n */\r\n public isReady() {\r\n return this._outputTexture.isReady() && !(this._debugPassPP && !this._debugPassPP.isReady());\r\n }\r\n\r\n /**\r\n * Disposes the associated resources\r\n */\r\n public dispose() {\r\n this._outputTexture.dispose();\r\n if (this._debugPassPP) {\r\n this._debugPassPP.dispose();\r\n }\r\n }\r\n}\r\n"]}
@@ -1,5 +1,6 @@
1
1
  import { RenderTargetTexture } from "../../Materials/Textures/renderTargetTexture";
2
2
  import { Matrix } from "../../Maths/math.vector";
3
+ import type { Mesh } from "../../Meshes/mesh";
3
4
  import type { Scene } from "../../scene";
4
5
  import { PostProcess } from "../../PostProcesses/postProcess";
5
6
  import { ProceduralTexture } from "../../Materials/Textures/Procedurals/proceduralTexture";
@@ -13,7 +14,6 @@ import type { IblShadowsRenderPipeline } from "./iblShadowsRenderPipeline";
13
14
  export declare class _IblShadowsVoxelRenderer {
14
15
  private _scene;
15
16
  private _engine;
16
- private _renderPipeline;
17
17
  private _voxelGridRT;
18
18
  private _voxelGridXaxis;
19
19
  private _voxelGridYaxis;
@@ -23,6 +23,8 @@ export declare class _IblShadowsVoxelRenderer {
23
23
  private _voxelMrtsZaxis;
24
24
  private _isVoxelGrid3D;
25
25
  private _renderInFlight;
26
+ private _voxelMaterial;
27
+ private _voxelSlabDebugMaterial;
26
28
  /**
27
29
  * Return the voxel grid texture.
28
30
  * @returns The voxel grid texture.
@@ -81,6 +83,7 @@ export declare class _IblShadowsVoxelRenderer {
81
83
  get voxelDebugAxis(): number;
82
84
  private _voxelDebugAxis;
83
85
  private _debugSizeParams;
86
+ private _includedMeshes;
84
87
  /**
85
88
  * Sets params that control the position and scaling of the debug display on the screen.
86
89
  * @param x Screen X offset of the debug display (0-1)
@@ -105,6 +108,7 @@ export declare class _IblShadowsVoxelRenderer {
105
108
  */
106
109
  get voxelDebugEnabled(): boolean;
107
110
  set voxelDebugEnabled(enabled: boolean);
111
+ private _setDebugBindingsBound;
108
112
  /**
109
113
  * Creates the debug post process effect for this pass
110
114
  */
@@ -126,7 +130,8 @@ export declare class _IblShadowsVoxelRenderer {
126
130
  private _createTextures;
127
131
  private _createVoxelMRTs;
128
132
  private _disposeVoxelTextures;
129
- private _createVoxelMaterial;
133
+ private _createVoxelMaterials;
134
+ private _setDebugBindings;
130
135
  /**
131
136
  * Checks if the voxel renderer is ready to voxelize scene
132
137
  * @returns true if the voxel renderer is ready to voxelize scene
@@ -140,9 +145,9 @@ export declare class _IblShadowsVoxelRenderer {
140
145
  private _removeVoxelRTs;
141
146
  /**
142
147
  * Renders voxel grid of scene for IBL shadows
143
- * @param excludedMeshes
148
+ * @param includedMeshes
144
149
  */
145
- updateVoxelGrid(excludedMeshes: number[]): void;
150
+ updateVoxelGrid(includedMeshes: Mesh[]): void;
146
151
  private _renderVoxelGrid;
147
152
  private _addRTsForRender;
148
153
  /**
@@ -5,7 +5,6 @@ import { MultiRenderTarget } from "../../Materials/Textures/multiRenderTarget.js
5
5
  import { RenderTargetTexture } from "../../Materials/Textures/renderTargetTexture.js";
6
6
  import { Color4 } from "../../Maths/math.color.js";
7
7
  import { Matrix, Vector3, Vector4 } from "../../Maths/math.vector.js";
8
- import { Mesh } from "../../Meshes/mesh.js";
9
8
  import { Texture } from "../../Materials/Textures/texture.js";
10
9
  import { Logger } from "../../Misc/logger.js";
11
10
  import { PostProcess } from "../../PostProcesses/postProcess.js";
@@ -56,7 +55,6 @@ export class _IblShadowsVoxelRenderer {
56
55
  this._triPlanarVoxelization = enabled;
57
56
  this._disposeVoxelTextures();
58
57
  this._createTextures();
59
- this._renderPipeline.updateVoxelization();
60
58
  }
61
59
  /**
62
60
  * Set the matrix to use for scaling the world space to voxel space
@@ -136,19 +134,26 @@ export class _IblShadowsVoxelRenderer {
136
134
  }
137
135
  this._voxelDebugEnabled = enabled;
138
136
  if (enabled) {
139
- this._voxelSlabDebugRT = new RenderTargetTexture("voxelSlabDebug", { ratio: 1 }, this._scene, {
137
+ this._voxelSlabDebugRT = new RenderTargetTexture("voxelSlabDebug", { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, this._scene, {
140
138
  generateDepthBuffer: true,
141
139
  generateMipMaps: false,
142
140
  type: 0,
143
- format: 6,
141
+ format: 5,
144
142
  samplingMode: 1,
145
143
  });
146
144
  this._voxelSlabDebugRT.noPrePassRenderer = true;
147
145
  }
146
+ if (this._voxelSlabDebugRT) {
147
+ this._removeVoxelRTs([this._voxelSlabDebugRT]);
148
+ }
149
+ // Add the slab debug RT if needed.
150
+ if (this._voxelDebugEnabled) {
151
+ this._addRTsForRender([this._voxelSlabDebugRT], this._includedMeshes, this._voxelDebugAxis, 1, true);
152
+ this._setDebugBindingsBound = this._setDebugBindings.bind(this);
153
+ this._scene.onBeforeRenderObservable.add(this._setDebugBindingsBound);
154
+ }
148
155
  else {
149
- if (this._voxelSlabDebugRT) {
150
- this._removeVoxelRTs([this._voxelSlabDebugRT]);
151
- }
156
+ this._scene.onBeforeRenderObservable.removeCallback(this._setDebugBindingsBound);
152
157
  }
153
158
  }
154
159
  /**
@@ -160,7 +165,7 @@ export class _IblShadowsVoxelRenderer {
160
165
  const debugOptions = {
161
166
  width: this._engine.getRenderWidth(),
162
167
  height: this._engine.getRenderHeight(),
163
- textureFormat: 6,
168
+ textureFormat: 5,
164
169
  textureType: 0,
165
170
  samplingMode: 1,
166
171
  uniforms: ["sizeParams", "mipNumber"],
@@ -223,18 +228,19 @@ export class _IblShadowsVoxelRenderer {
223
228
  this._renderTargets = [];
224
229
  this._triPlanarVoxelization = true;
225
230
  this._voxelizationInProgress = false;
231
+ this._invWorldScaleMatrix = Matrix.Identity();
226
232
  this._voxelResolution = 64;
227
233
  this._voxelResolutionExp = 6;
228
234
  this._mipArray = [];
229
235
  this._voxelDebugEnabled = false;
230
236
  this._voxelDebugAxis = -1;
231
237
  this._debugSizeParams = new Vector4(0.0, 0.0, 0.0, 0.0);
238
+ this._includedMeshes = [];
232
239
  this._debugMipNumber = 0;
233
240
  this._debugPassName = "Voxelization Debug Pass";
234
241
  this._scene = scene;
235
242
  this._engine = scene.getEngine();
236
243
  this._triPlanarVoxelization = triPlanarVoxelization;
237
- this._renderPipeline = iblShadowsRenderPipeline;
238
244
  if (!this._engine.getCaps().drawBuffersExtension) {
239
245
  Logger.Error("Can't do voxel rendering without the draw buffers extension.");
240
246
  }
@@ -398,6 +404,7 @@ export class _IblShadowsVoxelRenderer {
398
404
  mipTarget.setTexture("srcMip", mipIdx > 1 ? this._mipArray[mipIdx - 2] : this.getVoxelGrid());
399
405
  mipTarget.setInt("layerNum", 0);
400
406
  }
407
+ this._createVoxelMaterials();
401
408
  }
402
409
  _createVoxelMRTs(name, voxelRT, numSlabs) {
403
410
  voxelRT.wrapU = Texture.CLAMP_ADDRESSMODE;
@@ -450,14 +457,16 @@ export class _IblShadowsVoxelRenderer {
450
457
  this._mipArray.forEach((mip) => {
451
458
  mip.dispose();
452
459
  });
460
+ this._voxelMaterial?.dispose();
461
+ this._voxelSlabDebugMaterial?.dispose();
453
462
  this._mipArray = [];
454
463
  this._voxelMrtsXaxis = [];
455
464
  this._voxelMrtsYaxis = [];
456
465
  this._voxelMrtsZaxis = [];
457
466
  }
458
- _createVoxelMaterial() {
467
+ _createVoxelMaterials() {
459
468
  const isWebGPU = this._engine.isWebGPU;
460
- const voxelMaterial = new ShaderMaterial("voxelization", this._scene, "iblVoxelGrid", {
469
+ this._voxelMaterial = new ShaderMaterial("voxelization", this._scene, "iblVoxelGrid", {
461
470
  uniforms: ["world", "viewMatrix", "invWorldScale", "nearPlane", "farPlane", "stepSize"],
462
471
  defines: ["MAX_DRAW_BUFFERS " + this._maxDrawBuffers],
463
472
  shaderLanguage: isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */,
@@ -470,10 +479,26 @@ export class _IblShadowsVoxelRenderer {
470
479
  }
471
480
  },
472
481
  });
473
- voxelMaterial.cullBackFaces = false;
474
- voxelMaterial.backFaceCulling = false;
475
- voxelMaterial.depthFunction = Engine.ALWAYS;
476
- return voxelMaterial;
482
+ this._voxelMaterial.cullBackFaces = false;
483
+ this._voxelMaterial.backFaceCulling = false;
484
+ this._voxelMaterial.depthFunction = Engine.ALWAYS;
485
+ this._voxelSlabDebugMaterial = new ShaderMaterial("voxelSlabDebug", this._scene, "iblVoxelSlabDebug", {
486
+ uniforms: ["world", "viewMatrix", "cameraViewMatrix", "projection", "invWorldScale", "nearPlane", "farPlane", "stepSize"],
487
+ defines: ["MAX_DRAW_BUFFERS " + this._maxDrawBuffers],
488
+ shaderLanguage: isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */,
489
+ extraInitializationsAsync: async () => {
490
+ if (isWebGPU) {
491
+ await Promise.all([import("../../ShadersWGSL/iblVoxelSlabDebug.fragment.js"), import("../../ShadersWGSL/iblVoxelSlabDebug.vertex.js")]);
492
+ }
493
+ else {
494
+ await Promise.all([import("../../Shaders/iblVoxelSlabDebug.fragment.js"), import("../../Shaders/iblVoxelSlabDebug.vertex.js")]);
495
+ }
496
+ },
497
+ });
498
+ }
499
+ _setDebugBindings() {
500
+ this._voxelSlabDebugMaterial.setMatrix("projection", this._scene.activeCamera.getProjectionMatrix());
501
+ this._voxelSlabDebugMaterial.setMatrix("cameraViewMatrix", this._scene.activeCamera.getViewMatrix());
477
502
  }
478
503
  /**
479
504
  * Checks if the voxel renderer is ready to voxelize scene
@@ -523,26 +548,24 @@ export class _IblShadowsVoxelRenderer {
523
548
  }
524
549
  /**
525
550
  * Renders voxel grid of scene for IBL shadows
526
- * @param excludedMeshes
551
+ * @param includedMeshes
527
552
  */
528
- updateVoxelGrid(excludedMeshes) {
553
+ updateVoxelGrid(includedMeshes) {
529
554
  this._stopVoxelization();
555
+ this._includedMeshes = includedMeshes;
530
556
  this._voxelizationInProgress = true;
531
557
  if (this._triPlanarVoxelization) {
532
- this._addRTsForRender(this._voxelMrtsXaxis, excludedMeshes, 0);
533
- this._addRTsForRender(this._voxelMrtsYaxis, excludedMeshes, 1);
534
- this._addRTsForRender(this._voxelMrtsZaxis, excludedMeshes, 2);
558
+ this._addRTsForRender(this._voxelMrtsXaxis, includedMeshes, 0);
559
+ this._addRTsForRender(this._voxelMrtsYaxis, includedMeshes, 1);
560
+ this._addRTsForRender(this._voxelMrtsZaxis, includedMeshes, 2);
535
561
  }
536
562
  else {
537
- this._addRTsForRender(this._voxelMrtsZaxis, excludedMeshes, 2);
563
+ this._addRTsForRender(this._voxelMrtsZaxis, includedMeshes, 2);
538
564
  }
539
- // Add the slab debug RT if needed.
540
565
  if (this._voxelDebugEnabled) {
541
- this._removeVoxelRTs([this._voxelSlabDebugRT]);
542
- this._addRTsForRender([this._voxelSlabDebugRT], [], this._voxelDebugAxis, 1, true);
566
+ this._addRTsForRender([this._voxelSlabDebugRT], includedMeshes, this._voxelDebugAxis, 1, true);
543
567
  }
544
- this.boundVoxelGridRenderFn = this._renderVoxelGrid.bind(this);
545
- this._scene.onAfterRenderTargetsRenderObservable.add(this.boundVoxelGridRenderFn);
568
+ this._scene.onAfterRenderTargetsRenderObservable.addOnce(this._renderVoxelGrid.bind(this));
546
569
  }
547
570
  _renderVoxelGrid() {
548
571
  if (this._voxelizationInProgress) {
@@ -557,7 +580,6 @@ export class _IblShadowsVoxelRenderer {
557
580
  }
558
581
  if (allReady) {
559
582
  this._renderInFlight = false;
560
- this._scene.prePassRenderer._setEnabled(false);
561
583
  this._renderTargets.forEach((rt) => {
562
584
  rt.render();
563
585
  });
@@ -569,7 +591,6 @@ export class _IblShadowsVoxelRenderer {
569
591
  this._copyMipMaps();
570
592
  this._voxelizationInProgress = false;
571
593
  this._scene.onAfterRenderTargetsRenderObservable.removeCallback(this.boundVoxelGridRenderFn);
572
- this._scene.prePassRenderer._setEnabled(true);
573
594
  }
574
595
  else if (!this._renderInFlight) {
575
596
  this._renderInFlight = true;
@@ -579,39 +600,21 @@ export class _IblShadowsVoxelRenderer {
579
600
  }
580
601
  }
581
602
  }
582
- _addRTsForRender(mrts, excludedMeshes, axis, shaderType = 0, continuousRender = false) {
603
+ _addRTsForRender(mrts, includedMeshes, axis, shaderType = 0, continuousRender = false) {
583
604
  const slabSize = 1.0 / this._computeNumberOfSlabs();
584
- const meshes = this._scene.meshes;
605
+ let voxelMaterial;
606
+ if (shaderType === 0) {
607
+ voxelMaterial = this._voxelMaterial;
608
+ }
609
+ else {
610
+ voxelMaterial = this._voxelSlabDebugMaterial;
611
+ }
585
612
  // We need to update the world scale uniform for every mesh being rendered to the voxel grid.
586
613
  mrts.forEach((mrt, mrtIndex) => {
587
614
  mrt.renderList = [];
588
615
  const nearPlane = mrtIndex * slabSize;
589
616
  const farPlane = (mrtIndex + 1) * slabSize;
590
617
  const stepSize = slabSize / this._maxDrawBuffers;
591
- let voxelMaterial;
592
- if (shaderType === 0) {
593
- voxelMaterial = this._createVoxelMaterial();
594
- }
595
- else {
596
- const isWebGPU = this._engine.isWebGPU;
597
- voxelMaterial = new ShaderMaterial("voxelSlabDebug", this._scene, "iblVoxelSlabDebug", {
598
- uniforms: ["world", "viewMatrix", "cameraViewMatrix", "projection", "invWorldScale", "nearPlane", "farPlane", "stepSize"],
599
- defines: ["MAX_DRAW_BUFFERS " + this._maxDrawBuffers],
600
- shaderLanguage: isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */,
601
- extraInitializationsAsync: async () => {
602
- if (isWebGPU) {
603
- await Promise.all([import("../../ShadersWGSL/iblVoxelSlabDebug.fragment.js"), import("../../ShadersWGSL/iblVoxelSlabDebug.vertex.js")]);
604
- }
605
- else {
606
- await Promise.all([import("../../Shaders/iblVoxelSlabDebug.fragment.js"), import("../../Shaders/iblVoxelSlabDebug.vertex.js")]);
607
- }
608
- },
609
- });
610
- this._scene.onBeforeRenderObservable.add(() => {
611
- voxelMaterial.setMatrix("projection", this._scene.activeCamera.getProjectionMatrix());
612
- voxelMaterial.setMatrix("cameraViewMatrix", this._scene.activeCamera.getViewMatrix());
613
- });
614
- }
615
618
  const cameraPosition = new Vector3(0, 0, 0);
616
619
  let targetPosition = new Vector3(0, 0, 1);
617
620
  if (axis === 0) {
@@ -624,24 +627,39 @@ export class _IblShadowsVoxelRenderer {
624
627
  if (axis === 1) {
625
628
  upDirection = new Vector3(1, 0, 0);
626
629
  }
627
- voxelMaterial.setMatrix("viewMatrix", Matrix.LookAtLH(cameraPosition, targetPosition, upDirection));
628
- voxelMaterial.setMatrix("invWorldScale", this._invWorldScaleMatrix);
629
- voxelMaterial.setFloat("nearPlane", nearPlane);
630
- voxelMaterial.setFloat("farPlane", farPlane);
631
- voxelMaterial.setFloat("stepSize", stepSize);
630
+ mrt.onBeforeRenderObservable.add(() => {
631
+ voxelMaterial.setMatrix("viewMatrix", Matrix.LookAtLH(cameraPosition, targetPosition, upDirection));
632
+ voxelMaterial.setMatrix("invWorldScale", this._invWorldScaleMatrix);
633
+ voxelMaterial.setFloat("nearPlane", nearPlane);
634
+ voxelMaterial.setFloat("farPlane", farPlane);
635
+ voxelMaterial.setFloat("stepSize", stepSize);
636
+ });
632
637
  // Set this material on every mesh in the scene (for this RT)
633
- meshes.forEach((mesh) => {
634
- if (mesh instanceof Mesh && mesh.material && excludedMeshes.indexOf(mesh.uniqueId) === -1) {
635
- mrt.renderList?.push(mesh);
636
- // TODO - if the mesh already has a voxel material applied, don't create a new one.
637
- // mesh.getMaterialForRenderPass(mrt.renderPassIds)
638
- mrt.setMaterialForRendering(mesh, voxelMaterial);
638
+ if (includedMeshes.length === 0) {
639
+ return;
640
+ }
641
+ includedMeshes.forEach((mesh) => {
642
+ if (mesh) {
643
+ if (mesh.subMeshes && mesh.subMeshes.length > 0) {
644
+ mrt.renderList?.push(mesh);
645
+ mrt.setMaterialForRendering(mesh, voxelMaterial);
646
+ }
647
+ mesh.getChildMeshes().forEach((childMesh) => {
648
+ if (childMesh.subMeshes && childMesh.subMeshes.length > 0) {
649
+ mrt.renderList?.push(childMesh);
650
+ mrt.setMaterialForRendering(childMesh, voxelMaterial);
651
+ }
652
+ });
639
653
  }
640
654
  });
641
655
  });
642
656
  // Add the MRT's to render.
643
657
  if (continuousRender) {
644
- this._scene.customRenderTargets = this._scene.customRenderTargets.concat(mrts);
658
+ mrts.forEach((mrt) => {
659
+ if (this._scene.customRenderTargets.indexOf(mrt) === -1) {
660
+ this._scene.customRenderTargets.push(mrt);
661
+ }
662
+ });
645
663
  }
646
664
  else {
647
665
  this._renderTargets = this._renderTargets.concat(mrts);