@babylonjs/core 8.15.0 → 8.16.0

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 (173) hide show
  1. package/Animations/animatable.core.d.ts +6 -0
  2. package/Animations/animatable.core.js +7 -1
  3. package/Animations/animatable.core.js.map +1 -1
  4. package/Animations/animationGroup.d.ts +3 -1
  5. package/Animations/animationGroup.js +3 -2
  6. package/Animations/animationGroup.js.map +1 -1
  7. package/AudioV2/webAudio/components/webAudioParameterComponent.d.ts +8 -0
  8. package/AudioV2/webAudio/components/webAudioParameterComponent.js +36 -3
  9. package/AudioV2/webAudio/components/webAudioParameterComponent.js.map +1 -1
  10. package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.js +10 -0
  11. package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.js.map +1 -1
  12. package/AudioV2/webAudio/subProperties/spatialWebAudioListener.js +11 -0
  13. package/AudioV2/webAudio/subProperties/spatialWebAudioListener.js.map +1 -1
  14. package/AudioV2/webAudio/webAudioEngine.d.ts +7 -0
  15. package/AudioV2/webAudio/webAudioEngine.js +45 -0
  16. package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
  17. package/AudioV2/webAudio/webAudioStaticSound.d.ts +1 -0
  18. package/AudioV2/webAudio/webAudioStaticSound.js +4 -1
  19. package/AudioV2/webAudio/webAudioStaticSound.js.map +1 -1
  20. package/Behaviors/Cameras/framingBehavior.js +3 -3
  21. package/Behaviors/Cameras/framingBehavior.js.map +1 -1
  22. package/Debug/directionalLightFrustumViewer.d.ts +6 -0
  23. package/Debug/directionalLightFrustumViewer.js +39 -1
  24. package/Debug/directionalLightFrustumViewer.js.map +1 -1
  25. package/Engines/AbstractEngine/abstractEngine.alpha.d.ts +2 -1
  26. package/Engines/AbstractEngine/abstractEngine.alpha.js +9 -9
  27. package/Engines/AbstractEngine/abstractEngine.alpha.js.map +1 -1
  28. package/Engines/AbstractEngine/abstractEngine.states.d.ts +4 -104
  29. package/Engines/AbstractEngine/abstractEngine.states.js +4 -70
  30. package/Engines/AbstractEngine/abstractEngine.states.js.map +1 -1
  31. package/Engines/AbstractEngine/abstractEngine.stencil.d.ts +147 -0
  32. package/Engines/AbstractEngine/abstractEngine.stencil.js +93 -0
  33. package/Engines/AbstractEngine/abstractEngine.stencil.js.map +1 -0
  34. package/Engines/AbstractEngine/index.d.ts +1 -0
  35. package/Engines/AbstractEngine/index.js +1 -0
  36. package/Engines/AbstractEngine/index.js.map +1 -1
  37. package/Engines/Extensions/engine.alpha.d.ts +2 -1
  38. package/Engines/Extensions/engine.alpha.js +7 -78
  39. package/Engines/Extensions/engine.alpha.js.map +1 -1
  40. package/Engines/WebGL/webGL2ShaderProcessors.js +8 -1
  41. package/Engines/WebGL/webGL2ShaderProcessors.js.map +1 -1
  42. package/Engines/WebGPU/Extensions/engine.alpha.d.ts +2 -1
  43. package/Engines/WebGPU/Extensions/engine.alpha.js +12 -82
  44. package/Engines/WebGPU/Extensions/engine.alpha.js.map +1 -1
  45. package/Engines/WebGPU/webgpuCacheRenderPipeline.d.ts +12 -5
  46. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +139 -72
  47. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  48. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +13 -1
  49. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  50. package/Engines/WebGPU/webgpuStencilStateComposer.d.ts +8 -0
  51. package/Engines/WebGPU/webgpuStencilStateComposer.js +40 -0
  52. package/Engines/WebGPU/webgpuStencilStateComposer.js.map +1 -1
  53. package/Engines/abstractEngine.d.ts +7 -3
  54. package/Engines/abstractEngine.js +12 -5
  55. package/Engines/abstractEngine.js.map +1 -1
  56. package/Engines/constants.d.ts +30 -28
  57. package/Engines/constants.js +30 -28
  58. package/Engines/constants.js.map +1 -1
  59. package/Engines/engine.d.ts +10 -0
  60. package/Engines/engine.js +1 -0
  61. package/Engines/engine.js.map +1 -1
  62. package/Engines/engineCapabilities.d.ts +4 -0
  63. package/Engines/engineCapabilities.js.map +1 -1
  64. package/Engines/nativeEngine.d.ts +2 -1
  65. package/Engines/nativeEngine.js +6 -3
  66. package/Engines/nativeEngine.js.map +1 -1
  67. package/Engines/nullEngine.d.ts +2 -1
  68. package/Engines/nullEngine.js +7 -4
  69. package/Engines/nullEngine.js.map +1 -1
  70. package/Engines/thinEngine.js +16 -3
  71. package/Engines/thinEngine.js.map +1 -1
  72. package/Engines/webgpuEngine.d.ts +1 -0
  73. package/Engines/webgpuEngine.js +6 -4
  74. package/Engines/webgpuEngine.js.map +1 -1
  75. package/FrameGraph/Tasks/PostProcesses/passTask.d.ts +1 -1
  76. package/FrameGraph/Tasks/PostProcesses/passTask.js.map +1 -1
  77. package/FrameGraph/Tasks/Rendering/objectRendererTask.d.ts +8 -1
  78. package/FrameGraph/Tasks/Rendering/objectRendererTask.js +14 -6
  79. package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
  80. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js +3 -0
  81. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js.map +1 -1
  82. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js +6 -5
  83. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js.map +1 -1
  84. package/FrameGraph/Tasks/Texture/clearTextureTask.d.ts +1 -1
  85. package/FrameGraph/Tasks/Texture/clearTextureTask.js +7 -5
  86. package/FrameGraph/Tasks/Texture/clearTextureTask.js.map +1 -1
  87. package/FrameGraph/frameGraph.d.ts +6 -0
  88. package/FrameGraph/frameGraph.js +8 -0
  89. package/FrameGraph/frameGraph.js.map +1 -1
  90. package/FrameGraph/frameGraphContext.d.ts +16 -0
  91. package/FrameGraph/frameGraphContext.js +23 -0
  92. package/FrameGraph/frameGraphContext.js.map +1 -1
  93. package/FrameGraph/frameGraphRenderContext.d.ts +9 -16
  94. package/FrameGraph/frameGraphRenderContext.js +15 -23
  95. package/FrameGraph/frameGraphRenderContext.js.map +1 -1
  96. package/FrameGraph/frameGraphUtils.d.ts +52 -0
  97. package/FrameGraph/frameGraphUtils.js +99 -0
  98. package/FrameGraph/frameGraphUtils.js.map +1 -0
  99. package/FrameGraph/index.d.ts +1 -0
  100. package/FrameGraph/index.js +1 -0
  101. package/FrameGraph/index.js.map +1 -1
  102. package/Gizmos/boundingBoxGizmo.js +2 -0
  103. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  104. package/Loading/Plugins/babylonFileLoader.js +35 -2
  105. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  106. package/Materials/material.d.ts +32 -12
  107. package/Materials/material.js +49 -17
  108. package/Materials/material.js.map +1 -1
  109. package/Materials/materialStencilState.d.ts +24 -0
  110. package/Materials/materialStencilState.js +53 -1
  111. package/Materials/materialStencilState.js.map +1 -1
  112. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +4 -4
  113. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  114. package/Meshes/geometry.js +1 -1
  115. package/Meshes/geometry.js.map +1 -1
  116. package/Meshes/instancedMesh.d.ts +5 -0
  117. package/Meshes/instancedMesh.js +3 -3
  118. package/Meshes/instancedMesh.js.map +1 -1
  119. package/Meshes/mesh.d.ts +28 -5
  120. package/Meshes/mesh.js +127 -57
  121. package/Meshes/mesh.js.map +1 -1
  122. package/Meshes/thinInstanceMesh.js +4 -0
  123. package/Meshes/thinInstanceMesh.js.map +1 -1
  124. package/Misc/snapshotRenderingHelper.js +2 -1
  125. package/Misc/snapshotRenderingHelper.js.map +1 -1
  126. package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.d.ts +71 -0
  127. package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.js +156 -0
  128. package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.js.map +1 -0
  129. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.d.ts +13 -0
  130. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js +79 -3
  131. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js.map +1 -1
  132. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.d.ts +4 -0
  133. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js +5 -0
  134. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js.map +1 -1
  135. package/PostProcesses/RenderPipeline/postProcessRenderPipelineManager.d.ts +12 -3
  136. package/PostProcesses/RenderPipeline/postProcessRenderPipelineManager.js +22 -1
  137. package/PostProcesses/RenderPipeline/postProcessRenderPipelineManager.js.map +1 -1
  138. package/PostProcesses/thinPassPostProcess.js +7 -3
  139. package/PostProcesses/thinPassPostProcess.js.map +1 -1
  140. package/PostProcesses/thinTAAPostProcess.d.ts +17 -0
  141. package/PostProcesses/thinTAAPostProcess.js +51 -0
  142. package/PostProcesses/thinTAAPostProcess.js.map +1 -1
  143. package/Rendering/edgesRenderer.js +3 -2
  144. package/Rendering/edgesRenderer.js.map +1 -1
  145. package/Rendering/geometryBufferRenderer.js +1 -1
  146. package/Rendering/geometryBufferRenderer.js.map +1 -1
  147. package/Rendering/outlineRenderer.js +1 -1
  148. package/Rendering/outlineRenderer.js.map +1 -1
  149. package/Shaders/lod.fragment.js +2 -3
  150. package/Shaders/lod.fragment.js.map +1 -1
  151. package/Shaders/taa.fragment.js +15 -1
  152. package/Shaders/taa.fragment.js.map +1 -1
  153. package/ShadersWGSL/lod.fragment.js +2 -2
  154. package/ShadersWGSL/lod.fragment.js.map +1 -1
  155. package/ShadersWGSL/taa.fragment.js +16 -2
  156. package/ShadersWGSL/taa.fragment.js.map +1 -1
  157. package/States/IStencilState.d.ts +6 -2
  158. package/States/IStencilState.js.map +1 -1
  159. package/States/alphaCullingState.d.ts +7 -5
  160. package/States/alphaCullingState.js +144 -33
  161. package/States/alphaCullingState.js.map +1 -1
  162. package/States/stencilState.d.ts +12 -0
  163. package/States/stencilState.js +29 -1
  164. package/States/stencilState.js.map +1 -1
  165. package/States/stencilStateComposer.d.ts +12 -0
  166. package/States/stencilStateComposer.js +48 -2
  167. package/States/stencilStateComposer.js.map +1 -1
  168. package/assetContainer.js +29 -8
  169. package/assetContainer.js.map +1 -1
  170. package/package.json +1 -1
  171. package/scene.d.ts +2 -1
  172. package/scene.js +1 -0
  173. package/scene.js.map +1 -1
@@ -37,6 +37,17 @@ export declare class TAARenderingPipeline extends PostProcessRenderPipeline {
37
37
  */
38
38
  get disableOnCameraMove(): boolean;
39
39
  set disableOnCameraMove(value: boolean);
40
+ /**
41
+ * Enables reprojecting the history texture with a per-pixel velocity.
42
+ */
43
+ get reprojectHistory(): boolean;
44
+ set reprojectHistory(reproject: boolean);
45
+ /**
46
+ * Clamps the history pixel to the min and max of the 3x3 pixels surrounding the target pixel.
47
+ * This can help further reduce ghosting and artifacts.
48
+ */
49
+ get clampHistory(): boolean;
50
+ set clampHistory(history: boolean);
40
51
  private _isEnabled;
41
52
  /**
42
53
  * Gets or sets a boolean indicating if the render pipeline is enabled (default: true).
@@ -53,6 +64,7 @@ export declare class TAARenderingPipeline extends PostProcessRenderPipeline {
53
64
  private _textureType;
54
65
  private _taaPostProcess;
55
66
  private _taaThinPostProcess;
67
+ private _taaMaterialManager;
56
68
  private _passPostProcess;
57
69
  private _ping;
58
70
  private _pong;
@@ -89,6 +101,7 @@ export declare class TAARenderingPipeline extends PostProcessRenderPipeline {
89
101
  */
90
102
  dispose(): void;
91
103
  private _createPingPongTextures;
104
+ private _updateReprojection;
92
105
  private _buildPipeline;
93
106
  private _disposePostProcesses;
94
107
  private _createTAAPostProcess;
@@ -9,7 +9,16 @@ import { RegisterClass } from "../../../Misc/typeStore.js";
9
9
 
10
10
  import { PassPostProcess } from "../../passPostProcess.js";
11
11
  import { ThinTAAPostProcess } from "../../thinTAAPostProcess.js";
12
+ import { TAAMaterialManager } from "./taaMaterialManager.js";
13
+ import { Logger } from "../../../Misc/logger.js";
12
14
  import "../postProcessRenderPipelineManagerSceneComponent.js";
15
+ class TAAEffectConfiguration {
16
+ constructor() {
17
+ this.name = "taa";
18
+ this.enabled = true;
19
+ this.texturesRequired = [11];
20
+ }
21
+ }
13
22
  /**
14
23
  * Simple implementation of Temporal Anti-Aliasing (TAA).
15
24
  * This can be used to improve image quality for still pictures (screenshots for e.g.).
@@ -58,6 +67,28 @@ export class TAARenderingPipeline extends PostProcessRenderPipeline {
58
67
  set disableOnCameraMove(value) {
59
68
  this._taaThinPostProcess.disableOnCameraMove = value;
60
69
  }
70
+ /**
71
+ * Enables reprojecting the history texture with a per-pixel velocity.
72
+ */
73
+ get reprojectHistory() {
74
+ return this._taaThinPostProcess.reprojectHistory;
75
+ }
76
+ set reprojectHistory(reproject) {
77
+ if (this.reprojectHistory === reproject) {
78
+ return;
79
+ }
80
+ this._updateReprojection(reproject);
81
+ }
82
+ /**
83
+ * Clamps the history pixel to the min and max of the 3x3 pixels surrounding the target pixel.
84
+ * This can help further reduce ghosting and artifacts.
85
+ */
86
+ get clampHistory() {
87
+ return this._taaThinPostProcess.clampHistory;
88
+ }
89
+ set clampHistory(history) {
90
+ this._taaThinPostProcess.clampHistory = history;
91
+ }
61
92
  /**
62
93
  * Gets or sets a boolean indicating if the render pipeline is enabled (default: true).
63
94
  */
@@ -69,6 +100,9 @@ export class TAARenderingPipeline extends PostProcessRenderPipeline {
69
100
  return;
70
101
  }
71
102
  this._isEnabled = value;
103
+ if (this._taaMaterialManager) {
104
+ this._taaMaterialManager.isEnabled = value && this.reprojectHistory;
105
+ }
72
106
  if (!value) {
73
107
  if (this._cameras !== null) {
74
108
  this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);
@@ -166,6 +200,7 @@ export class TAARenderingPipeline extends PostProcessRenderPipeline {
166
200
  this._disposePostProcesses();
167
201
  this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);
168
202
  this._scene.postProcessRenderPipelineManager.removePipeline(this._name);
203
+ this._taaMaterialManager?.dispose();
169
204
  this._ping.dispose();
170
205
  this._pong.dispose();
171
206
  super.dispose();
@@ -174,11 +209,29 @@ export class TAARenderingPipeline extends PostProcessRenderPipeline {
174
209
  const engine = this._scene.getEngine();
175
210
  this._ping?.dispose();
176
211
  this._pong?.dispose();
177
- this._ping = engine.createRenderTargetTexture({ width, height }, { generateMipMaps: false, generateDepthBuffer: false, type: 2, samplingMode: 1 });
178
- this._pong = engine.createRenderTargetTexture({ width, height }, { generateMipMaps: false, generateDepthBuffer: false, type: 2, samplingMode: 1 });
212
+ this._ping = engine.createRenderTargetTexture({ width, height }, { generateMipMaps: false, generateDepthBuffer: false, type: 2, samplingMode: 2 });
213
+ this._pong = engine.createRenderTargetTexture({ width, height }, { generateMipMaps: false, generateDepthBuffer: false, type: 2, samplingMode: 2 });
179
214
  this._taaThinPostProcess.textureWidth = width;
180
215
  this._taaThinPostProcess.textureHeight = height;
181
216
  }
217
+ _updateReprojection(reproject) {
218
+ if (reproject) {
219
+ if (!this._scene.enablePrePassRenderer()) {
220
+ Logger.Warn("TAA reprojection requires PrePass which is not supported");
221
+ return;
222
+ }
223
+ else if (!this._taaMaterialManager) {
224
+ this._taaMaterialManager = new TAAMaterialManager(this._scene);
225
+ }
226
+ // The velocity buffer may be old so reset for one frame
227
+ this._taaThinPostProcess._reset();
228
+ }
229
+ this._taaThinPostProcess.reprojectHistory = reproject;
230
+ if (this._taaMaterialManager) {
231
+ this._taaMaterialManager.isEnabled = reproject && this._isEnabled;
232
+ }
233
+ this._buildPipeline();
234
+ }
182
235
  _buildPipeline() {
183
236
  if (!this.isSupported) {
184
237
  return;
@@ -227,6 +280,9 @@ export class TAARenderingPipeline extends PostProcessRenderPipeline {
227
280
  textureType: this._textureType,
228
281
  effectWrapper: this._taaThinPostProcess,
229
282
  });
283
+ if (this.reprojectHistory) {
284
+ this._taaPostProcess._prePassEffectConfiguration = new TAAEffectConfiguration();
285
+ }
230
286
  this._taaPostProcess.samples = this._msaaSamples;
231
287
  this._taaPostProcess.onActivateObservable.add(() => {
232
288
  this._taaThinPostProcess.camera = this._scene.activeCamera;
@@ -234,7 +290,15 @@ export class TAARenderingPipeline extends PostProcessRenderPipeline {
234
290
  const engine = this._scene.getEngine();
235
291
  this._createPingPongTextures(engine.getRenderWidth(), engine.getRenderHeight());
236
292
  }
237
- this._taaThinPostProcess.updateProjectionMatrix();
293
+ if (this.reprojectHistory && this._taaMaterialManager) {
294
+ // Applying jitter to the projection matrix messes with the velocity buffer,
295
+ // so we do it as a final vertex step in a material plugin instead
296
+ this._taaThinPostProcess.nextJitterOffset(this._taaMaterialManager.jitter);
297
+ }
298
+ else {
299
+ // Use the projection matrix by default since it supports most materials
300
+ this._taaThinPostProcess.updateProjectionMatrix();
301
+ }
238
302
  if (this._passPostProcess) {
239
303
  this._passPostProcess.inputTexture = this._pingpong ? this._ping : this._pong;
240
304
  }
@@ -242,6 +306,12 @@ export class TAARenderingPipeline extends PostProcessRenderPipeline {
242
306
  });
243
307
  this._taaPostProcess.onApplyObservable.add((effect) => {
244
308
  effect._bindTexture("historySampler", this._pingpong ? this._ping.texture : this._pong.texture);
309
+ const prePassRenderer = this._scene.prePassRenderer;
310
+ if (this.reprojectHistory && prePassRenderer) {
311
+ const renderTarget = prePassRenderer.getRenderTarget();
312
+ const velocityIndex = prePassRenderer.getIndex(11);
313
+ effect.setTexture("velocitySampler", renderTarget.textures[velocityIndex]);
314
+ }
245
315
  });
246
316
  }
247
317
  _createPassPostProcess() {
@@ -282,6 +352,12 @@ __decorate([
282
352
  __decorate([
283
353
  serialize()
284
354
  ], TAARenderingPipeline.prototype, "disableOnCameraMove", null);
355
+ __decorate([
356
+ serialize()
357
+ ], TAARenderingPipeline.prototype, "reprojectHistory", null);
358
+ __decorate([
359
+ serialize()
360
+ ], TAARenderingPipeline.prototype, "clampHistory", null);
285
361
  __decorate([
286
362
  serialize("isEnabled")
287
363
  ], TAARenderingPipeline.prototype, "_isEnabled", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"taaRenderingPipeline.js","sourceRoot":"","sources":["../../../../../../dev/core/src/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { serialize } from \"../../../Misc/decorators\";\r\nimport { SerializationHelper } from \"../../../Misc/decorators.serialization\";\r\nimport type { Camera } from \"../../../Cameras/camera\";\r\nimport type { Effect } from \"../../../Materials/effect\";\r\nimport { PostProcess } from \"../../postProcess\";\r\nimport { PostProcessRenderPipeline } from \"../postProcessRenderPipeline\";\r\nimport { PostProcessRenderEffect } from \"../postProcessRenderEffect\";\r\nimport type { Scene } from \"../../../scene\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport { Constants } from \"../../../Engines/constants\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport { PassPostProcess } from \"core/PostProcesses/passPostProcess\";\r\nimport type { RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\r\nimport { ThinTAAPostProcess } from \"core/PostProcesses/thinTAAPostProcess\";\r\n\r\nimport \"../postProcessRenderPipelineManagerSceneComponent\";\r\n\r\n/**\r\n * Simple implementation of Temporal Anti-Aliasing (TAA).\r\n * This can be used to improve image quality for still pictures (screenshots for e.g.).\r\n */\r\nexport class TAARenderingPipeline extends PostProcessRenderPipeline {\r\n /**\r\n * The TAA PostProcess effect id in the pipeline\r\n */\r\n public TAARenderEffect: string = \"TAARenderEffect\";\r\n /**\r\n * The pass PostProcess effect id in the pipeline\r\n */\r\n public TAAPassEffect: string = \"TAAPassEffect\";\r\n\r\n /**\r\n * Number of accumulated samples (default: 16)\r\n */\r\n @serialize(\"samples\")\r\n public set samples(samples: number) {\r\n this._taaThinPostProcess.samples = samples;\r\n }\r\n\r\n public get samples(): number {\r\n return this._taaThinPostProcess.samples;\r\n }\r\n\r\n @serialize(\"msaaSamples\")\r\n private _msaaSamples = 1;\r\n /**\r\n * MSAA samples (default: 1)\r\n */\r\n public set msaaSamples(samples: number) {\r\n if (this._msaaSamples === samples) {\r\n return;\r\n }\r\n\r\n this._msaaSamples = samples;\r\n if (this._taaPostProcess) {\r\n this._taaPostProcess.samples = samples;\r\n }\r\n }\r\n\r\n public get msaaSamples(): number {\r\n return this._msaaSamples;\r\n }\r\n\r\n /**\r\n * The factor used to blend the history frame with current frame (default: 0.05)\r\n */\r\n @serialize()\r\n public get factor() {\r\n return this._taaThinPostProcess.factor;\r\n }\r\n\r\n public set factor(value: number) {\r\n this._taaThinPostProcess.factor = value;\r\n }\r\n\r\n /**\r\n * Disable TAA on camera move (default: true).\r\n * You generally want to keep this enabled, otherwise you will get a ghost effect when the camera moves (but if it's what you want, go for it!)\r\n */\r\n @serialize()\r\n public get disableOnCameraMove() {\r\n return this._taaThinPostProcess.disableOnCameraMove;\r\n }\r\n\r\n public set disableOnCameraMove(value: boolean) {\r\n this._taaThinPostProcess.disableOnCameraMove = value;\r\n }\r\n\r\n @serialize(\"isEnabled\")\r\n private _isEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if the render pipeline is enabled (default: true).\r\n */\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n\r\n this._isEnabled = value;\r\n\r\n if (!value) {\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n this._cameras = this._camerasToBeAttached.slice();\r\n }\r\n } else if (value) {\r\n if (!this._isDirty) {\r\n if (this._cameras !== null) {\r\n this._taaThinPostProcess._reset();\r\n this._scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this._name, this._cameras);\r\n }\r\n } else {\r\n this._buildPipeline();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets active scene\r\n */\r\n public get scene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n private _scene: Scene;\r\n private _isDirty = false;\r\n private _camerasToBeAttached: Array<Camera> = [];\r\n private _textureType: number;\r\n private _taaPostProcess: Nullable<PostProcess>;\r\n private _taaThinPostProcess: ThinTAAPostProcess;\r\n private _passPostProcess: Nullable<PassPostProcess>;\r\n private _ping: RenderTargetWrapper;\r\n private _pong: RenderTargetWrapper;\r\n private _pingpong = 0;\r\n\r\n /**\r\n * Returns true if TAA is supported by the running hardware\r\n */\r\n public override get isSupported(): boolean {\r\n const caps = this._scene.getEngine().getCaps();\r\n\r\n return caps.texelFetch;\r\n }\r\n\r\n /**\r\n * Constructor of the TAA rendering pipeline\r\n * @param name The rendering pipeline name\r\n * @param scene The scene linked to this pipeline\r\n * @param cameras The array of cameras that the rendering pipeline will be attached to (default: scene.cameras)\r\n * @param textureType The type of texture where the scene will be rendered (default: Constants.TEXTURETYPE_UNSIGNED_BYTE)\r\n */\r\n constructor(name: string, scene: Scene, cameras?: Camera[], textureType = Constants.TEXTURETYPE_UNSIGNED_BYTE) {\r\n const engine = scene.getEngine();\r\n\r\n super(engine, name);\r\n\r\n this._cameras = cameras || scene.cameras;\r\n this._cameras = this._cameras.slice();\r\n this._camerasToBeAttached = this._cameras.slice();\r\n\r\n this._scene = scene;\r\n this._textureType = textureType;\r\n this._taaThinPostProcess = new ThinTAAPostProcess(\"TAA\", this._scene.getEngine());\r\n\r\n if (this.isSupported) {\r\n this._createPingPongTextures(engine.getRenderWidth(), engine.getRenderHeight());\r\n\r\n scene.postProcessRenderPipelineManager.addPipeline(this);\r\n\r\n this._buildPipeline();\r\n }\r\n }\r\n\r\n /**\r\n * Get the class name\r\n * @returns \"TAARenderingPipeline\"\r\n */\r\n public override getClassName(): string {\r\n return \"TAARenderingPipeline\";\r\n }\r\n\r\n /**\r\n * Adds a camera to the pipeline\r\n * @param camera the camera to be added\r\n */\r\n public addCamera(camera: Camera): void {\r\n this._camerasToBeAttached.push(camera);\r\n this._buildPipeline();\r\n }\r\n\r\n /**\r\n * Removes a camera from the pipeline\r\n * @param camera the camera to remove\r\n */\r\n public removeCamera(camera: Camera): void {\r\n const index = this._camerasToBeAttached.indexOf(camera);\r\n this._camerasToBeAttached.splice(index, 1);\r\n this._buildPipeline();\r\n }\r\n\r\n /**\r\n * Removes the internal pipeline assets and detaches the pipeline from the scene cameras\r\n */\r\n public override dispose(): void {\r\n this._disposePostProcesses();\r\n\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n\r\n this._scene.postProcessRenderPipelineManager.removePipeline(this._name);\r\n\r\n this._ping.dispose();\r\n this._pong.dispose();\r\n\r\n super.dispose();\r\n }\r\n\r\n private _createPingPongTextures(width: number, height: number) {\r\n const engine = this._scene.getEngine();\r\n\r\n this._ping?.dispose();\r\n this._pong?.dispose();\r\n\r\n this._ping = engine.createRenderTargetTexture(\r\n { width, height },\r\n { generateMipMaps: false, generateDepthBuffer: false, type: Constants.TEXTURETYPE_HALF_FLOAT, samplingMode: Constants.TEXTURE_NEAREST_NEAREST }\r\n );\r\n\r\n this._pong = engine.createRenderTargetTexture(\r\n { width, height },\r\n { generateMipMaps: false, generateDepthBuffer: false, type: Constants.TEXTURETYPE_HALF_FLOAT, samplingMode: Constants.TEXTURE_NEAREST_NEAREST }\r\n );\r\n\r\n this._taaThinPostProcess.textureWidth = width;\r\n this._taaThinPostProcess.textureHeight = height;\r\n }\r\n\r\n private _buildPipeline() {\r\n if (!this.isSupported) {\r\n return;\r\n }\r\n\r\n if (!this._isEnabled) {\r\n this._isDirty = true;\r\n return;\r\n }\r\n\r\n this._isDirty = false;\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n this._disposePostProcesses();\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n // get back cameras to be used to reattach pipeline\r\n this._cameras = this._camerasToBeAttached.slice();\r\n }\r\n this._reset();\r\n\r\n this._createTAAPostProcess();\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n engine,\r\n this.TAARenderEffect,\r\n () => {\r\n return this._taaPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n\r\n this._createPassPostProcess();\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n engine,\r\n this.TAAPassEffect,\r\n () => {\r\n return this._passPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this._name, this._cameras);\r\n }\r\n }\r\n\r\n private _disposePostProcesses(): void {\r\n for (let i = 0; i < this._cameras.length; i++) {\r\n const camera = this._cameras[i];\r\n\r\n this._taaPostProcess?.dispose(camera);\r\n this._passPostProcess?.dispose(camera);\r\n\r\n camera.getProjectionMatrix(true); // recompute the projection matrix\r\n }\r\n\r\n this._taaPostProcess = null;\r\n this._passPostProcess = null;\r\n }\r\n\r\n private _createTAAPostProcess(): void {\r\n this._taaPostProcess = new PostProcess(\"TAA\", \"taa\", {\r\n uniforms: [\"factor\"],\r\n samplers: [\"historySampler\"],\r\n size: 1.0,\r\n engine: this._scene.getEngine(),\r\n textureType: this._textureType,\r\n effectWrapper: this._taaThinPostProcess,\r\n });\r\n\r\n this._taaPostProcess.samples = this._msaaSamples;\r\n\r\n this._taaPostProcess.onActivateObservable.add(() => {\r\n this._taaThinPostProcess.camera = this._scene.activeCamera;\r\n\r\n if (this._taaPostProcess?.width !== this._ping.width || this._taaPostProcess?.height !== this._ping.height) {\r\n const engine = this._scene.getEngine();\r\n this._createPingPongTextures(engine.getRenderWidth(), engine.getRenderHeight());\r\n }\r\n\r\n this._taaThinPostProcess.updateProjectionMatrix();\r\n\r\n if (this._passPostProcess) {\r\n this._passPostProcess.inputTexture = this._pingpong ? this._ping : this._pong;\r\n }\r\n this._pingpong = this._pingpong ^ 1;\r\n });\r\n\r\n this._taaPostProcess.onApplyObservable.add((effect: Effect) => {\r\n effect._bindTexture(\"historySampler\", this._pingpong ? this._ping.texture : this._pong.texture);\r\n });\r\n }\r\n\r\n private _createPassPostProcess() {\r\n const engine = this._scene.getEngine();\r\n\r\n this._passPostProcess = new PassPostProcess(\"TAAPass\", 1, null, Constants.TEXTURE_NEAREST_NEAREST, engine);\r\n this._passPostProcess.inputTexture = this._ping;\r\n this._passPostProcess.autoClear = false;\r\n }\r\n\r\n /**\r\n * Serializes the rendering pipeline (Used when exporting)\r\n * @returns the serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.customType = \"TAARenderingPipeline\";\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parse the serialized pipeline\r\n * @param source Source pipeline.\r\n * @param scene The scene to load the pipeline to.\r\n * @param rootUrl The URL of the serialized pipeline.\r\n * @returns An instantiated pipeline from the serialized object.\r\n */\r\n public static Parse(source: any, scene: Scene, rootUrl: string): TAARenderingPipeline {\r\n return SerializationHelper.Parse(() => new TAARenderingPipeline(source._name, scene, source._ratio), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.TAARenderingPipeline\", TAARenderingPipeline);\r\n"]}
1
+ {"version":3,"file":"taaRenderingPipeline.js","sourceRoot":"","sources":["../../../../../../dev/core/src/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { serialize } from \"../../../Misc/decorators\";\r\nimport { SerializationHelper } from \"../../../Misc/decorators.serialization\";\r\nimport type { Camera } from \"../../../Cameras/camera\";\r\nimport type { Effect } from \"../../../Materials/effect\";\r\nimport { PostProcess } from \"../../postProcess\";\r\nimport { PostProcessRenderPipeline } from \"../postProcessRenderPipeline\";\r\nimport { PostProcessRenderEffect } from \"../postProcessRenderEffect\";\r\nimport type { Scene } from \"../../../scene\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport { Constants } from \"../../../Engines/constants\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport { PassPostProcess } from \"core/PostProcesses/passPostProcess\";\r\nimport type { RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\r\nimport { ThinTAAPostProcess } from \"core/PostProcesses/thinTAAPostProcess\";\r\nimport { TAAMaterialManager } from \"./taaMaterialManager\";\r\nimport type { PrePassEffectConfiguration } from \"core/Rendering/prePassEffectConfiguration\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\nimport \"../postProcessRenderPipelineManagerSceneComponent\";\r\n\r\nclass TAAEffectConfiguration implements PrePassEffectConfiguration {\r\n public name = \"taa\";\r\n public enabled = true;\r\n public readonly texturesRequired = [Constants.PREPASS_VELOCITY_LINEAR_TEXTURE_TYPE];\r\n}\r\n\r\n/**\r\n * Simple implementation of Temporal Anti-Aliasing (TAA).\r\n * This can be used to improve image quality for still pictures (screenshots for e.g.).\r\n */\r\nexport class TAARenderingPipeline extends PostProcessRenderPipeline {\r\n /**\r\n * The TAA PostProcess effect id in the pipeline\r\n */\r\n public TAARenderEffect: string = \"TAARenderEffect\";\r\n /**\r\n * The pass PostProcess effect id in the pipeline\r\n */\r\n public TAAPassEffect: string = \"TAAPassEffect\";\r\n\r\n /**\r\n * Number of accumulated samples (default: 16)\r\n */\r\n @serialize(\"samples\")\r\n public set samples(samples: number) {\r\n this._taaThinPostProcess.samples = samples;\r\n }\r\n\r\n public get samples(): number {\r\n return this._taaThinPostProcess.samples;\r\n }\r\n\r\n @serialize(\"msaaSamples\")\r\n private _msaaSamples = 1;\r\n /**\r\n * MSAA samples (default: 1)\r\n */\r\n public set msaaSamples(samples: number) {\r\n if (this._msaaSamples === samples) {\r\n return;\r\n }\r\n\r\n this._msaaSamples = samples;\r\n if (this._taaPostProcess) {\r\n this._taaPostProcess.samples = samples;\r\n }\r\n }\r\n\r\n public get msaaSamples(): number {\r\n return this._msaaSamples;\r\n }\r\n\r\n /**\r\n * The factor used to blend the history frame with current frame (default: 0.05)\r\n */\r\n @serialize()\r\n public get factor() {\r\n return this._taaThinPostProcess.factor;\r\n }\r\n\r\n public set factor(value: number) {\r\n this._taaThinPostProcess.factor = value;\r\n }\r\n\r\n /**\r\n * Disable TAA on camera move (default: true).\r\n * You generally want to keep this enabled, otherwise you will get a ghost effect when the camera moves (but if it's what you want, go for it!)\r\n */\r\n @serialize()\r\n public get disableOnCameraMove() {\r\n return this._taaThinPostProcess.disableOnCameraMove;\r\n }\r\n\r\n public set disableOnCameraMove(value: boolean) {\r\n this._taaThinPostProcess.disableOnCameraMove = value;\r\n }\r\n\r\n /**\r\n * Enables reprojecting the history texture with a per-pixel velocity.\r\n */\r\n @serialize()\r\n public get reprojectHistory(): boolean {\r\n return this._taaThinPostProcess.reprojectHistory;\r\n }\r\n\r\n public set reprojectHistory(reproject: boolean) {\r\n if (this.reprojectHistory === reproject) {\r\n return;\r\n }\r\n this._updateReprojection(reproject);\r\n }\r\n\r\n /**\r\n * Clamps the history pixel to the min and max of the 3x3 pixels surrounding the target pixel.\r\n * This can help further reduce ghosting and artifacts.\r\n */\r\n @serialize()\r\n public get clampHistory(): boolean {\r\n return this._taaThinPostProcess.clampHistory;\r\n }\r\n\r\n public set clampHistory(history: boolean) {\r\n this._taaThinPostProcess.clampHistory = history;\r\n }\r\n\r\n @serialize(\"isEnabled\")\r\n private _isEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if the render pipeline is enabled (default: true).\r\n */\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n\r\n this._isEnabled = value;\r\n if (this._taaMaterialManager) {\r\n this._taaMaterialManager.isEnabled = value && this.reprojectHistory;\r\n }\r\n\r\n if (!value) {\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n this._cameras = this._camerasToBeAttached.slice();\r\n }\r\n } else if (value) {\r\n if (!this._isDirty) {\r\n if (this._cameras !== null) {\r\n this._taaThinPostProcess._reset();\r\n this._scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this._name, this._cameras);\r\n }\r\n } else {\r\n this._buildPipeline();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets active scene\r\n */\r\n public get scene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n private _scene: Scene;\r\n private _isDirty = false;\r\n private _camerasToBeAttached: Array<Camera> = [];\r\n private _textureType: number;\r\n private _taaPostProcess: Nullable<PostProcess>;\r\n private _taaThinPostProcess: ThinTAAPostProcess;\r\n private _taaMaterialManager: Nullable<TAAMaterialManager>;\r\n private _passPostProcess: Nullable<PassPostProcess>;\r\n private _ping: RenderTargetWrapper;\r\n private _pong: RenderTargetWrapper;\r\n private _pingpong = 0;\r\n\r\n /**\r\n * Returns true if TAA is supported by the running hardware\r\n */\r\n public override get isSupported(): boolean {\r\n const caps = this._scene.getEngine().getCaps();\r\n\r\n return caps.texelFetch;\r\n }\r\n\r\n /**\r\n * Constructor of the TAA rendering pipeline\r\n * @param name The rendering pipeline name\r\n * @param scene The scene linked to this pipeline\r\n * @param cameras The array of cameras that the rendering pipeline will be attached to (default: scene.cameras)\r\n * @param textureType The type of texture where the scene will be rendered (default: Constants.TEXTURETYPE_UNSIGNED_BYTE)\r\n */\r\n constructor(name: string, scene: Scene, cameras?: Camera[], textureType = Constants.TEXTURETYPE_UNSIGNED_BYTE) {\r\n const engine = scene.getEngine();\r\n\r\n super(engine, name);\r\n\r\n this._cameras = cameras || scene.cameras;\r\n this._cameras = this._cameras.slice();\r\n this._camerasToBeAttached = this._cameras.slice();\r\n\r\n this._scene = scene;\r\n this._textureType = textureType;\r\n this._taaThinPostProcess = new ThinTAAPostProcess(\"TAA\", this._scene.getEngine());\r\n\r\n if (this.isSupported) {\r\n this._createPingPongTextures(engine.getRenderWidth(), engine.getRenderHeight());\r\n\r\n scene.postProcessRenderPipelineManager.addPipeline(this);\r\n\r\n this._buildPipeline();\r\n }\r\n }\r\n\r\n /**\r\n * Get the class name\r\n * @returns \"TAARenderingPipeline\"\r\n */\r\n public override getClassName(): string {\r\n return \"TAARenderingPipeline\";\r\n }\r\n\r\n /**\r\n * Adds a camera to the pipeline\r\n * @param camera the camera to be added\r\n */\r\n public addCamera(camera: Camera): void {\r\n this._camerasToBeAttached.push(camera);\r\n this._buildPipeline();\r\n }\r\n\r\n /**\r\n * Removes a camera from the pipeline\r\n * @param camera the camera to remove\r\n */\r\n public removeCamera(camera: Camera): void {\r\n const index = this._camerasToBeAttached.indexOf(camera);\r\n this._camerasToBeAttached.splice(index, 1);\r\n this._buildPipeline();\r\n }\r\n\r\n /**\r\n * Removes the internal pipeline assets and detaches the pipeline from the scene cameras\r\n */\r\n public override dispose(): void {\r\n this._disposePostProcesses();\r\n\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n\r\n this._scene.postProcessRenderPipelineManager.removePipeline(this._name);\r\n\r\n this._taaMaterialManager?.dispose();\r\n this._ping.dispose();\r\n this._pong.dispose();\r\n\r\n super.dispose();\r\n }\r\n\r\n private _createPingPongTextures(width: number, height: number) {\r\n const engine = this._scene.getEngine();\r\n\r\n this._ping?.dispose();\r\n this._pong?.dispose();\r\n\r\n this._ping = engine.createRenderTargetTexture(\r\n { width, height },\r\n { generateMipMaps: false, generateDepthBuffer: false, type: Constants.TEXTURETYPE_HALF_FLOAT, samplingMode: Constants.TEXTURE_LINEAR_LINEAR }\r\n );\r\n\r\n this._pong = engine.createRenderTargetTexture(\r\n { width, height },\r\n { generateMipMaps: false, generateDepthBuffer: false, type: Constants.TEXTURETYPE_HALF_FLOAT, samplingMode: Constants.TEXTURE_LINEAR_LINEAR }\r\n );\r\n\r\n this._taaThinPostProcess.textureWidth = width;\r\n this._taaThinPostProcess.textureHeight = height;\r\n }\r\n\r\n private _updateReprojection(reproject: boolean) {\r\n if (reproject) {\r\n if (!this._scene.enablePrePassRenderer()) {\r\n Logger.Warn(\"TAA reprojection requires PrePass which is not supported\");\r\n return;\r\n } else if (!this._taaMaterialManager) {\r\n this._taaMaterialManager = new TAAMaterialManager(this._scene);\r\n }\r\n // The velocity buffer may be old so reset for one frame\r\n this._taaThinPostProcess._reset();\r\n }\r\n\r\n this._taaThinPostProcess.reprojectHistory = reproject;\r\n if (this._taaMaterialManager) {\r\n this._taaMaterialManager.isEnabled = reproject && this._isEnabled;\r\n }\r\n\r\n this._buildPipeline();\r\n }\r\n\r\n private _buildPipeline() {\r\n if (!this.isSupported) {\r\n return;\r\n }\r\n\r\n if (!this._isEnabled) {\r\n this._isDirty = true;\r\n return;\r\n }\r\n\r\n this._isDirty = false;\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n this._disposePostProcesses();\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n // get back cameras to be used to reattach pipeline\r\n this._cameras = this._camerasToBeAttached.slice();\r\n }\r\n this._reset();\r\n\r\n this._createTAAPostProcess();\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n engine,\r\n this.TAARenderEffect,\r\n () => {\r\n return this._taaPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n\r\n this._createPassPostProcess();\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n engine,\r\n this.TAAPassEffect,\r\n () => {\r\n return this._passPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this._name, this._cameras);\r\n }\r\n }\r\n\r\n private _disposePostProcesses(): void {\r\n for (let i = 0; i < this._cameras.length; i++) {\r\n const camera = this._cameras[i];\r\n\r\n this._taaPostProcess?.dispose(camera);\r\n this._passPostProcess?.dispose(camera);\r\n\r\n camera.getProjectionMatrix(true); // recompute the projection matrix\r\n }\r\n\r\n this._taaPostProcess = null;\r\n this._passPostProcess = null;\r\n }\r\n\r\n private _createTAAPostProcess(): void {\r\n this._taaPostProcess = new PostProcess(\"TAA\", \"taa\", {\r\n uniforms: [\"factor\"],\r\n samplers: [\"historySampler\"],\r\n size: 1.0,\r\n engine: this._scene.getEngine(),\r\n textureType: this._textureType,\r\n effectWrapper: this._taaThinPostProcess,\r\n });\r\n\r\n if (this.reprojectHistory) {\r\n this._taaPostProcess._prePassEffectConfiguration = new TAAEffectConfiguration();\r\n }\r\n\r\n this._taaPostProcess.samples = this._msaaSamples;\r\n\r\n this._taaPostProcess.onActivateObservable.add(() => {\r\n this._taaThinPostProcess.camera = this._scene.activeCamera;\r\n\r\n if (this._taaPostProcess?.width !== this._ping.width || this._taaPostProcess?.height !== this._ping.height) {\r\n const engine = this._scene.getEngine();\r\n this._createPingPongTextures(engine.getRenderWidth(), engine.getRenderHeight());\r\n }\r\n\r\n if (this.reprojectHistory && this._taaMaterialManager) {\r\n // Applying jitter to the projection matrix messes with the velocity buffer,\r\n // so we do it as a final vertex step in a material plugin instead\r\n this._taaThinPostProcess.nextJitterOffset(this._taaMaterialManager.jitter);\r\n } else {\r\n // Use the projection matrix by default since it supports most materials\r\n this._taaThinPostProcess.updateProjectionMatrix();\r\n }\r\n\r\n if (this._passPostProcess) {\r\n this._passPostProcess.inputTexture = this._pingpong ? this._ping : this._pong;\r\n }\r\n this._pingpong = this._pingpong ^ 1;\r\n });\r\n\r\n this._taaPostProcess.onApplyObservable.add((effect: Effect) => {\r\n effect._bindTexture(\"historySampler\", this._pingpong ? this._ping.texture : this._pong.texture);\r\n\r\n const prePassRenderer = this._scene.prePassRenderer;\r\n if (this.reprojectHistory && prePassRenderer) {\r\n const renderTarget = prePassRenderer.getRenderTarget();\r\n const velocityIndex = prePassRenderer.getIndex(Constants.PREPASS_VELOCITY_LINEAR_TEXTURE_TYPE);\r\n effect.setTexture(\"velocitySampler\", renderTarget.textures[velocityIndex]);\r\n }\r\n });\r\n }\r\n\r\n private _createPassPostProcess() {\r\n const engine = this._scene.getEngine();\r\n\r\n this._passPostProcess = new PassPostProcess(\"TAAPass\", 1, null, Constants.TEXTURE_NEAREST_NEAREST, engine);\r\n this._passPostProcess.inputTexture = this._ping;\r\n this._passPostProcess.autoClear = false;\r\n }\r\n\r\n /**\r\n * Serializes the rendering pipeline (Used when exporting)\r\n * @returns the serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.customType = \"TAARenderingPipeline\";\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parse the serialized pipeline\r\n * @param source Source pipeline.\r\n * @param scene The scene to load the pipeline to.\r\n * @param rootUrl The URL of the serialized pipeline.\r\n * @returns An instantiated pipeline from the serialized object.\r\n */\r\n public static Parse(source: any, scene: Scene, rootUrl: string): TAARenderingPipeline {\r\n return SerializationHelper.Parse(() => new TAARenderingPipeline(source._name, scene, source._ratio), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.TAARenderingPipeline\", TAARenderingPipeline);\r\n"]}
@@ -29,6 +29,10 @@ export declare class PostProcessRenderPipeline {
29
29
  * Gets pipeline name
30
30
  */
31
31
  get name(): string;
32
+ /**
33
+ * Gets the unique id of the post process rendering pipeline
34
+ */
35
+ readonly uniqueId: number;
32
36
  /** Gets the list of attached cameras */
33
37
  get cameras(): Camera[];
34
38
  /**
@@ -1,6 +1,7 @@
1
1
  import { __decorate } from "../../tslib.es6.js";
2
2
  import { Tools } from "../../Misc/tools.js";
3
3
  import { serialize } from "../../Misc/decorators.js";
4
+ import { UniqueIdGenerator } from "../../Misc/uniqueIdGenerator.js";
4
5
  /**
5
6
  * PostProcessRenderPipeline
6
7
  * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/postProcessRenderPipeline
@@ -29,6 +30,10 @@ export class PostProcessRenderPipeline {
29
30
  */
30
31
  constructor(_engine, name) {
31
32
  this._engine = _engine;
33
+ /**
34
+ * Gets the unique id of the post process rendering pipeline
35
+ */
36
+ this.uniqueId = UniqueIdGenerator.UniqueId;
32
37
  this._name = name;
33
38
  this._renderEffects = {};
34
39
  this._renderEffectsForIsolatedPass = new Array();
@@ -1 +1 @@
1
- {"version":3,"file":"postProcessRenderPipeline.js","sourceRoot":"","sources":["../../../../../dev/core/src/PostProcesses/RenderPipeline/postProcessRenderPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\nimport type { AbstractEngine } from \"../../Engines/abstractEngine\";\r\nimport type { PostProcessRenderEffect } from \"./postProcessRenderEffect\";\r\nimport type { IInspectable } from \"../../Misc/iInspectable\";\r\n\r\nimport type { PrePassRenderer } from \"../../Rendering/prePassRenderer\";\r\n\r\n/**\r\n * PostProcessRenderPipeline\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/postProcessRenderPipeline\r\n */\r\nexport class PostProcessRenderPipeline {\r\n protected _renderEffects: { [key: string]: PostProcessRenderEffect };\r\n protected _renderEffectsForIsolatedPass: PostProcessRenderEffect[];\r\n\r\n /**\r\n * List of inspectable custom properties (used by the Inspector)\r\n * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility\r\n */\r\n public inspectableCustomProperties: IInspectable[];\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _cameras: Camera[];\r\n\r\n /** @internal */\r\n @serialize()\r\n public _name: string;\r\n\r\n /**\r\n * Gets pipeline name\r\n */\r\n public get name(): string {\r\n return this._name;\r\n }\r\n\r\n /** Gets the list of attached cameras */\r\n public get cameras() {\r\n return this._cameras;\r\n }\r\n\r\n /**\r\n * Gets the active engine\r\n */\r\n public get engine(): AbstractEngine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * Initializes a PostProcessRenderPipeline\r\n * @param _engine engine to add the pipeline to\r\n * @param name name of the pipeline\r\n */\r\n constructor(\r\n private _engine: AbstractEngine,\r\n name: string\r\n ) {\r\n this._name = name;\r\n\r\n this._renderEffects = {};\r\n this._renderEffectsForIsolatedPass = new Array<PostProcessRenderEffect>();\r\n\r\n this._cameras = [];\r\n }\r\n\r\n /**\r\n * Gets the class name\r\n * @returns \"PostProcessRenderPipeline\"\r\n */\r\n public getClassName(): string {\r\n return \"PostProcessRenderPipeline\";\r\n }\r\n\r\n /**\r\n * If all the render effects in the pipeline are supported\r\n */\r\n public get isSupported(): boolean {\r\n for (const renderEffectName in this._renderEffects) {\r\n if (Object.prototype.hasOwnProperty.call(this._renderEffects, renderEffectName)) {\r\n if (!this._renderEffects[renderEffectName].isSupported) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Adds an effect to the pipeline\r\n * @param renderEffect the effect to add\r\n */\r\n public addEffect(renderEffect: PostProcessRenderEffect): void {\r\n (<any>this._renderEffects)[renderEffect._name] = renderEffect;\r\n }\r\n\r\n // private\r\n\r\n /** @internal */\r\n public _rebuild() {}\r\n\r\n /** @internal */\r\n public _enableEffect(renderEffectName: string, cameras: Camera): void;\r\n /** @internal */\r\n public _enableEffect(renderEffectName: string, cameras: Camera[]): void;\r\n /**\r\n * @internal\r\n */\r\n public _enableEffect(renderEffectName: string, cameras: any): void {\r\n const renderEffects: PostProcessRenderEffect = (<any>this._renderEffects)[renderEffectName];\r\n\r\n if (!renderEffects) {\r\n return;\r\n }\r\n\r\n renderEffects._enable(Tools.MakeArray(cameras || this._cameras));\r\n }\r\n\r\n /** @internal */\r\n public _disableEffect(renderEffectName: string, cameras: Nullable<Camera[]>): void;\r\n /** @internal */\r\n public _disableEffect(renderEffectName: string, cameras: Nullable<Camera[]>): void;\r\n /**\r\n * @internal\r\n */\r\n public _disableEffect(renderEffectName: string, cameras: Nullable<Camera[]>): void {\r\n const renderEffects: PostProcessRenderEffect = (<any>this._renderEffects)[renderEffectName];\r\n\r\n if (!renderEffects) {\r\n return;\r\n }\r\n\r\n renderEffects._disable(Tools.MakeArray(cameras || this._cameras));\r\n }\r\n\r\n /** @internal */\r\n public _attachCameras(cameras: Camera, unique: boolean): void;\r\n /** @internal */\r\n public _attachCameras(cameras: Camera[], unique: boolean): void;\r\n /**\r\n * @internal\r\n */\r\n public _attachCameras(cameras: any, unique: boolean): void {\r\n const cams = Tools.MakeArray(cameras || this._cameras);\r\n\r\n if (!cams) {\r\n return;\r\n }\r\n\r\n const indicesToDelete = [];\r\n let i: number;\r\n for (i = 0; i < cams.length; i++) {\r\n const camera = cams[i];\r\n if (!camera) {\r\n continue;\r\n }\r\n\r\n if (this._cameras.indexOf(camera) === -1) {\r\n this._cameras.push(camera);\r\n } else if (unique) {\r\n indicesToDelete.push(i);\r\n }\r\n }\r\n\r\n for (i = 0; i < indicesToDelete.length; i++) {\r\n cams.splice(indicesToDelete[i], 1);\r\n }\r\n\r\n for (const renderEffectName in this._renderEffects) {\r\n if (Object.prototype.hasOwnProperty.call(this._renderEffects, renderEffectName)) {\r\n this._renderEffects[renderEffectName]._attachCameras(cams);\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _detachCameras(cameras: Camera): void;\r\n /** @internal */\r\n public _detachCameras(cameras: Nullable<Camera[]>): void;\r\n /**\r\n * @internal\r\n */\r\n public _detachCameras(cameras: any): void {\r\n const cams = Tools.MakeArray(cameras || this._cameras);\r\n\r\n if (!cams) {\r\n return;\r\n }\r\n\r\n for (const renderEffectName in this._renderEffects) {\r\n if (Object.prototype.hasOwnProperty.call(this._renderEffects, renderEffectName)) {\r\n this._renderEffects[renderEffectName]._detachCameras(cams);\r\n }\r\n }\r\n\r\n for (let i = 0; i < cams.length; i++) {\r\n this._cameras.splice(this._cameras.indexOf(cams[i]), 1);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _update(): void {\r\n for (const renderEffectName in this._renderEffects) {\r\n if (Object.prototype.hasOwnProperty.call(this._renderEffects, renderEffectName)) {\r\n this._renderEffects[renderEffectName]._update();\r\n }\r\n }\r\n\r\n for (let i = 0; i < this._cameras.length; i++) {\r\n if (!this._cameras[i]) {\r\n continue;\r\n }\r\n const cameraName = this._cameras[i].name;\r\n if ((<any>this._renderEffectsForIsolatedPass)[cameraName]) {\r\n (<any>this._renderEffectsForIsolatedPass)[cameraName]._update();\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _reset(): void {\r\n this._renderEffects = {};\r\n this._renderEffectsForIsolatedPass = new Array<PostProcessRenderEffect>();\r\n }\r\n\r\n protected _enableMSAAOnFirstPostProcess(sampleCount: number): boolean {\r\n if (!this._engine._features.supportMSAA) {\r\n return false;\r\n }\r\n\r\n // Set samples of the very first post process to 4 to enable native anti-aliasing in browsers that support webGL 2.0 (See: https://github.com/BabylonJS/Babylon.js/issues/3754)\r\n const effectKeys = Object.keys(this._renderEffects);\r\n if (effectKeys.length > 0) {\r\n const postProcesses = this._renderEffects[effectKeys[0]].getPostProcesses();\r\n if (postProcesses) {\r\n postProcesses[0].samples = sampleCount;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Ensures that all post processes in the pipeline are the correct size according to the\r\n * the viewport's required size\r\n */\r\n protected _adaptPostProcessesToViewPort(): void {\r\n const effectKeys = Object.keys(this._renderEffects);\r\n for (const effectKey of effectKeys) {\r\n const postProcesses = this._renderEffects[effectKey].getPostProcesses();\r\n if (postProcesses) {\r\n for (const postProcess of postProcesses) {\r\n postProcess.adaptScaleToCurrentViewport = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets the required values to the prepass renderer.\r\n * @param prePassRenderer defines the prepass renderer to setup.\r\n * @returns true if the pre pass is needed.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public setPrePassRenderer(prePassRenderer: PrePassRenderer): boolean {\r\n // Do Nothing by default\r\n return false;\r\n }\r\n\r\n /**\r\n * Disposes of the pipeline\r\n */\r\n public dispose() {\r\n // Must be implemented by children\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"postProcessRenderPipeline.js","sourceRoot":"","sources":["../../../../../dev/core/src/PostProcesses/RenderPipeline/postProcessRenderPipeline.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,wCAAoC;AAQhE;;;GAGG;AACH,MAAM,OAAO,yBAAyB;IAmBlC;;OAEG;IACH,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAOD,wCAAwC;IACxC,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACH,YACY,OAAuB,EAC/B,IAAY;QADJ,YAAO,GAAP,OAAO,CAAgB;QAvBnC;;WAEG;QACa,aAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC;QAuBlD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,6BAA6B,GAAG,IAAI,KAAK,EAA2B,CAAC;QAE1E,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACvB,CAAC;IAED;;;OAGG;IACI,YAAY;QACf,OAAO,2BAA2B,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,IAAW,WAAW;QAClB,KAAK,MAAM,gBAAgB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACjD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,gBAAgB,CAAC,EAAE,CAAC;gBAC9E,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC;oBACrD,OAAO,KAAK,CAAC;gBACjB,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,SAAS,CAAC,YAAqC;QAC5C,IAAI,CAAC,cAAe,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC;IAClE,CAAC;IAED,UAAU;IAEV,gBAAgB;IACT,QAAQ,KAAI,CAAC;IAMpB;;OAEG;IACI,aAAa,CAAC,gBAAwB,EAAE,OAAY;QACvD,MAAM,aAAa,GAAkC,IAAI,CAAC,cAAe,CAAC,gBAAgB,CAAC,CAAC;QAE5F,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,OAAO;QACX,CAAC;QAED,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrE,CAAC;IAMD;;OAEG;IACI,cAAc,CAAC,gBAAwB,EAAE,OAA2B;QACvE,MAAM,aAAa,GAAkC,IAAI,CAAC,cAAe,CAAC,gBAAgB,CAAC,CAAC;QAE5F,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,OAAO;QACX,CAAC;QAED,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtE,CAAC;IAMD;;OAEG;IACI,cAAc,CAAC,OAAY,EAAE,MAAe;QAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEvD,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO;QACX,CAAC;QAED,MAAM,eAAe,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAS,CAAC;QACd,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,SAAS;YACb,CAAC;YAED,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;iBAAM,IAAI,MAAM,EAAE,CAAC;gBAChB,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvC,CAAC;QAED,KAAK,MAAM,gBAAgB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACjD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,gBAAgB,CAAC,EAAE,CAAC;gBAC9E,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC/D,CAAC;QACL,CAAC;IACL,CAAC;IAMD;;OAEG;IACI,cAAc,CAAC,OAAY;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEvD,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO;QACX,CAAC;QAED,KAAK,MAAM,gBAAgB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACjD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,gBAAgB,CAAC,EAAE,CAAC;gBAC9E,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC/D,CAAC;QACL,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;IACL,CAAC;IAED,gBAAgB;IACT,OAAO;QACV,KAAK,MAAM,gBAAgB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACjD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,gBAAgB,CAAC,EAAE,CAAC;gBAC9E,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC;YACpD,CAAC;QACL,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpB,SAAS;YACb,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACzC,IAAU,IAAI,CAAC,6BAA8B,CAAC,UAAU,CAAC,EAAE,CAAC;gBAClD,IAAI,CAAC,6BAA8B,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;YACpE,CAAC;QACL,CAAC;IACL,CAAC;IAED,gBAAgB;IACT,MAAM;QACT,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,6BAA6B,GAAG,IAAI,KAAK,EAA2B,CAAC;IAC9E,CAAC;IAES,6BAA6B,CAAC,WAAmB;QACvD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,+KAA+K;QAC/K,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACpD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC;YAC5E,IAAI,aAAa,EAAE,CAAC;gBAChB,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,WAAW,CAAC;YAC3C,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACO,6BAA6B;QACnC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACpD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACjC,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACxE,IAAI,aAAa,EAAE,CAAC;gBAChB,KAAK,MAAM,WAAW,IAAI,aAAa,EAAE,CAAC;oBACtC,WAAW,CAAC,2BAA2B,GAAG,IAAI,CAAC;gBACnD,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,6DAA6D;IACtD,kBAAkB,CAAC,eAAgC;QACtD,wBAAwB;QACxB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;OAEG;IACI,OAAO;QACV,kCAAkC;IACtC,CAAC;CACJ;AA5PU;IADN,SAAS,EAAE;wDACS","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport { UniqueIdGenerator } from \"core/Misc/uniqueIdGenerator\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\nimport type { AbstractEngine } from \"../../Engines/abstractEngine\";\r\nimport type { PostProcessRenderEffect } from \"./postProcessRenderEffect\";\r\nimport type { IInspectable } from \"../../Misc/iInspectable\";\r\n\r\nimport type { PrePassRenderer } from \"../../Rendering/prePassRenderer\";\r\n\r\n/**\r\n * PostProcessRenderPipeline\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/postProcessRenderPipeline\r\n */\r\nexport class PostProcessRenderPipeline {\r\n protected _renderEffects: { [key: string]: PostProcessRenderEffect };\r\n protected _renderEffectsForIsolatedPass: PostProcessRenderEffect[];\r\n\r\n /**\r\n * List of inspectable custom properties (used by the Inspector)\r\n * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility\r\n */\r\n public inspectableCustomProperties: IInspectable[];\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _cameras: Camera[];\r\n\r\n /** @internal */\r\n @serialize()\r\n public _name: string;\r\n\r\n /**\r\n * Gets pipeline name\r\n */\r\n public get name(): string {\r\n return this._name;\r\n }\r\n\r\n /**\r\n * Gets the unique id of the post process rendering pipeline\r\n */\r\n public readonly uniqueId = UniqueIdGenerator.UniqueId;\r\n\r\n /** Gets the list of attached cameras */\r\n public get cameras() {\r\n return this._cameras;\r\n }\r\n\r\n /**\r\n * Gets the active engine\r\n */\r\n public get engine(): AbstractEngine {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * Initializes a PostProcessRenderPipeline\r\n * @param _engine engine to add the pipeline to\r\n * @param name name of the pipeline\r\n */\r\n constructor(\r\n private _engine: AbstractEngine,\r\n name: string\r\n ) {\r\n this._name = name;\r\n\r\n this._renderEffects = {};\r\n this._renderEffectsForIsolatedPass = new Array<PostProcessRenderEffect>();\r\n\r\n this._cameras = [];\r\n }\r\n\r\n /**\r\n * Gets the class name\r\n * @returns \"PostProcessRenderPipeline\"\r\n */\r\n public getClassName(): string {\r\n return \"PostProcessRenderPipeline\";\r\n }\r\n\r\n /**\r\n * If all the render effects in the pipeline are supported\r\n */\r\n public get isSupported(): boolean {\r\n for (const renderEffectName in this._renderEffects) {\r\n if (Object.prototype.hasOwnProperty.call(this._renderEffects, renderEffectName)) {\r\n if (!this._renderEffects[renderEffectName].isSupported) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Adds an effect to the pipeline\r\n * @param renderEffect the effect to add\r\n */\r\n public addEffect(renderEffect: PostProcessRenderEffect): void {\r\n (<any>this._renderEffects)[renderEffect._name] = renderEffect;\r\n }\r\n\r\n // private\r\n\r\n /** @internal */\r\n public _rebuild() {}\r\n\r\n /** @internal */\r\n public _enableEffect(renderEffectName: string, cameras: Camera): void;\r\n /** @internal */\r\n public _enableEffect(renderEffectName: string, cameras: Camera[]): void;\r\n /**\r\n * @internal\r\n */\r\n public _enableEffect(renderEffectName: string, cameras: any): void {\r\n const renderEffects: PostProcessRenderEffect = (<any>this._renderEffects)[renderEffectName];\r\n\r\n if (!renderEffects) {\r\n return;\r\n }\r\n\r\n renderEffects._enable(Tools.MakeArray(cameras || this._cameras));\r\n }\r\n\r\n /** @internal */\r\n public _disableEffect(renderEffectName: string, cameras: Nullable<Camera[]>): void;\r\n /** @internal */\r\n public _disableEffect(renderEffectName: string, cameras: Nullable<Camera[]>): void;\r\n /**\r\n * @internal\r\n */\r\n public _disableEffect(renderEffectName: string, cameras: Nullable<Camera[]>): void {\r\n const renderEffects: PostProcessRenderEffect = (<any>this._renderEffects)[renderEffectName];\r\n\r\n if (!renderEffects) {\r\n return;\r\n }\r\n\r\n renderEffects._disable(Tools.MakeArray(cameras || this._cameras));\r\n }\r\n\r\n /** @internal */\r\n public _attachCameras(cameras: Camera, unique: boolean): void;\r\n /** @internal */\r\n public _attachCameras(cameras: Camera[], unique: boolean): void;\r\n /**\r\n * @internal\r\n */\r\n public _attachCameras(cameras: any, unique: boolean): void {\r\n const cams = Tools.MakeArray(cameras || this._cameras);\r\n\r\n if (!cams) {\r\n return;\r\n }\r\n\r\n const indicesToDelete = [];\r\n let i: number;\r\n for (i = 0; i < cams.length; i++) {\r\n const camera = cams[i];\r\n if (!camera) {\r\n continue;\r\n }\r\n\r\n if (this._cameras.indexOf(camera) === -1) {\r\n this._cameras.push(camera);\r\n } else if (unique) {\r\n indicesToDelete.push(i);\r\n }\r\n }\r\n\r\n for (i = 0; i < indicesToDelete.length; i++) {\r\n cams.splice(indicesToDelete[i], 1);\r\n }\r\n\r\n for (const renderEffectName in this._renderEffects) {\r\n if (Object.prototype.hasOwnProperty.call(this._renderEffects, renderEffectName)) {\r\n this._renderEffects[renderEffectName]._attachCameras(cams);\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _detachCameras(cameras: Camera): void;\r\n /** @internal */\r\n public _detachCameras(cameras: Nullable<Camera[]>): void;\r\n /**\r\n * @internal\r\n */\r\n public _detachCameras(cameras: any): void {\r\n const cams = Tools.MakeArray(cameras || this._cameras);\r\n\r\n if (!cams) {\r\n return;\r\n }\r\n\r\n for (const renderEffectName in this._renderEffects) {\r\n if (Object.prototype.hasOwnProperty.call(this._renderEffects, renderEffectName)) {\r\n this._renderEffects[renderEffectName]._detachCameras(cams);\r\n }\r\n }\r\n\r\n for (let i = 0; i < cams.length; i++) {\r\n this._cameras.splice(this._cameras.indexOf(cams[i]), 1);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _update(): void {\r\n for (const renderEffectName in this._renderEffects) {\r\n if (Object.prototype.hasOwnProperty.call(this._renderEffects, renderEffectName)) {\r\n this._renderEffects[renderEffectName]._update();\r\n }\r\n }\r\n\r\n for (let i = 0; i < this._cameras.length; i++) {\r\n if (!this._cameras[i]) {\r\n continue;\r\n }\r\n const cameraName = this._cameras[i].name;\r\n if ((<any>this._renderEffectsForIsolatedPass)[cameraName]) {\r\n (<any>this._renderEffectsForIsolatedPass)[cameraName]._update();\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _reset(): void {\r\n this._renderEffects = {};\r\n this._renderEffectsForIsolatedPass = new Array<PostProcessRenderEffect>();\r\n }\r\n\r\n protected _enableMSAAOnFirstPostProcess(sampleCount: number): boolean {\r\n if (!this._engine._features.supportMSAA) {\r\n return false;\r\n }\r\n\r\n // Set samples of the very first post process to 4 to enable native anti-aliasing in browsers that support webGL 2.0 (See: https://github.com/BabylonJS/Babylon.js/issues/3754)\r\n const effectKeys = Object.keys(this._renderEffects);\r\n if (effectKeys.length > 0) {\r\n const postProcesses = this._renderEffects[effectKeys[0]].getPostProcesses();\r\n if (postProcesses) {\r\n postProcesses[0].samples = sampleCount;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Ensures that all post processes in the pipeline are the correct size according to the\r\n * the viewport's required size\r\n */\r\n protected _adaptPostProcessesToViewPort(): void {\r\n const effectKeys = Object.keys(this._renderEffects);\r\n for (const effectKey of effectKeys) {\r\n const postProcesses = this._renderEffects[effectKey].getPostProcesses();\r\n if (postProcesses) {\r\n for (const postProcess of postProcesses) {\r\n postProcess.adaptScaleToCurrentViewport = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets the required values to the prepass renderer.\r\n * @param prePassRenderer defines the prepass renderer to setup.\r\n * @returns true if the pre pass is needed.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public setPrePassRenderer(prePassRenderer: PrePassRenderer): boolean {\r\n // Do Nothing by default\r\n return false;\r\n }\r\n\r\n /**\r\n * Disposes of the pipeline\r\n */\r\n public dispose() {\r\n // Must be implemented by children\r\n }\r\n}\r\n"]}
@@ -1,16 +1,25 @@
1
- import type { Camera } from "../../Cameras/camera.js";
2
- import type { PostProcessRenderPipeline } from "./postProcessRenderPipeline.js";
1
+ import type { Camera, IReadonlyObservable, PostProcessRenderPipeline } from "../../index.js";
3
2
  /**
4
3
  * PostProcessRenderPipelineManager class
5
4
  * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/postProcessRenderPipeline
6
5
  */
7
6
  export declare class PostProcessRenderPipelineManager {
8
- private _renderPipelines;
7
+ private readonly _renderPipelines;
8
+ private readonly _onNewPipelineAddedObservable;
9
+ private readonly _onPipelineRemovedObservable;
9
10
  /**
10
11
  * Initializes a PostProcessRenderPipelineManager
11
12
  * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/postProcessRenderPipeline
12
13
  */
13
14
  constructor();
15
+ /**
16
+ * An event triggered when a pipeline is added to the manager
17
+ */
18
+ get onNewPipelineAddedObservable(): IReadonlyObservable<PostProcessRenderPipeline>;
19
+ /**
20
+ * An event triggered when a pipeline is removed from the manager
21
+ */
22
+ get onPipelineRemovedObservable(): IReadonlyObservable<PostProcessRenderPipeline>;
14
23
  /**
15
24
  * Gets the list of supported render pipelines
16
25
  */
@@ -1,3 +1,4 @@
1
+ import { Observable } from "../../Misc/observable.js";
1
2
  /**
2
3
  * PostProcessRenderPipelineManager class
3
4
  * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/postProcessRenderPipeline
@@ -9,6 +10,20 @@ export class PostProcessRenderPipelineManager {
9
10
  */
10
11
  constructor() {
11
12
  this._renderPipelines = {};
13
+ this._onNewPipelineAddedObservable = new Observable();
14
+ this._onPipelineRemovedObservable = new Observable();
15
+ }
16
+ /**
17
+ * An event triggered when a pipeline is added to the manager
18
+ */
19
+ get onNewPipelineAddedObservable() {
20
+ return this._onNewPipelineAddedObservable;
21
+ }
22
+ /**
23
+ * An event triggered when a pipeline is removed from the manager
24
+ */
25
+ get onPipelineRemovedObservable() {
26
+ return this._onPipelineRemovedObservable;
12
27
  }
13
28
  /**
14
29
  * Gets the list of supported render pipelines
@@ -30,14 +45,20 @@ export class PostProcessRenderPipelineManager {
30
45
  * @param renderPipeline The pipeline to add
31
46
  */
32
47
  addPipeline(renderPipeline) {
48
+ this.removePipeline(renderPipeline._name);
33
49
  this._renderPipelines[renderPipeline._name] = renderPipeline;
50
+ this._onNewPipelineAddedObservable.notifyObservers(renderPipeline);
34
51
  }
35
52
  /**
36
53
  * Remove the pipeline from the manager
37
54
  * @param renderPipelineName the name of the pipeline to remove
38
55
  */
39
56
  removePipeline(renderPipelineName) {
40
- delete this._renderPipelines[renderPipelineName];
57
+ const pipeline = this._renderPipelines[renderPipelineName];
58
+ if (pipeline) {
59
+ this._onPipelineRemovedObservable.notifyObservers(pipeline);
60
+ delete this._renderPipelines[renderPipelineName];
61
+ }
41
62
  }
42
63
  /**
43
64
  * Attaches a camera to the pipeline
@@ -1 +1 @@
1
- {"version":3,"file":"postProcessRenderPipelineManager.js","sourceRoot":"","sources":["../../../../../dev/core/src/PostProcesses/RenderPipeline/postProcessRenderPipelineManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Camera } from \"../../Cameras/camera\";\r\nimport type { PostProcessRenderPipeline } from \"./postProcessRenderPipeline\";\r\n/**\r\n * PostProcessRenderPipelineManager class\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/postProcessRenderPipeline\r\n */\r\nexport class PostProcessRenderPipelineManager {\r\n private _renderPipelines: { [Key: string]: PostProcessRenderPipeline };\r\n\r\n /**\r\n * Initializes a PostProcessRenderPipelineManager\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/postProcessRenderPipeline\r\n */\r\n constructor() {\r\n this._renderPipelines = {};\r\n }\r\n\r\n /**\r\n * Gets the list of supported render pipelines\r\n */\r\n public get supportedPipelines(): PostProcessRenderPipeline[] {\r\n const result = [];\r\n\r\n for (const renderPipelineName in this._renderPipelines) {\r\n if (Object.prototype.hasOwnProperty.call(this._renderPipelines, renderPipelineName)) {\r\n const pipeline = this._renderPipelines[renderPipelineName];\r\n if (pipeline.isSupported) {\r\n result.push(pipeline);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Adds a pipeline to the manager\r\n * @param renderPipeline The pipeline to add\r\n */\r\n public addPipeline(renderPipeline: PostProcessRenderPipeline): void {\r\n this._renderPipelines[renderPipeline._name] = renderPipeline;\r\n }\r\n\r\n /**\r\n * Remove the pipeline from the manager\r\n * @param renderPipelineName the name of the pipeline to remove\r\n */\r\n public removePipeline(renderPipelineName: string): void {\r\n delete this._renderPipelines[renderPipelineName];\r\n }\r\n\r\n /**\r\n * Attaches a camera to the pipeline\r\n * @param renderPipelineName The name of the pipeline to attach to\r\n * @param cameras the camera to attach\r\n * @param unique if the camera can be attached multiple times to the pipeline\r\n */\r\n public attachCamerasToRenderPipeline(renderPipelineName: string, cameras: Camera[] | Camera, unique: boolean = false): void {\r\n const renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];\r\n\r\n if (!renderPipeline) {\r\n return;\r\n }\r\n\r\n renderPipeline._attachCameras(cameras as Camera[], unique);\r\n }\r\n\r\n /**\r\n * Detaches a camera from the pipeline\r\n * @param renderPipelineName The name of the pipeline to detach from\r\n * @param cameras the camera to detach\r\n */\r\n public detachCamerasFromRenderPipeline(renderPipelineName: string, cameras: Camera[] | Camera): void {\r\n const renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];\r\n\r\n if (!renderPipeline) {\r\n return;\r\n }\r\n\r\n renderPipeline._detachCameras(cameras as Camera[]);\r\n }\r\n\r\n /**\r\n * Enables an effect by name on a pipeline\r\n * @param renderPipelineName the name of the pipeline to enable the effect in\r\n * @param renderEffectName the name of the effect to enable\r\n * @param cameras the cameras that the effect should be enabled on\r\n */\r\n public enableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera[] | Camera): void {\r\n const renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];\r\n\r\n if (!renderPipeline) {\r\n return;\r\n }\r\n\r\n renderPipeline._enableEffect(renderEffectName, cameras as Camera[]);\r\n }\r\n\r\n /**\r\n * Disables an effect by name on a pipeline\r\n * @param renderPipelineName the name of the pipeline to disable the effect in\r\n * @param renderEffectName the name of the effect to disable\r\n * @param cameras the cameras that the effect should be disabled on\r\n */\r\n public disableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera[] | Camera): void {\r\n const renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];\r\n\r\n if (!renderPipeline) {\r\n return;\r\n }\r\n\r\n renderPipeline._disableEffect(renderEffectName, cameras as Camera[]);\r\n }\r\n\r\n /**\r\n * Updates the state of all contained render pipelines and disposes of any non supported pipelines\r\n */\r\n public update(): void {\r\n for (const renderPipelineName in this._renderPipelines) {\r\n if (Object.prototype.hasOwnProperty.call(this._renderPipelines, renderPipelineName)) {\r\n const pipeline = this._renderPipelines[renderPipelineName];\r\n if (!pipeline.isSupported) {\r\n pipeline.dispose();\r\n delete this._renderPipelines[renderPipelineName];\r\n } else {\r\n pipeline._update();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n for (const renderPipelineName in this._renderPipelines) {\r\n if (Object.prototype.hasOwnProperty.call(this._renderPipelines, renderPipelineName)) {\r\n const pipeline = this._renderPipelines[renderPipelineName];\r\n pipeline._rebuild();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the manager and pipelines\r\n */\r\n public dispose(): void {\r\n for (const renderPipelineName in this._renderPipelines) {\r\n if (Object.prototype.hasOwnProperty.call(this._renderPipelines, renderPipelineName)) {\r\n const pipeline = this._renderPipelines[renderPipelineName];\r\n pipeline.dispose();\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"postProcessRenderPipelineManager.js","sourceRoot":"","sources":["../../../../../dev/core/src/PostProcesses/RenderPipeline/postProcessRenderPipelineManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Camera, IReadonlyObservable, PostProcessRenderPipeline } from \"core/index\";\r\n\r\nimport { Observable } from \"../../Misc/observable\";\r\n\r\n/**\r\n * PostProcessRenderPipelineManager class\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/postProcessRenderPipeline\r\n */\r\nexport class PostProcessRenderPipelineManager {\r\n private readonly _renderPipelines: { [Key: string]: PostProcessRenderPipeline } = {};\r\n private readonly _onNewPipelineAddedObservable = new Observable<PostProcessRenderPipeline>();\r\n private readonly _onPipelineRemovedObservable = new Observable<PostProcessRenderPipeline>();\r\n\r\n /**\r\n * Initializes a PostProcessRenderPipelineManager\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/postProcessRenderPipeline\r\n */\r\n constructor() {}\r\n\r\n /**\r\n * An event triggered when a pipeline is added to the manager\r\n */\r\n public get onNewPipelineAddedObservable(): IReadonlyObservable<PostProcessRenderPipeline> {\r\n return this._onNewPipelineAddedObservable;\r\n }\r\n\r\n /**\r\n * An event triggered when a pipeline is removed from the manager\r\n */\r\n public get onPipelineRemovedObservable(): IReadonlyObservable<PostProcessRenderPipeline> {\r\n return this._onPipelineRemovedObservable;\r\n }\r\n\r\n /**\r\n * Gets the list of supported render pipelines\r\n */\r\n public get supportedPipelines(): PostProcessRenderPipeline[] {\r\n const result = [];\r\n\r\n for (const renderPipelineName in this._renderPipelines) {\r\n if (Object.prototype.hasOwnProperty.call(this._renderPipelines, renderPipelineName)) {\r\n const pipeline = this._renderPipelines[renderPipelineName];\r\n if (pipeline.isSupported) {\r\n result.push(pipeline);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Adds a pipeline to the manager\r\n * @param renderPipeline The pipeline to add\r\n */\r\n public addPipeline(renderPipeline: PostProcessRenderPipeline): void {\r\n this.removePipeline(renderPipeline._name);\r\n this._renderPipelines[renderPipeline._name] = renderPipeline;\r\n this._onNewPipelineAddedObservable.notifyObservers(renderPipeline);\r\n }\r\n\r\n /**\r\n * Remove the pipeline from the manager\r\n * @param renderPipelineName the name of the pipeline to remove\r\n */\r\n public removePipeline(renderPipelineName: string): void {\r\n const pipeline = this._renderPipelines[renderPipelineName];\r\n if (pipeline) {\r\n this._onPipelineRemovedObservable.notifyObservers(pipeline);\r\n delete this._renderPipelines[renderPipelineName];\r\n }\r\n }\r\n\r\n /**\r\n * Attaches a camera to the pipeline\r\n * @param renderPipelineName The name of the pipeline to attach to\r\n * @param cameras the camera to attach\r\n * @param unique if the camera can be attached multiple times to the pipeline\r\n */\r\n public attachCamerasToRenderPipeline(renderPipelineName: string, cameras: Camera[] | Camera, unique: boolean = false): void {\r\n const renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];\r\n\r\n if (!renderPipeline) {\r\n return;\r\n }\r\n\r\n renderPipeline._attachCameras(cameras as Camera[], unique);\r\n }\r\n\r\n /**\r\n * Detaches a camera from the pipeline\r\n * @param renderPipelineName The name of the pipeline to detach from\r\n * @param cameras the camera to detach\r\n */\r\n public detachCamerasFromRenderPipeline(renderPipelineName: string, cameras: Camera[] | Camera): void {\r\n const renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];\r\n\r\n if (!renderPipeline) {\r\n return;\r\n }\r\n\r\n renderPipeline._detachCameras(cameras as Camera[]);\r\n }\r\n\r\n /**\r\n * Enables an effect by name on a pipeline\r\n * @param renderPipelineName the name of the pipeline to enable the effect in\r\n * @param renderEffectName the name of the effect to enable\r\n * @param cameras the cameras that the effect should be enabled on\r\n */\r\n public enableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera[] | Camera): void {\r\n const renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];\r\n\r\n if (!renderPipeline) {\r\n return;\r\n }\r\n\r\n renderPipeline._enableEffect(renderEffectName, cameras as Camera[]);\r\n }\r\n\r\n /**\r\n * Disables an effect by name on a pipeline\r\n * @param renderPipelineName the name of the pipeline to disable the effect in\r\n * @param renderEffectName the name of the effect to disable\r\n * @param cameras the cameras that the effect should be disabled on\r\n */\r\n public disableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera[] | Camera): void {\r\n const renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];\r\n\r\n if (!renderPipeline) {\r\n return;\r\n }\r\n\r\n renderPipeline._disableEffect(renderEffectName, cameras as Camera[]);\r\n }\r\n\r\n /**\r\n * Updates the state of all contained render pipelines and disposes of any non supported pipelines\r\n */\r\n public update(): void {\r\n for (const renderPipelineName in this._renderPipelines) {\r\n if (Object.prototype.hasOwnProperty.call(this._renderPipelines, renderPipelineName)) {\r\n const pipeline = this._renderPipelines[renderPipelineName];\r\n if (!pipeline.isSupported) {\r\n pipeline.dispose();\r\n delete this._renderPipelines[renderPipelineName];\r\n } else {\r\n pipeline._update();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n for (const renderPipelineName in this._renderPipelines) {\r\n if (Object.prototype.hasOwnProperty.call(this._renderPipelines, renderPipelineName)) {\r\n const pipeline = this._renderPipelines[renderPipelineName];\r\n pipeline._rebuild();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the manager and pipelines\r\n */\r\n public dispose(): void {\r\n for (const renderPipelineName in this._renderPipelines) {\r\n if (Object.prototype.hasOwnProperty.call(this._renderPipelines, renderPipelineName)) {\r\n const pipeline = this._renderPipelines[renderPipelineName];\r\n pipeline.dispose();\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -21,14 +21,18 @@ export class ThinPassPostProcess extends EffectWrapper {
21
21
  * @param options Options to configure the effect
22
22
  */
23
23
  constructor(name, engine = null, options) {
24
- super({
25
- ...options,
24
+ const localOptions = {
26
25
  name,
27
26
  engine: engine || Engine.LastCreatedEngine,
28
27
  useShaderStore: true,
29
28
  useAsPostProcess: true,
30
29
  fragmentShader: ThinPassPostProcess.FragmentUrl,
31
- });
30
+ ...options,
31
+ };
32
+ if (!localOptions.engine) {
33
+ localOptions.engine = Engine.LastCreatedEngine;
34
+ }
35
+ super(localOptions);
32
36
  }
33
37
  }
34
38
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"thinPassPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinPassPostProcess.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, EffectWrapperCreationOptions, AbstractEngine } from \"core/index\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer\";\r\nimport { Engine } from \"../Engines/engine\";\r\n\r\n/**\r\n * PassPostProcess which produces an output the same as it's input\r\n */\r\nexport class ThinPassPostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"pass\";\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(Promise.all([import(\"../ShadersWGSL/pass.fragment\")]));\r\n } else {\r\n list.push(Promise.all([import(\"../Shaders/pass.fragment\")]));\r\n }\r\n\r\n super._gatherImports(useWebGPU, list);\r\n }\r\n\r\n /**\r\n * Constructs a new pass post process\r\n * @param name Name of the effect\r\n * @param engine Engine to use to render the effect. If not provided, the last created engine will be used\r\n * @param options Options to configure the effect\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: ThinPassPostProcess.FragmentUrl,\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * PassCubePostProcess which produces an output the same as it's input (which must be a cube texture)\r\n */\r\nexport class ThinPassCubePostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"passCube\";\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(Promise.all([import(\"../ShadersWGSL/passCube.fragment\")]));\r\n } else {\r\n list.push(Promise.all([import(\"../Shaders/passCube.fragment\")]));\r\n }\r\n\r\n super._gatherImports(useWebGPU, list);\r\n }\r\n\r\n /**\r\n * Creates the PassCubePostProcess\r\n * @param name Name of the effect\r\n * @param engine Engine to use to render the effect. If not provided, the last created engine will be used\r\n * @param options Options to configure the effect\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: ThinPassCubePostProcess.FragmentUrl,\r\n defines: \"#define POSITIVEX\",\r\n });\r\n }\r\n\r\n private _face = 0;\r\n\r\n /**\r\n * Gets or sets the cube face to display.\r\n * * 0 is +X\r\n * * 1 is -X\r\n * * 2 is +Y\r\n * * 3 is -Y\r\n * * 4 is +Z\r\n * * 5 is -Z\r\n */\r\n public get face(): number {\r\n return this._face;\r\n }\r\n\r\n public set face(value: number) {\r\n if (value < 0 || value > 5) {\r\n return;\r\n }\r\n\r\n this._face = value;\r\n switch (this._face) {\r\n case 0:\r\n this.updateEffect(\"#define POSITIVEX\");\r\n break;\r\n case 1:\r\n this.updateEffect(\"#define NEGATIVEX\");\r\n break;\r\n case 2:\r\n this.updateEffect(\"#define POSITIVEY\");\r\n break;\r\n case 3:\r\n this.updateEffect(\"#define NEGATIVEY\");\r\n break;\r\n case 4:\r\n this.updateEffect(\"#define POSITIVEZ\");\r\n break;\r\n case 5:\r\n this.updateEffect(\"#define NEGATIVEZ\");\r\n break;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"thinPassPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinPassPostProcess.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, EffectWrapperCreationOptions, AbstractEngine } from \"core/index\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer\";\r\nimport { Engine } from \"../Engines/engine\";\r\n\r\n/**\r\n * PassPostProcess which produces an output the same as it's input\r\n */\r\nexport class ThinPassPostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"pass\";\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(Promise.all([import(\"../ShadersWGSL/pass.fragment\")]));\r\n } else {\r\n list.push(Promise.all([import(\"../Shaders/pass.fragment\")]));\r\n }\r\n\r\n super._gatherImports(useWebGPU, list);\r\n }\r\n\r\n /**\r\n * Constructs a new pass post process\r\n * @param name Name of the effect\r\n * @param engine Engine to use to render the effect. If not provided, the last created engine will be used\r\n * @param options Options to configure the effect\r\n */\r\n constructor(name: string, engine: Nullable<AbstractEngine> = null, options?: EffectWrapperCreationOptions) {\r\n const localOptions: EffectWrapperCreationOptions = {\r\n name,\r\n engine: engine || Engine.LastCreatedEngine!,\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinPassPostProcess.FragmentUrl,\r\n ...options,\r\n };\r\n\r\n if (!localOptions.engine) {\r\n localOptions.engine = Engine.LastCreatedEngine!;\r\n }\r\n\r\n super(localOptions);\r\n }\r\n}\r\n\r\n/**\r\n * PassCubePostProcess which produces an output the same as it's input (which must be a cube texture)\r\n */\r\nexport class ThinPassCubePostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"passCube\";\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(Promise.all([import(\"../ShadersWGSL/passCube.fragment\")]));\r\n } else {\r\n list.push(Promise.all([import(\"../Shaders/passCube.fragment\")]));\r\n }\r\n\r\n super._gatherImports(useWebGPU, list);\r\n }\r\n\r\n /**\r\n * Creates the PassCubePostProcess\r\n * @param name Name of the effect\r\n * @param engine Engine to use to render the effect. If not provided, the last created engine will be used\r\n * @param options Options to configure the effect\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: ThinPassCubePostProcess.FragmentUrl,\r\n defines: \"#define POSITIVEX\",\r\n });\r\n }\r\n\r\n private _face = 0;\r\n\r\n /**\r\n * Gets or sets the cube face to display.\r\n * * 0 is +X\r\n * * 1 is -X\r\n * * 2 is +Y\r\n * * 3 is -Y\r\n * * 4 is +Z\r\n * * 5 is -Z\r\n */\r\n public get face(): number {\r\n return this._face;\r\n }\r\n\r\n public set face(value: number) {\r\n if (value < 0 || value > 5) {\r\n return;\r\n }\r\n\r\n this._face = value;\r\n switch (this._face) {\r\n case 0:\r\n this.updateEffect(\"#define POSITIVEX\");\r\n break;\r\n case 1:\r\n this.updateEffect(\"#define NEGATIVEX\");\r\n break;\r\n case 2:\r\n this.updateEffect(\"#define POSITIVEY\");\r\n break;\r\n case 3:\r\n this.updateEffect(\"#define NEGATIVEY\");\r\n break;\r\n case 4:\r\n this.updateEffect(\"#define POSITIVEZ\");\r\n break;\r\n case 5:\r\n this.updateEffect(\"#define NEGATIVEZ\");\r\n break;\r\n }\r\n }\r\n}\r\n"]}
@@ -1,5 +1,6 @@
1
1
  import type { Nullable, AbstractEngine, EffectWrapperCreationOptions } from "../index.js";
2
2
  import { Camera } from "../Cameras/camera.js";
3
+ import { Vector2 } from "../Maths/math.vector.js";
3
4
  import { EffectWrapper } from "../Materials/effectRenderer.js";
4
5
  /**
5
6
  * Simple implementation of Temporal Anti-Aliasing (TAA).
@@ -56,6 +57,20 @@ export declare class ThinTAAPostProcess extends EffectWrapper {
56
57
  * You generally want to keep this enabled, otherwise you will get a ghost effect when the camera moves (but if it's what you want, go for it!)
57
58
  */
58
59
  disableOnCameraMove: boolean;
60
+ private _reprojectHistory;
61
+ /**
62
+ * Enables reprojecting the history texture with a per-pixel velocity.
63
+ * If set the "velocitySampler" has to be provided.
64
+ */
65
+ get reprojectHistory(): boolean;
66
+ set reprojectHistory(reproject: boolean);
67
+ private _clampHistory;
68
+ /**
69
+ * Clamps the history pixel to the min and max of the 3x3 pixels surrounding the target pixel.
70
+ * This can help further reduce ghosting and artifacts.
71
+ */
72
+ get clampHistory(): boolean;
73
+ set clampHistory(clamp: boolean);
59
74
  private _hs;
60
75
  private _firstUpdate;
61
76
  /**
@@ -67,6 +82,8 @@ export declare class ThinTAAPostProcess extends EffectWrapper {
67
82
  constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
68
83
  /** @internal */
69
84
  _reset(): void;
85
+ nextJitterOffset(output?: Vector2): Vector2;
70
86
  updateProjectionMatrix(): void;
71
87
  bind(noDefaultBindings?: boolean): void;
88
+ private _updateEffect;
72
89
  }