@babylonjs/core 8.32.1 → 8.32.3

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 (163) hide show
  1. package/Engines/abstractEngine.js +2 -2
  2. package/Engines/abstractEngine.js.map +1 -1
  3. package/FrameGraph/Node/Blocks/Layers/glowLayerBlock.d.ts +1 -0
  4. package/FrameGraph/Node/Blocks/Layers/glowLayerBlock.js +1 -1
  5. package/FrameGraph/Node/Blocks/Layers/glowLayerBlock.js.map +1 -1
  6. package/FrameGraph/Node/Blocks/Layers/highlightLayerBlock.d.ts +1 -0
  7. package/FrameGraph/Node/Blocks/Layers/highlightLayerBlock.js.map +1 -1
  8. package/FrameGraph/Node/Blocks/PostProcesses/bloomPostProcessBlock.d.ts +1 -0
  9. package/FrameGraph/Node/Blocks/PostProcesses/bloomPostProcessBlock.js.map +1 -1
  10. package/FrameGraph/Node/Blocks/PostProcesses/convolutionPostProcessBlock.d.ts +1 -0
  11. package/FrameGraph/Node/Blocks/PostProcesses/convolutionPostProcessBlock.js.map +1 -1
  12. package/FrameGraph/Node/Blocks/PostProcesses/ssao2PostProcessBlock.d.ts +94 -0
  13. package/FrameGraph/Node/Blocks/PostProcesses/ssao2PostProcessBlock.js +312 -0
  14. package/FrameGraph/Node/Blocks/PostProcesses/ssao2PostProcessBlock.js.map +1 -0
  15. package/FrameGraph/Node/Blocks/PostProcesses/ssrPostProcessBlock.d.ts +1 -0
  16. package/FrameGraph/Node/Blocks/PostProcesses/ssrPostProcessBlock.js.map +1 -1
  17. package/FrameGraph/Node/Blocks/PostProcesses/taaPostProcessBlock.d.ts +55 -0
  18. package/FrameGraph/Node/Blocks/PostProcesses/taaPostProcessBlock.js +147 -0
  19. package/FrameGraph/Node/Blocks/PostProcesses/taaPostProcessBlock.js.map +1 -0
  20. package/FrameGraph/Node/Blocks/PostProcesses/tonemapPostProcessBlock.d.ts +1 -0
  21. package/FrameGraph/Node/Blocks/PostProcesses/tonemapPostProcessBlock.js.map +1 -1
  22. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.d.ts +1 -0
  23. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  24. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.d.ts +1 -0
  25. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js +1 -1
  26. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js.map +1 -1
  27. package/FrameGraph/Node/Blocks/index.d.ts +2 -1
  28. package/FrameGraph/Node/Blocks/index.js +2 -1
  29. package/FrameGraph/Node/Blocks/index.js.map +1 -1
  30. package/FrameGraph/Node/nodeRenderGraph.js +1 -1
  31. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  32. package/FrameGraph/Tasks/Layers/baseLayerTask.js +1 -7
  33. package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
  34. package/FrameGraph/Tasks/PostProcesses/bloomTask.js +0 -6
  35. package/FrameGraph/Tasks/PostProcesses/bloomTask.js.map +1 -1
  36. package/FrameGraph/Tasks/PostProcesses/circleOfConfusionTask.js +3 -4
  37. package/FrameGraph/Tasks/PostProcesses/circleOfConfusionTask.js.map +1 -1
  38. package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js +3 -4
  39. package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js.map +1 -1
  40. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js +3 -4
  41. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js.map +1 -1
  42. package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js +0 -8
  43. package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js.map +1 -1
  44. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js +4 -11
  45. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js.map +1 -1
  46. package/FrameGraph/Tasks/PostProcesses/ssao2BlurTask.d.ts +13 -0
  47. package/FrameGraph/Tasks/PostProcesses/ssao2BlurTask.js +25 -0
  48. package/FrameGraph/Tasks/PostProcesses/ssao2BlurTask.js.map +1 -0
  49. package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.d.ts +76 -0
  50. package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js +147 -0
  51. package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js.map +1 -0
  52. package/FrameGraph/Tasks/PostProcesses/ssao2Task.d.ts +14 -0
  53. package/FrameGraph/Tasks/PostProcesses/ssao2Task.js +29 -0
  54. package/FrameGraph/Tasks/PostProcesses/ssao2Task.js.map +1 -0
  55. package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js +2 -11
  56. package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js.map +1 -1
  57. package/FrameGraph/Tasks/PostProcesses/ssrTask.js +8 -9
  58. package/FrameGraph/Tasks/PostProcesses/ssrTask.js.map +1 -1
  59. package/FrameGraph/Tasks/PostProcesses/taaTask.d.ts +29 -0
  60. package/FrameGraph/Tasks/PostProcesses/taaTask.js +102 -0
  61. package/FrameGraph/Tasks/PostProcesses/taaTask.js.map +1 -0
  62. package/FrameGraph/frameGraphTextureManager.d.ts +9 -0
  63. package/FrameGraph/frameGraphTextureManager.js +15 -0
  64. package/FrameGraph/frameGraphTextureManager.js.map +1 -1
  65. package/FrameGraph/index.d.ts +2 -1
  66. package/FrameGraph/index.js +2 -1
  67. package/FrameGraph/index.js.map +1 -1
  68. package/Lights/Clustered/clusteredLightContainer.js +4 -3
  69. package/Lights/Clustered/clusteredLightContainer.js.map +1 -1
  70. package/Lights/pointLight.js +6 -4
  71. package/Lights/pointLight.js.map +1 -1
  72. package/Lights/rectAreaLight.js +6 -4
  73. package/Lights/rectAreaLight.js.map +1 -1
  74. package/Lights/spotLight.js +3 -2
  75. package/Lights/spotLight.js.map +1 -1
  76. package/Materials/Background/backgroundMaterial.js +1 -1
  77. package/Materials/Background/backgroundMaterial.js.map +1 -1
  78. package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +11 -0
  79. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +74 -27
  80. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  81. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.d.ts +4 -0
  82. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +6 -0
  83. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  84. package/Materials/Node/nodeMaterial.js +1 -1
  85. package/Materials/Node/nodeMaterial.js.map +1 -1
  86. package/Materials/PBR/openPbrMaterial.js +1 -1
  87. package/Materials/PBR/openPbrMaterial.js.map +1 -1
  88. package/Materials/PBR/pbrBaseMaterial.js +1 -1
  89. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  90. package/Materials/material.d.ts +7 -3
  91. package/Materials/material.js +11 -7
  92. package/Materials/material.js.map +1 -1
  93. package/Materials/standardMaterial.js +1 -1
  94. package/Materials/standardMaterial.js.map +1 -1
  95. package/Maths/math.vector.d.ts +1 -1
  96. package/Maths/math.vector.js +1 -1
  97. package/Maths/math.vector.js.map +1 -1
  98. package/Meshes/Node/nodeGeometry.js +1 -1
  99. package/Meshes/Node/nodeGeometry.js.map +1 -1
  100. package/Meshes/mesh.js +9 -0
  101. package/Meshes/mesh.js.map +1 -1
  102. package/Morph/morphTargetManager.d.ts +2 -0
  103. package/Morph/morphTargetManager.js +19 -1
  104. package/Morph/morphTargetManager.js.map +1 -1
  105. package/Particles/Node/nodeParticleSystemSet.d.ts +14 -6
  106. package/Particles/Node/nodeParticleSystemSet.js +38 -7
  107. package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
  108. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.d.ts +21 -30
  109. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +163 -256
  110. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
  111. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.d.ts +1 -3
  112. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
  113. package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.js +1 -1
  114. package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.js.map +1 -1
  115. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.d.ts +0 -1
  116. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js +4 -22
  117. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js.map +1 -1
  118. package/PostProcesses/RenderPipeline/Pipelines/thinSSAO2RenderingPipeline.d.ts +130 -0
  119. package/PostProcesses/RenderPipeline/Pipelines/thinSSAO2RenderingPipeline.js +193 -0
  120. package/PostProcesses/RenderPipeline/Pipelines/thinSSAO2RenderingPipeline.js.map +1 -0
  121. package/PostProcesses/thinSSAO2BlurPostProcess.d.ts +26 -0
  122. package/PostProcesses/thinSSAO2BlurPostProcess.js +81 -0
  123. package/PostProcesses/thinSSAO2BlurPostProcess.js.map +1 -0
  124. package/PostProcesses/thinSSAO2CombinePostProcess.d.ts +15 -0
  125. package/PostProcesses/thinSSAO2CombinePostProcess.js +48 -0
  126. package/PostProcesses/thinSSAO2CombinePostProcess.js.map +1 -0
  127. package/PostProcesses/thinSSAO2PostProcess.d.ts +45 -0
  128. package/PostProcesses/thinSSAO2PostProcess.js +208 -0
  129. package/PostProcesses/thinSSAO2PostProcess.js.map +1 -0
  130. package/PostProcesses/thinTAAPostProcess.d.ts +10 -5
  131. package/PostProcesses/thinTAAPostProcess.js +37 -7
  132. package/PostProcesses/thinTAAPostProcess.js.map +1 -1
  133. package/Rendering/boundingBoxRenderer.js +6 -1
  134. package/Rendering/boundingBoxRenderer.js.map +1 -1
  135. package/Rendering/edgesRenderer.js +4 -0
  136. package/Rendering/edgesRenderer.js.map +1 -1
  137. package/Shaders/ShadersInclude/gaussianSplatting.js +10 -2
  138. package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
  139. package/Shaders/ShadersInclude/shadowsFragmentFunctions.js +29 -4
  140. package/Shaders/ShadersInclude/shadowsFragmentFunctions.js.map +1 -1
  141. package/Shaders/gaussianSplattingDepth.fragment.d.ts +5 -0
  142. package/Shaders/gaussianSplattingDepth.fragment.js +11 -0
  143. package/Shaders/gaussianSplattingDepth.fragment.js.map +1 -0
  144. package/Shaders/gaussianSplattingDepth.vertex.d.ts +8 -0
  145. package/Shaders/gaussianSplattingDepth.vertex.js +17 -0
  146. package/Shaders/gaussianSplattingDepth.vertex.js.map +1 -0
  147. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +7 -1
  148. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
  149. package/ShadersWGSL/gaussianSplattingDepth.fragment.d.ts +6 -0
  150. package/ShadersWGSL/gaussianSplattingDepth.fragment.js +17 -0
  151. package/ShadersWGSL/gaussianSplattingDepth.fragment.js.map +1 -0
  152. package/ShadersWGSL/gaussianSplattingDepth.vertex.d.ts +8 -0
  153. package/ShadersWGSL/gaussianSplattingDepth.vertex.js +19 -0
  154. package/ShadersWGSL/gaussianSplattingDepth.vertex.js.map +1 -0
  155. package/package.json +1 -1
  156. package/scene.js +6 -5
  157. package/scene.js.map +1 -1
  158. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.d.ts +0 -48
  159. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.js +0 -119
  160. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.js.map +0 -1
  161. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.d.ts +0 -24
  162. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js +0 -109
  163. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js.map +0 -1
@@ -0,0 +1,81 @@
1
+ import { EffectWrapper } from "../Materials/effectRenderer.js";
2
+ import { Engine } from "../Engines/engine.js";
3
+ /**
4
+ * @internal
5
+ */
6
+ export class ThinSSAO2BlurPostProcess extends EffectWrapper {
7
+ _gatherImports(useWebGPU, list) {
8
+ if (useWebGPU) {
9
+ this._webGPUReady = true;
10
+ list.push(import("../ShadersWGSL/ssao2.fragment.js"));
11
+ }
12
+ else {
13
+ list.push(import("../Shaders/ssao2.fragment.js"));
14
+ }
15
+ }
16
+ constructor(name, engine = null, isHorizontal, options) {
17
+ super({
18
+ ...options,
19
+ name,
20
+ engine: engine || Engine.LastCreatedEngine,
21
+ useShaderStore: true,
22
+ useAsPostProcess: true,
23
+ fragmentShader: ThinSSAO2BlurPostProcess.FragmentUrl,
24
+ uniforms: ThinSSAO2BlurPostProcess.Uniforms,
25
+ samplers: ThinSSAO2BlurPostProcess.Samplers,
26
+ defines: "#define BLUR\n" + (isHorizontal ? "#define BLUR_H\n" : ""),
27
+ });
28
+ this._bypassBlur = false;
29
+ this.textureSize = 0;
30
+ this.bilateralSamples = 16;
31
+ this.bilateralSoften = 0;
32
+ this.bilateralTolerance = 0;
33
+ this._expensiveBlur = true;
34
+ this._isHorizontal = isHorizontal;
35
+ const defines = this._getDefinesForBlur(this.expensiveBlur, this.bypassBlur);
36
+ const samplers = this._getSamplersForBlur(this.bypassBlur);
37
+ this.updateEffect(defines, null, samplers);
38
+ }
39
+ set bypassBlur(b) {
40
+ const defines = this._getDefinesForBlur(this.expensiveBlur, b);
41
+ const samplers = this._getSamplersForBlur(b);
42
+ this.updateEffect(defines, null, samplers);
43
+ this._bypassBlur = b;
44
+ }
45
+ get bypassBlur() {
46
+ return this._bypassBlur;
47
+ }
48
+ set expensiveBlur(b) {
49
+ const defines = this._getDefinesForBlur(b, this._bypassBlur);
50
+ this.updateEffect(defines);
51
+ this._expensiveBlur = b;
52
+ }
53
+ get expensiveBlur() {
54
+ return this._expensiveBlur;
55
+ }
56
+ bind(noDefaultBindings = false) {
57
+ super.bind(noDefaultBindings);
58
+ const effect = this._drawWrapper.effect;
59
+ effect.setFloat("outSize", this.textureSize);
60
+ effect.setInt("samples", this.bilateralSamples);
61
+ effect.setFloat("soften", this.bilateralSoften);
62
+ effect.setFloat("tolerance", this.bilateralTolerance);
63
+ }
64
+ _getSamplersForBlur(disabled) {
65
+ return disabled ? ["textureSampler"] : ["textureSampler", "depthSampler"];
66
+ }
67
+ _getDefinesForBlur(bilateral, disabled) {
68
+ let define = "#define BLUR\n";
69
+ if (disabled) {
70
+ define += "#define BLUR_BYPASS\n";
71
+ }
72
+ if (!bilateral) {
73
+ define += "#define BLUR_LEGACY\n";
74
+ }
75
+ return this._isHorizontal ? define + "#define BLUR_H\n" : define;
76
+ }
77
+ }
78
+ ThinSSAO2BlurPostProcess.FragmentUrl = "ssao2";
79
+ ThinSSAO2BlurPostProcess.Uniforms = ["outSize", "samples", "soften", "tolerance"];
80
+ ThinSSAO2BlurPostProcess.Samplers = ["textureSampler", "depthSampler"];
81
+ //# sourceMappingURL=thinSSAO2BlurPostProcess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thinSSAO2BlurPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinSSAO2BlurPostProcess.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { Engine } from \"../Engines/engine\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class ThinSSAO2BlurPostProcess extends EffectWrapper {\r\n public static readonly FragmentUrl = \"ssao2\";\r\n\r\n public static readonly Uniforms = [\"outSize\", \"samples\", \"soften\", \"tolerance\"];\r\n\r\n public static readonly Samplers = [\"textureSampler\", \"depthSampler\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/ssao2.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/ssao2.fragment\"));\r\n }\r\n }\r\n\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, isHorizontal: boolean, options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || Engine.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinSSAO2BlurPostProcess.FragmentUrl,\r\n uniforms: ThinSSAO2BlurPostProcess.Uniforms,\r\n samplers: ThinSSAO2BlurPostProcess.Samplers,\r\n defines: \"#define BLUR\\n\" + (isHorizontal ? \"#define BLUR_H\\n\" : \"\"),\r\n });\r\n\r\n this._isHorizontal = isHorizontal;\r\n\r\n const defines = this._getDefinesForBlur(this.expensiveBlur, this.bypassBlur);\r\n const samplers = this._getSamplersForBlur(this.bypassBlur);\r\n\r\n this.updateEffect(defines, null, samplers);\r\n }\r\n\r\n private readonly _isHorizontal: boolean;\r\n private _bypassBlur: boolean = false;\r\n\r\n public textureSize: number = 0;\r\n\r\n public bilateralSamples: number = 16;\r\n\r\n public bilateralSoften: number = 0;\r\n\r\n public bilateralTolerance: number = 0;\r\n\r\n public set bypassBlur(b: boolean) {\r\n const defines = this._getDefinesForBlur(this.expensiveBlur, b);\r\n const samplers = this._getSamplersForBlur(b);\r\n\r\n this.updateEffect(defines, null, samplers);\r\n\r\n this._bypassBlur = b;\r\n }\r\n public get bypassBlur(): boolean {\r\n return this._bypassBlur;\r\n }\r\n\r\n private _expensiveBlur: boolean = true;\r\n\r\n public set expensiveBlur(b: boolean) {\r\n const defines = this._getDefinesForBlur(b, this._bypassBlur);\r\n\r\n this.updateEffect(defines);\r\n\r\n this._expensiveBlur = b;\r\n }\r\n public get expensiveBlur(): boolean {\r\n return this._expensiveBlur;\r\n }\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n\r\n const effect = this._drawWrapper.effect!;\r\n\r\n effect.setFloat(\"outSize\", this.textureSize);\r\n effect.setInt(\"samples\", this.bilateralSamples);\r\n effect.setFloat(\"soften\", this.bilateralSoften);\r\n effect.setFloat(\"tolerance\", this.bilateralTolerance);\r\n }\r\n\r\n private _getSamplersForBlur(disabled: boolean): Array<string> {\r\n return disabled ? [\"textureSampler\"] : [\"textureSampler\", \"depthSampler\"];\r\n }\r\n\r\n private _getDefinesForBlur(bilateral: boolean, disabled: boolean): string {\r\n let define = \"#define BLUR\\n\";\r\n if (disabled) {\r\n define += \"#define BLUR_BYPASS\\n\";\r\n }\r\n if (!bilateral) {\r\n define += \"#define BLUR_LEGACY\\n\";\r\n }\r\n return this._isHorizontal ? define + \"#define BLUR_H\\n\" : define;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,15 @@
1
+ import type { Nullable, AbstractEngine, EffectWrapperCreationOptions, Camera } from "../index.js";
2
+ import { EffectWrapper } from "../Materials/effectRenderer.js";
3
+ /**
4
+ * @internal
5
+ */
6
+ export declare class ThinSSAO2CombinePostProcess extends EffectWrapper {
7
+ static readonly FragmentUrl = "ssaoCombine";
8
+ static readonly Uniforms: string[];
9
+ static readonly Samplers: string[];
10
+ protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
11
+ constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
12
+ camera: Nullable<Camera>;
13
+ useViewportInCombineStage: boolean;
14
+ bind(noDefaultBindings?: boolean): void;
15
+ }
@@ -0,0 +1,48 @@
1
+ import { EffectWrapper } from "../Materials/effectRenderer.js";
2
+ import { Engine } from "../Engines/engine.js";
3
+ import { TmpVectors } from "../Maths/math.vector.js";
4
+ /**
5
+ * @internal
6
+ */
7
+ export class ThinSSAO2CombinePostProcess extends EffectWrapper {
8
+ _gatherImports(useWebGPU, list) {
9
+ if (useWebGPU) {
10
+ this._webGPUReady = true;
11
+ list.push(import("../ShadersWGSL/ssaoCombine.fragment.js"));
12
+ }
13
+ else {
14
+ list.push(import("../Shaders/ssaoCombine.fragment.js"));
15
+ }
16
+ }
17
+ constructor(name, engine = null, options) {
18
+ super({
19
+ ...options,
20
+ name,
21
+ engine: engine || Engine.LastCreatedEngine,
22
+ useShaderStore: true,
23
+ useAsPostProcess: true,
24
+ fragmentShader: ThinSSAO2CombinePostProcess.FragmentUrl,
25
+ uniforms: ThinSSAO2CombinePostProcess.Uniforms,
26
+ samplers: ThinSSAO2CombinePostProcess.Samplers,
27
+ });
28
+ this.camera = null;
29
+ this.useViewportInCombineStage = true;
30
+ }
31
+ bind(noDefaultBindings = false) {
32
+ super.bind(noDefaultBindings);
33
+ const effect = this._drawWrapper.effect;
34
+ if (this.camera) {
35
+ const viewport = this.camera.viewport;
36
+ if (this.useViewportInCombineStage) {
37
+ effect.setVector4("viewport", TmpVectors.Vector4[0].copyFromFloats(viewport.x, viewport.y, viewport.width, viewport.height));
38
+ }
39
+ else {
40
+ effect.setVector4("viewport", TmpVectors.Vector4[0].copyFromFloats(0, 0, 1, 1));
41
+ }
42
+ }
43
+ }
44
+ }
45
+ ThinSSAO2CombinePostProcess.FragmentUrl = "ssaoCombine";
46
+ ThinSSAO2CombinePostProcess.Uniforms = ["viewport"];
47
+ ThinSSAO2CombinePostProcess.Samplers = ["originalColor"];
48
+ //# sourceMappingURL=thinSSAO2CombinePostProcess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thinSSAO2CombinePostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinSSAO2CombinePostProcess.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,gCAA+B;AAEpD;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,aAAa;IAOvC,cAAc,CAAC,SAAkB,EAAE,IAAoB;QACtE,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC,CAAC;QACzD,CAAC;IACL,CAAC;IAED,YAAY,IAAY,EAAE,SAAmC,IAAI,EAAE,OAAsC;QACrG,KAAK,CAAC;YACF,GAAG,OAAO;YACV,IAAI;YACJ,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,iBAAkB;YAC3C,cAAc,EAAE,IAAI;YACpB,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,2BAA2B,CAAC,WAAW;YACvD,QAAQ,EAAE,2BAA2B,CAAC,QAAQ;YAC9C,QAAQ,EAAE,2BAA2B,CAAC,QAAQ;SACjD,CAAC,CAAC;QAGA,WAAM,GAAqB,IAAI,CAAC;QAEhC,8BAAyB,GAAG,IAAI,CAAC;IAJxC,CAAC;IAMe,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAC1C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAO,CAAC;QAEzC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACtC,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;gBACjC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YACjI,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACpF,CAAC;QACL,CAAC;IACL,CAAC;;AA7CsB,uCAAW,GAAG,aAAa,AAAhB,CAAiB;AAE5B,oCAAQ,GAAG,CAAC,UAAU,CAAC,AAAf,CAAgB;AAExB,oCAAQ,GAAG,CAAC,eAAe,CAAC,AAApB,CAAqB","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions, Camera } from \"core/index\";\r\nimport { EffectWrapper } from \"../Materials/effectRenderer\";\r\nimport { Engine } from \"../Engines/engine\";\r\nimport { TmpVectors } from \"core/Maths/math.vector\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class ThinSSAO2CombinePostProcess extends EffectWrapper {\r\n public static readonly FragmentUrl = \"ssaoCombine\";\r\n\r\n public static readonly Uniforms = [\"viewport\"];\r\n\r\n public static readonly Samplers = [\"originalColor\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/ssaoCombine.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/ssaoCombine.fragment\"));\r\n }\r\n }\r\n\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: engine || Engine.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinSSAO2CombinePostProcess.FragmentUrl,\r\n uniforms: ThinSSAO2CombinePostProcess.Uniforms,\r\n samplers: ThinSSAO2CombinePostProcess.Samplers,\r\n });\r\n }\r\n\r\n public camera: Nullable<Camera> = null;\r\n\r\n public useViewportInCombineStage = true;\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n\r\n const effect = this._drawWrapper.effect!;\r\n\r\n if (this.camera) {\r\n const viewport = this.camera.viewport;\r\n if (this.useViewportInCombineStage) {\r\n effect.setVector4(\"viewport\", TmpVectors.Vector4[0].copyFromFloats(viewport.x, viewport.y, viewport.width, viewport.height));\r\n } else {\r\n effect.setVector4(\"viewport\", TmpVectors.Vector4[0].copyFromFloats(0, 0, 1, 1));\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -0,0 +1,45 @@
1
+ import type { Nullable, Scene, EffectWrapperCreationOptions } from "../index.js";
2
+ import { EffectWrapper } from "../Materials/effectRenderer.js";
3
+ import { Camera } from "../Cameras/camera.js";
4
+ /**
5
+ * @internal
6
+ */
7
+ export declare class ThinSSAO2PostProcess extends EffectWrapper {
8
+ private static readonly ORTHO_DEPTH_PROJECTION;
9
+ private static readonly PERSPECTIVE_DEPTH_PROJECTION;
10
+ static readonly FragmentUrl = "ssao2";
11
+ static readonly Uniforms: string[];
12
+ static readonly Samplers: string[];
13
+ protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
14
+ camera: Nullable<Camera>;
15
+ private _textureWidth;
16
+ get textureWidth(): number;
17
+ set textureWidth(width: number);
18
+ private _textureHeight;
19
+ get textureHeight(): number;
20
+ set textureHeight(height: number);
21
+ private _samples;
22
+ set samples(n: number);
23
+ get samples(): number;
24
+ totalStrength: number;
25
+ radius: number;
26
+ maxZ: number;
27
+ minZAspect: number;
28
+ base: number;
29
+ private _epsilon;
30
+ set epsilon(n: number);
31
+ get epsilon(): number;
32
+ private _scene;
33
+ private _randomTexture;
34
+ private _sampleSphere;
35
+ constructor(name: string, scene: Scene, options?: EffectWrapperCreationOptions);
36
+ bind(noDefaultBindings?: boolean): void;
37
+ dispose(): void;
38
+ private _createRandomTexture;
39
+ private _bits;
40
+ private _radicalInverseVdC;
41
+ private _hammersley;
42
+ private _hemisphereSampleUniform;
43
+ private _generateHemisphere;
44
+ private _getDefinesForSSAO;
45
+ }
@@ -0,0 +1,208 @@
1
+
2
+ import { EffectWrapper } from "../Materials/effectRenderer.js";
3
+ import { Vector2, Vector3 } from "../Maths/math.vector.js";
4
+ import { Camera } from "../Cameras/camera.js";
5
+ import { RawTexture } from "../Materials/Textures/rawTexture.js";
6
+ import { RandomRange } from "../Maths/math.scalar.functions.js";
7
+ import { Texture } from "../Materials/Textures/texture.js";
8
+ /**
9
+ * @internal
10
+ */
11
+ export class ThinSSAO2PostProcess extends EffectWrapper {
12
+ _gatherImports(useWebGPU, list) {
13
+ if (useWebGPU) {
14
+ this._webGPUReady = true;
15
+ list.push(import("../ShadersWGSL/ssao2.fragment.js"));
16
+ }
17
+ else {
18
+ list.push(import("../Shaders/ssao2.fragment.js"));
19
+ }
20
+ }
21
+ get textureWidth() {
22
+ return this._textureWidth;
23
+ }
24
+ set textureWidth(width) {
25
+ if (this._textureWidth === width) {
26
+ return;
27
+ }
28
+ this._textureWidth = width;
29
+ }
30
+ get textureHeight() {
31
+ return this._textureHeight;
32
+ }
33
+ set textureHeight(height) {
34
+ if (this._textureHeight === height) {
35
+ return;
36
+ }
37
+ this._textureHeight = height;
38
+ }
39
+ set samples(n) {
40
+ this._samples = n;
41
+ this.updateEffect(this._getDefinesForSSAO());
42
+ this._sampleSphere = this._generateHemisphere();
43
+ }
44
+ get samples() {
45
+ return this._samples;
46
+ }
47
+ set epsilon(n) {
48
+ this._epsilon = n;
49
+ this.updateEffect(this._getDefinesForSSAO());
50
+ }
51
+ get epsilon() {
52
+ return this._epsilon;
53
+ }
54
+ constructor(name, scene, options) {
55
+ super({
56
+ ...options,
57
+ name,
58
+ engine: scene.getEngine(),
59
+ useShaderStore: true,
60
+ useAsPostProcess: true,
61
+ fragmentShader: ThinSSAO2PostProcess.FragmentUrl,
62
+ uniforms: ThinSSAO2PostProcess.Uniforms,
63
+ samplers: ThinSSAO2PostProcess.Samplers,
64
+ defines: `#define SSAO\n#define SAMPLES 8\n#define EPSILON 0.0001`,
65
+ shaderLanguage: scene.getEngine().isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */,
66
+ });
67
+ this.camera = null;
68
+ this._textureWidth = 0;
69
+ this._textureHeight = 0;
70
+ this._samples = 8;
71
+ this.totalStrength = 1.0;
72
+ this.radius = 2.0;
73
+ this.maxZ = 100.0;
74
+ this.minZAspect = 0.2;
75
+ this.base = 0;
76
+ this._epsilon = 0.02;
77
+ this._bits = new Uint32Array(1);
78
+ this._scene = scene;
79
+ this._createRandomTexture();
80
+ this.updateEffect(this._getDefinesForSSAO());
81
+ this._sampleSphere = this._generateHemisphere();
82
+ }
83
+ bind(noDefaultBindings = false) {
84
+ super.bind(noDefaultBindings);
85
+ const effect = this._drawWrapper.effect;
86
+ const camera = this.camera;
87
+ if (!camera) {
88
+ return;
89
+ }
90
+ const projectionMatrix = camera.getProjectionMatrix();
91
+ effect.setArray3("sampleSphere", this._sampleSphere);
92
+ effect.setFloat("randTextureTiles", 32.0);
93
+ effect.setFloat("samplesFactor", 1 / this.samples);
94
+ effect.setFloat("totalStrength", this.totalStrength);
95
+ effect.setFloat2("texelSize", 1 / this.textureWidth, 1 / this.textureHeight);
96
+ effect.setFloat("radius", this.radius);
97
+ effect.setFloat("maxZ", this.maxZ);
98
+ effect.setFloat("minZAspect", this.minZAspect);
99
+ effect.setFloat("base", this.base);
100
+ effect.setFloat("near", camera.minZ);
101
+ if (camera.mode === Camera.PERSPECTIVE_CAMERA) {
102
+ effect.setMatrix3x3("depthProjection", ThinSSAO2PostProcess.PERSPECTIVE_DEPTH_PROJECTION);
103
+ effect.setFloat("xViewport", Math.tan(camera.fov / 2) * this._scene.getEngine().getAspectRatio(camera, true));
104
+ effect.setFloat("yViewport", Math.tan(camera.fov / 2));
105
+ }
106
+ else {
107
+ const halfWidth = this._scene.getEngine().getRenderWidth() / 2.0;
108
+ const halfHeight = this._scene.getEngine().getRenderHeight() / 2.0;
109
+ const orthoLeft = camera.orthoLeft ?? -halfWidth;
110
+ const orthoRight = camera.orthoRight ?? halfWidth;
111
+ const orthoBottom = camera.orthoBottom ?? -halfHeight;
112
+ const orthoTop = camera.orthoTop ?? halfHeight;
113
+ effect.setMatrix3x3("depthProjection", ThinSSAO2PostProcess.ORTHO_DEPTH_PROJECTION);
114
+ effect.setFloat4("viewport", orthoLeft, orthoRight, orthoBottom, orthoTop);
115
+ }
116
+ effect.setMatrix("projection", projectionMatrix);
117
+ effect.setTexture("randomSampler", this._randomTexture);
118
+ }
119
+ dispose() {
120
+ this._randomTexture.dispose();
121
+ super.dispose();
122
+ }
123
+ _createRandomTexture() {
124
+ const size = 128;
125
+ const data = new Uint8Array(size * size * 4);
126
+ const randVector = Vector2.Zero();
127
+ for (let index = 0; index < data.length;) {
128
+ randVector.set(RandomRange(0, 1), RandomRange(0, 1)).normalize().scaleInPlace(255);
129
+ data[index++] = Math.floor(randVector.x);
130
+ data[index++] = Math.floor(randVector.y);
131
+ data[index++] = 0;
132
+ data[index++] = 255;
133
+ }
134
+ const texture = RawTexture.CreateRGBATexture(data, size, size, this._scene, false, false, 2);
135
+ texture.name = "SSAORandomTexture";
136
+ texture.wrapU = Texture.WRAP_ADDRESSMODE;
137
+ texture.wrapV = Texture.WRAP_ADDRESSMODE;
138
+ this._randomTexture = texture;
139
+ }
140
+ //Van der Corput radical inverse
141
+ _radicalInverseVdC(i) {
142
+ this._bits[0] = i;
143
+ this._bits[0] = ((this._bits[0] << 16) | (this._bits[0] >> 16)) >>> 0;
144
+ this._bits[0] = ((this._bits[0] & 0x55555555) << 1) | (((this._bits[0] & 0xaaaaaaaa) >>> 1) >>> 0);
145
+ this._bits[0] = ((this._bits[0] & 0x33333333) << 2) | (((this._bits[0] & 0xcccccccc) >>> 2) >>> 0);
146
+ this._bits[0] = ((this._bits[0] & 0x0f0f0f0f) << 4) | (((this._bits[0] & 0xf0f0f0f0) >>> 4) >>> 0);
147
+ this._bits[0] = ((this._bits[0] & 0x00ff00ff) << 8) | (((this._bits[0] & 0xff00ff00) >>> 8) >>> 0);
148
+ return this._bits[0] * 2.3283064365386963e-10; // / 0x100000000 or / 4294967296
149
+ }
150
+ _hammersley(i, n) {
151
+ return [i / n, this._radicalInverseVdC(i)];
152
+ }
153
+ _hemisphereSampleUniform(u, v) {
154
+ const phi = v * 2.0 * Math.PI;
155
+ // rejecting samples that are close to tangent plane to avoid z-fighting artifacts
156
+ const cosTheta = 1.0 - u * 0.85;
157
+ const sinTheta = Math.sqrt(1.0 - cosTheta * cosTheta);
158
+ return new Vector3(Math.cos(phi) * sinTheta, Math.sin(phi) * sinTheta, cosTheta);
159
+ }
160
+ _generateHemisphere() {
161
+ const numSamples = this.samples;
162
+ const result = [];
163
+ let vector;
164
+ let i = 0;
165
+ while (i < numSamples) {
166
+ if (numSamples < 16) {
167
+ vector = this._hemisphereSampleUniform(Math.random(), Math.random());
168
+ }
169
+ else {
170
+ const rand = this._hammersley(i, numSamples);
171
+ vector = this._hemisphereSampleUniform(rand[0], rand[1]);
172
+ }
173
+ result.push(vector.x, vector.y, vector.z);
174
+ i++;
175
+ }
176
+ return result;
177
+ }
178
+ _getDefinesForSSAO() {
179
+ let defines = `#define SSAO\n#define SAMPLES ${this.samples}\n#define EPSILON ${this.epsilon.toFixed(4)}`;
180
+ if (this.camera?.mode === Camera.ORTHOGRAPHIC_CAMERA) {
181
+ defines += `\n#define ORTHOGRAPHIC_CAMERA`;
182
+ }
183
+ return defines;
184
+ }
185
+ }
186
+ ThinSSAO2PostProcess.ORTHO_DEPTH_PROJECTION = [1, 0, 0, 0, 1, 0, 0, 0, 1];
187
+ ThinSSAO2PostProcess.PERSPECTIVE_DEPTH_PROJECTION = [0, 0, 0, 0, 0, 0, 1, 1, 1];
188
+ ThinSSAO2PostProcess.FragmentUrl = "ssao2";
189
+ ThinSSAO2PostProcess.Uniforms = [
190
+ "sampleSphere",
191
+ "samplesFactor",
192
+ "randTextureTiles",
193
+ "totalStrength",
194
+ "radius",
195
+ "base",
196
+ "range",
197
+ "projection",
198
+ "near",
199
+ "texelSize",
200
+ "xViewport",
201
+ "yViewport",
202
+ "viewport",
203
+ "maxZ",
204
+ "minZAspect",
205
+ "depthProjection",
206
+ ];
207
+ ThinSSAO2PostProcess.Samplers = ["randomSampler", "depthSampler", "normalSampler"];
208
+ //# sourceMappingURL=thinSSAO2PostProcess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thinSSAO2PostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinSSAO2PostProcess.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, Scene, EffectWrapperCreationOptions } from \"core/index\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { Vector2, Vector3 } from \"core/Maths/math.vector\";\r\nimport { Camera } from \"core/Cameras/camera\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\nimport { RandomRange } from \"core/Maths/math.scalar.functions\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class ThinSSAO2PostProcess extends EffectWrapper {\r\n private static readonly ORTHO_DEPTH_PROJECTION = [1, 0, 0, 0, 1, 0, 0, 0, 1];\r\n\r\n private static readonly PERSPECTIVE_DEPTH_PROJECTION = [0, 0, 0, 0, 0, 0, 1, 1, 1];\r\n\r\n public static readonly FragmentUrl = \"ssao2\";\r\n\r\n public static readonly Uniforms = [\r\n \"sampleSphere\",\r\n \"samplesFactor\",\r\n \"randTextureTiles\",\r\n \"totalStrength\",\r\n \"radius\",\r\n \"base\",\r\n \"range\",\r\n \"projection\",\r\n \"near\",\r\n \"texelSize\",\r\n \"xViewport\",\r\n \"yViewport\",\r\n \"viewport\",\r\n \"maxZ\",\r\n \"minZAspect\",\r\n \"depthProjection\",\r\n ];\r\n\r\n public static readonly Samplers = [\"randomSampler\", \"depthSampler\", \"normalSampler\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/ssao2.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/ssao2.fragment\"));\r\n }\r\n }\r\n\r\n public camera: Nullable<Camera> = null;\r\n\r\n private _textureWidth = 0;\r\n\r\n public get textureWidth() {\r\n return this._textureWidth;\r\n }\r\n\r\n public set textureWidth(width: number) {\r\n if (this._textureWidth === width) {\r\n return;\r\n }\r\n this._textureWidth = width;\r\n }\r\n\r\n private _textureHeight = 0;\r\n\r\n public get textureHeight() {\r\n return this._textureHeight;\r\n }\r\n\r\n public set textureHeight(height: number) {\r\n if (this._textureHeight === height) {\r\n return;\r\n }\r\n this._textureHeight = height;\r\n }\r\n\r\n private _samples: number = 8;\r\n\r\n public set samples(n: number) {\r\n this._samples = n;\r\n this.updateEffect(this._getDefinesForSSAO());\r\n this._sampleSphere = this._generateHemisphere();\r\n }\r\n public get samples(): number {\r\n return this._samples;\r\n }\r\n\r\n public totalStrength: number = 1.0;\r\n\r\n public radius: number = 2.0;\r\n\r\n public maxZ: number = 100.0;\r\n\r\n public minZAspect: number = 0.2;\r\n\r\n public base: number = 0;\r\n\r\n private _epsilon: number = 0.02;\r\n\r\n public set epsilon(n: number) {\r\n this._epsilon = n;\r\n this.updateEffect(this._getDefinesForSSAO());\r\n }\r\n public get epsilon(): number {\r\n return this._epsilon;\r\n }\r\n\r\n private _scene: Scene;\r\n private _randomTexture: Texture;\r\n private _sampleSphere: number[];\r\n\r\n constructor(name: string, scene: Scene, options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: scene.getEngine(),\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinSSAO2PostProcess.FragmentUrl,\r\n uniforms: ThinSSAO2PostProcess.Uniforms,\r\n samplers: ThinSSAO2PostProcess.Samplers,\r\n defines: `#define SSAO\\n#define SAMPLES 8\\n#define EPSILON 0.0001`,\r\n shaderLanguage: scene.getEngine().isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n });\r\n\r\n this._scene = scene;\r\n\r\n this._createRandomTexture();\r\n\r\n this.updateEffect(this._getDefinesForSSAO());\r\n this._sampleSphere = this._generateHemisphere();\r\n }\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n\r\n const effect = this._drawWrapper.effect!;\r\n\r\n const camera = this.camera;\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n const projectionMatrix = camera.getProjectionMatrix();\r\n\r\n effect.setArray3(\"sampleSphere\", this._sampleSphere);\r\n effect.setFloat(\"randTextureTiles\", 32.0);\r\n effect.setFloat(\"samplesFactor\", 1 / this.samples);\r\n effect.setFloat(\"totalStrength\", this.totalStrength);\r\n effect.setFloat2(\"texelSize\", 1 / this.textureWidth, 1 / this.textureHeight);\r\n effect.setFloat(\"radius\", this.radius);\r\n effect.setFloat(\"maxZ\", this.maxZ);\r\n effect.setFloat(\"minZAspect\", this.minZAspect);\r\n effect.setFloat(\"base\", this.base);\r\n effect.setFloat(\"near\", camera.minZ);\r\n if (camera.mode === Camera.PERSPECTIVE_CAMERA) {\r\n effect.setMatrix3x3(\"depthProjection\", ThinSSAO2PostProcess.PERSPECTIVE_DEPTH_PROJECTION);\r\n effect.setFloat(\"xViewport\", Math.tan(camera.fov / 2) * this._scene.getEngine().getAspectRatio(camera, true));\r\n effect.setFloat(\"yViewport\", Math.tan(camera.fov / 2));\r\n } else {\r\n const halfWidth = this._scene.getEngine().getRenderWidth() / 2.0;\r\n const halfHeight = this._scene.getEngine().getRenderHeight() / 2.0;\r\n const orthoLeft = camera.orthoLeft ?? -halfWidth;\r\n const orthoRight = camera.orthoRight ?? halfWidth;\r\n const orthoBottom = camera.orthoBottom ?? -halfHeight;\r\n const orthoTop = camera.orthoTop ?? halfHeight;\r\n effect.setMatrix3x3(\"depthProjection\", ThinSSAO2PostProcess.ORTHO_DEPTH_PROJECTION);\r\n effect.setFloat4(\"viewport\", orthoLeft, orthoRight, orthoBottom, orthoTop);\r\n }\r\n effect.setMatrix(\"projection\", projectionMatrix);\r\n\r\n effect.setTexture(\"randomSampler\", this._randomTexture);\r\n }\r\n\r\n public override dispose() {\r\n this._randomTexture.dispose();\r\n\r\n super.dispose();\r\n }\r\n\r\n private _createRandomTexture(): void {\r\n const size = 128;\r\n\r\n const data = new Uint8Array(size * size * 4);\r\n const randVector = Vector2.Zero();\r\n for (let index = 0; index < data.length; ) {\r\n randVector.set(RandomRange(0, 1), RandomRange(0, 1)).normalize().scaleInPlace(255);\r\n data[index++] = Math.floor(randVector.x);\r\n data[index++] = Math.floor(randVector.y);\r\n data[index++] = 0;\r\n data[index++] = 255;\r\n }\r\n\r\n const texture = RawTexture.CreateRGBATexture(data, size, size, this._scene, false, false, Constants.TEXTURE_BILINEAR_SAMPLINGMODE);\r\n texture.name = \"SSAORandomTexture\";\r\n texture.wrapU = Texture.WRAP_ADDRESSMODE;\r\n texture.wrapV = Texture.WRAP_ADDRESSMODE;\r\n this._randomTexture = texture;\r\n }\r\n\r\n private _bits = new Uint32Array(1);\r\n\r\n //Van der Corput radical inverse\r\n private _radicalInverseVdC(i: number) {\r\n this._bits[0] = i;\r\n this._bits[0] = ((this._bits[0] << 16) | (this._bits[0] >> 16)) >>> 0;\r\n this._bits[0] = ((this._bits[0] & 0x55555555) << 1) | (((this._bits[0] & 0xaaaaaaaa) >>> 1) >>> 0);\r\n this._bits[0] = ((this._bits[0] & 0x33333333) << 2) | (((this._bits[0] & 0xcccccccc) >>> 2) >>> 0);\r\n this._bits[0] = ((this._bits[0] & 0x0f0f0f0f) << 4) | (((this._bits[0] & 0xf0f0f0f0) >>> 4) >>> 0);\r\n this._bits[0] = ((this._bits[0] & 0x00ff00ff) << 8) | (((this._bits[0] & 0xff00ff00) >>> 8) >>> 0);\r\n return this._bits[0] * 2.3283064365386963e-10; // / 0x100000000 or / 4294967296\r\n }\r\n\r\n private _hammersley(i: number, n: number) {\r\n return [i / n, this._radicalInverseVdC(i)];\r\n }\r\n\r\n private _hemisphereSampleUniform(u: number, v: number): Vector3 {\r\n const phi = v * 2.0 * Math.PI;\r\n // rejecting samples that are close to tangent plane to avoid z-fighting artifacts\r\n const cosTheta = 1.0 - u * 0.85;\r\n const sinTheta = Math.sqrt(1.0 - cosTheta * cosTheta);\r\n return new Vector3(Math.cos(phi) * sinTheta, Math.sin(phi) * sinTheta, cosTheta);\r\n }\r\n\r\n private _generateHemisphere(): number[] {\r\n const numSamples = this.samples;\r\n const result = [];\r\n let vector;\r\n\r\n let i = 0;\r\n while (i < numSamples) {\r\n if (numSamples < 16) {\r\n vector = this._hemisphereSampleUniform(Math.random(), Math.random());\r\n } else {\r\n const rand = this._hammersley(i, numSamples);\r\n vector = this._hemisphereSampleUniform(rand[0], rand[1]);\r\n }\r\n\r\n result.push(vector.x, vector.y, vector.z);\r\n i++;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _getDefinesForSSAO() {\r\n let defines = `#define SSAO\\n#define SAMPLES ${this.samples}\\n#define EPSILON ${this.epsilon.toFixed(4)}`;\r\n\r\n if (this.camera?.mode === Camera.ORTHOGRAPHIC_CAMERA) {\r\n defines += `\\n#define ORTHOGRAPHIC_CAMERA`;\r\n }\r\n\r\n return defines;\r\n }\r\n}\r\n"]}
@@ -1,4 +1,4 @@
1
- import type { Nullable, AbstractEngine, EffectWrapperCreationOptions } from "../index.js";
1
+ import type { Nullable, EffectWrapperCreationOptions, Scene } from "../index.js";
2
2
  import { Camera } from "../Cameras/camera.js";
3
3
  import { Vector2 } from "../Maths/math.vector.js";
4
4
  import { EffectWrapper } from "../Materials/effectRenderer.js";
@@ -71,19 +71,24 @@ export declare class ThinTAAPostProcess extends EffectWrapper {
71
71
  */
72
72
  get clampHistory(): boolean;
73
73
  set clampHistory(clamp: boolean);
74
+ private _scene;
74
75
  private _hs;
75
76
  private _firstUpdate;
77
+ private _taaMaterialManager;
76
78
  /**
77
79
  * Constructs a new TAA post process
78
80
  * @param name Name of the effect
79
- * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
81
+ * @param scene The scene the post process belongs to
80
82
  * @param options Options to configure the effect
81
83
  */
82
- constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
84
+ constructor(name: string, scene: Scene, options?: EffectWrapperCreationOptions);
83
85
  /** @internal */
84
86
  _reset(): void;
85
- nextJitterOffset(output?: Vector2): Vector2;
86
- updateProjectionMatrix(): void;
87
+ /** @internal */
88
+ _updateJitter(): void;
89
+ protected _nextJitterOffset(output?: Vector2): Vector2;
90
+ protected _updateProjectionMatrix(): void;
87
91
  bind(noDefaultBindings?: boolean): void;
92
+ dispose(): void;
88
93
  private _updateEffect;
89
94
  }
@@ -1,8 +1,8 @@
1
1
  import { Camera } from "../Cameras/camera.js";
2
2
  import { Halton2DSequence } from "../Maths/halton2DSequence.js";
3
3
  import { Vector2 } from "../Maths/math.vector.js";
4
- import { Engine } from "../Engines/engine.js";
5
4
  import { EffectWrapper } from "../Materials/effectRenderer.js";
5
+ import { TAAMaterialManager } from "./RenderPipeline/Pipelines/taaMaterialManager.js";
6
6
  /**
7
7
  * Simple implementation of Temporal Anti-Aliasing (TAA).
8
8
  * This can be used to improve image quality for still pictures (screenshots for e.g.).
@@ -41,6 +41,9 @@ export class ThinTAAPostProcess extends EffectWrapper {
41
41
  return;
42
42
  }
43
43
  this._disabled = value;
44
+ if (this._taaMaterialManager) {
45
+ this._taaMaterialManager.isEnabled = !value && this.reprojectHistory;
46
+ }
44
47
  this._reset();
45
48
  }
46
49
  /**
@@ -81,6 +84,16 @@ export class ThinTAAPostProcess extends EffectWrapper {
81
84
  return;
82
85
  }
83
86
  this._reprojectHistory = reproject;
87
+ if (reproject) {
88
+ if (!this._taaMaterialManager) {
89
+ this._taaMaterialManager = new TAAMaterialManager(this._scene);
90
+ }
91
+ // The velocity buffer may be old so reset for one frame
92
+ this._reset();
93
+ }
94
+ if (this._taaMaterialManager) {
95
+ this._taaMaterialManager.isEnabled = reproject && !this._disabled;
96
+ }
84
97
  this._updateEffect();
85
98
  }
86
99
  /**
@@ -100,14 +113,14 @@ export class ThinTAAPostProcess extends EffectWrapper {
100
113
  /**
101
114
  * Constructs a new TAA post process
102
115
  * @param name Name of the effect
103
- * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
116
+ * @param scene The scene the post process belongs to
104
117
  * @param options Options to configure the effect
105
118
  */
106
- constructor(name, engine = null, options) {
119
+ constructor(name, scene, options) {
107
120
  super({
108
121
  ...options,
109
122
  name,
110
- engine: engine || Engine.LastCreatedEngine,
123
+ engine: scene.getEngine(),
111
124
  useShaderStore: true,
112
125
  useAsPostProcess: true,
113
126
  fragmentShader: ThinTAAPostProcess.FragmentUrl,
@@ -130,6 +143,7 @@ export class ThinTAAPostProcess extends EffectWrapper {
130
143
  this._reprojectHistory = false;
131
144
  this._clampHistory = false;
132
145
  this._firstUpdate = true;
146
+ this._scene = scene;
133
147
  this._hs = new Halton2DSequence(this.samples);
134
148
  }
135
149
  /** @internal */
@@ -138,14 +152,26 @@ export class ThinTAAPostProcess extends EffectWrapper {
138
152
  this._hs.next();
139
153
  this._firstUpdate = true;
140
154
  }
141
- nextJitterOffset(output = new Vector2()) {
142
- if (!this.camera || !this.camera.hasMoved) {
155
+ /** @internal */
156
+ _updateJitter() {
157
+ if (this.reprojectHistory && this._taaMaterialManager) {
158
+ // Applying jitter to the projection matrix messes with the velocity buffer,
159
+ // so we do it as a final vertex step in a material plugin instead
160
+ this._nextJitterOffset(this._taaMaterialManager.jitter);
161
+ }
162
+ else {
163
+ // Use the projection matrix by default since it supports most materials
164
+ this._updateProjectionMatrix();
165
+ }
166
+ }
167
+ _nextJitterOffset(output = new Vector2()) {
168
+ if (!this.camera || !this.camera.hasMoved || !this.disableOnCameraMove) {
143
169
  this._hs.next();
144
170
  }
145
171
  output.set(this._hs.x, this._hs.y);
146
172
  return output;
147
173
  }
148
- updateProjectionMatrix() {
174
+ _updateProjectionMatrix() {
149
175
  if (this.disabled) {
150
176
  return;
151
177
  }
@@ -171,6 +197,10 @@ export class ThinTAAPostProcess extends EffectWrapper {
171
197
  effect.setFloat("factor", (this.camera?.hasMoved && this.disableOnCameraMove) || this._firstUpdate ? 1 : this.factor);
172
198
  this._firstUpdate = false;
173
199
  }
200
+ dispose() {
201
+ this._taaMaterialManager?.dispose();
202
+ super.dispose();
203
+ }
174
204
  _updateEffect() {
175
205
  const defines = [];
176
206
  // There seems to be an issue where `updateEffect` sometimes doesn't include the initial samplers