@babylonjs/core 9.3.0 → 9.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/Engines/abstractEngine.js +2 -2
  2. package/Engines/abstractEngine.js.map +1 -1
  3. package/Engines/engine.d.ts +49 -1118
  4. package/FlowGraph/flowGraph.d.ts +11 -0
  5. package/FlowGraph/flowGraph.js +20 -0
  6. package/FlowGraph/flowGraph.js.map +1 -1
  7. package/FlowGraph/flowGraphContext.d.ts +30 -0
  8. package/FlowGraph/flowGraphContext.js +42 -0
  9. package/FlowGraph/flowGraphContext.js.map +1 -1
  10. package/FlowGraph/flowGraphParser.js +13 -0
  11. package/FlowGraph/flowGraphParser.js.map +1 -1
  12. package/FlowGraph/typeDefinitions.d.ts +16 -0
  13. package/FlowGraph/typeDefinitions.js.map +1 -1
  14. package/Layers/thinSelectionOutlineLayer.js +25 -1
  15. package/Layers/thinSelectionOutlineLayer.js.map +1 -1
  16. package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +18 -0
  17. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +110 -1
  18. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  19. package/Materials/Textures/baseTexture.d.ts +1 -0
  20. package/Materials/Textures/baseTexture.js +1 -0
  21. package/Materials/Textures/baseTexture.js.map +1 -1
  22. package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +5 -1
  23. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +14 -4
  24. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  25. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.d.ts +24 -0
  26. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.js +128 -0
  27. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.js.map +1 -1
  28. package/Misc/tools.js +1 -1
  29. package/Misc/tools.js.map +1 -1
  30. package/Particles/IParticleSystem.d.ts +7 -1
  31. package/Particles/IParticleSystem.js.map +1 -1
  32. package/Particles/baseParticleSystem.d.ts +18 -2
  33. package/Particles/baseParticleSystem.js +53 -11
  34. package/Particles/baseParticleSystem.js.map +1 -1
  35. package/Particles/computeShaderParticleSystem.js +16 -0
  36. package/Particles/computeShaderParticleSystem.js.map +1 -1
  37. package/Particles/gpuParticleSystem.d.ts +14 -72
  38. package/Particles/gpuParticleSystem.js +130 -106
  39. package/Particles/gpuParticleSystem.js.map +1 -1
  40. package/Particles/particleSystem.d.ts +0 -80
  41. package/Particles/particleSystem.functions.d.ts +16 -0
  42. package/Particles/particleSystem.functions.js +18 -0
  43. package/Particles/particleSystem.functions.js.map +1 -1
  44. package/Particles/particleSystem.js +0 -114
  45. package/Particles/particleSystem.js.map +1 -1
  46. package/Particles/webgl2ParticleSystem.js +12 -0
  47. package/Particles/webgl2ParticleSystem.js.map +1 -1
  48. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +17 -0
  49. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  50. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.d.ts +10 -0
  51. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +146 -24
  52. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  53. package/Rendering/objectRenderer.d.ts +2 -0
  54. package/Rendering/objectRenderer.js +10 -0
  55. package/Rendering/objectRenderer.js.map +1 -1
  56. package/Shaders/ShadersInclude/gaussianSplatting.js +21 -1
  57. package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
  58. package/Shaders/gaussianSplattingVoxel.fragment.d.ts +5 -0
  59. package/Shaders/gaussianSplattingVoxel.fragment.js +27 -0
  60. package/Shaders/gaussianSplattingVoxel.fragment.js.map +1 -0
  61. package/Shaders/gaussianSplattingVoxel.vertex.d.ts +8 -0
  62. package/Shaders/gaussianSplattingVoxel.vertex.js +31 -0
  63. package/Shaders/gaussianSplattingVoxel.vertex.js.map +1 -0
  64. package/Shaders/gpuUpdateParticles.vertex.js +13 -0
  65. package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
  66. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +21 -1
  67. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
  68. package/ShadersWGSL/gaussianSplattingVoxel.fragment.d.ts +5 -0
  69. package/ShadersWGSL/gaussianSplattingVoxel.fragment.js +22 -0
  70. package/ShadersWGSL/gaussianSplattingVoxel.fragment.js.map +1 -0
  71. package/ShadersWGSL/gaussianSplattingVoxel.vertex.d.ts +8 -0
  72. package/ShadersWGSL/gaussianSplattingVoxel.vertex.js +42 -0
  73. package/ShadersWGSL/gaussianSplattingVoxel.vertex.js.map +1 -0
  74. package/ShadersWGSL/gpuUpdateParticles.compute.js +19 -0
  75. package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
  76. package/package.json +1 -1
@@ -118,6 +118,8 @@ export class _IblShadowsVoxelRenderer {
118
118
  */
119
119
  this.onVoxelizationCompleteObservable = new Observable();
120
120
  this._renderTargets = [];
121
+ /** Per-mesh voxel ShaderMaterials for GaussianSplattingMesh, keyed by mesh uniqueId. */
122
+ this._gsVoxelMaterialCache = new Map();
121
123
  this._triPlanarVoxelization = true;
122
124
  this._voxelizationInProgress = false;
123
125
  this._invWorldScaleMatrix = Matrix.Identity();
@@ -516,6 +518,9 @@ export class _IblShadowsVoxelRenderer {
516
518
  const rttReady = this._renderTargets[i].isReadyForRendering();
517
519
  allReady && (allReady = rttReady);
518
520
  }
521
+ for (const gsVoxelMat of Array.from(this._gsVoxelMaterialCache.values())) {
522
+ allReady && (allReady = gsVoxelMat.isReady());
523
+ }
519
524
  if (!allReady) {
520
525
  return;
521
526
  }
@@ -549,6 +554,98 @@ export class _IblShadowsVoxelRenderer {
549
554
  this.onVoxelizationCompleteObservable.notifyObservers();
550
555
  }
551
556
  }
557
+ /**
558
+ * Splits rendering for every voxel RT: non–Gaussian splatting meshes use subMesh.render
559
+ * (material override from setMaterialForRendering); GaussianSplattingMesh uses a custom draw path with its cached voxel ShaderMaterial.
560
+ * @param rtt - the render target texture to install the custom render function on
561
+ */
562
+ _installVoxelMixedCustomRender(rtt) {
563
+ const scene = this._scene;
564
+ const engine = scene.getEngine();
565
+ const renderGsSplat = (sm) => {
566
+ const renderingMesh = sm.getRenderingMesh();
567
+ const effectiveMesh = sm.getEffectiveMesh();
568
+ const gsVoxelMaterial = this._gsVoxelMaterialCache.get(effectiveMesh.uniqueId);
569
+ if (!gsVoxelMaterial || !gsVoxelMaterial.isReady()) {
570
+ return;
571
+ }
572
+ const drawWrapper = gsVoxelMaterial._getDrawWrapper();
573
+ if (!drawWrapper?.effect) {
574
+ return;
575
+ }
576
+ const effect = drawWrapper.effect;
577
+ const batch = renderingMesh._getInstancesRenderList(sm._id, !!sm.getReplacementMesh());
578
+ if (batch.mustReturn) {
579
+ return;
580
+ }
581
+ const hardwareInstancedRendering = engine.getCaps().instancedArrays && ((batch.visibleInstances[sm._id] !== null && batch.visibleInstances[sm._id] !== undefined) || renderingMesh.hasThinInstances);
582
+ const fillMode = sm.getMaterial()?.fillMode ?? 0;
583
+ engine.enableEffect(drawWrapper);
584
+ renderingMesh._bind(sm, effect, fillMode);
585
+ gsVoxelMaterial._preBind(drawWrapper);
586
+ gsVoxelMaterial.bind(effectiveMesh.getWorldMatrix(), effectiveMesh, effect);
587
+ // If rotation/scale textures are missing, bind() logged the warning; skip the draw to avoid GPU errors.
588
+ if (!effectiveMesh.rotationsATexture) {
589
+ gsVoxelMaterial.unbind();
590
+ return;
591
+ }
592
+ if (engine.isWebGPU) {
593
+ // A GSplat is a 3D Gaussian ellipsoid. To approximate its volume in the voxel grid
594
+ // we rasterize three planar cross-section quads — one per principal axis — each
595
+ // spanning the ellipsoid cross-section perpendicular to that axis. A quad rendered
596
+ // edge-on produces zero fragments, so we draw once per world axis: each draw lets
597
+ // computeVoxelSplatWorldPos pick the quad whose normal best aligns with that view,
598
+ // guaranteeing every splat is captured face-on from at least one direction.
599
+ const viewMatrices = _IblShadowsVoxelRenderer._VOXEL_VIEW_MATRICES;
600
+ for (let axisIdx = 0; axisIdx < 3; axisIdx++) {
601
+ effect.setMatrix("viewMatrix", viewMatrices[axisIdx]);
602
+ renderingMesh._processRendering(effectiveMesh, sm, effect, fillMode, batch, hardwareInstancedRendering, (_isInstance, world) => {
603
+ effect.setMatrix("world", world);
604
+ });
605
+ }
606
+ }
607
+ else {
608
+ renderingMesh._processRendering(effectiveMesh, sm, effect, fillMode, batch, hardwareInstancedRendering, (_isInstance, world) => effect.setMatrix("world", world));
609
+ }
610
+ gsVoxelMaterial.unbind();
611
+ };
612
+ const processBucket = (subMeshes, enableAlphaMode) => {
613
+ for (let i = 0; i < subMeshes.length; i++) {
614
+ const sm = subMeshes.data[i];
615
+ const effective = sm.getEffectiveMesh();
616
+ if (effective.getClassName() === "GaussianSplattingMesh") {
617
+ renderGsSplat(sm);
618
+ }
619
+ else {
620
+ sm.render(enableAlphaMode);
621
+ }
622
+ }
623
+ };
624
+ rtt.customRenderFunction = (opaqueSubMeshes, alphaTestSubMeshes, transparentSubMeshes, depthOnlySubMeshes) => {
625
+ if (depthOnlySubMeshes.length) {
626
+ engine.setColorWrite(false);
627
+ processBucket(depthOnlySubMeshes, false);
628
+ engine.setColorWrite(true);
629
+ }
630
+ processBucket(opaqueSubMeshes, false);
631
+ processBucket(alphaTestSubMeshes, false);
632
+ processBucket(transparentSubMeshes, true);
633
+ };
634
+ }
635
+ _addGsMeshToVoxelRT(mrt, mesh) {
636
+ let gsVoxelMaterial = this._gsVoxelMaterialCache.get(mesh.uniqueId);
637
+ if (!gsVoxelMaterial) {
638
+ const gsMaterial = mesh.material;
639
+ if (!gsMaterial) {
640
+ return;
641
+ }
642
+ const shaderLanguage = this._engine.isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */;
643
+ gsVoxelMaterial = gsMaterial.makeVoxelRenderingMaterial(this._scene, shaderLanguage, this._maxDrawBuffers, mesh.isCompound);
644
+ this._gsVoxelMaterialCache.set(mesh.uniqueId, gsVoxelMaterial);
645
+ }
646
+ mrt.renderList?.push(mesh);
647
+ mrt.setMaterialForRendering(mesh, gsVoxelMaterial);
648
+ }
552
649
  _addRTsForRender(mrts, includedMeshes, axis) {
553
650
  const slabSize = 1.0 / this._computeNumberOfSlabs();
554
651
  const voxelMaterial = this._voxelMaterial;
@@ -576,21 +673,10 @@ export class _IblShadowsVoxelRenderer {
576
673
  const nearPlane = mrtIndex * slabSize;
577
674
  const farPlane = (mrtIndex + 1) * slabSize;
578
675
  const stepSize = slabSize / this._maxDrawBuffers;
579
- const cameraPosition = new Vector3(0, 0, 0);
580
- let targetPosition = new Vector3(0, 0, 1);
581
- if (axis === 0) {
582
- targetPosition = new Vector3(1, 0, 0);
583
- }
584
- else if (axis === 1) {
585
- targetPosition = new Vector3(0, 1, 0);
586
- }
587
- let upDirection = new Vector3(0, 1, 0);
588
- if (axis === 1) {
589
- upDirection = new Vector3(1, 0, 0);
590
- }
676
+ const viewMatrix = _IblShadowsVoxelRenderer._VOXEL_VIEW_MATRICES[axis];
591
677
  mrt.onBeforeRenderObservable.clear();
592
678
  mrt.onBeforeRenderObservable.add(() => {
593
- voxelMaterial.setMatrix("viewMatrix", Matrix.LookAtLH(cameraPosition, targetPosition, upDirection));
679
+ voxelMaterial.setMatrix("viewMatrix", viewMatrix);
594
680
  voxelMaterial.setMatrix("invWorldScale", this._invWorldScaleMatrix);
595
681
  voxelMaterial.setFloat("nearPlane", nearPlane);
596
682
  voxelMaterial.setFloat("farPlane", farPlane);
@@ -599,26 +685,53 @@ export class _IblShadowsVoxelRenderer {
599
685
  this._voxelMaterial.useVertexPulling = true;
600
686
  this._voxelMaterial.setTexture("voxel_storage", this.getVoxelGrid());
601
687
  }
688
+ // Push per-slab uniforms to each GS voxel material in this MRT's render list.
689
+ for (const m of mrt.renderList ?? []) {
690
+ if (m.getClassName() === "GaussianSplattingMesh") {
691
+ const gsVoxelMat = this._gsVoxelMaterialCache.get(m.uniqueId);
692
+ if (gsVoxelMat) {
693
+ gsVoxelMat.setMatrix("invWorldScale", this._invWorldScaleMatrix);
694
+ if (this._engine.isWebGPU) {
695
+ // WGSL GS voxel shader uses the same viewMatrix approach as WebGL; the per-axis viewMatrix is set per-draw in renderGsSplat.
696
+ gsVoxelMat.setTexture("voxel_storage", this.getVoxelGrid());
697
+ }
698
+ else {
699
+ gsVoxelMat.setMatrix("viewMatrix", viewMatrix);
700
+ gsVoxelMat.setFloat("nearPlane", nearPlane);
701
+ gsVoxelMat.setFloat("farPlane", farPlane);
702
+ gsVoxelMat.setFloat("stepSize", stepSize);
703
+ }
704
+ }
705
+ }
706
+ }
602
707
  });
603
708
  // Set this material on every mesh in the scene (for this RT)
604
709
  if (includedMeshes.length === 0) {
605
710
  return;
606
711
  }
607
712
  for (const mesh of includedMeshes) {
608
- if (mesh) {
609
- if (mesh.subMeshes && mesh.subMeshes.length > 0) {
610
- mrt.renderList?.push(mesh);
611
- mrt.setMaterialForRendering(mesh, voxelMaterial);
713
+ if (!mesh) {
714
+ continue;
715
+ }
716
+ if (mesh.getClassName() === "GaussianSplattingMesh") {
717
+ this._addGsMeshToVoxelRT(mrt, mesh);
718
+ }
719
+ else if (mesh.subMeshes && mesh.subMeshes.length > 0) {
720
+ mrt.renderList?.push(mesh);
721
+ mrt.setMaterialForRendering(mesh, voxelMaterial);
722
+ }
723
+ const meshes = mesh.getChildMeshes();
724
+ for (const childMesh of meshes) {
725
+ if (childMesh.getClassName() === "GaussianSplattingMesh") {
726
+ this._addGsMeshToVoxelRT(mrt, childMesh);
612
727
  }
613
- const meshes = mesh.getChildMeshes();
614
- for (const childMesh of meshes) {
615
- if (childMesh.subMeshes && childMesh.subMeshes.length > 0) {
616
- mrt.renderList?.push(childMesh);
617
- mrt.setMaterialForRendering(childMesh, voxelMaterial);
618
- }
728
+ else if (childMesh.subMeshes && childMesh.subMeshes.length > 0) {
729
+ mrt.renderList?.push(childMesh);
730
+ mrt.setMaterialForRendering(childMesh, voxelMaterial);
619
731
  }
620
732
  }
621
733
  }
734
+ this._installVoxelMixedCustomRender(mrt);
622
735
  }
623
736
  this._renderTargets = this._renderTargets.concat(mrts);
624
737
  }
@@ -631,7 +744,16 @@ export class _IblShadowsVoxelRenderer {
631
744
  */
632
745
  dispose() {
633
746
  this._disposeVoxelTextures();
634
- // TODO - dispose all created voxel materials.
747
+ for (const mat of Array.from(this._gsVoxelMaterialCache.values())) {
748
+ mat.dispose();
749
+ }
750
+ this._gsVoxelMaterialCache.clear();
635
751
  }
636
752
  }
753
+ // View matrices for the three voxelization axes.
754
+ _IblShadowsVoxelRenderer._VOXEL_VIEW_MATRICES = [
755
+ Matrix.LookAtLH(Vector3.Zero(), new Vector3(1, 0, 0), Vector3.Up()),
756
+ Matrix.LookAtLH(Vector3.Zero(), new Vector3(0, 1, 0), new Vector3(1, 0, 0)),
757
+ Matrix.LookAtLH(Vector3.Zero(), new Vector3(0, 0, 1), Vector3.Up()),
758
+ ];
637
759
  //# sourceMappingURL=iblShadowsVoxelRenderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"iblShadowsVoxelRenderer.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\nimport { type Engine } from \"../../Engines/engine\";\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial\";\nimport { MultiRenderTarget } from \"../../Materials/Textures/multiRenderTarget\";\nimport { RenderTargetTexture, type RenderTargetTextureOptions } from \"../../Materials/Textures/renderTargetTexture\";\nimport { type TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\nimport { Color4 } from \"../../Maths/math.color\";\nimport { Matrix, Vector3 } from \"../../Maths/math.vector\";\nimport { type Mesh } from \"../../Meshes/mesh\";\nimport { type Scene } from \"../../scene\";\nimport { Texture } from \"../../Materials/Textures/texture\";\nimport { Logger } from \"../../Misc/logger\";\nimport { Observable } from \"../../Misc/observable\";\nimport { ProceduralTexture, type IProceduralTextureCreationOptions } from \"../../Materials/Textures/Procedurals/proceduralTexture\";\nimport { EffectRenderer, EffectWrapper } from \"../../Materials/effectRenderer\";\nimport { type IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline\";\nimport { type RenderTargetWrapper } from \"core/Engines\";\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\nimport \"../../Engines/Extensions/engine.multiRender\";\n\n/**\n * Voxel-based shadow rendering for IBL's.\n * This should not be instanciated directly, as it is part of a scene component\n * @internal\n * @see https://playground.babylonjs.com/#8R5SSE#222\n */\nexport class _IblShadowsVoxelRenderer {\n private _scene: Scene;\n private _engine: Engine;\n\n // WebGPU, single-pass voxelization.\n // See https://playground.babylonjs.com/#XSNYAU#133\n private _voxelGrid: RenderTargetTexture;\n private _voxelGridRT: RenderTargetTexture;\n\n // WebGL voxelization, including tri-planar voxelization.\n private _combinedVoxelGridPT: ProceduralTexture;\n private _voxelGridXaxis: RenderTargetTexture;\n private _voxelGridYaxis: RenderTargetTexture;\n private _voxelGridZaxis: RenderTargetTexture;\n private _voxelMrtsXaxis: MultiRenderTarget[] = [];\n private _voxelMrtsYaxis: MultiRenderTarget[] = [];\n private _voxelMrtsZaxis: MultiRenderTarget[] = [];\n\n private _voxelMaterial: ShaderMaterial;\n private _voxelClearColor: Color4 = new Color4(0, 0, 0, 1);\n\n /**\n * Return the voxel grid texture.\n * @returns The voxel grid texture.\n */\n public getVoxelGrid(): ProceduralTexture | RenderTargetTexture {\n if (this._engine.isWebGPU) {\n return this._voxelGrid;\n } else if (this._triPlanarVoxelization) {\n return this._combinedVoxelGridPT;\n } else {\n return this._voxelGridZaxis;\n }\n }\n\n /**\n * Return the voxel render target used during voxelization.\n * @returns The voxel render target.\n */\n public getRT(): ProceduralTexture | RenderTargetTexture {\n if (this._engine.isWebGPU) {\n return this._voxelGridRT;\n } else if (this._triPlanarVoxelization) {\n return this._combinedVoxelGridPT;\n } else {\n return this._voxelGridZaxis;\n }\n }\n\n /**\n * Observable that triggers when the voxelization is complete\n */\n public onVoxelizationCompleteObservable: Observable<void> = new Observable<void>();\n\n private _maxDrawBuffers: number;\n private _renderTargets: RenderTargetTexture[] = [];\n\n private _triPlanarVoxelization: boolean = true;\n\n /**\n * Whether to use tri-planar voxelization. More expensive, but can help with artifacts.\n */\n public get triPlanarVoxelization(): boolean {\n return this._triPlanarVoxelization;\n }\n\n /**\n * Whether to use tri-planar voxelization. More expensive, but can help with artifacts.\n */\n public set triPlanarVoxelization(enabled: boolean) {\n if (this._engine.isWebGPU) {\n // WebGPU only supports tri-planar voxelization.\n this._triPlanarVoxelization = true;\n return;\n }\n if (this._triPlanarVoxelization === enabled) {\n return;\n }\n this._triPlanarVoxelization = enabled;\n this._disposeVoxelTextures();\n this._createTextures();\n }\n\n private _voxelizationInProgress: boolean = false;\n private _invWorldScaleMatrix: Matrix = Matrix.Identity();\n\n /**\n * Set the matrix to use for scaling the world space to voxel space\n * @param matrix The matrix to use for scaling the world space to voxel space\n */\n public setWorldScaleMatrix(matrix: Matrix) {\n this._invWorldScaleMatrix = matrix;\n }\n\n /**\n * @returns Whether voxelization is currently happening.\n */\n public isVoxelizationInProgress(): boolean {\n return this._voxelizationInProgress;\n }\n\n private _voxelResolution: number = 64;\n private _voxelResolutionExp: number = 6;\n\n /**\n * Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n */\n public get voxelResolutionExp(): number {\n return this._voxelResolutionExp;\n }\n\n /**\n * Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n */\n public set voxelResolutionExp(resolutionExp: number) {\n if (this._voxelResolutionExp === resolutionExp && this._voxelGridZaxis) {\n return;\n }\n this._voxelResolutionExp = Math.round(Math.min(Math.max(resolutionExp, 3), 9));\n this._voxelResolution = Math.pow(2.0, this._voxelResolutionExp);\n this._disposeVoxelTextures();\n this._createTextures();\n }\n\n private _copyMipEffectRenderer: EffectRenderer;\n private _copyMipEffectWrapper: EffectWrapper;\n private _copyMipSourceTexture?: ProceduralTexture;\n private _copyMipLayer = 0;\n private _mipArray: ProceduralTexture[] = [];\n\n /**\n * Instanciates the voxel renderer\n * @param scene Scene to attach to\n * @param iblShadowsRenderPipeline The render pipeline this pass is associated with\n * @param resolutionExp Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n * @param triPlanarVoxelization Whether to use tri-planar voxelization. Only applies to WebGL. Voxelization will take longer but will reduce missing geometry.\n * @returns The voxel renderer\n */\n constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline, resolutionExp: number = 6, triPlanarVoxelization: boolean = true) {\n this._scene = scene;\n this._engine = scene.getEngine() as Engine;\n this._triPlanarVoxelization = this._engine.isWebGPU || triPlanarVoxelization;\n if (!this._engine.getCaps().drawBuffersExtension) {\n Logger.Error(\"Can't do voxel rendering without the draw buffers extension.\");\n }\n\n const isWebGPU = this._engine.isWebGPU;\n // Round down to a power of 2 so it evenly divides the power-of-2 voxel resolution,\n // preventing out-of-bounds layer indices in the last MRT slab.\n // This shader implementation writes up to 16 MRT outputs, so clamp to 16 to keep\n // active draw buffers aligned with declared/written fragment outputs.\n const rawMaxDrawBuffers = this._engine.getCaps().maxDrawBuffers || 0;\n const cappedMaxDrawBuffers = Math.min(rawMaxDrawBuffers, 16);\n this._maxDrawBuffers = cappedMaxDrawBuffers >= 1 ? 1 << Math.floor(Math.log2(cappedMaxDrawBuffers)) : 0;\n\n this._copyMipEffectRenderer = new EffectRenderer(this._engine);\n this._copyMipEffectWrapper = new EffectWrapper({\n engine: this._engine,\n fragmentShader: \"copyTexture3DLayerToTexture\",\n useShaderStore: true,\n uniformNames: [\"layerNum\"],\n samplerNames: [\"textureSampler\"],\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/copyTexture3DLayerToTexture.fragment\");\n } else {\n await import(\"../../Shaders/copyTexture3DLayerToTexture.fragment\");\n }\n },\n });\n this._copyMipEffectWrapper.onApplyObservable.add(() => {\n const effect = this._copyMipEffectWrapper.effect;\n if (!effect || !this._copyMipSourceTexture) {\n return;\n }\n\n effect.setTexture(\"textureSampler\", this._copyMipSourceTexture);\n effect.setInt(\"layerNum\", this._copyMipLayer);\n });\n\n this.voxelResolutionExp = resolutionExp;\n }\n\n private _generateMipMaps() {\n const iterations = Math.ceil(Math.log2(this._voxelResolution));\n for (let i = 1; i < iterations + 1; i++) {\n this._generateMipMap(i);\n }\n }\n\n private _generateMipMap(lodLevel: number) {\n // Generate a mip map for the given level by triggering the render of the procedural mip texture.\n const mipTarget = this._mipArray[lodLevel - 1];\n if (!mipTarget) {\n return;\n }\n\n mipTarget.setTexture(\"srcMip\", lodLevel === 1 ? this.getVoxelGrid() : this._mipArray[lodLevel - 2]);\n mipTarget.render();\n }\n\n private _copyMipMaps() {\n const iterations = Math.ceil(Math.log2(this._voxelResolution));\n for (let i = 1; i < iterations + 1; i++) {\n this._copyMipMap(i);\n }\n }\n\n private _copyMipMap(lodLevel: number) {\n // Now, copy this mip into the mip chain of the voxel grid.\n const mipTarget = this._mipArray[lodLevel - 1];\n if (!mipTarget) {\n return;\n }\n const voxelGrid = this.getVoxelGrid();\n let rt: RenderTargetWrapper;\n if (voxelGrid instanceof RenderTargetTexture && voxelGrid.renderTarget) {\n rt = voxelGrid.renderTarget;\n } else {\n rt = (voxelGrid as any)._rtWrapper;\n }\n if (rt) {\n this._copyMipEffectRenderer.saveStates();\n const previousColorWrite = this._engine.getColorWrite();\n const previousDepthBuffer = this._engine.getDepthBuffer();\n const previousDepthWrite = this._engine.getDepthWrite();\n const previousAlphaMode = this._engine.getAlphaMode();\n this._engine.setColorWrite(true);\n this._engine.setDepthBuffer(false);\n this._engine.setDepthWrite(false);\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\n const bindSize = mipTarget.getSize().width;\n let sourceDepth = mipTarget.getInternalTexture()?.depth;\n sourceDepth = Math.max(1, sourceDepth || bindSize);\n const destinationMipDepth = Math.max(1, this._voxelResolution >> lodLevel);\n const layersToCopy = Math.min(sourceDepth, destinationMipDepth);\n const destinationTexture = rt.texture;\n const previousGenerateMipMaps = destinationTexture?.generateMipMaps;\n\n if (destinationTexture) {\n destinationTexture.generateMipMaps = false;\n }\n\n try {\n // Render to each layer of the voxel grid.\n for (let layer = 0; layer < layersToCopy; layer++) {\n this._engine.bindFramebuffer(rt, 0, bindSize, bindSize, true, lodLevel, layer);\n this._copyMipSourceTexture = mipTarget;\n this._copyMipLayer = layer;\n this._copyMipEffectRenderer.applyEffectWrapper(this._copyMipEffectWrapper);\n this._copyMipEffectRenderer.draw();\n this._engine.unBindFramebuffer(rt, true);\n }\n\n if (!this._engine.isWebGPU) {\n this._engine.unbindAllTextures();\n }\n } finally {\n if (destinationTexture && previousGenerateMipMaps !== undefined) {\n destinationTexture.generateMipMaps = previousGenerateMipMaps;\n }\n this._engine.setAlphaMode(previousAlphaMode);\n this._engine.setDepthWrite(previousDepthWrite);\n this._engine.setDepthBuffer(previousDepthBuffer);\n this._engine.setColorWrite(previousColorWrite);\n }\n\n this._copyMipSourceTexture = undefined;\n this._copyMipEffectRenderer.restoreStates();\n }\n }\n\n private _computeNumberOfSlabs(): number {\n return Math.ceil(this._voxelResolution / this._maxDrawBuffers);\n }\n\n private _createTextures() {\n const isWebGPU = this._engine.isWebGPU;\n const size: TextureSize = {\n width: this._voxelResolution,\n height: this._voxelResolution,\n depth: this._voxelResolution,\n };\n const voxelAxisOptions: RenderTargetTextureOptions = {\n generateDepthBuffer: false,\n generateMipMaps: false,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n };\n\n // We can render up to maxDrawBuffers voxel slices of the grid per render.\n // We call this a slab.\n const numSlabs = this._computeNumberOfSlabs();\n const voxelCombinedOptions: IProceduralTextureCreationOptions = {\n generateDepthBuffer: false,\n generateMipMaps: true,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_NEAREST_MIPNEAREST,\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/iblCombineVoxelGrids.fragment\");\n } else {\n await import(\"../../Shaders/iblCombineVoxelGrids.fragment\");\n }\n },\n };\n if (this._engine.isWebGPU) {\n this._voxelGrid = new RenderTargetTexture(\"voxelGrid\", size, this._scene, {\n ...voxelCombinedOptions,\n format: Constants.TEXTUREFORMAT_R,\n creationFlags: Constants.TEXTURE_CREATIONFLAG_STORAGE,\n });\n this._voxelGridRT = new RenderTargetTexture(\n \"voxelGridRT\",\n { width: Math.min(size.width * 2.0, 2048), height: Math.min(size.height * 2.0, 2048) },\n this._scene,\n voxelAxisOptions\n );\n } else if (this._triPlanarVoxelization) {\n this._voxelGridXaxis = new RenderTargetTexture(\"voxelGridXaxis\", size, this._scene, voxelAxisOptions);\n this._voxelGridYaxis = new RenderTargetTexture(\"voxelGridYaxis\", size, this._scene, voxelAxisOptions);\n this._voxelGridZaxis = new RenderTargetTexture(\"voxelGridZaxis\", size, this._scene, voxelAxisOptions);\n this._voxelMrtsXaxis = this._createVoxelMRTs(\"x_axis_\", this._voxelGridXaxis, numSlabs);\n this._voxelMrtsYaxis = this._createVoxelMRTs(\"y_axis_\", this._voxelGridYaxis, numSlabs);\n this._voxelMrtsZaxis = this._createVoxelMRTs(\"z_axis_\", this._voxelGridZaxis, numSlabs);\n\n this._combinedVoxelGridPT = new ProceduralTexture(\"combinedVoxelGrid\", size, \"iblCombineVoxelGrids\", this._scene, voxelCombinedOptions, false);\n this._scene.proceduralTextures.splice(this._scene.proceduralTextures.indexOf(this._combinedVoxelGridPT), 1);\n this._combinedVoxelGridPT.setFloat(\"layer\", 0.0);\n this._combinedVoxelGridPT.setTexture(\"voxelXaxisSampler\", this._voxelGridXaxis);\n this._combinedVoxelGridPT.setTexture(\"voxelYaxisSampler\", this._voxelGridYaxis);\n this._combinedVoxelGridPT.setTexture(\"voxelZaxisSampler\", this._voxelGridZaxis);\n // We will render this only after voxelization is completed for the 3 axes.\n this._combinedVoxelGridPT.autoClear = false;\n this._combinedVoxelGridPT.wrapU = Texture.CLAMP_ADDRESSMODE;\n this._combinedVoxelGridPT.wrapV = Texture.CLAMP_ADDRESSMODE;\n } else {\n this._voxelGridZaxis = new RenderTargetTexture(\"voxelGridZaxis\", size, this._scene, voxelCombinedOptions);\n this._voxelMrtsZaxis = this._createVoxelMRTs(\"z_axis_\", this._voxelGridZaxis, numSlabs);\n }\n\n const generateVoxelMipOptions: IProceduralTextureCreationOptions = {\n generateDepthBuffer: false,\n generateMipMaps: false,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/iblGenerateVoxelMip.fragment\");\n } else {\n await import(\"../../Shaders/iblGenerateVoxelMip.fragment\");\n }\n },\n };\n this._mipArray = new Array(Math.ceil(Math.log2(this._voxelResolution)));\n for (let mipIdx = 1; mipIdx <= this._mipArray.length; mipIdx++) {\n const mipDim = this._voxelResolution >> mipIdx;\n const mipSize: TextureSize = { width: mipDim, height: mipDim, depth: mipDim };\n this._mipArray[mipIdx - 1] = new ProceduralTexture(\"voxelMip\" + mipIdx, mipSize, \"iblGenerateVoxelMip\", this._scene, generateVoxelMipOptions, false);\n this._scene.proceduralTextures.splice(this._scene.proceduralTextures.indexOf(this._mipArray[mipIdx - 1]), 1);\n\n const mipTarget = this._mipArray[mipIdx - 1];\n mipTarget.autoClear = false;\n mipTarget.wrapU = Texture.CLAMP_ADDRESSMODE;\n mipTarget.wrapV = Texture.CLAMP_ADDRESSMODE;\n mipTarget.setTexture(\"srcMip\", mipIdx > 1 ? this._mipArray[mipIdx - 2] : this.getVoxelGrid());\n mipTarget.setInt(\"layerNum\", 0);\n }\n\n this._createVoxelMaterials();\n }\n\n private _createVoxelMRTs(name: string, voxelRT: RenderTargetTexture, numSlabs: number): MultiRenderTarget[] {\n voxelRT.wrapU = Texture.CLAMP_ADDRESSMODE;\n voxelRT.wrapV = Texture.CLAMP_ADDRESSMODE;\n voxelRT.noPrePassRenderer = true;\n const mrtArray: MultiRenderTarget[] = [];\n const targetTypes = new Array(this._maxDrawBuffers).fill(Constants.TEXTURE_3D);\n\n for (let mrtIndex = 0; mrtIndex < numSlabs; mrtIndex++) {\n let layerIndices = new Array(this._maxDrawBuffers).fill(0);\n layerIndices = layerIndices.map((value, index) => mrtIndex * this._maxDrawBuffers + index);\n\n let textureNames = new Array(this._maxDrawBuffers).fill(\"\");\n textureNames = textureNames.map((value, index) => \"voxel_grid_\" + name + (mrtIndex * this._maxDrawBuffers + index));\n\n const mrt = new MultiRenderTarget(\n \"mrt_\" + name + mrtIndex,\n { width: this._voxelResolution, height: this._voxelResolution, depth: this._voxelResolution },\n this._maxDrawBuffers, // number of draw buffers\n this._scene,\n {\n types: new Array(this._maxDrawBuffers).fill(Constants.TEXTURETYPE_UNSIGNED_BYTE),\n samplingModes: new Array(this._maxDrawBuffers).fill(Constants.TEXTURE_TRILINEAR_SAMPLINGMODE),\n generateMipMaps: false,\n targetTypes,\n formats: new Array(this._maxDrawBuffers).fill(Constants.TEXTUREFORMAT_R),\n faceIndex: new Array(this._maxDrawBuffers).fill(0),\n layerIndex: layerIndices,\n layerCounts: new Array(this._maxDrawBuffers).fill(this._voxelResolution),\n generateDepthBuffer: false,\n generateStencilBuffer: false,\n },\n textureNames\n );\n\n mrt.clearColor = new Color4(0, 0, 0, 1);\n mrt.noPrePassRenderer = true;\n for (let i = 0; i < this._maxDrawBuffers; i++) {\n mrt.setInternalTexture(voxelRT.getInternalTexture()!, i);\n }\n\n mrtArray.push(mrt);\n }\n return mrtArray;\n }\n\n private _disposeVoxelTextures() {\n this._stopVoxelization();\n for (let i = 0; i < this._voxelMrtsZaxis.length; i++) {\n if (this._triPlanarVoxelization) {\n this._voxelMrtsXaxis[i].dispose(true);\n this._voxelMrtsYaxis[i].dispose(true);\n }\n this._voxelMrtsZaxis[i].dispose(true);\n }\n if (this._triPlanarVoxelization) {\n this._voxelGridXaxis?.dispose();\n this._voxelGridYaxis?.dispose();\n this._combinedVoxelGridPT?.dispose();\n }\n this._voxelGridZaxis?.dispose();\n for (const mip of this._mipArray) {\n mip.dispose();\n }\n this._voxelMaterial?.dispose();\n this._mipArray = [];\n this._voxelMrtsXaxis = [];\n this._voxelMrtsYaxis = [];\n this._voxelMrtsZaxis = [];\n }\n\n private _createVoxelMaterials(): void {\n const isWebGPU = this._engine.isWebGPU;\n this._voxelMaterial = new ShaderMaterial(\"voxelization\", this._scene, \"iblVoxelGrid\", {\n uniforms: [\"world\", \"viewMatrix\", \"invTransWorld\", \"invWorldScale\", \"nearPlane\", \"farPlane\", \"stepSize\"],\n defines: [\"MAX_DRAW_BUFFERS \" + this._maxDrawBuffers],\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await Promise.all([import(\"../../ShadersWGSL/iblVoxelGrid.fragment\"), import(\"../../ShadersWGSL/iblVoxelGrid.vertex\")]);\n } else {\n await Promise.all([import(\"../../Shaders/iblVoxelGrid.fragment\"), import(\"../../Shaders/iblVoxelGrid.vertex\")]);\n }\n },\n });\n\n this._voxelMaterial.cullBackFaces = false;\n this._voxelMaterial.backFaceCulling = false;\n this._voxelMaterial.depthFunction = Constants.ALWAYS;\n }\n\n /**\n * Checks if the voxel renderer is ready to voxelize scene\n * @returns true if the voxel renderer is ready to voxelize scene\n */\n public isReady() {\n let allReady = this.getVoxelGrid().isReady();\n for (let i = 0; i < this._mipArray.length; i++) {\n const mipReady = this._mipArray[i].isReady();\n allReady &&= mipReady;\n }\n\n if (!allReady || this._voxelizationInProgress) {\n return false;\n }\n\n return true;\n }\n\n /**\n * If the MRT's are already in the list of render targets, this will\n * remove them so that they don't get rendered again.\n */\n private _stopVoxelization() {\n // If the MRT's are already in the list of render targets, remove them.\n this._removeVoxelRTs(this._voxelMrtsXaxis);\n this._removeVoxelRTs(this._voxelMrtsYaxis);\n this._removeVoxelRTs(this._voxelMrtsZaxis);\n this._removeVoxelRTs([this._voxelGridRT]);\n }\n\n private _removeVoxelRTs(rts: RenderTargetTexture[]) {\n // const currentRTs = this._scene.customRenderTargets;\n const rtIdx = this._renderTargets.findIndex((rt) => {\n if (rt === rts[0]) {\n return true;\n }\n return false;\n });\n if (rtIdx >= 0) {\n this._renderTargets.splice(rtIdx, rts.length);\n } else {\n const rtIdx = this._scene.customRenderTargets.findIndex((rt) => {\n if (rt === rts[0]) {\n return true;\n }\n return false;\n });\n if (rtIdx >= 0) {\n this._scene.customRenderTargets.splice(rtIdx, rts.length);\n }\n }\n }\n\n /**\n * Renders voxel grid of scene for IBL shadows\n * @param includedMeshes\n * @param registerAfterRenderObservable Whether to register scene onAfterRender callback (legacy path).\n */\n public updateVoxelGrid(includedMeshes: Mesh[], registerAfterRenderObservable: boolean = true) {\n if (this._voxelizationInProgress) {\n return;\n }\n this._stopVoxelization();\n this._voxelizationInProgress = true;\n\n if (this._engine.isWebGPU) {\n this._voxelGridRT.renderList = includedMeshes;\n this._addRTsForRender([this._voxelGridRT], includedMeshes, 0);\n } else if (this._triPlanarVoxelization) {\n this._addRTsForRender(this._voxelMrtsXaxis, includedMeshes, 0);\n this._addRTsForRender(this._voxelMrtsYaxis, includedMeshes, 1);\n this._addRTsForRender(this._voxelMrtsZaxis, includedMeshes, 2);\n } else {\n this._addRTsForRender(this._voxelMrtsZaxis, includedMeshes, 2);\n }\n if (registerAfterRenderObservable) {\n this._renderVoxelGridBound = this._renderVoxelGrid.bind(this);\n this._scene.onAfterRenderObservable.add(this._renderVoxelGridBound);\n }\n }\n\n /**\n * Advances voxelization work when running in custom render loops (for example FrameGraph tasks)\n * where scene onAfterRender timing may differ from classic pipeline flow.\n */\n public processVoxelization(): void {\n this._renderVoxelGrid();\n }\n\n private _renderVoxelGridBound: () => void;\n\n private _renderVoxelGrid() {\n if (this._voxelizationInProgress) {\n let allReady = this.getVoxelGrid().isReady();\n for (let i = 0; i < this._mipArray.length; i++) {\n const mipReady = this._mipArray[i].isReady();\n allReady &&= mipReady;\n }\n for (let i = 0; i < this._renderTargets.length; i++) {\n const rttReady = this._renderTargets[i].isReadyForRendering();\n allReady &&= rttReady;\n }\n if (!allReady) {\n return;\n }\n\n const copyMipEffect = this._copyMipEffectWrapper.effect;\n if (!copyMipEffect.isReady()) {\n return;\n }\n\n if (this._engine.isWebGPU) {\n // Clear the voxel grid storage texture.\n // Need to clear each layer individually.\n // Would a compute shader be faster here to clear all layers in one go?\n if (this._voxelGrid && this._voxelGrid.renderTarget) {\n for (let layer = 0; layer < this._voxelResolution; layer++) {\n this._engine.bindFramebuffer(this._voxelGrid.renderTarget, 0, undefined, undefined, true, 0, layer);\n this._engine.clear(this._voxelClearColor, true, false, false);\n this._engine.unBindFramebuffer(this._voxelGrid.renderTarget, true);\n }\n }\n }\n\n for (const rt of this._renderTargets) {\n rt.render();\n }\n this._stopVoxelization();\n\n if (this._triPlanarVoxelization && !this._engine.isWebGPU) {\n this._combinedVoxelGridPT.render();\n }\n this._generateMipMaps();\n this._copyMipMaps();\n this._scene.onAfterRenderObservable.removeCallback(this._renderVoxelGridBound);\n this._voxelizationInProgress = false;\n this.onVoxelizationCompleteObservable.notifyObservers();\n }\n }\n\n private _addRTsForRender(mrts: RenderTargetTexture[], includedMeshes: Mesh[], axis: number) {\n const slabSize = 1.0 / this._computeNumberOfSlabs();\n const voxelMaterial = this._voxelMaterial;\n\n // We need to update the world scale uniform for every mesh being rendered to the voxel grid.\n for (let mrtIndex = 0; mrtIndex < mrts.length; mrtIndex++) {\n const mrt = mrts[mrtIndex];\n mrt._disableEngineStages = true;\n mrt.useCameraPostProcesses = false;\n mrt.renderParticles = false;\n mrt.renderSprites = false;\n mrt.enableOutlineRendering = false;\n\n mrt.customRenderFunction = (opaqueSubMeshes, alphaTestSubMeshes, transparentSubMeshes, depthOnlySubMeshes) => {\n const buckets = [depthOnlySubMeshes, opaqueSubMeshes, alphaTestSubMeshes, transparentSubMeshes];\n for (const bucket of buckets) {\n for (let index = 0; index < bucket.length; index++) {\n const subMesh = bucket.data[index];\n if (subMesh.getMaterial() !== voxelMaterial) {\n continue;\n }\n subMesh.render(false);\n }\n }\n };\n\n mrt.renderList = [];\n const nearPlane = mrtIndex * slabSize;\n const farPlane = (mrtIndex + 1) * slabSize;\n const stepSize = slabSize / this._maxDrawBuffers;\n\n const cameraPosition = new Vector3(0, 0, 0);\n let targetPosition = new Vector3(0, 0, 1);\n if (axis === 0) {\n targetPosition = new Vector3(1, 0, 0);\n } else if (axis === 1) {\n targetPosition = new Vector3(0, 1, 0);\n }\n let upDirection = new Vector3(0, 1, 0);\n if (axis === 1) {\n upDirection = new Vector3(1, 0, 0);\n }\n mrt.onBeforeRenderObservable.clear();\n mrt.onBeforeRenderObservable.add(() => {\n voxelMaterial.setMatrix(\"viewMatrix\", Matrix.LookAtLH(cameraPosition, targetPosition, upDirection));\n voxelMaterial.setMatrix(\"invWorldScale\", this._invWorldScaleMatrix);\n voxelMaterial.setFloat(\"nearPlane\", nearPlane);\n voxelMaterial.setFloat(\"farPlane\", farPlane);\n voxelMaterial.setFloat(\"stepSize\", stepSize);\n if (this._engine.isWebGPU) {\n this._voxelMaterial.useVertexPulling = true;\n this._voxelMaterial.setTexture(\"voxel_storage\", this.getVoxelGrid());\n }\n });\n\n // Set this material on every mesh in the scene (for this RT)\n if (includedMeshes.length === 0) {\n return;\n }\n for (const mesh of includedMeshes) {\n if (mesh) {\n if (mesh.subMeshes && mesh.subMeshes.length > 0) {\n mrt.renderList?.push(mesh);\n mrt.setMaterialForRendering(mesh, voxelMaterial);\n }\n const meshes = mesh.getChildMeshes();\n for (const childMesh of meshes) {\n if (childMesh.subMeshes && childMesh.subMeshes.length > 0) {\n mrt.renderList?.push(childMesh);\n mrt.setMaterialForRendering(childMesh, voxelMaterial);\n }\n }\n }\n }\n }\n\n this._renderTargets = this._renderTargets.concat(mrts);\n }\n\n /**\n * Called by the pipeline to resize resources.\n */\n public resize() {}\n\n /**\n * Disposes the voxel renderer and associated resources\n */\n public dispose() {\n this._disposeVoxelTextures();\n // TODO - dispose all created voxel materials.\n }\n}\n"]}
1
+ {"version":3,"file":"iblShadowsVoxelRenderer.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\nimport { type Engine } from \"../../Engines/engine\";\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial\";\nimport { MultiRenderTarget } from \"../../Materials/Textures/multiRenderTarget\";\nimport { RenderTargetTexture, type RenderTargetTextureOptions } from \"../../Materials/Textures/renderTargetTexture\";\nimport { type TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\nimport { Color4 } from \"../../Maths/math.color\";\nimport { Matrix, Vector3 } from \"../../Maths/math.vector\";\nimport { type Mesh } from \"../../Meshes/mesh\";\nimport { type SubMesh } from \"../../Meshes/subMesh\";\nimport { type Scene } from \"../../scene\";\nimport { type SmartArray } from \"../../Misc/smartArray\";\nimport { Texture } from \"../../Materials/Textures/texture\";\nimport { Logger } from \"../../Misc/logger\";\nimport { Observable } from \"../../Misc/observable\";\nimport { ProceduralTexture, type IProceduralTextureCreationOptions } from \"../../Materials/Textures/Procedurals/proceduralTexture\";\nimport { EffectRenderer, EffectWrapper } from \"../../Materials/effectRenderer\";\nimport { type IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline\";\nimport { type RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\nimport { type GaussianSplattingMesh } from \"../../Meshes/GaussianSplatting/gaussianSplattingMesh\";\nimport { type GaussianSplattingMaterial } from \"../../Materials/GaussianSplatting/gaussianSplattingMaterial\";\nimport \"../../Engines/Extensions/engine.multiRender\";\n\n/**\n * Voxel-based shadow rendering for IBL's.\n * This should not be instanciated directly, as it is part of a scene component\n * @internal\n * @see https://playground.babylonjs.com/#8R5SSE#222\n */\nexport class _IblShadowsVoxelRenderer {\n // View matrices for the three voxelization axes.\n private static readonly _VOXEL_VIEW_MATRICES = [\n Matrix.LookAtLH(Vector3.Zero(), new Vector3(1, 0, 0), Vector3.Up()),\n Matrix.LookAtLH(Vector3.Zero(), new Vector3(0, 1, 0), new Vector3(1, 0, 0)),\n Matrix.LookAtLH(Vector3.Zero(), new Vector3(0, 0, 1), Vector3.Up()),\n ];\n\n private _scene: Scene;\n private _engine: Engine;\n\n // WebGPU, single-pass voxelization.\n // See https://playground.babylonjs.com/#XSNYAU#133\n private _voxelGrid: RenderTargetTexture;\n private _voxelGridRT: RenderTargetTexture;\n\n // WebGL voxelization, including tri-planar voxelization.\n private _combinedVoxelGridPT: ProceduralTexture;\n private _voxelGridXaxis: RenderTargetTexture;\n private _voxelGridYaxis: RenderTargetTexture;\n private _voxelGridZaxis: RenderTargetTexture;\n private _voxelMrtsXaxis: MultiRenderTarget[] = [];\n private _voxelMrtsYaxis: MultiRenderTarget[] = [];\n private _voxelMrtsZaxis: MultiRenderTarget[] = [];\n\n private _voxelMaterial: ShaderMaterial;\n private _voxelClearColor: Color4 = new Color4(0, 0, 0, 1);\n\n /**\n * Return the voxel grid texture.\n * @returns The voxel grid texture.\n */\n public getVoxelGrid(): ProceduralTexture | RenderTargetTexture {\n if (this._engine.isWebGPU) {\n return this._voxelGrid;\n } else if (this._triPlanarVoxelization) {\n return this._combinedVoxelGridPT;\n } else {\n return this._voxelGridZaxis;\n }\n }\n\n /**\n * Return the voxel render target used during voxelization.\n * @returns The voxel render target.\n */\n public getRT(): ProceduralTexture | RenderTargetTexture {\n if (this._engine.isWebGPU) {\n return this._voxelGridRT;\n } else if (this._triPlanarVoxelization) {\n return this._combinedVoxelGridPT;\n } else {\n return this._voxelGridZaxis;\n }\n }\n\n /**\n * Observable that triggers when the voxelization is complete\n */\n public onVoxelizationCompleteObservable: Observable<void> = new Observable<void>();\n\n private _maxDrawBuffers: number;\n private _renderTargets: RenderTargetTexture[] = [];\n\n /** Per-mesh voxel ShaderMaterials for GaussianSplattingMesh, keyed by mesh uniqueId. */\n private _gsVoxelMaterialCache: Map<number, ShaderMaterial> = new Map();\n\n private _triPlanarVoxelization: boolean = true;\n\n /**\n * Whether to use tri-planar voxelization. More expensive, but can help with artifacts.\n */\n public get triPlanarVoxelization(): boolean {\n return this._triPlanarVoxelization;\n }\n\n /**\n * Whether to use tri-planar voxelization. More expensive, but can help with artifacts.\n */\n public set triPlanarVoxelization(enabled: boolean) {\n if (this._engine.isWebGPU) {\n // WebGPU only supports tri-planar voxelization.\n this._triPlanarVoxelization = true;\n return;\n }\n if (this._triPlanarVoxelization === enabled) {\n return;\n }\n this._triPlanarVoxelization = enabled;\n this._disposeVoxelTextures();\n this._createTextures();\n }\n\n private _voxelizationInProgress: boolean = false;\n private _invWorldScaleMatrix: Matrix = Matrix.Identity();\n\n /**\n * Set the matrix to use for scaling the world space to voxel space\n * @param matrix The matrix to use for scaling the world space to voxel space\n */\n public setWorldScaleMatrix(matrix: Matrix) {\n this._invWorldScaleMatrix = matrix;\n }\n\n /**\n * @returns Whether voxelization is currently happening.\n */\n public isVoxelizationInProgress(): boolean {\n return this._voxelizationInProgress;\n }\n\n private _voxelResolution: number = 64;\n private _voxelResolutionExp: number = 6;\n\n /**\n * Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n */\n public get voxelResolutionExp(): number {\n return this._voxelResolutionExp;\n }\n\n /**\n * Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n */\n public set voxelResolutionExp(resolutionExp: number) {\n if (this._voxelResolutionExp === resolutionExp && this._voxelGridZaxis) {\n return;\n }\n this._voxelResolutionExp = Math.round(Math.min(Math.max(resolutionExp, 3), 9));\n this._voxelResolution = Math.pow(2.0, this._voxelResolutionExp);\n this._disposeVoxelTextures();\n this._createTextures();\n }\n\n private _copyMipEffectRenderer: EffectRenderer;\n private _copyMipEffectWrapper: EffectWrapper;\n private _copyMipSourceTexture?: ProceduralTexture;\n private _copyMipLayer = 0;\n private _mipArray: ProceduralTexture[] = [];\n\n /**\n * Instanciates the voxel renderer\n * @param scene Scene to attach to\n * @param iblShadowsRenderPipeline The render pipeline this pass is associated with\n * @param resolutionExp Resolution of the voxel grid. The final resolution will be 2^resolutionExp.\n * @param triPlanarVoxelization Whether to use tri-planar voxelization. Only applies to WebGL. Voxelization will take longer but will reduce missing geometry.\n * @returns The voxel renderer\n */\n constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline, resolutionExp: number = 6, triPlanarVoxelization: boolean = true) {\n this._scene = scene;\n this._engine = scene.getEngine() as Engine;\n this._triPlanarVoxelization = this._engine.isWebGPU || triPlanarVoxelization;\n if (!this._engine.getCaps().drawBuffersExtension) {\n Logger.Error(\"Can't do voxel rendering without the draw buffers extension.\");\n }\n\n const isWebGPU = this._engine.isWebGPU;\n // Round down to a power of 2 so it evenly divides the power-of-2 voxel resolution,\n // preventing out-of-bounds layer indices in the last MRT slab.\n // This shader implementation writes up to 16 MRT outputs, so clamp to 16 to keep\n // active draw buffers aligned with declared/written fragment outputs.\n const rawMaxDrawBuffers = this._engine.getCaps().maxDrawBuffers || 0;\n const cappedMaxDrawBuffers = Math.min(rawMaxDrawBuffers, 16);\n this._maxDrawBuffers = cappedMaxDrawBuffers >= 1 ? 1 << Math.floor(Math.log2(cappedMaxDrawBuffers)) : 0;\n\n this._copyMipEffectRenderer = new EffectRenderer(this._engine);\n this._copyMipEffectWrapper = new EffectWrapper({\n engine: this._engine,\n fragmentShader: \"copyTexture3DLayerToTexture\",\n useShaderStore: true,\n uniformNames: [\"layerNum\"],\n samplerNames: [\"textureSampler\"],\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/copyTexture3DLayerToTexture.fragment\");\n } else {\n await import(\"../../Shaders/copyTexture3DLayerToTexture.fragment\");\n }\n },\n });\n this._copyMipEffectWrapper.onApplyObservable.add(() => {\n const effect = this._copyMipEffectWrapper.effect;\n if (!effect || !this._copyMipSourceTexture) {\n return;\n }\n\n effect.setTexture(\"textureSampler\", this._copyMipSourceTexture);\n effect.setInt(\"layerNum\", this._copyMipLayer);\n });\n\n this.voxelResolutionExp = resolutionExp;\n }\n\n private _generateMipMaps() {\n const iterations = Math.ceil(Math.log2(this._voxelResolution));\n for (let i = 1; i < iterations + 1; i++) {\n this._generateMipMap(i);\n }\n }\n\n private _generateMipMap(lodLevel: number) {\n // Generate a mip map for the given level by triggering the render of the procedural mip texture.\n const mipTarget = this._mipArray[lodLevel - 1];\n if (!mipTarget) {\n return;\n }\n\n mipTarget.setTexture(\"srcMip\", lodLevel === 1 ? this.getVoxelGrid() : this._mipArray[lodLevel - 2]);\n mipTarget.render();\n }\n\n private _copyMipMaps() {\n const iterations = Math.ceil(Math.log2(this._voxelResolution));\n for (let i = 1; i < iterations + 1; i++) {\n this._copyMipMap(i);\n }\n }\n\n private _copyMipMap(lodLevel: number) {\n // Now, copy this mip into the mip chain of the voxel grid.\n const mipTarget = this._mipArray[lodLevel - 1];\n if (!mipTarget) {\n return;\n }\n const voxelGrid = this.getVoxelGrid();\n let rt: RenderTargetWrapper;\n if (voxelGrid instanceof RenderTargetTexture && voxelGrid.renderTarget) {\n rt = voxelGrid.renderTarget;\n } else {\n rt = (voxelGrid as any)._rtWrapper;\n }\n if (rt) {\n this._copyMipEffectRenderer.saveStates();\n const previousColorWrite = this._engine.getColorWrite();\n const previousDepthBuffer = this._engine.getDepthBuffer();\n const previousDepthWrite = this._engine.getDepthWrite();\n const previousAlphaMode = this._engine.getAlphaMode();\n this._engine.setColorWrite(true);\n this._engine.setDepthBuffer(false);\n this._engine.setDepthWrite(false);\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\n const bindSize = mipTarget.getSize().width;\n let sourceDepth = mipTarget.getInternalTexture()?.depth;\n sourceDepth = Math.max(1, sourceDepth || bindSize);\n const destinationMipDepth = Math.max(1, this._voxelResolution >> lodLevel);\n const layersToCopy = Math.min(sourceDepth, destinationMipDepth);\n const destinationTexture = rt.texture;\n const previousGenerateMipMaps = destinationTexture?.generateMipMaps;\n\n if (destinationTexture) {\n destinationTexture.generateMipMaps = false;\n }\n\n try {\n // Render to each layer of the voxel grid.\n for (let layer = 0; layer < layersToCopy; layer++) {\n this._engine.bindFramebuffer(rt, 0, bindSize, bindSize, true, lodLevel, layer);\n this._copyMipSourceTexture = mipTarget;\n this._copyMipLayer = layer;\n this._copyMipEffectRenderer.applyEffectWrapper(this._copyMipEffectWrapper);\n this._copyMipEffectRenderer.draw();\n this._engine.unBindFramebuffer(rt, true);\n }\n\n if (!this._engine.isWebGPU) {\n this._engine.unbindAllTextures();\n }\n } finally {\n if (destinationTexture && previousGenerateMipMaps !== undefined) {\n destinationTexture.generateMipMaps = previousGenerateMipMaps;\n }\n this._engine.setAlphaMode(previousAlphaMode);\n this._engine.setDepthWrite(previousDepthWrite);\n this._engine.setDepthBuffer(previousDepthBuffer);\n this._engine.setColorWrite(previousColorWrite);\n }\n\n this._copyMipSourceTexture = undefined;\n this._copyMipEffectRenderer.restoreStates();\n }\n }\n\n private _computeNumberOfSlabs(): number {\n return Math.ceil(this._voxelResolution / this._maxDrawBuffers);\n }\n\n private _createTextures() {\n const isWebGPU = this._engine.isWebGPU;\n const size: TextureSize = {\n width: this._voxelResolution,\n height: this._voxelResolution,\n depth: this._voxelResolution,\n };\n const voxelAxisOptions: RenderTargetTextureOptions = {\n generateDepthBuffer: false,\n generateMipMaps: false,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n };\n\n // We can render up to maxDrawBuffers voxel slices of the grid per render.\n // We call this a slab.\n const numSlabs = this._computeNumberOfSlabs();\n const voxelCombinedOptions: IProceduralTextureCreationOptions = {\n generateDepthBuffer: false,\n generateMipMaps: true,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_NEAREST_MIPNEAREST,\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/iblCombineVoxelGrids.fragment\");\n } else {\n await import(\"../../Shaders/iblCombineVoxelGrids.fragment\");\n }\n },\n };\n if (this._engine.isWebGPU) {\n this._voxelGrid = new RenderTargetTexture(\"voxelGrid\", size, this._scene, {\n ...voxelCombinedOptions,\n format: Constants.TEXTUREFORMAT_R,\n creationFlags: Constants.TEXTURE_CREATIONFLAG_STORAGE,\n });\n this._voxelGridRT = new RenderTargetTexture(\n \"voxelGridRT\",\n { width: Math.min(size.width * 2.0, 2048), height: Math.min(size.height * 2.0, 2048) },\n this._scene,\n voxelAxisOptions\n );\n } else if (this._triPlanarVoxelization) {\n this._voxelGridXaxis = new RenderTargetTexture(\"voxelGridXaxis\", size, this._scene, voxelAxisOptions);\n this._voxelGridYaxis = new RenderTargetTexture(\"voxelGridYaxis\", size, this._scene, voxelAxisOptions);\n this._voxelGridZaxis = new RenderTargetTexture(\"voxelGridZaxis\", size, this._scene, voxelAxisOptions);\n this._voxelMrtsXaxis = this._createVoxelMRTs(\"x_axis_\", this._voxelGridXaxis, numSlabs);\n this._voxelMrtsYaxis = this._createVoxelMRTs(\"y_axis_\", this._voxelGridYaxis, numSlabs);\n this._voxelMrtsZaxis = this._createVoxelMRTs(\"z_axis_\", this._voxelGridZaxis, numSlabs);\n\n this._combinedVoxelGridPT = new ProceduralTexture(\"combinedVoxelGrid\", size, \"iblCombineVoxelGrids\", this._scene, voxelCombinedOptions, false);\n this._scene.proceduralTextures.splice(this._scene.proceduralTextures.indexOf(this._combinedVoxelGridPT), 1);\n this._combinedVoxelGridPT.setFloat(\"layer\", 0.0);\n this._combinedVoxelGridPT.setTexture(\"voxelXaxisSampler\", this._voxelGridXaxis);\n this._combinedVoxelGridPT.setTexture(\"voxelYaxisSampler\", this._voxelGridYaxis);\n this._combinedVoxelGridPT.setTexture(\"voxelZaxisSampler\", this._voxelGridZaxis);\n // We will render this only after voxelization is completed for the 3 axes.\n this._combinedVoxelGridPT.autoClear = false;\n this._combinedVoxelGridPT.wrapU = Texture.CLAMP_ADDRESSMODE;\n this._combinedVoxelGridPT.wrapV = Texture.CLAMP_ADDRESSMODE;\n } else {\n this._voxelGridZaxis = new RenderTargetTexture(\"voxelGridZaxis\", size, this._scene, voxelCombinedOptions);\n this._voxelMrtsZaxis = this._createVoxelMRTs(\"z_axis_\", this._voxelGridZaxis, numSlabs);\n }\n\n const generateVoxelMipOptions: IProceduralTextureCreationOptions = {\n generateDepthBuffer: false,\n generateMipMaps: false,\n type: Constants.TEXTURETYPE_UNSIGNED_BYTE,\n format: Constants.TEXTUREFORMAT_R,\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await import(\"../../ShadersWGSL/iblGenerateVoxelMip.fragment\");\n } else {\n await import(\"../../Shaders/iblGenerateVoxelMip.fragment\");\n }\n },\n };\n this._mipArray = new Array(Math.ceil(Math.log2(this._voxelResolution)));\n for (let mipIdx = 1; mipIdx <= this._mipArray.length; mipIdx++) {\n const mipDim = this._voxelResolution >> mipIdx;\n const mipSize: TextureSize = { width: mipDim, height: mipDim, depth: mipDim };\n this._mipArray[mipIdx - 1] = new ProceduralTexture(\"voxelMip\" + mipIdx, mipSize, \"iblGenerateVoxelMip\", this._scene, generateVoxelMipOptions, false);\n this._scene.proceduralTextures.splice(this._scene.proceduralTextures.indexOf(this._mipArray[mipIdx - 1]), 1);\n\n const mipTarget = this._mipArray[mipIdx - 1];\n mipTarget.autoClear = false;\n mipTarget.wrapU = Texture.CLAMP_ADDRESSMODE;\n mipTarget.wrapV = Texture.CLAMP_ADDRESSMODE;\n mipTarget.setTexture(\"srcMip\", mipIdx > 1 ? this._mipArray[mipIdx - 2] : this.getVoxelGrid());\n mipTarget.setInt(\"layerNum\", 0);\n }\n\n this._createVoxelMaterials();\n }\n\n private _createVoxelMRTs(name: string, voxelRT: RenderTargetTexture, numSlabs: number): MultiRenderTarget[] {\n voxelRT.wrapU = Texture.CLAMP_ADDRESSMODE;\n voxelRT.wrapV = Texture.CLAMP_ADDRESSMODE;\n voxelRT.noPrePassRenderer = true;\n const mrtArray: MultiRenderTarget[] = [];\n const targetTypes = new Array(this._maxDrawBuffers).fill(Constants.TEXTURE_3D);\n\n for (let mrtIndex = 0; mrtIndex < numSlabs; mrtIndex++) {\n let layerIndices = new Array(this._maxDrawBuffers).fill(0);\n layerIndices = layerIndices.map((value, index) => mrtIndex * this._maxDrawBuffers + index);\n\n let textureNames = new Array(this._maxDrawBuffers).fill(\"\");\n textureNames = textureNames.map((value, index) => \"voxel_grid_\" + name + (mrtIndex * this._maxDrawBuffers + index));\n\n const mrt = new MultiRenderTarget(\n \"mrt_\" + name + mrtIndex,\n { width: this._voxelResolution, height: this._voxelResolution, depth: this._voxelResolution },\n this._maxDrawBuffers, // number of draw buffers\n this._scene,\n {\n types: new Array(this._maxDrawBuffers).fill(Constants.TEXTURETYPE_UNSIGNED_BYTE),\n samplingModes: new Array(this._maxDrawBuffers).fill(Constants.TEXTURE_TRILINEAR_SAMPLINGMODE),\n generateMipMaps: false,\n targetTypes,\n formats: new Array(this._maxDrawBuffers).fill(Constants.TEXTUREFORMAT_R),\n faceIndex: new Array(this._maxDrawBuffers).fill(0),\n layerIndex: layerIndices,\n layerCounts: new Array(this._maxDrawBuffers).fill(this._voxelResolution),\n generateDepthBuffer: false,\n generateStencilBuffer: false,\n },\n textureNames\n );\n\n mrt.clearColor = new Color4(0, 0, 0, 1);\n mrt.noPrePassRenderer = true;\n for (let i = 0; i < this._maxDrawBuffers; i++) {\n mrt.setInternalTexture(voxelRT.getInternalTexture()!, i);\n }\n\n mrtArray.push(mrt);\n }\n return mrtArray;\n }\n\n private _disposeVoxelTextures() {\n this._stopVoxelization();\n for (let i = 0; i < this._voxelMrtsZaxis.length; i++) {\n if (this._triPlanarVoxelization) {\n this._voxelMrtsXaxis[i].dispose(true);\n this._voxelMrtsYaxis[i].dispose(true);\n }\n this._voxelMrtsZaxis[i].dispose(true);\n }\n if (this._triPlanarVoxelization) {\n this._voxelGridXaxis?.dispose();\n this._voxelGridYaxis?.dispose();\n this._combinedVoxelGridPT?.dispose();\n }\n this._voxelGridZaxis?.dispose();\n for (const mip of this._mipArray) {\n mip.dispose();\n }\n this._voxelMaterial?.dispose();\n this._mipArray = [];\n this._voxelMrtsXaxis = [];\n this._voxelMrtsYaxis = [];\n this._voxelMrtsZaxis = [];\n }\n\n private _createVoxelMaterials(): void {\n const isWebGPU = this._engine.isWebGPU;\n this._voxelMaterial = new ShaderMaterial(\"voxelization\", this._scene, \"iblVoxelGrid\", {\n uniforms: [\"world\", \"viewMatrix\", \"invTransWorld\", \"invWorldScale\", \"nearPlane\", \"farPlane\", \"stepSize\"],\n defines: [\"MAX_DRAW_BUFFERS \" + this._maxDrawBuffers],\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (isWebGPU) {\n await Promise.all([import(\"../../ShadersWGSL/iblVoxelGrid.fragment\"), import(\"../../ShadersWGSL/iblVoxelGrid.vertex\")]);\n } else {\n await Promise.all([import(\"../../Shaders/iblVoxelGrid.fragment\"), import(\"../../Shaders/iblVoxelGrid.vertex\")]);\n }\n },\n });\n\n this._voxelMaterial.cullBackFaces = false;\n this._voxelMaterial.backFaceCulling = false;\n this._voxelMaterial.depthFunction = Constants.ALWAYS;\n }\n\n /**\n * Checks if the voxel renderer is ready to voxelize scene\n * @returns true if the voxel renderer is ready to voxelize scene\n */\n public isReady() {\n let allReady = this.getVoxelGrid().isReady();\n for (let i = 0; i < this._mipArray.length; i++) {\n const mipReady = this._mipArray[i].isReady();\n allReady &&= mipReady;\n }\n\n if (!allReady || this._voxelizationInProgress) {\n return false;\n }\n\n return true;\n }\n\n /**\n * If the MRT's are already in the list of render targets, this will\n * remove them so that they don't get rendered again.\n */\n private _stopVoxelization() {\n // If the MRT's are already in the list of render targets, remove them.\n this._removeVoxelRTs(this._voxelMrtsXaxis);\n this._removeVoxelRTs(this._voxelMrtsYaxis);\n this._removeVoxelRTs(this._voxelMrtsZaxis);\n this._removeVoxelRTs([this._voxelGridRT]);\n }\n\n private _removeVoxelRTs(rts: RenderTargetTexture[]) {\n // const currentRTs = this._scene.customRenderTargets;\n const rtIdx = this._renderTargets.findIndex((rt) => {\n if (rt === rts[0]) {\n return true;\n }\n return false;\n });\n if (rtIdx >= 0) {\n this._renderTargets.splice(rtIdx, rts.length);\n } else {\n const rtIdx = this._scene.customRenderTargets.findIndex((rt) => {\n if (rt === rts[0]) {\n return true;\n }\n return false;\n });\n if (rtIdx >= 0) {\n this._scene.customRenderTargets.splice(rtIdx, rts.length);\n }\n }\n }\n\n /**\n * Renders voxel grid of scene for IBL shadows\n * @param includedMeshes\n * @param registerAfterRenderObservable Whether to register scene onAfterRender callback (legacy path).\n */\n public updateVoxelGrid(includedMeshes: Mesh[], registerAfterRenderObservable: boolean = true) {\n if (this._voxelizationInProgress) {\n return;\n }\n this._stopVoxelization();\n this._voxelizationInProgress = true;\n\n if (this._engine.isWebGPU) {\n this._voxelGridRT.renderList = includedMeshes;\n this._addRTsForRender([this._voxelGridRT], includedMeshes, 0);\n } else if (this._triPlanarVoxelization) {\n this._addRTsForRender(this._voxelMrtsXaxis, includedMeshes, 0);\n this._addRTsForRender(this._voxelMrtsYaxis, includedMeshes, 1);\n this._addRTsForRender(this._voxelMrtsZaxis, includedMeshes, 2);\n } else {\n this._addRTsForRender(this._voxelMrtsZaxis, includedMeshes, 2);\n }\n if (registerAfterRenderObservable) {\n this._renderVoxelGridBound = this._renderVoxelGrid.bind(this);\n this._scene.onAfterRenderObservable.add(this._renderVoxelGridBound);\n }\n }\n\n /**\n * Advances voxelization work when running in custom render loops (for example FrameGraph tasks)\n * where scene onAfterRender timing may differ from classic pipeline flow.\n */\n public processVoxelization(): void {\n this._renderVoxelGrid();\n }\n\n private _renderVoxelGridBound: () => void;\n\n private _renderVoxelGrid() {\n if (this._voxelizationInProgress) {\n let allReady = this.getVoxelGrid().isReady();\n for (let i = 0; i < this._mipArray.length; i++) {\n const mipReady = this._mipArray[i].isReady();\n allReady &&= mipReady;\n }\n for (let i = 0; i < this._renderTargets.length; i++) {\n const rttReady = this._renderTargets[i].isReadyForRendering();\n allReady &&= rttReady;\n }\n for (const gsVoxelMat of Array.from(this._gsVoxelMaterialCache.values())) {\n allReady &&= gsVoxelMat.isReady();\n }\n if (!allReady) {\n return;\n }\n\n const copyMipEffect = this._copyMipEffectWrapper.effect;\n if (!copyMipEffect.isReady()) {\n return;\n }\n\n if (this._engine.isWebGPU) {\n // Clear the voxel grid storage texture.\n // Need to clear each layer individually.\n // Would a compute shader be faster here to clear all layers in one go?\n if (this._voxelGrid && this._voxelGrid.renderTarget) {\n for (let layer = 0; layer < this._voxelResolution; layer++) {\n this._engine.bindFramebuffer(this._voxelGrid.renderTarget, 0, undefined, undefined, true, 0, layer);\n this._engine.clear(this._voxelClearColor, true, false, false);\n this._engine.unBindFramebuffer(this._voxelGrid.renderTarget, true);\n }\n }\n }\n\n for (const rt of this._renderTargets) {\n rt.render();\n }\n this._stopVoxelization();\n\n if (this._triPlanarVoxelization && !this._engine.isWebGPU) {\n this._combinedVoxelGridPT.render();\n }\n this._generateMipMaps();\n this._copyMipMaps();\n this._scene.onAfterRenderObservable.removeCallback(this._renderVoxelGridBound);\n this._voxelizationInProgress = false;\n this.onVoxelizationCompleteObservable.notifyObservers();\n }\n }\n\n /**\n * Splits rendering for every voxel RT: non–Gaussian splatting meshes use subMesh.render\n * (material override from setMaterialForRendering); GaussianSplattingMesh uses a custom draw path with its cached voxel ShaderMaterial.\n * @param rtt - the render target texture to install the custom render function on\n */\n private _installVoxelMixedCustomRender(rtt: RenderTargetTexture): void {\n const scene = this._scene;\n const engine = scene.getEngine();\n\n const renderGsSplat = (sm: SubMesh): void => {\n const renderingMesh = sm.getRenderingMesh();\n const effectiveMesh = sm.getEffectiveMesh();\n const gsVoxelMaterial = this._gsVoxelMaterialCache.get(effectiveMesh.uniqueId);\n if (!gsVoxelMaterial || !gsVoxelMaterial.isReady()) {\n return;\n }\n\n const drawWrapper = gsVoxelMaterial._getDrawWrapper();\n if (!drawWrapper?.effect) {\n return;\n }\n const effect = drawWrapper.effect;\n\n const batch = renderingMesh._getInstancesRenderList(sm._id, !!sm.getReplacementMesh());\n if (batch.mustReturn) {\n return;\n }\n\n const hardwareInstancedRendering =\n engine.getCaps().instancedArrays && ((batch.visibleInstances[sm._id] !== null && batch.visibleInstances[sm._id] !== undefined) || renderingMesh.hasThinInstances);\n\n const fillMode = sm.getMaterial()?.fillMode ?? Constants.MATERIAL_TriangleFillMode;\n engine.enableEffect(drawWrapper);\n renderingMesh._bind(sm, effect, fillMode);\n gsVoxelMaterial._preBind(drawWrapper);\n gsVoxelMaterial.bind(effectiveMesh.getWorldMatrix(), effectiveMesh, effect);\n // If rotation/scale textures are missing, bind() logged the warning; skip the draw to avoid GPU errors.\n if (!(effectiveMesh as GaussianSplattingMesh).rotationsATexture) {\n gsVoxelMaterial.unbind();\n return;\n }\n if (engine.isWebGPU) {\n // A GSplat is a 3D Gaussian ellipsoid. To approximate its volume in the voxel grid\n // we rasterize three planar cross-section quads — one per principal axis — each\n // spanning the ellipsoid cross-section perpendicular to that axis. A quad rendered\n // edge-on produces zero fragments, so we draw once per world axis: each draw lets\n // computeVoxelSplatWorldPos pick the quad whose normal best aligns with that view,\n // guaranteeing every splat is captured face-on from at least one direction.\n const viewMatrices = _IblShadowsVoxelRenderer._VOXEL_VIEW_MATRICES;\n for (let axisIdx = 0; axisIdx < 3; axisIdx++) {\n effect.setMatrix(\"viewMatrix\", viewMatrices[axisIdx]);\n renderingMesh._processRendering(effectiveMesh, sm, effect, fillMode, batch, hardwareInstancedRendering, (_isInstance, world) => {\n effect.setMatrix(\"world\", world);\n });\n }\n } else {\n renderingMesh._processRendering(effectiveMesh, sm, effect, fillMode, batch, hardwareInstancedRendering, (_isInstance, world) => effect.setMatrix(\"world\", world));\n }\n gsVoxelMaterial.unbind();\n };\n\n const processBucket = (subMeshes: SmartArray<SubMesh>, enableAlphaMode: boolean): void => {\n for (let i = 0; i < subMeshes.length; i++) {\n const sm = subMeshes.data[i];\n const effective = sm.getEffectiveMesh();\n if (effective.getClassName() === \"GaussianSplattingMesh\") {\n renderGsSplat(sm);\n } else {\n sm.render(enableAlphaMode);\n }\n }\n };\n\n rtt.customRenderFunction = (\n opaqueSubMeshes: SmartArray<SubMesh>,\n alphaTestSubMeshes: SmartArray<SubMesh>,\n transparentSubMeshes: SmartArray<SubMesh>,\n depthOnlySubMeshes: SmartArray<SubMesh>\n ): void => {\n if (depthOnlySubMeshes.length) {\n engine.setColorWrite(false);\n processBucket(depthOnlySubMeshes, false);\n engine.setColorWrite(true);\n }\n processBucket(opaqueSubMeshes, false);\n processBucket(alphaTestSubMeshes, false);\n processBucket(transparentSubMeshes, true);\n };\n }\n\n private _addGsMeshToVoxelRT(mrt: RenderTargetTexture, mesh: GaussianSplattingMesh): void {\n let gsVoxelMaterial = this._gsVoxelMaterialCache.get(mesh.uniqueId);\n if (!gsVoxelMaterial) {\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\n if (!gsMaterial) {\n return;\n }\n const shaderLanguage = this._engine.isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL;\n gsVoxelMaterial = gsMaterial.makeVoxelRenderingMaterial(this._scene, shaderLanguage, this._maxDrawBuffers, mesh.isCompound);\n this._gsVoxelMaterialCache.set(mesh.uniqueId, gsVoxelMaterial);\n }\n mrt.renderList?.push(mesh as Mesh);\n mrt.setMaterialForRendering(mesh as Mesh, gsVoxelMaterial);\n }\n\n private _addRTsForRender(mrts: RenderTargetTexture[], includedMeshes: Mesh[], axis: number) {\n const slabSize = 1.0 / this._computeNumberOfSlabs();\n const voxelMaterial = this._voxelMaterial;\n\n // We need to update the world scale uniform for every mesh being rendered to the voxel grid.\n for (let mrtIndex = 0; mrtIndex < mrts.length; mrtIndex++) {\n const mrt = mrts[mrtIndex];\n mrt._disableEngineStages = true;\n mrt.useCameraPostProcesses = false;\n mrt.renderParticles = false;\n mrt.renderSprites = false;\n mrt.enableOutlineRendering = false;\n\n mrt.customRenderFunction = (opaqueSubMeshes, alphaTestSubMeshes, transparentSubMeshes, depthOnlySubMeshes) => {\n const buckets = [depthOnlySubMeshes, opaqueSubMeshes, alphaTestSubMeshes, transparentSubMeshes];\n for (const bucket of buckets) {\n for (let index = 0; index < bucket.length; index++) {\n const subMesh = bucket.data[index];\n if (subMesh.getMaterial() !== voxelMaterial) {\n continue;\n }\n subMesh.render(false);\n }\n }\n };\n\n mrt.renderList = [];\n const nearPlane = mrtIndex * slabSize;\n const farPlane = (mrtIndex + 1) * slabSize;\n const stepSize = slabSize / this._maxDrawBuffers;\n\n const viewMatrix = _IblShadowsVoxelRenderer._VOXEL_VIEW_MATRICES[axis];\n mrt.onBeforeRenderObservable.clear();\n mrt.onBeforeRenderObservable.add(() => {\n voxelMaterial.setMatrix(\"viewMatrix\", viewMatrix);\n voxelMaterial.setMatrix(\"invWorldScale\", this._invWorldScaleMatrix);\n voxelMaterial.setFloat(\"nearPlane\", nearPlane);\n voxelMaterial.setFloat(\"farPlane\", farPlane);\n voxelMaterial.setFloat(\"stepSize\", stepSize);\n if (this._engine.isWebGPU) {\n this._voxelMaterial.useVertexPulling = true;\n this._voxelMaterial.setTexture(\"voxel_storage\", this.getVoxelGrid());\n }\n // Push per-slab uniforms to each GS voxel material in this MRT's render list.\n for (const m of mrt.renderList ?? []) {\n if (m.getClassName() === \"GaussianSplattingMesh\") {\n const gsVoxelMat = this._gsVoxelMaterialCache.get(m.uniqueId);\n if (gsVoxelMat) {\n gsVoxelMat.setMatrix(\"invWorldScale\", this._invWorldScaleMatrix);\n if (this._engine.isWebGPU) {\n // WGSL GS voxel shader uses the same viewMatrix approach as WebGL; the per-axis viewMatrix is set per-draw in renderGsSplat.\n gsVoxelMat.setTexture(\"voxel_storage\", this.getVoxelGrid());\n } else {\n gsVoxelMat.setMatrix(\"viewMatrix\", viewMatrix);\n gsVoxelMat.setFloat(\"nearPlane\", nearPlane);\n gsVoxelMat.setFloat(\"farPlane\", farPlane);\n gsVoxelMat.setFloat(\"stepSize\", stepSize);\n }\n }\n }\n }\n });\n\n // Set this material on every mesh in the scene (for this RT)\n if (includedMeshes.length === 0) {\n return;\n }\n for (const mesh of includedMeshes) {\n if (!mesh) {\n continue;\n }\n if (mesh.getClassName() === \"GaussianSplattingMesh\") {\n this._addGsMeshToVoxelRT(mrt, mesh as GaussianSplattingMesh);\n } else if (mesh.subMeshes && mesh.subMeshes.length > 0) {\n mrt.renderList?.push(mesh);\n mrt.setMaterialForRendering(mesh, voxelMaterial);\n }\n const meshes = mesh.getChildMeshes();\n for (const childMesh of meshes) {\n if (childMesh.getClassName() === \"GaussianSplattingMesh\") {\n this._addGsMeshToVoxelRT(mrt, childMesh as GaussianSplattingMesh);\n } else if (childMesh.subMeshes && childMesh.subMeshes.length > 0) {\n mrt.renderList?.push(childMesh);\n mrt.setMaterialForRendering(childMesh, voxelMaterial);\n }\n }\n }\n\n this._installVoxelMixedCustomRender(mrt);\n }\n\n this._renderTargets = this._renderTargets.concat(mrts);\n }\n\n /**\n * Called by the pipeline to resize resources.\n */\n public resize() {}\n\n /**\n * Disposes the voxel renderer and associated resources\n */\n public dispose() {\n this._disposeVoxelTextures();\n for (const mat of Array.from(this._gsVoxelMaterialCache.values())) {\n mat.dispose();\n }\n this._gsVoxelMaterialCache.clear();\n }\n}\n"]}
@@ -258,6 +258,8 @@ export declare class ObjectRenderer {
258
258
  /**
259
259
  * Indicates if the renderer should render the current frame.
260
260
  * The output is based on the specified refresh rate.
261
+ * When snapshot rendering is active, this always returns true to ensure render pass
262
+ * topology stays consistent between the recording frame and playback frames.
261
263
  * @returns true if the renderer should render the current frame
262
264
  */
263
265
  shouldRender(): boolean;
@@ -389,9 +389,19 @@ export class ObjectRenderer {
389
389
  /**
390
390
  * Indicates if the renderer should render the current frame.
391
391
  * The output is based on the specified refresh rate.
392
+ * When snapshot rendering is active, this always returns true to ensure render pass
393
+ * topology stays consistent between the recording frame and playback frames.
392
394
  * @returns true if the renderer should render the current frame
393
395
  */
394
396
  shouldRender() {
397
+ if (this._engine.snapshotRendering) {
398
+ // When snapshot rendering is active (recording or playing), we must always render
399
+ // to ensure the number of render passes stays consistent between the recording frame
400
+ // and all playback frames. If a render target is skipped during recording but not
401
+ // during playback (or vice versa), the recorded bundle list indices become misaligned,
402
+ // causing visual artifacts such as flickering.
403
+ return true;
404
+ }
395
405
  if (this._currentRefreshId === -1) {
396
406
  // At least render once
397
407
  this._currentRefreshId = 1;