@babylonjs/core 7.32.3 → 7.32.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/Engines/abstractEngine.js +2 -2
  2. package/Engines/abstractEngine.js.map +1 -1
  3. package/Misc/webRequest.d.ts +4 -0
  4. package/Misc/webRequest.js +6 -0
  5. package/Misc/webRequest.js.map +1 -1
  6. package/Rendering/IBLShadows/iblShadowsAccumulationPass.d.ts +35 -11
  7. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +131 -117
  8. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -1
  9. package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js +0 -1
  10. package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js.map +1 -1
  11. package/Rendering/IBLShadows/iblShadowsPluginMaterial.d.ts +60 -0
  12. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js +166 -0
  13. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js.map +1 -0
  14. package/Rendering/IBLShadows/iblShadowsRenderPipeline.d.ts +97 -56
  15. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +356 -308
  16. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  17. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.d.ts +20 -6
  18. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js +67 -35
  19. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js.map +1 -1
  20. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.d.ts +9 -4
  21. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +84 -66
  22. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  23. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.d.ts +31 -6
  24. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +108 -60
  25. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
  26. package/Rendering/geometryBufferRenderer.d.ts +15 -0
  27. package/Rendering/geometryBufferRenderer.js +48 -5
  28. package/Rendering/geometryBufferRenderer.js.map +1 -1
  29. package/Shaders/ShadersInclude/instancesDeclaration.js +2 -4
  30. package/Shaders/ShadersInclude/instancesDeclaration.js.map +1 -1
  31. package/Shaders/ShadersInclude/instancesVertex.js +3 -6
  32. package/Shaders/ShadersInclude/instancesVertex.js.map +1 -1
  33. package/Shaders/geometry.fragment.js +5 -1
  34. package/Shaders/geometry.fragment.js.map +1 -1
  35. package/Shaders/geometry.vertex.js +3 -3
  36. package/Shaders/geometry.vertex.js.map +1 -1
  37. package/Shaders/iblShadowAccumulation.fragment.js +7 -11
  38. package/Shaders/iblShadowAccumulation.fragment.js.map +1 -1
  39. package/Shaders/iblShadowGBufferDebug.fragment.js +2 -3
  40. package/Shaders/iblShadowGBufferDebug.fragment.js.map +1 -1
  41. package/Shaders/iblShadowSpatialBlur.fragment.js +5 -5
  42. package/Shaders/iblShadowSpatialBlur.fragment.js.map +1 -1
  43. package/Shaders/iblShadowVoxelTracing.fragment.js +31 -32
  44. package/Shaders/iblShadowVoxelTracing.fragment.js.map +1 -1
  45. package/Shaders/iblShadowsCombine.fragment.js +2 -2
  46. package/Shaders/iblShadowsCombine.fragment.js.map +1 -1
  47. package/ShadersWGSL/ShadersInclude/instancesDeclaration.js +2 -4
  48. package/ShadersWGSL/ShadersInclude/instancesDeclaration.js.map +1 -1
  49. package/ShadersWGSL/ShadersInclude/instancesVertex.js +3 -6
  50. package/ShadersWGSL/ShadersInclude/instancesVertex.js.map +1 -1
  51. package/ShadersWGSL/geometry.fragment.js +7 -1
  52. package/ShadersWGSL/geometry.fragment.js.map +1 -1
  53. package/ShadersWGSL/geometry.vertex.js +3 -3
  54. package/ShadersWGSL/geometry.vertex.js.map +1 -1
  55. package/ShadersWGSL/iblShadowAccumulation.fragment.js +5 -10
  56. package/ShadersWGSL/iblShadowAccumulation.fragment.js.map +1 -1
  57. package/ShadersWGSL/iblShadowGBufferDebug.fragment.js +2 -3
  58. package/ShadersWGSL/iblShadowGBufferDebug.fragment.js.map +1 -1
  59. package/ShadersWGSL/iblShadowSpatialBlur.fragment.js +5 -5
  60. package/ShadersWGSL/iblShadowSpatialBlur.fragment.js.map +1 -1
  61. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js +45 -33
  62. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js.map +1 -1
  63. package/ShadersWGSL/iblShadowsCombine.fragment.js +6 -2
  64. package/ShadersWGSL/iblShadowsCombine.fragment.js.map +1 -1
  65. package/package.json +1 -1
@@ -26,6 +26,10 @@ export declare class WebRequest implements IWebRequest {
26
26
  */
27
27
  static get IsCustomRequestAvailable(): boolean;
28
28
  private _requestURL;
29
+ /**
30
+ * Returns the requested URL once open has been called
31
+ */
32
+ get requestURL(): string;
29
33
  private _injectCustomRequestHeaders;
30
34
  private _shouldSkipRequestModifications;
31
35
  /**
@@ -24,6 +24,12 @@ export class WebRequest {
24
24
  static get IsCustomRequestAvailable() {
25
25
  return Object.keys(WebRequest.CustomRequestHeaders).length > 0 || WebRequest.CustomRequestModifiers.length > 0;
26
26
  }
27
+ /**
28
+ * Returns the requested URL once open has been called
29
+ */
30
+ get requestURL() {
31
+ return this._requestURL;
32
+ }
27
33
  _injectCustomRequestHeaders() {
28
34
  if (this._shouldSkipRequestModifications(this._requestURL)) {
29
35
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"webRequest.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/webRequest.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IWebRequest } from \"./interfaces/iWebRequest\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { INative } from \"../Engines/Native/nativeInterfaces\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare const _native: INative;\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nfunction createXMLHttpRequest(): XMLHttpRequest {\r\n // If running in Babylon Native, then defer to the native XMLHttpRequest, which has the same public contract\r\n if (typeof _native !== \"undefined\" && _native.XMLHttpRequest) {\r\n return new _native.XMLHttpRequest();\r\n } else {\r\n return new XMLHttpRequest();\r\n }\r\n}\r\n\r\n/**\r\n * Extended version of XMLHttpRequest with support for customizations (headers, ...)\r\n */\r\nexport class WebRequest implements IWebRequest {\r\n private readonly _xhr = createXMLHttpRequest();\r\n\r\n /**\r\n * Custom HTTP Request Headers to be sent with XMLHttpRequests\r\n * i.e. when loading files, where the server/service expects an Authorization header\r\n */\r\n public static CustomRequestHeaders: { [key: string]: string } = {};\r\n\r\n /**\r\n * Add callback functions in this array to update all the requests before they get sent to the network\r\n */\r\n public static CustomRequestModifiers = new Array<(request: XMLHttpRequest, url: string) => void>();\r\n\r\n /**\r\n * If set to true, requests to Babylon.js CDN requests will not be modified\r\n */\r\n public static SkipRequestModificationForBabylonCDN = true;\r\n\r\n /**\r\n * This function can be called to check if there are request modifiers for network requests\r\n * @returns true if there are any custom requests available\r\n */\r\n public static get IsCustomRequestAvailable(): boolean {\r\n return Object.keys(WebRequest.CustomRequestHeaders).length > 0 || WebRequest.CustomRequestModifiers.length > 0;\r\n }\r\n\r\n private _requestURL: string = \"\";\r\n\r\n private _injectCustomRequestHeaders(): void {\r\n if (this._shouldSkipRequestModifications(this._requestURL)) {\r\n return;\r\n }\r\n for (const key in WebRequest.CustomRequestHeaders) {\r\n const val = WebRequest.CustomRequestHeaders[key];\r\n if (val) {\r\n this._xhr.setRequestHeader(key, val);\r\n }\r\n }\r\n }\r\n\r\n private _shouldSkipRequestModifications(url: string): boolean {\r\n return WebRequest.SkipRequestModificationForBabylonCDN && (url.includes(\"preview.babylonjs.com\") || url.includes(\"cdn.babylonjs.com\"));\r\n }\r\n\r\n /**\r\n * Gets or sets a function to be called when loading progress changes\r\n */\r\n public get onprogress(): ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null {\r\n return this._xhr.onprogress;\r\n }\r\n\r\n public set onprogress(value: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null) {\r\n this._xhr.onprogress = value;\r\n }\r\n\r\n /**\r\n * Returns client's state\r\n */\r\n public get readyState(): number {\r\n return this._xhr.readyState;\r\n }\r\n\r\n /**\r\n * Returns client's status\r\n */\r\n public get status(): number {\r\n return this._xhr.status;\r\n }\r\n\r\n /**\r\n * Returns client's status as a text\r\n */\r\n public get statusText(): string {\r\n return this._xhr.statusText;\r\n }\r\n\r\n /**\r\n * Returns client's response\r\n */\r\n public get response(): any {\r\n return this._xhr.response;\r\n }\r\n\r\n /**\r\n * Returns client's response url\r\n */\r\n public get responseURL(): string {\r\n return this._xhr.responseURL;\r\n }\r\n\r\n /**\r\n * Returns client's response as text\r\n */\r\n public get responseText(): string {\r\n return this._xhr.responseText;\r\n }\r\n\r\n /**\r\n * Gets or sets the expected response type\r\n */\r\n public get responseType(): XMLHttpRequestResponseType {\r\n return this._xhr.responseType;\r\n }\r\n\r\n public set responseType(value: XMLHttpRequestResponseType) {\r\n this._xhr.responseType = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the timeout value in milliseconds\r\n */\r\n public get timeout(): number {\r\n return this._xhr.timeout;\r\n }\r\n\r\n public set timeout(value: number) {\r\n this._xhr.timeout = value;\r\n }\r\n\r\n /** @internal */\r\n public addEventListener<K extends keyof XMLHttpRequestEventMap>(\r\n type: K,\r\n listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any,\r\n options?: boolean | AddEventListenerOptions\r\n ): void;\r\n public addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void {\r\n this._xhr.addEventListener(type, listener, options);\r\n }\r\n\r\n /** @internal */\r\n public removeEventListener<K extends keyof XMLHttpRequestEventMap>(\r\n type: K,\r\n listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any,\r\n options?: boolean | EventListenerOptions\r\n ): void;\r\n public removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void {\r\n this._xhr.removeEventListener(type, listener, options);\r\n }\r\n\r\n /**\r\n * Cancels any network activity\r\n */\r\n public abort() {\r\n this._xhr.abort();\r\n }\r\n\r\n /**\r\n * Initiates the request. The optional argument provides the request body. The argument is ignored if request method is GET or HEAD\r\n * @param body defines an optional request body\r\n */\r\n public send(body?: Document | XMLHttpRequestBodyInit | null): void {\r\n if (WebRequest.CustomRequestHeaders) {\r\n this._injectCustomRequestHeaders();\r\n }\r\n\r\n this._xhr.send(body);\r\n }\r\n\r\n /**\r\n * Sets the request method, request URL\r\n * @param method defines the method to use (GET, POST, etc..)\r\n * @param url defines the url to connect with\r\n */\r\n public open(method: string, url: string): void {\r\n for (const update of WebRequest.CustomRequestModifiers) {\r\n if (this._shouldSkipRequestModifications(url)) {\r\n return;\r\n }\r\n update(this._xhr, url);\r\n }\r\n\r\n // Clean url\r\n url = url.replace(\"file:http:\", \"http:\");\r\n url = url.replace(\"file:https:\", \"https:\");\r\n\r\n this._requestURL = url;\r\n\r\n this._xhr.open(method, url, true);\r\n }\r\n\r\n /**\r\n * Sets the value of a request header.\r\n * @param name The name of the header whose value is to be set\r\n * @param value The value to set as the body of the header\r\n */\r\n setRequestHeader(name: string, value: string): void {\r\n this._xhr.setRequestHeader(name, value);\r\n }\r\n\r\n /**\r\n * Get the string containing the text of a particular header's value.\r\n * @param name The name of the header\r\n * @returns The string containing the text of the given header name\r\n */\r\n getResponseHeader(name: string): Nullable<string> {\r\n return this._xhr.getResponseHeader(name);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webRequest.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/webRequest.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IWebRequest } from \"./interfaces/iWebRequest\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { INative } from \"../Engines/Native/nativeInterfaces\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare const _native: INative;\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nfunction createXMLHttpRequest(): XMLHttpRequest {\r\n // If running in Babylon Native, then defer to the native XMLHttpRequest, which has the same public contract\r\n if (typeof _native !== \"undefined\" && _native.XMLHttpRequest) {\r\n return new _native.XMLHttpRequest();\r\n } else {\r\n return new XMLHttpRequest();\r\n }\r\n}\r\n\r\n/**\r\n * Extended version of XMLHttpRequest with support for customizations (headers, ...)\r\n */\r\nexport class WebRequest implements IWebRequest {\r\n private readonly _xhr = createXMLHttpRequest();\r\n\r\n /**\r\n * Custom HTTP Request Headers to be sent with XMLHttpRequests\r\n * i.e. when loading files, where the server/service expects an Authorization header\r\n */\r\n public static CustomRequestHeaders: { [key: string]: string } = {};\r\n\r\n /**\r\n * Add callback functions in this array to update all the requests before they get sent to the network\r\n */\r\n public static CustomRequestModifiers = new Array<(request: XMLHttpRequest, url: string) => void>();\r\n\r\n /**\r\n * If set to true, requests to Babylon.js CDN requests will not be modified\r\n */\r\n public static SkipRequestModificationForBabylonCDN = true;\r\n\r\n /**\r\n * This function can be called to check if there are request modifiers for network requests\r\n * @returns true if there are any custom requests available\r\n */\r\n public static get IsCustomRequestAvailable(): boolean {\r\n return Object.keys(WebRequest.CustomRequestHeaders).length > 0 || WebRequest.CustomRequestModifiers.length > 0;\r\n }\r\n\r\n private _requestURL: string = \"\";\r\n\r\n /**\r\n * Returns the requested URL once open has been called\r\n */\r\n public get requestURL(): string {\r\n return this._requestURL;\r\n }\r\n\r\n private _injectCustomRequestHeaders(): void {\r\n if (this._shouldSkipRequestModifications(this._requestURL)) {\r\n return;\r\n }\r\n for (const key in WebRequest.CustomRequestHeaders) {\r\n const val = WebRequest.CustomRequestHeaders[key];\r\n if (val) {\r\n this._xhr.setRequestHeader(key, val);\r\n }\r\n }\r\n }\r\n\r\n private _shouldSkipRequestModifications(url: string): boolean {\r\n return WebRequest.SkipRequestModificationForBabylonCDN && (url.includes(\"preview.babylonjs.com\") || url.includes(\"cdn.babylonjs.com\"));\r\n }\r\n\r\n /**\r\n * Gets or sets a function to be called when loading progress changes\r\n */\r\n public get onprogress(): ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null {\r\n return this._xhr.onprogress;\r\n }\r\n\r\n public set onprogress(value: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null) {\r\n this._xhr.onprogress = value;\r\n }\r\n\r\n /**\r\n * Returns client's state\r\n */\r\n public get readyState(): number {\r\n return this._xhr.readyState;\r\n }\r\n\r\n /**\r\n * Returns client's status\r\n */\r\n public get status(): number {\r\n return this._xhr.status;\r\n }\r\n\r\n /**\r\n * Returns client's status as a text\r\n */\r\n public get statusText(): string {\r\n return this._xhr.statusText;\r\n }\r\n\r\n /**\r\n * Returns client's response\r\n */\r\n public get response(): any {\r\n return this._xhr.response;\r\n }\r\n\r\n /**\r\n * Returns client's response url\r\n */\r\n public get responseURL(): string {\r\n return this._xhr.responseURL;\r\n }\r\n\r\n /**\r\n * Returns client's response as text\r\n */\r\n public get responseText(): string {\r\n return this._xhr.responseText;\r\n }\r\n\r\n /**\r\n * Gets or sets the expected response type\r\n */\r\n public get responseType(): XMLHttpRequestResponseType {\r\n return this._xhr.responseType;\r\n }\r\n\r\n public set responseType(value: XMLHttpRequestResponseType) {\r\n this._xhr.responseType = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the timeout value in milliseconds\r\n */\r\n public get timeout(): number {\r\n return this._xhr.timeout;\r\n }\r\n\r\n public set timeout(value: number) {\r\n this._xhr.timeout = value;\r\n }\r\n\r\n /** @internal */\r\n public addEventListener<K extends keyof XMLHttpRequestEventMap>(\r\n type: K,\r\n listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any,\r\n options?: boolean | AddEventListenerOptions\r\n ): void;\r\n public addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void {\r\n this._xhr.addEventListener(type, listener, options);\r\n }\r\n\r\n /** @internal */\r\n public removeEventListener<K extends keyof XMLHttpRequestEventMap>(\r\n type: K,\r\n listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any,\r\n options?: boolean | EventListenerOptions\r\n ): void;\r\n public removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void {\r\n this._xhr.removeEventListener(type, listener, options);\r\n }\r\n\r\n /**\r\n * Cancels any network activity\r\n */\r\n public abort() {\r\n this._xhr.abort();\r\n }\r\n\r\n /**\r\n * Initiates the request. The optional argument provides the request body. The argument is ignored if request method is GET or HEAD\r\n * @param body defines an optional request body\r\n */\r\n public send(body?: Document | XMLHttpRequestBodyInit | null): void {\r\n if (WebRequest.CustomRequestHeaders) {\r\n this._injectCustomRequestHeaders();\r\n }\r\n\r\n this._xhr.send(body);\r\n }\r\n\r\n /**\r\n * Sets the request method, request URL\r\n * @param method defines the method to use (GET, POST, etc..)\r\n * @param url defines the url to connect with\r\n */\r\n public open(method: string, url: string): void {\r\n for (const update of WebRequest.CustomRequestModifiers) {\r\n if (this._shouldSkipRequestModifications(url)) {\r\n return;\r\n }\r\n update(this._xhr, url);\r\n }\r\n\r\n // Clean url\r\n url = url.replace(\"file:http:\", \"http:\");\r\n url = url.replace(\"file:https:\", \"https:\");\r\n\r\n this._requestURL = url;\r\n\r\n this._xhr.open(method, url, true);\r\n }\r\n\r\n /**\r\n * Sets the value of a request header.\r\n * @param name The name of the header whose value is to be set\r\n * @param value The value to set as the body of the header\r\n */\r\n setRequestHeader(name: string, value: string): void {\r\n this._xhr.setRequestHeader(name, value);\r\n }\r\n\r\n /**\r\n * Get the string containing the text of a particular header's value.\r\n * @param name The name of the header\r\n * @returns The string containing the text of the given header name\r\n */\r\n getResponseHeader(name: string): Nullable<string> {\r\n return this._xhr.getResponseHeader(name);\r\n }\r\n}\r\n"]}
@@ -1,6 +1,8 @@
1
1
  import type { Scene } from "../../scene";
2
2
  import { PostProcess } from "../../PostProcesses/postProcess";
3
- import type { Effect } from "../../Materials/effect";
3
+ import { ProceduralTexture } from "../../Materials/Textures/Procedurals/proceduralTexture.js";
4
+ import type { IblShadowsRenderPipeline } from "./iblShadowsRenderPipeline";
5
+ import { Observable } from "../../Misc/observable";
4
6
  /**
5
7
  * This should not be instanciated directly, as it is part of a scene component
6
8
  * @internal
@@ -8,16 +10,26 @@ import type { Effect } from "../../Materials/effect";
8
10
  export declare class _IblShadowsAccumulationPass {
9
11
  private _scene;
10
12
  private _engine;
11
- private _outputPP;
12
- private _oldAccumulationRT;
13
- private _oldLocalPositionRT;
13
+ private _renderPipeline;
14
+ private _outputTexture;
15
+ private _oldAccumulationCopy;
16
+ private _oldPositionCopy;
17
+ private _accumulationParams;
14
18
  /** Enable the debug view for this pass */
15
19
  debugEnabled: boolean;
16
20
  /**
17
- * Gets the pass post process
18
- * @returns The post process
21
+ * Is the effect enabled
22
+ */
23
+ enabled: boolean;
24
+ /**
25
+ * Returns the output texture of the pass.
26
+ * @returns The output texture.
27
+ */
28
+ getOutputTexture(): ProceduralTexture;
29
+ /**
30
+ * Observable that triggers when the accumulation texture is ready
19
31
  */
20
- getPassPP(): PostProcess;
32
+ onReadyObservable: Observable<void>;
21
33
  /**
22
34
  * Gets the debug pass post process
23
35
  * @returns The post process
@@ -49,6 +61,12 @@ export declare class _IblShadowsAccumulationPass {
49
61
  */
50
62
  set reset(value: boolean);
51
63
  private _reset;
64
+ /**
65
+ * Tell the pass that the camera is moving. This will cause the accumulation
66
+ * rate to change.
67
+ */
68
+ set isMoving(value: boolean);
69
+ private _isMoving;
52
70
  private _debugPassPP;
53
71
  private _debugSizeParams;
54
72
  /**
@@ -66,13 +84,19 @@ export declare class _IblShadowsAccumulationPass {
66
84
  /**
67
85
  * Instantiates the accumulation pass
68
86
  * @param scene Scene to attach to
87
+ * @param iblShadowsRenderPipeline The IBL shadows render pipeline
69
88
  * @returns The accumulation pass
70
89
  */
71
- constructor(scene: Scene);
90
+ constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline);
72
91
  private _createTextures;
73
- _updatePostProcess(effect: Effect): void;
74
- /** Called by render pipeline when canvas resized. */
75
- resize(): void;
92
+ private _setOutputTextureBindings;
93
+ private _updatePositionCopy;
94
+ private _setAccumulationCopyBindings;
95
+ /**
96
+ * Called by render pipeline when canvas resized.
97
+ * @param scaleFactor The factor by which to scale the canvas size.
98
+ */
99
+ resize(scaleFactor?: number): void;
76
100
  private _disposeTextures;
77
101
  /**
78
102
  * Checks if the pass is ready
@@ -1,18 +1,20 @@
1
1
 
2
2
  import { Vector4 } from "../../Maths/math.vector.js";
3
3
  import { PostProcess } from "../../PostProcesses/postProcess.js";
4
- import { RenderTargetTexture } from "../../Materials/Textures/renderTargetTexture.js";
4
+ import { GeometryBufferRenderer } from "../../Rendering/geometryBufferRenderer.js";
5
+ import { ProceduralTexture } from "../../Materials/Textures/Procedurals/proceduralTexture.js";
6
+ import { Observable } from "../../Misc/observable.js";
5
7
  /**
6
8
  * This should not be instanciated directly, as it is part of a scene component
7
9
  * @internal
8
10
  */
9
11
  export class _IblShadowsAccumulationPass {
10
12
  /**
11
- * Gets the pass post process
12
- * @returns The post process
13
+ * Returns the output texture of the pass.
14
+ * @returns The output texture.
13
15
  */
14
- getPassPP() {
15
- return this._outputPP;
16
+ getOutputTexture() {
17
+ return this._outputTexture;
16
18
  }
17
19
  /**
18
20
  * Gets the debug pass post process
@@ -57,6 +59,13 @@ export class _IblShadowsAccumulationPass {
57
59
  set reset(value) {
58
60
  this._reset = value;
59
61
  }
62
+ /**
63
+ * Tell the pass that the camera is moving. This will cause the accumulation
64
+ * rate to change.
65
+ */
66
+ set isMoving(value) {
67
+ this._isMoving = value;
68
+ }
60
69
  /**
61
70
  * Sets params that control the position and scaling of the debug display on the screen.
62
71
  * @param x Screen X offset of the debug display (0-1)
@@ -76,7 +85,7 @@ export class _IblShadowsAccumulationPass {
76
85
  const debugOptions = {
77
86
  width: this._engine.getRenderWidth(),
78
87
  height: this._engine.getRenderHeight(),
79
- textureFormat: 7,
88
+ textureFormat: 5,
80
89
  textureType: 0,
81
90
  samplingMode: 1,
82
91
  uniforms: ["sizeParams"],
@@ -97,7 +106,7 @@ export class _IblShadowsAccumulationPass {
97
106
  this._debugPassPP.autoClear = false;
98
107
  this._debugPassPP.onApplyObservable.add((effect) => {
99
108
  // update the caustic texture with what we just rendered.
100
- effect.setTextureFromPostProcessOutput("debugSampler", this._outputPP);
109
+ effect.setTexture("debugSampler", this._outputTexture);
101
110
  effect.setVector4("sizeParams", this._debugSizeParams);
102
111
  });
103
112
  }
@@ -105,168 +114,174 @@ export class _IblShadowsAccumulationPass {
105
114
  /**
106
115
  * Instantiates the accumulation pass
107
116
  * @param scene Scene to attach to
117
+ * @param iblShadowsRenderPipeline The IBL shadows render pipeline
108
118
  * @returns The accumulation pass
109
119
  */
110
- constructor(scene) {
120
+ constructor(scene, iblShadowsRenderPipeline) {
121
+ this._accumulationParams = new Vector4(0.0, 0.0, 0.0, 0.0);
111
122
  /** Enable the debug view for this pass */
112
123
  this.debugEnabled = false;
124
+ /**
125
+ * Is the effect enabled
126
+ */
127
+ this.enabled = true;
128
+ /**
129
+ * Observable that triggers when the accumulation texture is ready
130
+ */
131
+ this.onReadyObservable = new Observable();
113
132
  this._debugPassName = "Shadow Accumulation Debug Pass";
114
133
  this._remenance = 0.9;
115
134
  this._reset = true;
135
+ this._isMoving = false;
116
136
  this._debugSizeParams = new Vector4(0.0, 0.0, 0.0, 0.0);
117
137
  this._scene = scene;
118
138
  this._engine = scene.getEngine();
139
+ this._renderPipeline = iblShadowsRenderPipeline;
119
140
  this._createTextures();
120
141
  }
121
142
  _createTextures() {
122
143
  const isWebGPU = this._engine.isWebGPU;
123
- // Create the local position texture for the previous frame.
124
- // We'll copy the previous local position texture to this texture at the start of every frame.
125
- const localPositionOptions = {
126
- generateDepthBuffer: false,
127
- generateMipMaps: false,
128
- format: 5,
144
+ const outputTextureOptions = {
129
145
  type: 2,
130
- samplingMode: 2,
131
- };
132
- this._oldLocalPositionRT = new RenderTargetTexture("oldLocalPositionRT", { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, this._scene, localPositionOptions);
133
- const localPositionCopyOptions = {
134
- width: this._engine.getRenderWidth(),
135
- height: this._engine.getRenderHeight(),
136
- textureFormat: 5,
137
- textureType: 2,
146
+ format: 5,
138
147
  samplingMode: 1,
139
- engine: this._engine,
140
- reusable: false,
141
- defines: "#define PASS_SAMPLER sampler",
148
+ generateDepthBuffer: false,
149
+ generateMipMaps: false,
142
150
  shaderLanguage: isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */,
143
- extraInitializations: (useWebGPU, list) => {
144
- if (useWebGPU) {
145
- list.push(import("../../ShadersWGSL/pass.fragment.js"));
151
+ extraInitializationsAsync: async () => {
152
+ if (isWebGPU) {
153
+ await Promise.all([import("../../ShadersWGSL/iblShadowAccumulation.fragment.js")]);
146
154
  }
147
155
  else {
148
- list.push(import("../../Shaders/pass.fragment.js"));
156
+ await Promise.all([import("../../Shaders/iblShadowAccumulation.fragment.js")]);
149
157
  }
150
158
  },
151
159
  };
152
- const localPositionCopyPP = new PostProcess("Copy Local Position Texture", "pass", localPositionCopyOptions);
153
- localPositionCopyPP.autoClear = false;
154
- localPositionCopyPP.onApplyObservable.add((effect) => {
155
- const prePassRenderer = this._scene.prePassRenderer;
156
- const index = prePassRenderer.getIndex(1);
157
- if (index >= 0)
158
- effect.setTexture("textureSampler", prePassRenderer.getRenderTarget().textures[index]);
160
+ this._outputTexture = new ProceduralTexture("shadowAccumulationPass", {
161
+ width: this._engine.getRenderWidth(),
162
+ height: this._engine.getRenderHeight(),
163
+ }, "iblShadowAccumulation", this._scene, outputTextureOptions);
164
+ this._outputTexture.refreshRate = -1;
165
+ this._outputTexture.autoClear = false;
166
+ this._outputTexture.onGeneratedObservable.addOnce(() => {
167
+ this.onReadyObservable.notifyObservers();
168
+ });
169
+ // Need to set all the textures first so that the effect gets created with the proper uniforms.
170
+ this._setOutputTextureBindings();
171
+ let counter = 0;
172
+ this._scene.onBeforeRenderObservable.add(() => {
173
+ counter = 0;
174
+ });
175
+ this._scene.onAfterRenderTargetsRenderObservable.add(() => {
176
+ if (++counter == 2) {
177
+ if (this.enabled && this._outputTexture.isReady()) {
178
+ this._setOutputTextureBindings();
179
+ this._outputTexture.render();
180
+ }
181
+ }
159
182
  });
160
- this._oldLocalPositionRT.addPostProcess(localPositionCopyPP);
161
- this._oldLocalPositionRT.skipInitialClear = true;
162
- this._oldLocalPositionRT.noPrePassRenderer = true;
163
- this._scene.customRenderTargets.push(this._oldLocalPositionRT);
164
183
  // Create the accumulation texture for the previous frame.
165
184
  // We'll copy the output of the accumulation pass to this texture at the start of every frame.
166
185
  const accumulationOptions = {
167
- generateDepthBuffer: false,
168
- generateMipMaps: false,
169
- format: 7,
170
186
  type: 2,
187
+ format: 5,
171
188
  samplingMode: 1,
172
- };
173
- this._oldAccumulationRT = new RenderTargetTexture("oldAccumulationRT", { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, this._scene, accumulationOptions);
174
- const accumulationCopyOptions = {
175
- width: this._engine.getRenderWidth(),
176
- height: this._engine.getRenderHeight(),
177
- textureFormat: 7,
178
- textureType: 2,
179
- samplingMode: 1,
180
- engine: this._engine,
181
- reusable: false,
182
- defines: "#define PASS_SAMPLER sampler",
189
+ generateDepthBuffer: false,
190
+ generateMipMaps: false,
183
191
  shaderLanguage: isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */,
184
- extraInitializations: (useWebGPU, list) => {
185
- if (useWebGPU) {
186
- list.push(import("../../ShadersWGSL/pass.fragment.js"));
192
+ extraInitializationsAsync: async () => {
193
+ if (isWebGPU) {
194
+ await Promise.all([import("../../ShadersWGSL/pass.fragment.js")]);
187
195
  }
188
196
  else {
189
- list.push(import("../../Shaders/pass.fragment.js"));
197
+ await Promise.all([import("../../Shaders/pass.fragment.js")]);
190
198
  }
191
199
  },
192
200
  };
193
- const accumulationCopyPP = new PostProcess("Copy Accumulation Texture", "pass", accumulationCopyOptions);
194
- accumulationCopyPP.autoClear = false;
195
- accumulationCopyPP.onApplyObservable.add((effect) => {
196
- if (this._outputPP._outputTexture?.texture) {
197
- effect.setTextureFromPostProcessOutput("textureSampler", this._outputPP);
198
- }
199
- else {
200
- // We must set a texture. It's not the right one, but we must set something before the right one is available (see above), probably on next frame.
201
- effect._bindTexture("textureSampler", this._outputPP.inputTexture.texture);
202
- }
203
- });
204
- this._oldAccumulationRT.addPostProcess(accumulationCopyPP);
205
- this._oldAccumulationRT.skipInitialClear = true;
206
- this._oldAccumulationRT.noPrePassRenderer = true;
207
- this._scene.customRenderTargets.push(this._oldAccumulationRT);
208
- // Now, create the accumulation pass
209
- const ppOptions = {
210
- width: this._engine.getRenderWidth(),
211
- height: this._engine.getRenderHeight(),
212
- textureFormat: 7,
213
- textureType: 2,
201
+ this._oldAccumulationCopy = new ProceduralTexture("oldAccumulationRT", { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, "pass", this._scene, accumulationOptions, false);
202
+ this._oldAccumulationCopy.autoClear = false;
203
+ this._oldAccumulationCopy.refreshRate = 1;
204
+ this._oldAccumulationCopy.onBeforeGenerationObservable.add(this._setAccumulationCopyBindings.bind(this));
205
+ this._setAccumulationCopyBindings();
206
+ // Create the local position texture for the previous frame.
207
+ // We'll copy the previous local position texture to this texture at the start of every frame.
208
+ const localPositionOptions = {
209
+ type: 2,
210
+ format: 5,
214
211
  samplingMode: 1,
215
- uniforms: ["accumulationParameters"],
216
- samplers: ["oldAccumulationSampler", "prevLocalPositionSampler", "localPositionSampler", "motionSampler"],
217
- engine: this._engine,
218
- reusable: false,
212
+ generateDepthBuffer: false,
213
+ generateMipMaps: false,
219
214
  shaderLanguage: isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */,
220
- extraInitializations: (useWebGPU, list) => {
221
- if (useWebGPU) {
222
- list.push(import("../../ShadersWGSL/iblShadowAccumulation.fragment.js"));
215
+ extraInitializationsAsync: async () => {
216
+ if (isWebGPU) {
217
+ await Promise.all([import("../../ShadersWGSL/pass.fragment.js")]);
223
218
  }
224
219
  else {
225
- list.push(import("../../Shaders/iblShadowAccumulation.fragment.js"));
220
+ await Promise.all([import("../../Shaders/pass.fragment.js")]);
226
221
  }
227
222
  },
228
223
  };
229
- this._outputPP = new PostProcess("accumulationPassPP", "iblShadowAccumulation", ppOptions);
230
- this._outputPP.autoClear = false;
231
- this._outputPP.resize(this._engine.getRenderWidth(), this._engine.getRenderHeight()); // make sure that _outputPP.inputTexture.texture is created right away
232
- this._outputPP.onApplyObservable.add((effect) => {
233
- this._updatePostProcess(effect);
234
- });
224
+ this._oldPositionCopy = new ProceduralTexture("oldLocalPositionRT", { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, "pass", this._scene, localPositionOptions, false);
225
+ this._updatePositionCopy();
226
+ this._oldPositionCopy.autoClear = false;
227
+ this._oldPositionCopy.refreshRate = 1;
228
+ this._oldPositionCopy.onBeforeGenerationObservable.add(this._updatePositionCopy.bind(this));
235
229
  }
236
- _updatePostProcess(effect) {
237
- effect.setVector4("accumulationParameters", new Vector4(this.remenance, this.reset ? 1.0 : 0.0, 0.0, 0.0));
238
- effect.setTexture("oldAccumulationSampler", this._oldAccumulationRT);
239
- effect.setTexture("prevLocalPositionSampler", this._oldLocalPositionRT);
240
- const prePassRenderer = this._scene.prePassRenderer;
241
- if (prePassRenderer) {
242
- const localPositionIndex = prePassRenderer.getIndex(1);
243
- if (localPositionIndex >= 0)
244
- effect.setTexture("localPositionSampler", prePassRenderer.getRenderTarget().textures[localPositionIndex]);
245
- const velocityIndex = prePassRenderer.getIndex(11);
246
- if (velocityIndex >= 0)
247
- effect.setTexture("motionSampler", prePassRenderer.getRenderTarget().textures[velocityIndex]);
230
+ _setOutputTextureBindings() {
231
+ const remenance = this._isMoving ? this.remenance : 0.99;
232
+ this._accumulationParams.set(remenance, this.reset ? 1.0 : 0.0, 0.0, 0.0);
233
+ this._outputTexture.setTexture("spatialBlurSampler", this._renderPipeline._getSpatialBlurTexture());
234
+ this._outputTexture.setVector4("accumulationParameters", this._accumulationParams);
235
+ this._outputTexture.setTexture("oldAccumulationSampler", this._oldAccumulationCopy ? this._oldAccumulationCopy : this._renderPipeline._dummyTexture2d);
236
+ this._outputTexture.setTexture("prevPositionSampler", this._oldPositionCopy ? this._oldPositionCopy : this._renderPipeline._dummyTexture2d);
237
+ const geometryBufferRenderer = this._scene.geometryBufferRenderer;
238
+ if (!geometryBufferRenderer) {
239
+ return;
248
240
  }
241
+ const velocityIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE);
242
+ this._outputTexture.setTexture("motionSampler", geometryBufferRenderer.getGBuffer().textures[velocityIndex]);
243
+ const wPositionIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);
244
+ this._outputTexture.setTexture("positionSampler", geometryBufferRenderer.getGBuffer().textures[wPositionIndex]);
249
245
  this.reset = false;
246
+ this._isMoving = false;
247
+ }
248
+ _updatePositionCopy() {
249
+ const geometryBufferRenderer = this._scene.geometryBufferRenderer;
250
+ const index = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);
251
+ this._oldPositionCopy.setTexture("textureSampler", geometryBufferRenderer.getGBuffer().textures[index]);
252
+ }
253
+ _setAccumulationCopyBindings() {
254
+ this._oldAccumulationCopy.setTexture("textureSampler", this._outputTexture);
250
255
  }
251
- /** Called by render pipeline when canvas resized. */
252
- resize() {
253
- this._oldAccumulationRT.resize({ width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() });
254
- this._oldLocalPositionRT.resize({ width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() });
256
+ /**
257
+ * Called by render pipeline when canvas resized.
258
+ * @param scaleFactor The factor by which to scale the canvas size.
259
+ */
260
+ resize(scaleFactor = 1.0) {
261
+ const newSize = {
262
+ width: Math.max(1.0, Math.floor(this._engine.getRenderWidth() * scaleFactor)),
263
+ height: Math.max(1.0, Math.floor(this._engine.getRenderHeight() * scaleFactor)),
264
+ };
265
+ this._outputTexture.resize(newSize, false);
266
+ this._oldAccumulationCopy.resize(newSize, false);
267
+ this._oldPositionCopy.resize({ width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, false);
268
+ this.reset = true;
255
269
  }
256
270
  _disposeTextures() {
257
- this._oldAccumulationRT.dispose();
258
- this._oldLocalPositionRT.dispose();
271
+ this._oldAccumulationCopy.dispose();
272
+ this._oldPositionCopy.dispose();
273
+ this._outputTexture.dispose();
259
274
  }
260
275
  /**
261
276
  * Checks if the pass is ready
262
277
  * @returns true if the pass is ready
263
278
  */
264
279
  isReady() {
265
- return (this._oldAccumulationRT &&
266
- this._oldAccumulationRT.isReadyForRendering() &&
267
- this._oldLocalPositionRT &&
268
- this._oldLocalPositionRT.isReadyForRendering() &&
269
- this._outputPP.isReady() &&
280
+ return (this._oldAccumulationCopy &&
281
+ this._oldAccumulationCopy.isReady() &&
282
+ this._oldPositionCopy &&
283
+ this._oldPositionCopy.isReady() &&
284
+ this._outputTexture.isReady() &&
270
285
  !(this._debugPassPP && !this._debugPassPP.isReady()));
271
286
  }
272
287
  /**
@@ -274,7 +289,6 @@ export class _IblShadowsAccumulationPass {
274
289
  */
275
290
  dispose() {
276
291
  this._disposeTextures();
277
- this._outputPP.dispose();
278
292
  if (this._debugPassPP) {
279
293
  this._debugPassPP.dispose();
280
294
  }
@@ -1 +1 @@
1
- {"version":3,"file":"iblShadowsAccumulationPass.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsAccumulationPass.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\r\nimport type { AbstractEngine } from \"../../Engines/abstractEngine\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Vector4 } from \"../../Maths/math.vector\";\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport type { PostProcessOptions } from \"../../PostProcesses/postProcess\";\r\nimport type { Effect } from \"../../Materials/effect\";\r\nimport { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\nimport type { RenderTargetCreationOptions } from \"../../Materials/Textures/textureCreationOptions\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * This should not be instanciated directly, as it is part of a scene component\r\n * @internal\r\n */\r\nexport class _IblShadowsAccumulationPass {\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n\r\n // First, render the accumulation pass with both position buffers, motion buffer, shadow buffer, and the previous accumulation buffer\r\n private _outputPP: PostProcess;\r\n private _oldAccumulationRT: RenderTargetTexture;\r\n private _oldLocalPositionRT: RenderTargetTexture;\r\n\r\n /** Enable the debug view for this pass */\r\n public debugEnabled: boolean = false;\r\n\r\n /**\r\n * Gets the pass post process\r\n * @returns The post process\r\n */\r\n public getPassPP(): PostProcess {\r\n return this._outputPP;\r\n }\r\n\r\n /**\r\n * Gets the debug pass post process\r\n * @returns The post process\r\n */\r\n public getDebugPassPP(): PostProcess {\r\n if (!this._debugPassPP) {\r\n this._createDebugPass();\r\n }\r\n return this._debugPassPP;\r\n }\r\n\r\n private _debugPassName: string = \"Shadow Accumulation Debug Pass\";\r\n\r\n /**\r\n * Gets the name of the debug pass\r\n * @returns The name of the debug pass\r\n */\r\n public get debugPassName(): string {\r\n return this._debugPassName;\r\n }\r\n\r\n /**\r\n * A value that controls how much of the previous frame's accumulation to keep.\r\n * The higher the value, the faster the shadows accumulate but the more potential ghosting you'll see.\r\n */\r\n public get remenance(): number {\r\n return this._remenance;\r\n }\r\n\r\n /**\r\n * A value that controls how much of the previous frame's accumulation to keep.\r\n * The higher the value, the faster the shadows accumulate but the more potential ghosting you'll see.\r\n */\r\n public set remenance(value: number) {\r\n this._remenance = value;\r\n }\r\n private _remenance: number = 0.9;\r\n\r\n /**\r\n * Reset the accumulation.\r\n */\r\n public get reset(): boolean {\r\n return this._reset;\r\n }\r\n /**\r\n * Reset the accumulation.\r\n */\r\n public set reset(value: boolean) {\r\n this._reset = value;\r\n }\r\n private _reset: boolean = true;\r\n private _debugPassPP: PostProcess;\r\n private _debugSizeParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /**\r\n * Sets params that control the position and scaling of the debug display on the screen.\r\n * @param x Screen X offset of the debug display (0-1)\r\n * @param y Screen Y offset of the debug display (0-1)\r\n * @param widthScale X scale of the debug display (0-1)\r\n * @param heightScale Y scale of the debug display (0-1)\r\n */\r\n public setDebugDisplayParams(x: number, y: number, widthScale: number, heightScale: number) {\r\n this._debugSizeParams.set(x, y, widthScale, heightScale);\r\n }\r\n\r\n /**\r\n * Creates the debug post process effect for this pass\r\n */\r\n private _createDebugPass() {\r\n if (!this._debugPassPP) {\r\n const isWebGPU = this._engine.isWebGPU;\r\n const debugOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n textureFormat: Constants.TEXTUREFORMAT_RG,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n uniforms: [\"sizeParams\"],\r\n samplers: [\"debugSampler\"],\r\n engine: this._engine,\r\n reusable: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (useWebGPU: boolean, list: Promise<any>[]) => {\r\n if (useWebGPU) {\r\n list.push(import(\"../../ShadersWGSL/iblShadowDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/iblShadowDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._debugPassPP = new PostProcess(this.debugPassName, \"iblShadowDebug\", debugOptions);\r\n this._debugPassPP.autoClear = false;\r\n this._debugPassPP.onApplyObservable.add((effect) => {\r\n // update the caustic texture with what we just rendered.\r\n effect.setTextureFromPostProcessOutput(\"debugSampler\", this._outputPP);\r\n effect.setVector4(\"sizeParams\", this._debugSizeParams);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Instantiates the accumulation pass\r\n * @param scene Scene to attach to\r\n * @returns The accumulation pass\r\n */\r\n constructor(scene: Scene) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._createTextures();\r\n }\r\n\r\n private _createTextures() {\r\n const isWebGPU = this._engine.isWebGPU;\r\n // Create the local position texture for the previous frame.\r\n // We'll copy the previous local position texture to this texture at the start of every frame.\r\n const localPositionOptions: RenderTargetCreationOptions = {\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n samplingMode: Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n };\r\n\r\n this._oldLocalPositionRT = new RenderTargetTexture(\r\n \"oldLocalPositionRT\",\r\n { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() },\r\n this._scene,\r\n localPositionOptions\r\n );\r\n\r\n const localPositionCopyOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n engine: this._engine,\r\n reusable: false,\r\n defines: \"#define PASS_SAMPLER sampler\",\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (useWebGPU: boolean, list: Promise<any>[]) => {\r\n if (useWebGPU) {\r\n list.push(import(\"../../ShadersWGSL/pass.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/pass.fragment\"));\r\n }\r\n },\r\n };\r\n const localPositionCopyPP = new PostProcess(\"Copy Local Position Texture\", \"pass\", localPositionCopyOptions);\r\n localPositionCopyPP.autoClear = false;\r\n localPositionCopyPP.onApplyObservable.add((effect) => {\r\n const prePassRenderer = this._scene!.prePassRenderer;\r\n const index = prePassRenderer!.getIndex(Constants.PREPASS_POSITION_TEXTURE_TYPE);\r\n if (index >= 0) effect.setTexture(\"textureSampler\", prePassRenderer!.getRenderTarget().textures[index]);\r\n });\r\n this._oldLocalPositionRT.addPostProcess(localPositionCopyPP);\r\n this._oldLocalPositionRT.skipInitialClear = true;\r\n this._oldLocalPositionRT.noPrePassRenderer = true;\r\n\r\n this._scene.customRenderTargets.push(this._oldLocalPositionRT);\r\n\r\n // Create the accumulation texture for the previous frame.\r\n // We'll copy the output of the accumulation pass to this texture at the start of every frame.\r\n const accumulationOptions: RenderTargetCreationOptions = {\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n format: Constants.TEXTUREFORMAT_RG,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n };\r\n\r\n this._oldAccumulationRT = new RenderTargetTexture(\r\n \"oldAccumulationRT\",\r\n { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() },\r\n this._scene,\r\n accumulationOptions\r\n );\r\n const accumulationCopyOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n textureFormat: Constants.TEXTUREFORMAT_RG,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n engine: this._engine,\r\n reusable: false,\r\n defines: \"#define PASS_SAMPLER sampler\",\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (useWebGPU: boolean, list: Promise<any>[]) => {\r\n if (useWebGPU) {\r\n list.push(import(\"../../ShadersWGSL/pass.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/pass.fragment\"));\r\n }\r\n },\r\n };\r\n const accumulationCopyPP = new PostProcess(\"Copy Accumulation Texture\", \"pass\", accumulationCopyOptions);\r\n accumulationCopyPP.autoClear = false;\r\n accumulationCopyPP.onApplyObservable.add((effect) => {\r\n if (this._outputPP._outputTexture?.texture) {\r\n effect.setTextureFromPostProcessOutput(\"textureSampler\", this._outputPP);\r\n } else {\r\n // We must set a texture. It's not the right one, but we must set something before the right one is available (see above), probably on next frame.\r\n effect._bindTexture(\"textureSampler\", this._outputPP.inputTexture.texture);\r\n }\r\n });\r\n this._oldAccumulationRT.addPostProcess(accumulationCopyPP);\r\n this._oldAccumulationRT.skipInitialClear = true;\r\n this._oldAccumulationRT.noPrePassRenderer = true;\r\n this._scene.customRenderTargets.push(this._oldAccumulationRT);\r\n\r\n // Now, create the accumulation pass\r\n const ppOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n textureFormat: Constants.TEXTUREFORMAT_RG,\r\n textureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n uniforms: [\"accumulationParameters\"],\r\n samplers: [\"oldAccumulationSampler\", \"prevLocalPositionSampler\", \"localPositionSampler\", \"motionSampler\"],\r\n engine: this._engine,\r\n reusable: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (useWebGPU: boolean, list: Promise<any>[]) => {\r\n if (useWebGPU) {\r\n list.push(import(\"../../ShadersWGSL/iblShadowAccumulation.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/iblShadowAccumulation.fragment\"));\r\n }\r\n },\r\n };\r\n this._outputPP = new PostProcess(\"accumulationPassPP\", \"iblShadowAccumulation\", ppOptions);\r\n this._outputPP.autoClear = false;\r\n this._outputPP.resize(this._engine.getRenderWidth(), this._engine.getRenderHeight()); // make sure that _outputPP.inputTexture.texture is created right away\r\n this._outputPP.onApplyObservable.add((effect) => {\r\n this._updatePostProcess(effect);\r\n });\r\n }\r\n\r\n public _updatePostProcess(effect: Effect) {\r\n effect.setVector4(\"accumulationParameters\", new Vector4(this.remenance, this.reset ? 1.0 : 0.0, 0.0, 0.0));\r\n effect.setTexture(\"oldAccumulationSampler\", this._oldAccumulationRT);\r\n effect.setTexture(\"prevLocalPositionSampler\", this._oldLocalPositionRT);\r\n\r\n const prePassRenderer = this._scene.prePassRenderer;\r\n if (prePassRenderer) {\r\n const localPositionIndex = prePassRenderer.getIndex(Constants.PREPASS_POSITION_TEXTURE_TYPE);\r\n if (localPositionIndex >= 0) effect.setTexture(\"localPositionSampler\", prePassRenderer.getRenderTarget().textures[localPositionIndex]);\r\n const velocityIndex = prePassRenderer.getIndex(Constants.PREPASS_VELOCITY_LINEAR_TEXTURE_TYPE);\r\n if (velocityIndex >= 0) effect.setTexture(\"motionSampler\", prePassRenderer.getRenderTarget().textures[velocityIndex]);\r\n }\r\n\r\n this.reset = false;\r\n }\r\n\r\n /** Called by render pipeline when canvas resized. */\r\n public resize() {\r\n this._oldAccumulationRT.resize({ width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() });\r\n this._oldLocalPositionRT.resize({ width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() });\r\n }\r\n\r\n private _disposeTextures() {\r\n this._oldAccumulationRT.dispose();\r\n this._oldLocalPositionRT.dispose();\r\n }\r\n\r\n /**\r\n * Checks if the pass is ready\r\n * @returns true if the pass is ready\r\n */\r\n public isReady() {\r\n return (\r\n this._oldAccumulationRT &&\r\n this._oldAccumulationRT.isReadyForRendering() &&\r\n this._oldLocalPositionRT &&\r\n this._oldLocalPositionRT.isReadyForRendering() &&\r\n this._outputPP.isReady() &&\r\n !(this._debugPassPP && !this._debugPassPP.isReady())\r\n );\r\n }\r\n\r\n /**\r\n * Disposes the associated resources\r\n */\r\n public dispose() {\r\n this._disposeTextures();\r\n this._outputPP.dispose();\r\n if (this._debugPassPP) {\r\n this._debugPassPP.dispose();\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"iblShadowsAccumulationPass.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsAccumulationPass.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\r\nimport type { AbstractEngine } from \"../../Engines/abstractEngine\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Vector4 } from \"../../Maths/math.vector\";\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport type { PostProcessOptions } from \"../../PostProcesses/postProcess\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { GeometryBufferRenderer } from \"../../Rendering/geometryBufferRenderer\";\r\nimport { ProceduralTexture } from \"core/Materials/Textures/Procedurals/proceduralTexture\";\r\nimport type { IProceduralTextureCreationOptions } from \"core/Materials/Textures/Procedurals/proceduralTexture\";\r\nimport type { IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline\";\r\nimport { Observable } from \"../../Misc/observable\";\r\n\r\n/**\r\n * This should not be instanciated directly, as it is part of a scene component\r\n * @internal\r\n */\r\nexport class _IblShadowsAccumulationPass {\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n private _renderPipeline: IblShadowsRenderPipeline;\r\n\r\n // First, render the accumulation pass with both position buffers, motion buffer, shadow buffer, and the previous accumulation buffer\r\n private _outputTexture: ProceduralTexture;\r\n private _oldAccumulationCopy: ProceduralTexture;\r\n private _oldPositionCopy: ProceduralTexture;\r\n private _accumulationParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /** Enable the debug view for this pass */\r\n public debugEnabled: boolean = false;\r\n\r\n /**\r\n * Is the effect enabled\r\n */\r\n public enabled: boolean = true;\r\n\r\n /**\r\n * Returns the output texture of the pass.\r\n * @returns The output texture.\r\n */\r\n public getOutputTexture(): ProceduralTexture {\r\n return this._outputTexture;\r\n }\r\n\r\n /**\r\n * Observable that triggers when the accumulation texture is ready\r\n */\r\n public onReadyObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * Gets the debug pass post process\r\n * @returns The post process\r\n */\r\n public getDebugPassPP(): PostProcess {\r\n if (!this._debugPassPP) {\r\n this._createDebugPass();\r\n }\r\n return this._debugPassPP;\r\n }\r\n\r\n private _debugPassName: string = \"Shadow Accumulation Debug Pass\";\r\n\r\n /**\r\n * Gets the name of the debug pass\r\n * @returns The name of the debug pass\r\n */\r\n public get debugPassName(): string {\r\n return this._debugPassName;\r\n }\r\n\r\n /**\r\n * A value that controls how much of the previous frame's accumulation to keep.\r\n * The higher the value, the faster the shadows accumulate but the more potential ghosting you'll see.\r\n */\r\n public get remenance(): number {\r\n return this._remenance;\r\n }\r\n\r\n /**\r\n * A value that controls how much of the previous frame's accumulation to keep.\r\n * The higher the value, the faster the shadows accumulate but the more potential ghosting you'll see.\r\n */\r\n public set remenance(value: number) {\r\n this._remenance = value;\r\n }\r\n private _remenance: number = 0.9;\r\n\r\n /**\r\n * Reset the accumulation.\r\n */\r\n public get reset(): boolean {\r\n return this._reset;\r\n }\r\n /**\r\n * Reset the accumulation.\r\n */\r\n public set reset(value: boolean) {\r\n this._reset = value;\r\n }\r\n private _reset: boolean = true;\r\n\r\n /**\r\n * Tell the pass that the camera is moving. This will cause the accumulation\r\n * rate to change.\r\n */\r\n public set isMoving(value: boolean) {\r\n this._isMoving = value;\r\n }\r\n private _isMoving: boolean = false;\r\n\r\n private _debugPassPP: PostProcess;\r\n private _debugSizeParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /**\r\n * Sets params that control the position and scaling of the debug display on the screen.\r\n * @param x Screen X offset of the debug display (0-1)\r\n * @param y Screen Y offset of the debug display (0-1)\r\n * @param widthScale X scale of the debug display (0-1)\r\n * @param heightScale Y scale of the debug display (0-1)\r\n */\r\n public setDebugDisplayParams(x: number, y: number, widthScale: number, heightScale: number) {\r\n this._debugSizeParams.set(x, y, widthScale, heightScale);\r\n }\r\n\r\n /**\r\n * Creates the debug post process effect for this pass\r\n */\r\n private _createDebugPass() {\r\n if (!this._debugPassPP) {\r\n const isWebGPU = this._engine.isWebGPU;\r\n const debugOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n uniforms: [\"sizeParams\"],\r\n samplers: [\"debugSampler\"],\r\n engine: this._engine,\r\n reusable: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (useWebGPU: boolean, list: Promise<any>[]) => {\r\n if (useWebGPU) {\r\n list.push(import(\"../../ShadersWGSL/iblShadowDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/iblShadowDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._debugPassPP = new PostProcess(this.debugPassName, \"iblShadowDebug\", debugOptions);\r\n this._debugPassPP.autoClear = false;\r\n this._debugPassPP.onApplyObservable.add((effect) => {\r\n // update the caustic texture with what we just rendered.\r\n effect.setTexture(\"debugSampler\", this._outputTexture);\r\n effect.setVector4(\"sizeParams\", this._debugSizeParams);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Instantiates the accumulation pass\r\n * @param scene Scene to attach to\r\n * @param iblShadowsRenderPipeline The IBL shadows render pipeline\r\n * @returns The accumulation pass\r\n */\r\n constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._renderPipeline = iblShadowsRenderPipeline;\r\n this._createTextures();\r\n }\r\n\r\n private _createTextures() {\r\n const isWebGPU = this._engine.isWebGPU;\r\n\r\n const outputTextureOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/iblShadowAccumulation.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/iblShadowAccumulation.fragment\")]);\r\n }\r\n },\r\n };\r\n this._outputTexture = new ProceduralTexture(\r\n \"shadowAccumulationPass\",\r\n {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n },\r\n \"iblShadowAccumulation\",\r\n this._scene,\r\n outputTextureOptions\r\n );\r\n this._outputTexture.refreshRate = -1;\r\n this._outputTexture.autoClear = false;\r\n this._outputTexture.onGeneratedObservable.addOnce(() => {\r\n this.onReadyObservable.notifyObservers();\r\n });\r\n\r\n // Need to set all the textures first so that the effect gets created with the proper uniforms.\r\n this._setOutputTextureBindings();\r\n\r\n let counter = 0;\r\n this._scene.onBeforeRenderObservable.add(() => {\r\n counter = 0;\r\n });\r\n this._scene.onAfterRenderTargetsRenderObservable.add(() => {\r\n if (++counter == 2) {\r\n if (this.enabled && this._outputTexture.isReady()) {\r\n this._setOutputTextureBindings();\r\n this._outputTexture.render();\r\n }\r\n }\r\n });\r\n\r\n // Create the accumulation texture for the previous frame.\r\n // We'll copy the output of the accumulation pass to this texture at the start of every frame.\r\n const accumulationOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/pass.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/pass.fragment\")]);\r\n }\r\n },\r\n };\r\n\r\n this._oldAccumulationCopy = new ProceduralTexture(\r\n \"oldAccumulationRT\",\r\n { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() },\r\n \"pass\",\r\n this._scene,\r\n accumulationOptions,\r\n false\r\n );\r\n\r\n this._oldAccumulationCopy.autoClear = false;\r\n this._oldAccumulationCopy.refreshRate = 1;\r\n this._oldAccumulationCopy.onBeforeGenerationObservable.add(this._setAccumulationCopyBindings.bind(this));\r\n this._setAccumulationCopyBindings();\r\n\r\n // Create the local position texture for the previous frame.\r\n // We'll copy the previous local position texture to this texture at the start of every frame.\r\n const localPositionOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/pass.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/pass.fragment\")]);\r\n }\r\n },\r\n };\r\n\r\n this._oldPositionCopy = new ProceduralTexture(\r\n \"oldLocalPositionRT\",\r\n { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() },\r\n \"pass\",\r\n this._scene,\r\n localPositionOptions,\r\n false\r\n );\r\n this._updatePositionCopy();\r\n this._oldPositionCopy.autoClear = false;\r\n this._oldPositionCopy.refreshRate = 1;\r\n this._oldPositionCopy.onBeforeGenerationObservable.add(this._updatePositionCopy.bind(this));\r\n }\r\n\r\n private _setOutputTextureBindings() {\r\n const remenance = this._isMoving ? this.remenance : 0.99;\r\n this._accumulationParams.set(remenance, this.reset ? 1.0 : 0.0, 0.0, 0.0);\r\n this._outputTexture.setTexture(\"spatialBlurSampler\", this._renderPipeline._getSpatialBlurTexture());\r\n this._outputTexture.setVector4(\"accumulationParameters\", this._accumulationParams);\r\n this._outputTexture.setTexture(\"oldAccumulationSampler\", this._oldAccumulationCopy ? this._oldAccumulationCopy : this._renderPipeline._dummyTexture2d);\r\n this._outputTexture.setTexture(\"prevPositionSampler\", this._oldPositionCopy ? this._oldPositionCopy : this._renderPipeline._dummyTexture2d);\r\n\r\n const geometryBufferRenderer = this._scene.geometryBufferRenderer;\r\n if (!geometryBufferRenderer) {\r\n return;\r\n }\r\n const velocityIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE);\r\n this._outputTexture.setTexture(\"motionSampler\", geometryBufferRenderer.getGBuffer().textures[velocityIndex]);\r\n const wPositionIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);\r\n this._outputTexture.setTexture(\"positionSampler\", geometryBufferRenderer.getGBuffer().textures[wPositionIndex]);\r\n\r\n this.reset = false;\r\n this._isMoving = false;\r\n }\r\n\r\n private _updatePositionCopy() {\r\n const geometryBufferRenderer = this._scene.geometryBufferRenderer;\r\n const index = geometryBufferRenderer!.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);\r\n this._oldPositionCopy.setTexture(\"textureSampler\", geometryBufferRenderer!.getGBuffer().textures[index]);\r\n }\r\n\r\n private _setAccumulationCopyBindings() {\r\n this._oldAccumulationCopy.setTexture(\"textureSampler\", this._outputTexture);\r\n }\r\n\r\n /**\r\n * Called by render pipeline when canvas resized.\r\n * @param scaleFactor The factor by which to scale the canvas size.\r\n */\r\n public resize(scaleFactor: number = 1.0) {\r\n const newSize = {\r\n width: Math.max(1.0, Math.floor(this._engine.getRenderWidth() * scaleFactor)),\r\n height: Math.max(1.0, Math.floor(this._engine.getRenderHeight() * scaleFactor)),\r\n };\r\n this._outputTexture.resize(newSize, false);\r\n this._oldAccumulationCopy.resize(newSize, false);\r\n this._oldPositionCopy.resize({ width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, false);\r\n this.reset = true;\r\n }\r\n\r\n private _disposeTextures() {\r\n this._oldAccumulationCopy.dispose();\r\n this._oldPositionCopy.dispose();\r\n this._outputTexture.dispose();\r\n }\r\n\r\n /**\r\n * Checks if the pass is ready\r\n * @returns true if the pass is ready\r\n */\r\n public isReady() {\r\n return (\r\n this._oldAccumulationCopy &&\r\n this._oldAccumulationCopy.isReady() &&\r\n this._oldPositionCopy &&\r\n this._oldPositionCopy.isReady() &&\r\n this._outputTexture.isReady() &&\r\n !(this._debugPassPP && !this._debugPassPP.isReady())\r\n );\r\n }\r\n\r\n /**\r\n * Disposes the associated resources\r\n */\r\n public dispose() {\r\n this._disposeTextures();\r\n if (this._debugPassPP) {\r\n this._debugPassPP.dispose();\r\n }\r\n }\r\n}\r\n"]}