@onerjs/core 8.28.6 → 8.28.7

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 (78) hide show
  1. package/FrameGraph/Node/Blocks/Layers/glowLayerBlock.js +1 -1
  2. package/FrameGraph/Node/Blocks/Layers/glowLayerBlock.js.map +1 -1
  3. package/FrameGraph/Node/Blocks/PostProcesses/taaPostProcessBlock.d.ts +55 -0
  4. package/FrameGraph/Node/Blocks/PostProcesses/taaPostProcessBlock.js +147 -0
  5. package/FrameGraph/Node/Blocks/PostProcesses/taaPostProcessBlock.js.map +1 -0
  6. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js +1 -1
  7. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js.map +1 -1
  8. package/FrameGraph/Node/Blocks/index.d.ts +1 -1
  9. package/FrameGraph/Node/Blocks/index.js +1 -1
  10. package/FrameGraph/Node/Blocks/index.js.map +1 -1
  11. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js +1 -6
  12. package/FrameGraph/Tasks/PostProcesses/postProcessTask.js.map +1 -1
  13. package/FrameGraph/Tasks/PostProcesses/taaTask.d.ts +29 -0
  14. package/FrameGraph/Tasks/PostProcesses/taaTask.js +102 -0
  15. package/FrameGraph/Tasks/PostProcesses/taaTask.js.map +1 -0
  16. package/FrameGraph/frameGraphTextureManager.d.ts +9 -0
  17. package/FrameGraph/frameGraphTextureManager.js +15 -0
  18. package/FrameGraph/frameGraphTextureManager.js.map +1 -1
  19. package/FrameGraph/index.d.ts +1 -1
  20. package/FrameGraph/index.js +1 -1
  21. package/FrameGraph/index.js.map +1 -1
  22. package/Materials/Background/backgroundMaterial.js +1 -1
  23. package/Materials/Background/backgroundMaterial.js.map +1 -1
  24. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +1 -1
  25. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  26. package/Materials/PBR/index.d.ts +1 -1
  27. package/Materials/PBR/index.js +1 -1
  28. package/Materials/PBR/index.js.map +1 -1
  29. package/Materials/PBR/{openPbrMaterial.d.ts → openpbrMaterial.d.ts} +17 -0
  30. package/Materials/PBR/{openPbrMaterial.js → openpbrMaterial.js} +33 -5
  31. package/Materials/PBR/openpbrMaterial.js.map +1 -0
  32. package/Materials/PBR/pbrBaseMaterial.js +1 -1
  33. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  34. package/Materials/material.d.ts +7 -3
  35. package/Materials/material.js +11 -7
  36. package/Materials/material.js.map +1 -1
  37. package/Materials/standardMaterial.js +1 -1
  38. package/Materials/standardMaterial.js.map +1 -1
  39. package/Maths/math.vector.d.ts +1 -1
  40. package/Maths/math.vector.js +1 -1
  41. package/Maths/math.vector.js.map +1 -1
  42. package/Meshes/mesh.js +8 -0
  43. package/Meshes/mesh.js.map +1 -1
  44. package/Morph/morphTargetManager.d.ts +2 -0
  45. package/Morph/morphTargetManager.js +19 -1
  46. package/Morph/morphTargetManager.js.map +1 -1
  47. package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.js +1 -1
  48. package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.js.map +1 -1
  49. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.d.ts +0 -1
  50. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js +4 -22
  51. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js.map +1 -1
  52. package/PostProcesses/thinTAAPostProcess.d.ts +10 -5
  53. package/PostProcesses/thinTAAPostProcess.js +37 -7
  54. package/PostProcesses/thinTAAPostProcess.js.map +1 -1
  55. package/Rendering/IBLShadows/iblShadowsPluginMaterial.d.ts +1 -1
  56. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js +1 -1
  57. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js.map +1 -1
  58. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +1 -1
  59. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  60. package/Rendering/boundingBoxRenderer.js +5 -1
  61. package/Rendering/boundingBoxRenderer.js.map +1 -1
  62. package/Rendering/edgesRenderer.js +3 -0
  63. package/Rendering/edgesRenderer.js.map +1 -1
  64. package/Rendering/geometryBufferRenderer.js.map +1 -1
  65. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js +4 -4
  66. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  67. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js +4 -4
  68. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  69. package/package.json +1 -1
  70. package/scene.d.ts +3 -1
  71. package/scene.js.map +1 -1
  72. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.d.ts +0 -48
  73. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.js +0 -119
  74. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.js.map +0 -1
  75. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.d.ts +0 -24
  76. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js +0 -109
  77. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js.map +0 -1
  78. package/Materials/PBR/openPbrMaterial.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  import { Camera } from "../Cameras/camera.js";
2
2
  import { Halton2DSequence } from "../Maths/halton2DSequence.js";
3
3
  import { Vector2 } from "../Maths/math.vector.js";
4
- import { Engine } from "../Engines/engine.js";
5
4
  import { EffectWrapper } from "../Materials/effectRenderer.js";
5
+ import { TAAMaterialManager } from "./RenderPipeline/Pipelines/taaMaterialManager.js";
6
6
  /**
7
7
  * Simple implementation of Temporal Anti-Aliasing (TAA).
8
8
  * This can be used to improve image quality for still pictures (screenshots for e.g.).
@@ -41,6 +41,9 @@ export class ThinTAAPostProcess extends EffectWrapper {
41
41
  return;
42
42
  }
43
43
  this._disabled = value;
44
+ if (this._taaMaterialManager) {
45
+ this._taaMaterialManager.isEnabled = !value && this.reprojectHistory;
46
+ }
44
47
  this._reset();
45
48
  }
46
49
  /**
@@ -81,6 +84,16 @@ export class ThinTAAPostProcess extends EffectWrapper {
81
84
  return;
82
85
  }
83
86
  this._reprojectHistory = reproject;
87
+ if (reproject) {
88
+ if (!this._taaMaterialManager) {
89
+ this._taaMaterialManager = new TAAMaterialManager(this._scene);
90
+ }
91
+ // The velocity buffer may be old so reset for one frame
92
+ this._reset();
93
+ }
94
+ if (this._taaMaterialManager) {
95
+ this._taaMaterialManager.isEnabled = reproject && !this._disabled;
96
+ }
84
97
  this._updateEffect();
85
98
  }
86
99
  /**
@@ -100,14 +113,14 @@ export class ThinTAAPostProcess extends EffectWrapper {
100
113
  /**
101
114
  * Constructs a new TAA post process
102
115
  * @param name Name of the effect
103
- * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
116
+ * @param scene The scene the post process belongs to
104
117
  * @param options Options to configure the effect
105
118
  */
106
- constructor(name, engine = null, options) {
119
+ constructor(name, scene, options) {
107
120
  super({
108
121
  ...options,
109
122
  name,
110
- engine: engine || Engine.LastCreatedEngine,
123
+ engine: scene.getEngine(),
111
124
  useShaderStore: true,
112
125
  useAsPostProcess: true,
113
126
  fragmentShader: ThinTAAPostProcess.FragmentUrl,
@@ -130,6 +143,7 @@ export class ThinTAAPostProcess extends EffectWrapper {
130
143
  this._reprojectHistory = false;
131
144
  this._clampHistory = false;
132
145
  this._firstUpdate = true;
146
+ this._scene = scene;
133
147
  this._hs = new Halton2DSequence(this.samples);
134
148
  }
135
149
  /** @internal */
@@ -138,14 +152,26 @@ export class ThinTAAPostProcess extends EffectWrapper {
138
152
  this._hs.next();
139
153
  this._firstUpdate = true;
140
154
  }
141
- nextJitterOffset(output = new Vector2()) {
142
- if (!this.camera || !this.camera.hasMoved) {
155
+ /** @internal */
156
+ _updateJitter() {
157
+ if (this.reprojectHistory && this._taaMaterialManager) {
158
+ // Applying jitter to the projection matrix messes with the velocity buffer,
159
+ // so we do it as a final vertex step in a material plugin instead
160
+ this._nextJitterOffset( /*this._taaMaterialManager.jitter*/);
161
+ }
162
+ else {
163
+ // Use the projection matrix by default since it supports most materials
164
+ this._updateProjectionMatrix();
165
+ }
166
+ }
167
+ _nextJitterOffset(output = new Vector2()) {
168
+ if (!this.camera || !this.camera.hasMoved || !this.disableOnCameraMove) {
143
169
  this._hs.next();
144
170
  }
145
171
  output.set(this._hs.x, this._hs.y);
146
172
  return output;
147
173
  }
148
- updateProjectionMatrix() {
174
+ _updateProjectionMatrix() {
149
175
  if (this.disabled) {
150
176
  return;
151
177
  }
@@ -171,6 +197,10 @@ export class ThinTAAPostProcess extends EffectWrapper {
171
197
  effect.setFloat("factor", (this.camera?.hasMoved && this.disableOnCameraMove) || this._firstUpdate ? 1 : this.factor);
172
198
  this._firstUpdate = false;
173
199
  }
200
+ dispose() {
201
+ this._taaMaterialManager?.dispose();
202
+ super.dispose();
203
+ }
174
204
  _updateEffect() {
175
205
  const defines = [];
176
206
  // There seems to be an issue where `updateEffect` sometimes doesn't include the initial samplers
@@ -1 +1 @@
1
- {"version":3,"file":"thinTAAPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinTAAPostProcess.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, AbstractEngine, EffectWrapperCreationOptions } from \"core/index\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { Halton2DSequence } from \"core/Maths/halton2DSequence\";\r\nimport { Vector2 } from \"core/Maths/math.vector\";\r\nimport { Engine } from \"core/Engines/engine\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer\";\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 ThinTAAPostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"taa\";\r\n\r\n /**\r\n * The list of uniforms used by the effect\r\n */\r\n public static readonly Uniforms = [\"factor\"];\r\n\r\n /**\r\n * The list of samplers used by the effect\r\n */\r\n public static readonly Samplers = [\"historySampler\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/taa.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/taa.fragment\"));\r\n }\r\n }\r\n\r\n private _samples = 8;\r\n /**\r\n * Number of accumulated samples (default: 8)\r\n */\r\n public set samples(samples: number) {\r\n if (this._samples === samples) {\r\n return;\r\n }\r\n\r\n this._samples = samples;\r\n this._hs.regenerate(samples);\r\n }\r\n\r\n public get samples(): number {\r\n return this._samples;\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 public factor = 0.05;\r\n\r\n /**\r\n * The camera to use for the post process\r\n */\r\n public camera: Nullable<Camera>;\r\n\r\n private _disabled = false;\r\n /**\r\n * Whether the TAA is disabled\r\n */\r\n public get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n public set disabled(value: boolean) {\r\n if (this._disabled === value) {\r\n return;\r\n }\r\n this._disabled = value;\r\n this._reset();\r\n }\r\n\r\n private _textureWidth = 0;\r\n /**\r\n * The width of the texture in which to render\r\n */\r\n public get textureWidth() {\r\n return this._textureWidth;\r\n }\r\n\r\n public set textureWidth(width: number) {\r\n if (this._textureWidth === width) {\r\n return;\r\n }\r\n this._textureWidth = width;\r\n this._reset();\r\n }\r\n\r\n private _textureHeight = 0;\r\n /**\r\n * The height of the texture in which to render\r\n */\r\n public get textureHeight() {\r\n return this._textureHeight;\r\n }\r\n\r\n public set textureHeight(height: number) {\r\n if (this._textureHeight === height) {\r\n return;\r\n }\r\n this._textureHeight = height;\r\n this._reset();\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 public disableOnCameraMove = true;\r\n\r\n private _reprojectHistory = false;\r\n /**\r\n * Enables reprojecting the history texture with a per-pixel velocity.\r\n * If set the \"velocitySampler\" has to be provided.\r\n */\r\n public get reprojectHistory(): boolean {\r\n return this._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._reprojectHistory = reproject;\r\n this._updateEffect();\r\n }\r\n\r\n private _clampHistory = false;\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 public get clampHistory(): boolean {\r\n return this._clampHistory;\r\n }\r\n\r\n public set clampHistory(clamp: boolean) {\r\n if (this._clampHistory === clamp) {\r\n return;\r\n }\r\n this._clampHistory = clamp;\r\n this._updateEffect();\r\n }\r\n\r\n private _hs: Halton2DSequence;\r\n private _firstUpdate = true;\r\n\r\n /**\r\n * Constructs a new TAA 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: ThinTAAPostProcess.FragmentUrl,\r\n uniforms: ThinTAAPostProcess.Uniforms,\r\n samplers: ThinTAAPostProcess.Samplers,\r\n });\r\n\r\n this._hs = new Halton2DSequence(this.samples);\r\n }\r\n\r\n /** @internal */\r\n public _reset(): void {\r\n this._hs.setDimensions(this._textureWidth / 2, this._textureHeight / 2);\r\n this._hs.next();\r\n this._firstUpdate = true;\r\n }\r\n\r\n public nextJitterOffset(output = new Vector2()): Vector2 {\r\n if (!this.camera || !this.camera.hasMoved) {\r\n this._hs.next();\r\n }\r\n output.set(this._hs.x, this._hs.y);\r\n return output;\r\n }\r\n\r\n public updateProjectionMatrix(): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n if (this.camera && !this.camera.hasMoved) {\r\n if (this.camera.mode === Camera.PERSPECTIVE_CAMERA) {\r\n const projMat = this.camera.getProjectionMatrix();\r\n projMat.setRowFromFloats(2, this._hs.x, this._hs.y, projMat.m[10], projMat.m[11]);\r\n } else {\r\n // We must force the update of the projection matrix so that m[12] and m[13] are recomputed, as we modified them the previous frame\r\n const projMat = this.camera.getProjectionMatrix(true);\r\n projMat.setRowFromFloats(3, this._hs.x + projMat.m[12], this._hs.y + projMat.m[13], projMat.m[14], projMat.m[15]);\r\n }\r\n }\r\n\r\n this._hs.next();\r\n }\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n const effect = this._drawWrapper.effect!;\r\n\r\n effect.setFloat(\"factor\", (this.camera?.hasMoved && this.disableOnCameraMove) || this._firstUpdate ? 1 : this.factor);\r\n\r\n this._firstUpdate = false;\r\n }\r\n\r\n private _updateEffect(): void {\r\n const defines: string[] = [];\r\n // There seems to be an issue where `updateEffect` sometimes doesn't include the initial samplers\r\n const samplers = [\"textureSampler\", \"historySampler\"];\r\n if (this._reprojectHistory) {\r\n defines.push(\"#define TAA_REPROJECT_HISTORY\");\r\n samplers.push(\"velocitySampler\");\r\n }\r\n if (this._clampHistory) {\r\n defines.push(\"#define TAA_CLAMP_HISTORY\");\r\n }\r\n this.updateEffect(defines.join(\"\\n\"), null, samplers);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"thinTAAPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinTAAPostProcess.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, EffectWrapperCreationOptions, Scene } from \"core/index\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { Halton2DSequence } from \"core/Maths/halton2DSequence\";\r\nimport { Vector2 } from \"core/Maths/math.vector\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer\";\r\nimport { TAAMaterialManager } from \"./RenderPipeline/Pipelines/taaMaterialManager\";\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 ThinTAAPostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"taa\";\r\n\r\n /**\r\n * The list of uniforms used by the effect\r\n */\r\n public static readonly Uniforms = [\"factor\"];\r\n\r\n /**\r\n * The list of samplers used by the effect\r\n */\r\n public static readonly Samplers = [\"historySampler\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/taa.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/taa.fragment\"));\r\n }\r\n }\r\n\r\n private _samples = 8;\r\n /**\r\n * Number of accumulated samples (default: 8)\r\n */\r\n public set samples(samples: number) {\r\n if (this._samples === samples) {\r\n return;\r\n }\r\n\r\n this._samples = samples;\r\n this._hs.regenerate(samples);\r\n }\r\n\r\n public get samples(): number {\r\n return this._samples;\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 public factor = 0.05;\r\n\r\n /**\r\n * The camera to use for the post process\r\n */\r\n public camera: Nullable<Camera>;\r\n\r\n private _disabled = false;\r\n /**\r\n * Whether the TAA is disabled\r\n */\r\n public get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n public set disabled(value: boolean) {\r\n if (this._disabled === value) {\r\n return;\r\n }\r\n this._disabled = value;\r\n if (this._taaMaterialManager) {\r\n this._taaMaterialManager.isEnabled = !value && this.reprojectHistory;\r\n }\r\n this._reset();\r\n }\r\n\r\n private _textureWidth = 0;\r\n /**\r\n * The width of the texture in which to render\r\n */\r\n public get textureWidth() {\r\n return this._textureWidth;\r\n }\r\n\r\n public set textureWidth(width: number) {\r\n if (this._textureWidth === width) {\r\n return;\r\n }\r\n this._textureWidth = width;\r\n this._reset();\r\n }\r\n\r\n private _textureHeight = 0;\r\n /**\r\n * The height of the texture in which to render\r\n */\r\n public get textureHeight() {\r\n return this._textureHeight;\r\n }\r\n\r\n public set textureHeight(height: number) {\r\n if (this._textureHeight === height) {\r\n return;\r\n }\r\n this._textureHeight = height;\r\n this._reset();\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 public disableOnCameraMove = true;\r\n\r\n private _reprojectHistory = false;\r\n /**\r\n * Enables reprojecting the history texture with a per-pixel velocity.\r\n * If set the \"velocitySampler\" has to be provided.\r\n */\r\n public get reprojectHistory(): boolean {\r\n return this._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._reprojectHistory = reproject;\r\n\r\n if (reproject) {\r\n 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._reset();\r\n }\r\n\r\n if (this._taaMaterialManager) {\r\n this._taaMaterialManager.isEnabled = reproject && !this._disabled;\r\n }\r\n\r\n this._updateEffect();\r\n }\r\n\r\n private _clampHistory = false;\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 public get clampHistory(): boolean {\r\n return this._clampHistory;\r\n }\r\n\r\n public set clampHistory(clamp: boolean) {\r\n if (this._clampHistory === clamp) {\r\n return;\r\n }\r\n this._clampHistory = clamp;\r\n this._updateEffect();\r\n }\r\n\r\n private _scene: Scene;\r\n private _hs: Halton2DSequence;\r\n private _firstUpdate = true;\r\n private _taaMaterialManager: Nullable<TAAMaterialManager>;\r\n\r\n /**\r\n * Constructs a new TAA post process\r\n * @param name Name of the effect\r\n * @param scene The scene the post process belongs to\r\n * @param options Options to configure the effect\r\n */\r\n constructor(name: string, scene: Scene, options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: scene.getEngine(),\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinTAAPostProcess.FragmentUrl,\r\n uniforms: ThinTAAPostProcess.Uniforms,\r\n samplers: ThinTAAPostProcess.Samplers,\r\n });\r\n\r\n this._scene = scene;\r\n this._hs = new Halton2DSequence(this.samples);\r\n }\r\n\r\n /** @internal */\r\n public _reset(): void {\r\n this._hs.setDimensions(this._textureWidth / 2, this._textureHeight / 2);\r\n this._hs.next();\r\n this._firstUpdate = true;\r\n }\r\n\r\n /** @internal */\r\n public _updateJitter() {\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._nextJitterOffset(/*this._taaMaterialManager.jitter*/);\r\n } else {\r\n // Use the projection matrix by default since it supports most materials\r\n this._updateProjectionMatrix();\r\n }\r\n }\r\n\r\n protected _nextJitterOffset(output = new Vector2()): Vector2 {\r\n if (!this.camera || !this.camera.hasMoved || !this.disableOnCameraMove) {\r\n this._hs.next();\r\n }\r\n output.set(this._hs.x, this._hs.y);\r\n return output;\r\n }\r\n\r\n protected _updateProjectionMatrix(): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n if (this.camera && !this.camera.hasMoved) {\r\n if (this.camera.mode === Camera.PERSPECTIVE_CAMERA) {\r\n const projMat = this.camera.getProjectionMatrix();\r\n projMat.setRowFromFloats(2, this._hs.x, this._hs.y, projMat.m[10], projMat.m[11]);\r\n } else {\r\n // We must force the update of the projection matrix so that m[12] and m[13] are recomputed, as we modified them the previous frame\r\n const projMat = this.camera.getProjectionMatrix(true);\r\n projMat.setRowFromFloats(3, this._hs.x + projMat.m[12], this._hs.y + projMat.m[13], projMat.m[14], projMat.m[15]);\r\n }\r\n }\r\n\r\n this._hs.next();\r\n }\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n const effect = this._drawWrapper.effect!;\r\n\r\n effect.setFloat(\"factor\", (this.camera?.hasMoved && this.disableOnCameraMove) || this._firstUpdate ? 1 : this.factor);\r\n\r\n this._firstUpdate = false;\r\n }\r\n\r\n public override dispose() {\r\n this._taaMaterialManager?.dispose();\r\n super.dispose();\r\n }\r\n\r\n private _updateEffect(): void {\r\n const defines: string[] = [];\r\n // There seems to be an issue where `updateEffect` sometimes doesn't include the initial samplers\r\n const samplers = [\"textureSampler\", \"historySampler\"];\r\n if (this._reprojectHistory) {\r\n defines.push(\"#define TAA_REPROJECT_HISTORY\");\r\n samplers.push(\"velocitySampler\");\r\n }\r\n if (this._clampHistory) {\r\n defines.push(\"#define TAA_CLAMP_HISTORY\");\r\n }\r\n this.updateEffect(defines.join(\"\\n\"), null, samplers);\r\n }\r\n}\r\n"]}
@@ -6,7 +6,7 @@ import type { StandardMaterial } from "../../Materials/standardMaterial.js";
6
6
  import { PBRBaseMaterial } from "../../Materials/PBR/pbrBaseMaterial.js";
7
7
  import type { UniformBuffer } from "../../Materials/uniformBuffer.js";
8
8
  import { ShaderLanguage } from "../../Materials/shaderLanguage.js";
9
- import { OpenPBRMaterial } from "../../Materials/PBR/openPbrMaterial.js";
9
+ import { OpenPBRMaterial } from "../../Materials/PBR/openpbrMaterial.js";
10
10
  /**
11
11
  * @internal
12
12
  */
@@ -5,7 +5,7 @@ import { MaterialPluginBase } from "../../Materials/materialPluginBase.js";
5
5
  import { PBRBaseMaterial } from "../../Materials/PBR/pbrBaseMaterial.js";
6
6
  import { expandToProperty, serialize } from "../../Misc/decorators.js";
7
7
  import { RegisterClass } from "../../Misc/typeStore.js";
8
- import { OpenPBRMaterial } from "../../Materials/PBR/openPbrMaterial.js";
8
+ import { OpenPBRMaterial } from "../../Materials/PBR/openpbrMaterial.js";
9
9
  /**
10
10
  * @internal
11
11
  */
@@ -1 +1 @@
1
- {"version":3,"file":"iblShadowsPluginMaterial.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsPluginMaterial.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,2CAAuC;AACjE,OAAO,EAAE,kBAAkB,EAAE,8CAA0C;AAGvE,OAAO,EAAE,SAAS,EAAE,mCAA+B;AAEnD,OAAO,EAAE,eAAe,EAAE,+CAA2C;AAErE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,iCAA6B;AACnE,OAAO,EAAE,aAAa,EAAE,gCAA4B;AAGpD,OAAO,EAAE,eAAe,EAAE,+CAA2C;AACrE;;GAEG;AACH,MAAM,+BAAgC,SAAQ,eAAe;IAA7D;;QACW,4BAAuB,GAAG,KAAK,CAAC;QAChC,wBAAmB,GAAG,KAAK,CAAC;IACvC,CAAC;CAAA;AAED;;GAEG;AACH,MAAM,OAAO,wBAAyB,SAAQ,kBAAkB;IAmB5D,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IACD,IAAW,SAAS,CAAC,KAAc;QAC/B,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YAC5B,OAAO;QACX,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,gCAAgC,EAAE,CAAC;IAC5C,CAAC;IAQS,gCAAgC;QACtC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9B,IAAI,CAAC,wCAAwC,EAAE,CAAC;IACpD,CAAC;IAID;;;OAGG;IACa,YAAY;QACxB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,YAAY,QAAyE;QACjF,KAAK,CAAC,QAAQ,EAAE,wBAAwB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,+BAA+B,EAAE,CAAC,CAAC;QAzC/F;;WAEG;QAEI,kBAAa,GAAW,GAAG,CAAC;QAE3B,eAAU,GAAG,KAAK,CAAC;QACnB,eAAU,GAAG,KAAK,CAAC;QAW3B;;WAEG;QAGI,cAAS,GAAG,KAAK,CAAC;QAmBrB,IAAI,CAAC,wCAAwC,GAAG,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;IAClH,CAAC;IAEe,cAAc,CAAC,OAAwC;QACnE,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,UAAU,CAAC;QAClD,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC;IACjD,CAAC;IAEe,YAAY;QACxB,OAAO,0BAA0B,CAAC;IACtC,CAAC;IAEe,WAAW;QACvB,OAAO;YACH,GAAG,EAAE;gBACD,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;gBACnD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;aACpD;YACD,QAAQ,EAAE;;;uBAGC;SACd,CAAC;IACN,CAAC;IAEe,WAAW,CAAC,QAAkB;QAC1C,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IAEe,cAAc,CAAC,aAA4B;QACvD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,aAAa,CAAC,WAAW,CAAC,mBAAmB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACvE,aAAa,CAAC,YAAY,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;YAChK,aAAa,CAAC,WAAW,CAAC,eAAe,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACnE,CAAC;IACL,CAAC;IAEe,aAAa,CAAC,UAAkB,EAAE,cAA8B;QAC5E,IAAI,IAAgC,CAAC;QAErC,IAAI,cAAc,gCAAwB,EAAE,CAAC;YACzC,IAAI,GAAG;gBACH,gEAAgE;gBAChE,2BAA2B,EAAE;;;;;;;;;;;;;;;;;;;aAmBhC;aACA,CAAC;YAEF,IAAI,IAAI,CAAC,SAAS,YAAY,eAAe,EAAE,CAAC;gBAC5C,gEAAgE;gBAChE,IAAI,CAAC,8CAA8C,CAAC,GAAG;;;;;;;;;;;;;;;;;;aAkB1D,CAAC;YACF,CAAC;iBAAM,IAAI,IAAI,CAAC,SAAS,YAAY,eAAe,EAAE,CAAC;gBACnD,gEAAgE;gBAChE,IAAI,CAAC,4CAA4C,CAAC,GAAG;;;;;;;;;;;;;;;;;;aAkBxD,CAAC;YACF,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,kCAAkC,CAAC,GAAG;;;;;;;;;;aAU9C,CAAC;YACF,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,GAAG;gBACH,gEAAgE;gBAChE,2BAA2B,EAAE;;;;;;;;;;;;;;;;;aAiBhC;aACA,CAAC;YAEF,IAAI,IAAI,CAAC,SAAS,YAAY,eAAe,EAAE,CAAC;gBAC5C,gEAAgE;gBAChE,IAAI,CAAC,8CAA8C,CAAC,GAAG;;;;;;;;;;;;;;;;;;aAkB1D,CAAC;YACF,CAAC;iBAAM,IAAI,IAAI,CAAC,SAAS,YAAY,eAAe,EAAE,CAAC;gBACnD,gEAAgE;gBAChE,IAAI,CAAC,4CAA4C,CAAC,GAAG;;;;;;;;;;;;;;;;;;aAkBxD,CAAC;YACF,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,kCAAkC,CAAC,GAAG;;;;;;;;;;aAU9C,CAAC;YACF,CAAC;QACL,CAAC;QAED,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACjD,CAAC;;AA7PD;;GAEG;AACoB,6BAAI,GAAG,0BAA0B,AAA7B,CAA8B;AAWlD;IADN,SAAS,EAAE;+DACuB;AAmB5B;IAFN,SAAS,EAAE;IACX,gBAAgB,CAAC,kCAAkC,CAAC;2DAC5B;AA+N7B,aAAa,CAAC,kCAAkC,EAAE,wBAAwB,CAAC,CAAC","sourcesContent":["import { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport type { InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { expandToProperty, serialize } from \"core/Misc/decorators\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\n\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openPbrMaterial\";\r\n/**\r\n * @internal\r\n */\r\nclass MaterialIBLShadowsRenderDefines extends MaterialDefines {\r\n public RENDER_WITH_IBL_SHADOWS = false;\r\n public COLORED_IBL_SHADOWS = false;\r\n}\r\n\r\n/**\r\n * Plugin used to render the contribution from IBL shadows.\r\n */\r\nexport class IBLShadowsPluginMaterial extends MaterialPluginBase {\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public static readonly Name = \"IBLShadowsPluginMaterial\";\r\n\r\n /**\r\n * The texture containing the contribution from IBL shadows.\r\n */\r\n public iblShadowsTexture: InternalTexture;\r\n\r\n /**\r\n * The opacity of the shadows.\r\n */\r\n @serialize()\r\n public shadowOpacity: number = 1.0;\r\n\r\n private _isEnabled = false;\r\n private _isColored = false;\r\n public get isColored(): boolean {\r\n return this._isColored;\r\n }\r\n public set isColored(value: boolean) {\r\n if (this._isColored === value) {\r\n return;\r\n }\r\n this._isColored = value;\r\n this._markAllSubMeshesAsTexturesDirty();\r\n }\r\n /**\r\n * Defines if the plugin is enabled in the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public isEnabled = false;\r\n\r\n protected _markAllSubMeshesAsTexturesDirty(): void {\r\n this._enable(this._isEnabled);\r\n this._internalMarkAllSubMeshesAsTexturesDirty();\r\n }\r\n\r\n private _internalMarkAllSubMeshesAsTexturesDirty: () => void;\r\n\r\n /**\r\n * Gets a boolean indicating that the plugin is compatible with a give shader language.\r\n * @returns true if the plugin is compatible with the shader language\r\n */\r\n public override isCompatible(): boolean {\r\n return true;\r\n }\r\n\r\n constructor(material: Material | StandardMaterial | PBRBaseMaterial | OpenPBRMaterial) {\r\n super(material, IBLShadowsPluginMaterial.Name, 310, new MaterialIBLShadowsRenderDefines());\r\n this._internalMarkAllSubMeshesAsTexturesDirty = material._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag];\r\n }\r\n\r\n public override prepareDefines(defines: MaterialIBLShadowsRenderDefines) {\r\n defines.RENDER_WITH_IBL_SHADOWS = this._isEnabled;\r\n defines.COLORED_IBL_SHADOWS = this.isColored;\r\n }\r\n\r\n public override getClassName() {\r\n return \"IBLShadowsPluginMaterial\";\r\n }\r\n\r\n public override getUniforms() {\r\n return {\r\n ubo: [\r\n { name: \"renderTargetSize\", size: 2, type: \"vec2\" },\r\n { name: \"shadowOpacity\", size: 1, type: \"float\" },\r\n ],\r\n fragment: `#ifdef RENDER_WITH_IBL_SHADOWS\r\n uniform vec2 renderTargetSize;\r\n uniform float shadowOpacity;\r\n #endif`,\r\n };\r\n }\r\n\r\n public override getSamplers(samplers: string[]) {\r\n samplers.push(\"iblShadowsTexture\");\r\n }\r\n\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer) {\r\n if (this._isEnabled) {\r\n uniformBuffer.bindTexture(\"iblShadowsTexture\", this.iblShadowsTexture);\r\n uniformBuffer.updateFloat2(\"renderTargetSize\", this._material.getScene().getEngine().getRenderWidth(), this._material.getScene().getEngine().getRenderHeight());\r\n uniformBuffer.updateFloat(\"shadowOpacity\", this.shadowOpacity);\r\n }\r\n }\r\n\r\n public override getCustomCode(shaderType: string, shaderLanguage: ShaderLanguage) {\r\n let frag: { [name: string]: string };\r\n\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n frag = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n var iblShadowsTextureSampler: sampler;\r\n var iblShadowsTexture: texture_2d<f32>;\r\n\r\n #ifdef COLORED_IBL_SHADOWS\r\n fn computeIndirectShadow() -> vec3f {\r\n var uv = fragmentInputs.position.xy / uniforms.renderTargetSize;\r\n var shadowValue: vec3f = textureSample(iblShadowsTexture, iblShadowsTextureSampler, uv).rgb;\r\n return mix(shadowValue, vec3f(1.0), 1.0 - uniforms.shadowOpacity);\r\n }\r\n #else\r\n fn computeIndirectShadow() -> vec2f {\r\n var uv = fragmentInputs.position.xy / uniforms.renderTargetSize;\r\n var shadowValue: vec2f = textureSample(iblShadowsTexture, iblShadowsTextureSampler, uv).rg;\r\n return mix(shadowValue, vec2f(1.0), 1.0 - uniforms.shadowOpacity);\r\n }\r\n #endif\r\n #endif\r\n `,\r\n };\r\n\r\n if (this._material instanceof PBRBaseMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifndef UNLIT\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n var shadowValue: vec3f = computeIndirectShadow();\r\n finalIrradiance *= shadowValue;\r\n finalRadianceScaled *= mix(vec3f(1.0), shadowValue, roughness);\r\n #else\r\n var shadowValue: vec2f = computeIndirectShadow();\r\n finalIrradiance *= vec3f(shadowValue.x);\r\n finalRadianceScaled *= vec3f(mix(pow(shadowValue.y, 4.0), shadowValue.x, roughness));\r\n #endif\r\n #endif\r\n #else\r\n finalDiffuse *= computeIndirectShadow().x;\r\n #endif\r\n #endif\r\n `;\r\n } else if (this._material instanceof OpenPBRMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_IBLLAYERCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifndef UNLIT\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n var shadowValue: vec3f = computeIndirectShadow();\r\n slab_diffuse_ibl *= shadowValue;\r\n slab_glossy_ibl *= mix(vec3f(1.0), shadowValue, specularAlphaG);\r\n #else\r\n var shadowValue: vec2f = computeIndirectShadow();\r\n slab_diffuse_ibl *= vec3f(shadowValue.x);\r\n slab_glossy_ibl *= vec3f(mix(pow(shadowValue.y, 4.0), shadowValue.x, specularAlphaG));\r\n #endif\r\n #endif\r\n #else\r\n slab_diffuse_ibl *= computeIndirectShadow().x;\r\n #endif\r\n #endif\r\n `;\r\n } else {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifdef COLORED_IBL_SHADOWS\r\n var shadowValue: vec3f = computeIndirectShadow();\r\n color *= toGammaSpace(vec4f(shadowValue, 1.0f));\r\n #else\r\n var shadowValue: vec2f = computeIndirectShadow();\r\n color *= toGammaSpace(vec4f(shadowValue.x, shadowValue.x, shadowValue.x, 1.0f));\r\n #endif\r\n #endif\r\n `;\r\n }\r\n } else {\r\n frag = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n uniform sampler2D iblShadowsTexture;\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 computeIndirectShadow() {\r\n vec2 uv = gl_FragCoord.xy / renderTargetSize;\r\n vec3 shadowValue = texture2D(iblShadowsTexture, uv).rgb;\r\n return mix(shadowValue.rgb, vec3(1.0), 1.0 - shadowOpacity);\r\n }\r\n #else\r\n vec2 computeIndirectShadow() {\r\n vec2 uv = gl_FragCoord.xy / renderTargetSize;\r\n vec2 shadowValue = texture2D(iblShadowsTexture, uv).rg;\r\n return mix(shadowValue.rg, vec2(1.0), 1.0 - shadowOpacity);\r\n }\r\n #endif\r\n #endif\r\n `,\r\n };\r\n\r\n if (this._material instanceof PBRBaseMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifndef UNLIT\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 shadowValue = computeIndirectShadow();\r\n finalIrradiance.rgb *= shadowValue.rgb;\r\n finalRadianceScaled *= mix(vec3(1.0), shadowValue.rgb, roughness);\r\n #else\r\n vec2 shadowValue = computeIndirectShadow();\r\n finalIrradiance *= shadowValue.x;\r\n finalRadianceScaled *= mix(pow(shadowValue.y, 4.0), shadowValue.x, roughness);\r\n #endif\r\n #endif\r\n #else\r\n finalDiffuse *= computeIndirectShadow().x;\r\n #endif\r\n #endif\r\n `;\r\n } else if (this._material instanceof OpenPBRMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_IBLLAYERCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifndef UNLIT\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 shadowValue = computeIndirectShadow();\r\n slab_diffuse_ibl.rgb *= shadowValue.rgb;\r\n slab_glossy_ibl *= mix(vec3(1.0), shadowValue.rgb, specularAlphaG);\r\n #else\r\n vec2 shadowValue = computeIndirectShadow();\r\n slab_diffuse_ibl *= shadowValue.x;\r\n slab_glossy_ibl *= mix(pow(shadowValue.y, 4.0), shadowValue.x, specularAlphaG);\r\n #endif\r\n #endif\r\n #else\r\n slab_diffuse_ibl *= computeIndirectShadow().x;\r\n #endif\r\n #endif\r\n `;\r\n } else {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 shadowValue = computeIndirectShadow();\r\n color.rgb *= toGammaSpace(shadowValue.rgb);\r\n #else\r\n vec2 shadowValue = computeIndirectShadow();\r\n color.rgb *= toGammaSpace(shadowValue.x);\r\n #endif\r\n #endif\r\n `;\r\n }\r\n }\r\n\r\n return shaderType === \"vertex\" ? null : frag;\r\n }\r\n}\r\n\r\nRegisterClass(`BABYLON.IBLShadowsPluginMaterial`, IBLShadowsPluginMaterial);\r\n"]}
1
+ {"version":3,"file":"iblShadowsPluginMaterial.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsPluginMaterial.ts"],"names":[],"mappings":"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","sourcesContent":["import { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport type { InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { expandToProperty, serialize } from \"core/Misc/decorators\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\n\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial\";\r\n/**\r\n * @internal\r\n */\r\nclass MaterialIBLShadowsRenderDefines extends MaterialDefines {\r\n public RENDER_WITH_IBL_SHADOWS = false;\r\n public COLORED_IBL_SHADOWS = false;\r\n}\r\n\r\n/**\r\n * Plugin used to render the contribution from IBL shadows.\r\n */\r\nexport class IBLShadowsPluginMaterial extends MaterialPluginBase {\r\n /**\r\n * Defines the name of the plugin.\r\n */\r\n public static readonly Name = \"IBLShadowsPluginMaterial\";\r\n\r\n /**\r\n * The texture containing the contribution from IBL shadows.\r\n */\r\n public iblShadowsTexture: InternalTexture;\r\n\r\n /**\r\n * The opacity of the shadows.\r\n */\r\n @serialize()\r\n public shadowOpacity: number = 1.0;\r\n\r\n private _isEnabled = false;\r\n private _isColored = false;\r\n public get isColored(): boolean {\r\n return this._isColored;\r\n }\r\n public set isColored(value: boolean) {\r\n if (this._isColored === value) {\r\n return;\r\n }\r\n this._isColored = value;\r\n this._markAllSubMeshesAsTexturesDirty();\r\n }\r\n /**\r\n * Defines if the plugin is enabled in the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public isEnabled = false;\r\n\r\n protected _markAllSubMeshesAsTexturesDirty(): void {\r\n this._enable(this._isEnabled);\r\n this._internalMarkAllSubMeshesAsTexturesDirty();\r\n }\r\n\r\n private _internalMarkAllSubMeshesAsTexturesDirty: () => void;\r\n\r\n /**\r\n * Gets a boolean indicating that the plugin is compatible with a give shader language.\r\n * @returns true if the plugin is compatible with the shader language\r\n */\r\n public override isCompatible(): boolean {\r\n return true;\r\n }\r\n\r\n constructor(material: Material | StandardMaterial | PBRBaseMaterial | OpenPBRMaterial) {\r\n super(material, IBLShadowsPluginMaterial.Name, 310, new MaterialIBLShadowsRenderDefines());\r\n this._internalMarkAllSubMeshesAsTexturesDirty = material._dirtyCallbacks[Constants.MATERIAL_TextureDirtyFlag];\r\n }\r\n\r\n public override prepareDefines(defines: MaterialIBLShadowsRenderDefines) {\r\n defines.RENDER_WITH_IBL_SHADOWS = this._isEnabled;\r\n defines.COLORED_IBL_SHADOWS = this.isColored;\r\n }\r\n\r\n public override getClassName() {\r\n return \"IBLShadowsPluginMaterial\";\r\n }\r\n\r\n public override getUniforms() {\r\n return {\r\n ubo: [\r\n { name: \"renderTargetSize\", size: 2, type: \"vec2\" },\r\n { name: \"shadowOpacity\", size: 1, type: \"float\" },\r\n ],\r\n fragment: `#ifdef RENDER_WITH_IBL_SHADOWS\r\n uniform vec2 renderTargetSize;\r\n uniform float shadowOpacity;\r\n #endif`,\r\n };\r\n }\r\n\r\n public override getSamplers(samplers: string[]) {\r\n samplers.push(\"iblShadowsTexture\");\r\n }\r\n\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer) {\r\n if (this._isEnabled) {\r\n uniformBuffer.bindTexture(\"iblShadowsTexture\", this.iblShadowsTexture);\r\n uniformBuffer.updateFloat2(\"renderTargetSize\", this._material.getScene().getEngine().getRenderWidth(), this._material.getScene().getEngine().getRenderHeight());\r\n uniformBuffer.updateFloat(\"shadowOpacity\", this.shadowOpacity);\r\n }\r\n }\r\n\r\n public override getCustomCode(shaderType: string, shaderLanguage: ShaderLanguage) {\r\n let frag: { [name: string]: string };\r\n\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n frag = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n var iblShadowsTextureSampler: sampler;\r\n var iblShadowsTexture: texture_2d<f32>;\r\n\r\n #ifdef COLORED_IBL_SHADOWS\r\n fn computeIndirectShadow() -> vec3f {\r\n var uv = fragmentInputs.position.xy / uniforms.renderTargetSize;\r\n var shadowValue: vec3f = textureSample(iblShadowsTexture, iblShadowsTextureSampler, uv).rgb;\r\n return mix(shadowValue, vec3f(1.0), 1.0 - uniforms.shadowOpacity);\r\n }\r\n #else\r\n fn computeIndirectShadow() -> vec2f {\r\n var uv = fragmentInputs.position.xy / uniforms.renderTargetSize;\r\n var shadowValue: vec2f = textureSample(iblShadowsTexture, iblShadowsTextureSampler, uv).rg;\r\n return mix(shadowValue, vec2f(1.0), 1.0 - uniforms.shadowOpacity);\r\n }\r\n #endif\r\n #endif\r\n `,\r\n };\r\n\r\n if (this._material instanceof PBRBaseMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifndef UNLIT\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n var shadowValue: vec3f = computeIndirectShadow();\r\n finalIrradiance *= shadowValue;\r\n finalRadianceScaled *= mix(vec3f(1.0), shadowValue, roughness);\r\n #else\r\n var shadowValue: vec2f = computeIndirectShadow();\r\n finalIrradiance *= vec3f(shadowValue.x);\r\n finalRadianceScaled *= vec3f(mix(pow(shadowValue.y, 4.0), shadowValue.x, roughness));\r\n #endif\r\n #endif\r\n #else\r\n finalDiffuse *= computeIndirectShadow().x;\r\n #endif\r\n #endif\r\n `;\r\n } else if (this._material instanceof OpenPBRMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_IBLLAYERCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifndef UNLIT\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n var shadowValue: vec3f = computeIndirectShadow();\r\n slab_diffuse_ibl *= shadowValue;\r\n slab_glossy_ibl *= mix(vec3f(1.0), shadowValue, specularAlphaG);\r\n #else\r\n var shadowValue: vec2f = computeIndirectShadow();\r\n slab_diffuse_ibl *= vec3f(shadowValue.x);\r\n slab_glossy_ibl *= vec3f(mix(pow(shadowValue.y, 4.0), shadowValue.x, specularAlphaG));\r\n #endif\r\n #endif\r\n #else\r\n slab_diffuse_ibl *= computeIndirectShadow().x;\r\n #endif\r\n #endif\r\n `;\r\n } else {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifdef COLORED_IBL_SHADOWS\r\n var shadowValue: vec3f = computeIndirectShadow();\r\n color *= toGammaSpace(vec4f(shadowValue, 1.0f));\r\n #else\r\n var shadowValue: vec2f = computeIndirectShadow();\r\n color *= toGammaSpace(vec4f(shadowValue.x, shadowValue.x, shadowValue.x, 1.0f));\r\n #endif\r\n #endif\r\n `;\r\n }\r\n } else {\r\n frag = {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n uniform sampler2D iblShadowsTexture;\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 computeIndirectShadow() {\r\n vec2 uv = gl_FragCoord.xy / renderTargetSize;\r\n vec3 shadowValue = texture2D(iblShadowsTexture, uv).rgb;\r\n return mix(shadowValue.rgb, vec3(1.0), 1.0 - shadowOpacity);\r\n }\r\n #else\r\n vec2 computeIndirectShadow() {\r\n vec2 uv = gl_FragCoord.xy / renderTargetSize;\r\n vec2 shadowValue = texture2D(iblShadowsTexture, uv).rg;\r\n return mix(shadowValue.rg, vec2(1.0), 1.0 - shadowOpacity);\r\n }\r\n #endif\r\n #endif\r\n `,\r\n };\r\n\r\n if (this._material instanceof PBRBaseMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifndef UNLIT\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 shadowValue = computeIndirectShadow();\r\n finalIrradiance.rgb *= shadowValue.rgb;\r\n finalRadianceScaled *= mix(vec3(1.0), shadowValue.rgb, roughness);\r\n #else\r\n vec2 shadowValue = computeIndirectShadow();\r\n finalIrradiance *= shadowValue.x;\r\n finalRadianceScaled *= mix(pow(shadowValue.y, 4.0), shadowValue.x, roughness);\r\n #endif\r\n #endif\r\n #else\r\n finalDiffuse *= computeIndirectShadow().x;\r\n #endif\r\n #endif\r\n `;\r\n } else if (this._material instanceof OpenPBRMaterial) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_IBLLAYERCOMPOSITION\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifndef UNLIT\r\n #ifdef REFLECTION\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 shadowValue = computeIndirectShadow();\r\n slab_diffuse_ibl.rgb *= shadowValue.rgb;\r\n slab_glossy_ibl *= mix(vec3(1.0), shadowValue.rgb, specularAlphaG);\r\n #else\r\n vec2 shadowValue = computeIndirectShadow();\r\n slab_diffuse_ibl *= shadowValue.x;\r\n slab_glossy_ibl *= mix(pow(shadowValue.y, 4.0), shadowValue.x, specularAlphaG);\r\n #endif\r\n #endif\r\n #else\r\n slab_diffuse_ibl *= computeIndirectShadow().x;\r\n #endif\r\n #endif\r\n `;\r\n } else {\r\n frag[\"CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR\"] = `\r\n #ifdef RENDER_WITH_IBL_SHADOWS\r\n #ifdef COLORED_IBL_SHADOWS\r\n vec3 shadowValue = computeIndirectShadow();\r\n color.rgb *= toGammaSpace(shadowValue.rgb);\r\n #else\r\n vec2 shadowValue = computeIndirectShadow();\r\n color.rgb *= toGammaSpace(shadowValue.x);\r\n #endif\r\n #endif\r\n `;\r\n }\r\n }\r\n\r\n return shaderType === \"vertex\" ? null : frag;\r\n }\r\n}\r\n\r\nRegisterClass(`BABYLON.IBLShadowsPluginMaterial`, IBLShadowsPluginMaterial);\r\n"]}
@@ -20,7 +20,7 @@ import { StandardMaterial } from "../../Materials/standardMaterial.js";
20
20
  import { Observable } from "../../Misc/observable.js";
21
21
  import "../geometryBufferRendererSceneComponent.js";
22
22
  import "../iblCdfGeneratorSceneComponent.js";
23
- import { OpenPBRMaterial } from "../../Materials/PBR/openPbrMaterial.js";
23
+ import { OpenPBRMaterial } from "../../Materials/PBR/openpbrMaterial.js";
24
24
  /**
25
25
  * Voxel-based shadow rendering for IBL's.
26
26
  * This should not be instanciated directly, as it is part of a scene component