@babylonjs/core 5.50.1 → 5.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/Animations/animatable.d.ts +5 -3
  2. package/Animations/animatable.js +10 -7
  3. package/Animations/animatable.js.map +1 -1
  4. package/Animations/animationGroup.js +3 -1
  5. package/Animations/animationGroup.js.map +1 -1
  6. package/Animations/runtimeAnimation.d.ts +1 -0
  7. package/Animations/runtimeAnimation.js +1 -0
  8. package/Animations/runtimeAnimation.js.map +1 -1
  9. package/Cameras/Inputs/freeCameraKeyboardMoveInput.d.ts +8 -0
  10. package/Cameras/Inputs/freeCameraKeyboardMoveInput.js +28 -2
  11. package/Cameras/Inputs/freeCameraKeyboardMoveInput.js.map +1 -1
  12. package/Cameras/freeCamera.d.ts +10 -0
  13. package/Cameras/freeCamera.js +32 -0
  14. package/Cameras/freeCamera.js.map +1 -1
  15. package/Cameras/targetCamera.js +4 -1
  16. package/Cameras/targetCamera.js.map +1 -1
  17. package/Engines/engineCapabilities.d.ts +2 -0
  18. package/Engines/engineCapabilities.js.map +1 -1
  19. package/Engines/nativeEngine.js +1 -0
  20. package/Engines/nativeEngine.js.map +1 -1
  21. package/Engines/nullEngine.js +1 -0
  22. package/Engines/nullEngine.js.map +1 -1
  23. package/Engines/thinEngine.js +3 -2
  24. package/Engines/thinEngine.js.map +1 -1
  25. package/Engines/webgpuEngine.js +1 -0
  26. package/Engines/webgpuEngine.js.map +1 -1
  27. package/Inputs/scene.inputManager.d.ts +6 -3
  28. package/Inputs/scene.inputManager.js +67 -12
  29. package/Inputs/scene.inputManager.js.map +1 -1
  30. package/Materials/Node/Blocks/Dual/sceneDepthBlock.d.ts +4 -0
  31. package/Materials/Node/Blocks/Dual/sceneDepthBlock.js +37 -2
  32. package/Materials/Node/Blocks/Dual/sceneDepthBlock.js.map +1 -1
  33. package/Materials/Node/nodeMaterialDecorator.d.ts +1 -1
  34. package/Materials/Node/nodeMaterialDecorator.js.map +1 -1
  35. package/Materials/PBR/pbrMaterial.js +1 -0
  36. package/Materials/PBR/pbrMaterial.js.map +1 -1
  37. package/Materials/Textures/cubeTexture.js +7 -1
  38. package/Materials/Textures/cubeTexture.js.map +1 -1
  39. package/Meshes/mesh.js +2 -2
  40. package/Meshes/mesh.js.map +1 -1
  41. package/Meshes/mesh.vertexData.d.ts +4 -1
  42. package/Meshes/mesh.vertexData.js +21 -17
  43. package/Meshes/mesh.vertexData.js.map +1 -1
  44. package/Misc/decorators.d.ts +8 -0
  45. package/Misc/decorators.js +22 -12
  46. package/Misc/decorators.js.map +1 -1
  47. package/Misc/environmentTextureTools.js +7 -0
  48. package/Misc/environmentTextureTools.js.map +1 -1
  49. package/Misc/khronosTextureContainer.js +4 -0
  50. package/Misc/khronosTextureContainer.js.map +1 -1
  51. package/Misc/observable.js +3 -0
  52. package/Misc/observable.js.map +1 -1
  53. package/Misc/sceneRecorder.js +3 -0
  54. package/Misc/sceneRecorder.js.map +1 -1
  55. package/Misc/virtualJoystick.js +2 -2
  56. package/Misc/virtualJoystick.js.map +1 -1
  57. package/Morph/morphTargetManager.js +7 -1
  58. package/Morph/morphTargetManager.js.map +1 -1
  59. package/Particles/gpuParticleSystem.js +18 -14
  60. package/Particles/gpuParticleSystem.js.map +1 -1
  61. package/Physics/v2/IPhysicsEnginePlugin.d.ts +126 -19
  62. package/Physics/v2/IPhysicsEnginePlugin.js +6 -0
  63. package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
  64. package/Physics/v2/physicsAggregate.d.ts +7 -1
  65. package/Physics/v2/physicsAggregate.js +21 -7
  66. package/Physics/v2/physicsAggregate.js.map +1 -1
  67. package/Physics/v2/physicsBody.d.ts +24 -15
  68. package/Physics/v2/physicsBody.js +46 -20
  69. package/Physics/v2/physicsBody.js.map +1 -1
  70. package/Physics/v2/physicsEngineComponent.d.ts +10 -0
  71. package/Physics/v2/physicsEngineComponent.js +27 -0
  72. package/Physics/v2/physicsEngineComponent.js.map +1 -1
  73. package/Physics/v2/physicsMaterial.d.ts +52 -46
  74. package/Physics/v2/physicsMaterial.js +23 -80
  75. package/Physics/v2/physicsMaterial.js.map +1 -1
  76. package/Physics/v2/physicsShape.d.ts +27 -2
  77. package/Physics/v2/physicsShape.js +52 -1
  78. package/Physics/v2/physicsShape.js.map +1 -1
  79. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.d.ts +59 -13
  80. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +131 -56
  81. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
  82. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.d.ts +65 -13
  83. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js +218 -80
  84. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
  85. package/Rendering/depthRenderer.js +1 -1
  86. package/Rendering/depthRenderer.js.map +1 -1
  87. package/Rendering/depthRendererSceneComponent.d.ts +2 -1
  88. package/Rendering/depthRendererSceneComponent.js +2 -2
  89. package/Rendering/depthRendererSceneComponent.js.map +1 -1
  90. package/Rendering/geometryBufferRenderer.d.ts +8 -2
  91. package/Rendering/geometryBufferRenderer.js +32 -10
  92. package/Rendering/geometryBufferRenderer.js.map +1 -1
  93. package/Rendering/prePassRenderer.d.ts +18 -2
  94. package/Rendering/prePassRenderer.js +72 -26
  95. package/Rendering/prePassRenderer.js.map +1 -1
  96. package/Shaders/ShadersInclude/screenSpaceRayTrace.js +3 -3
  97. package/Shaders/ShadersInclude/screenSpaceRayTrace.js.map +1 -1
  98. package/Shaders/geometry.fragment.js +2 -2
  99. package/Shaders/geometry.fragment.js.map +1 -1
  100. package/Shaders/screenSpaceReflection2.fragment.js +20 -10
  101. package/Shaders/screenSpaceReflection2.fragment.js.map +1 -1
  102. package/Shaders/screenSpaceReflection2Blur.fragment.js +1 -1
  103. package/Shaders/screenSpaceReflection2Blur.fragment.js.map +1 -1
  104. package/Shaders/screenSpaceReflection2BlurCombiner.fragment.js +9 -2
  105. package/Shaders/screenSpaceReflection2BlurCombiner.fragment.js.map +1 -1
  106. package/Shaders/sprites.fragment.js +6 -1
  107. package/Shaders/sprites.fragment.js.map +1 -1
  108. package/Shaders/ssao2.fragment.js +0 -2
  109. package/Shaders/ssao2.fragment.js.map +1 -1
  110. package/Sprites/spriteManager.d.ts +7 -0
  111. package/Sprites/spriteManager.js +27 -0
  112. package/Sprites/spriteManager.js.map +1 -1
  113. package/Sprites/spriteRenderer.d.ts +8 -0
  114. package/Sprites/spriteRenderer.js +42 -19
  115. package/Sprites/spriteRenderer.js.map +1 -1
  116. package/assetContainer.js +5 -1
  117. package/assetContainer.js.map +1 -1
  118. package/package.json +1 -1
@@ -1,6 +1,5 @@
1
1
  import { __decorate } from "../../../tslib.es6.js";
2
2
  /* eslint-disable @typescript-eslint/naming-convention */
3
- import { Logger } from "../../../Misc/logger.js";
4
3
  import { serialize, SerializationHelper } from "../../../Misc/decorators.js";
5
4
  import { Vector3, Matrix, Quaternion, TmpVectors } from "../../../Maths/math.vector.js";
6
5
  import { PostProcess } from "../../postProcess.js";
@@ -44,9 +43,24 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
44
43
  get samples() {
45
44
  return this._samples;
46
45
  }
46
+ /**
47
+ * Gets or sets the downsample factor used to reduce the size of the texture used to compute the SSR contribution (default: 0).
48
+ * Use 0 to render the SSR contribution at full resolution, 1 to render at half resolution, 2 to render at 1/3 resolution, etc.
49
+ * Note that it is used only when blurring is enabled (blurDispersionStrength \> 0), because in that mode the SSR contribution is generated in a separate texture.
50
+ */
51
+ get ssrDownsample() {
52
+ return this._ssrDownsample;
53
+ }
54
+ set ssrDownsample(downsample) {
55
+ if (downsample === this._ssrDownsample) {
56
+ return;
57
+ }
58
+ this._ssrDownsample = downsample;
59
+ this._buildPipeline();
60
+ }
47
61
  /**
48
62
  * Gets or sets the blur dispersion strength. Set this value to 0 to disable blurring (default: 0.05)
49
- * The reflections are blurred based on the distance between the pixel shaded and the reflected pixel: the higher the distance the more blurry the reflection is.
63
+ * The reflections are blurred based on the roughness of the surface and the distance between the pixel shaded and the reflected pixel: the higher the distance the more blurry the reflection is.
50
64
  * blurDispersionStrength allows to increase or decrease this effect.
51
65
  */
52
66
  get blurDispersionStrength() {
@@ -62,9 +76,26 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
62
76
  this._buildPipeline();
63
77
  }
64
78
  }
79
+ _useBlur() {
80
+ return this._blurDispersionStrength > 0;
81
+ }
82
+ /**
83
+ * Gets or sets the downsample factor used to reduce the size of the textures used to blur the reflection effect (default: 0).
84
+ * Use 0 to blur at full resolution, 1 to render at half resolution, 2 to render at 1/3 resolution, etc.
85
+ */
86
+ get blurDownsample() {
87
+ return this._blurDownsample;
88
+ }
89
+ set blurDownsample(downsample) {
90
+ if (downsample === this._blurDownsample) {
91
+ return;
92
+ }
93
+ this._blurDownsample = downsample;
94
+ this._buildPipeline();
95
+ }
65
96
  /**
66
- * Gets or sets whether or not smoothing reflections is enabled.
67
- * Enabling smoothing will require more GPU power and can generate a drop in FPS.
97
+ * Gets or sets whether or not smoothing reflections is enabled (default: false)
98
+ * Enabling smoothing will require more GPU power.
68
99
  * Note that this setting has no effect if step = 1: it's only used if step \> 1.
69
100
  */
70
101
  get enableSmoothReflections() {
@@ -124,6 +155,19 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
124
155
  this._attenuateIntersectionDistance = attenuate;
125
156
  this._updateEffectDefines();
126
157
  }
158
+ /**
159
+ * Gets or sets a boolean indicating if the reflections should be attenuated according to the number of iterations performed to find the intersection (default: true).
160
+ */
161
+ get attenuateIntersectionIterations() {
162
+ return this._attenuateIntersectionIterations;
163
+ }
164
+ set attenuateIntersectionIterations(attenuate) {
165
+ if (this._attenuateIntersectionIterations === attenuate) {
166
+ return;
167
+ }
168
+ this._attenuateIntersectionIterations = attenuate;
169
+ this._updateEffectDefines();
170
+ }
127
171
  /**
128
172
  * Gets or sets a boolean indicating if the reflections should be attenuated when the reflection ray is facing the camera (the view direction) (default: false).
129
173
  */
@@ -188,20 +232,35 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
188
232
  return this._depthRenderer;
189
233
  }
190
234
  /**
191
- * Gets or sets the size factor used to create the backface depth texture, used only if enableAutomaticThicknessComputation = true (default: 1).
192
- * This factor is used as a divisor of the full screen size (so, 2 means that the backface depth texture will be created at half the screen size, meaning better performances).
193
- * Note that you will get rendering artefacts when using a value different from 1: it's a tradeoff between image quality and performances.
235
+ * Gets or sets the downsample factor (default: 0) used to create the backface depth texture - used only if enableAutomaticThicknessComputation = true.
236
+ * Use 0 to render the depth at full resolution, 1 to render at half resolution, 2 to render at 1/4 resolution, etc.
237
+ * Note that you will get rendering artefacts when using a value different from 0: it's a tradeoff between image quality and performances.
194
238
  */
195
- get backfaceDepthTextureSizeFactor() {
196
- return this._backfaceDepthTextureSizeFactor;
239
+ get backfaceDepthTextureDownsample() {
240
+ return this._backfaceDepthTextureDownsample;
197
241
  }
198
- set backfaceDepthTextureSizeFactor(factor) {
199
- if (this._backfaceDepthTextureSizeFactor === factor) {
242
+ set backfaceDepthTextureDownsample(factor) {
243
+ if (this._backfaceDepthTextureDownsample === factor) {
200
244
  return;
201
245
  }
202
- this._backfaceDepthTextureSizeFactor = factor;
246
+ this._backfaceDepthTextureDownsample = factor;
203
247
  this._resizeDepthRenderer();
204
248
  }
249
+ /**
250
+ * Gets or sets a boolean (default: true) indicating if the depth of transparent meshes should be written to the backface depth texture (when automatic thickness computation is enabled).
251
+ */
252
+ get backfaceForceDepthWriteTransparentMeshes() {
253
+ return this._backfaceForceDepthWriteTransparentMeshes;
254
+ }
255
+ set backfaceForceDepthWriteTransparentMeshes(force) {
256
+ if (this._backfaceForceDepthWriteTransparentMeshes === force) {
257
+ return;
258
+ }
259
+ this._backfaceForceDepthWriteTransparentMeshes = force;
260
+ if (this._depthRenderer) {
261
+ this._depthRenderer.forceDepthWriteTransparentMeshes = force;
262
+ }
263
+ }
205
264
  /**
206
265
  * Gets or sets a boolean indicating if the effect is enabled (default: true).
207
266
  */
@@ -230,6 +289,34 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
230
289
  }
231
290
  }
232
291
  }
292
+ /**
293
+ * Gets or sets a boolean defining if the input color texture is in gamma space (default: true)
294
+ * The SSR effect works in linear space, so if the input texture is in gamma space, we must convert the texture to linear space before applying the effect
295
+ */
296
+ get inputTextureColorIsInGammaSpace() {
297
+ return this._inputTextureColorIsInGammaSpace;
298
+ }
299
+ set inputTextureColorIsInGammaSpace(gammaSpace) {
300
+ if (this._inputTextureColorIsInGammaSpace === gammaSpace) {
301
+ return;
302
+ }
303
+ this._inputTextureColorIsInGammaSpace = gammaSpace;
304
+ this._buildPipeline();
305
+ }
306
+ /**
307
+ * Gets or sets a boolean defining if the output color texture generated by the SSR pipeline should be in gamma space (default: true)
308
+ * If you have a post-process that comes after the SSR and that post-process needs the input to be in a linear space, you must disable generateOutputInGammaSpace
309
+ */
310
+ get generateOutputInGammaSpace() {
311
+ return this._generateOutputInGammaSpace;
312
+ }
313
+ set generateOutputInGammaSpace(gammaSpace) {
314
+ if (this._generateOutputInGammaSpace === gammaSpace) {
315
+ return;
316
+ }
317
+ this._generateOutputInGammaSpace = gammaSpace;
318
+ this._buildPipeline();
319
+ }
233
320
  /**
234
321
  * Gets or sets a boolean indicating if the effect should be rendered in debug mode (default: false).
235
322
  * In this mode, colors have this meaning:
@@ -250,6 +337,13 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
250
337
  this._debug = value;
251
338
  this._buildPipeline();
252
339
  }
340
+ /**
341
+ * Gets the scene the effect belongs to.
342
+ * @returns the scene the effect belongs to.
343
+ */
344
+ getScene() {
345
+ return this._scene;
346
+ }
253
347
  get _geometryBufferRenderer() {
254
348
  if (!this._forceGeometryBuffer) {
255
349
  return null;
@@ -268,6 +362,13 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
268
362
  get scene() {
269
363
  return this._scene;
270
364
  }
365
+ /**
366
+ * Returns true if SSR is supported by the running hardware
367
+ */
368
+ get isSupported() {
369
+ const caps = this._scene.getEngine().getCaps();
370
+ return caps.drawBuffersExtension && caps.texelFetch;
371
+ }
271
372
  /**
272
373
  * Constructor of the SSR rendering pipeline
273
374
  * @param name The rendering pipeline name
@@ -316,7 +417,8 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
316
417
  */
317
418
  this.reflectionSpecularFalloffExponent = 1;
318
419
  /**
319
- * Maximum number of steps during the ray marching process after which we consider an intersection could not be found (default: 1000)
420
+ * Maximum number of steps during the ray marching process after which we consider an intersection could not be found (default: 1000).
421
+ * Should be an integer value.
320
422
  */
321
423
  this.maxSteps = 1000.0;
322
424
  /**
@@ -330,22 +432,28 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
330
432
  * 1 should normally be a good value, depending on the scene you may need to use a higher value (2 or 3)
331
433
  */
332
434
  this.selfCollisionNumSkip = 1;
333
- this._blurDispersionStrength = 1 / 20;
334
435
  /**
335
- * Apply different weighting when blurring.
336
- * Must be a value between 2 and 5
436
+ * Gets or sets the minimum value for one of the reflectivity component of the material to consider it for SSR (default: 0.04).
437
+ * If all r/g/b components of the reflectivity is below or equal this value, the pixel will not be considered reflective and SSR won't be applied.
337
438
  */
338
- this.blurQuality = 2;
439
+ this.reflectivityThreshold = 0.04;
440
+ this._ssrDownsample = 0;
441
+ this._blurDispersionStrength = 0.03;
442
+ this._blurDownsample = 0;
339
443
  this._enableSmoothReflections = false;
340
444
  this._environmentTextureIsProbe = false;
341
445
  this._attenuateScreenBorders = true;
342
446
  this._attenuateIntersectionDistance = true;
447
+ this._attenuateIntersectionIterations = true;
343
448
  this._attenuateFacingCamera = false;
344
449
  this._attenuateBackfaceReflection = false;
345
450
  this._clipToFrustum = true;
346
451
  this._enableAutomaticThicknessComputation = false;
347
- this._backfaceDepthTextureSizeFactor = 1;
452
+ this._backfaceDepthTextureDownsample = 0;
453
+ this._backfaceForceDepthWriteTransparentMeshes = true;
348
454
  this._isEnabled = true;
455
+ this._inputTextureColorIsInGammaSpace = true;
456
+ this._generateOutputInGammaSpace = true;
349
457
  this._debug = false;
350
458
  this._forceGeometryBuffer = false;
351
459
  this._isDirty = false;
@@ -356,22 +464,24 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
356
464
  this._scene = scene;
357
465
  this._textureType = textureType;
358
466
  this._forceGeometryBuffer = forceGeometryBuffer;
359
- if (!this.isSupported) {
360
- Logger.Error("The current engine does not support SSR.");
361
- return;
362
- }
363
- scene.postProcessRenderPipelineManager.addPipeline(this);
364
- if (this._forceGeometryBuffer) {
365
- const geometryBufferRenderer = scene.enableGeometryBufferRenderer();
366
- if (geometryBufferRenderer) {
367
- geometryBufferRenderer.enableReflectivity = true;
467
+ if (this.isSupported) {
468
+ scene.postProcessRenderPipelineManager.addPipeline(this);
469
+ if (this._forceGeometryBuffer) {
470
+ const geometryBufferRenderer = scene.enableGeometryBufferRenderer();
471
+ if (geometryBufferRenderer) {
472
+ geometryBufferRenderer.enableReflectivity = true;
473
+ geometryBufferRenderer.useSpecificClearForDepthTexture = true;
474
+ }
368
475
  }
476
+ else {
477
+ const prePassRenderer = scene.enablePrePassRenderer();
478
+ if (prePassRenderer) {
479
+ prePassRenderer.useSpecificClearForDepthTexture = true;
480
+ prePassRenderer.markAsDirty();
481
+ }
482
+ }
483
+ this._buildPipeline();
369
484
  }
370
- else {
371
- const prePassRenderer = scene.enablePrePassRenderer();
372
- prePassRenderer === null || prePassRenderer === void 0 ? void 0 : prePassRenderer.markAsDirty();
373
- }
374
- this._buildPipeline();
375
485
  }
376
486
  /**
377
487
  * Get the class name
@@ -411,20 +521,20 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
411
521
  super.dispose();
412
522
  }
413
523
  _getTextureSize() {
524
+ var _a, _b;
414
525
  const engine = this._scene.getEngine();
415
- const geometryBufferRenderer = this._geometryBufferRenderer;
416
526
  const prePassRenderer = this._prePassRenderer;
417
527
  let textureSize = { width: engine.getRenderWidth(), height: engine.getRenderHeight() };
418
- if (geometryBufferRenderer) {
419
- textureSize = geometryBufferRenderer.getGBuffer().textures[0].getSize();
420
- }
421
- else if (prePassRenderer) {
422
- const depthIndex = prePassRenderer.getIndex(5);
528
+ if (prePassRenderer && ((_a = this._scene.activeCamera) === null || _a === void 0 ? void 0 : _a._getFirstPostProcess()) === this._ssrPostProcess) {
423
529
  const renderTarget = prePassRenderer.getRenderTarget();
424
530
  if (renderTarget && renderTarget.textures) {
425
- textureSize = renderTarget.textures[depthIndex].getSize();
531
+ textureSize = renderTarget.textures[prePassRenderer.getIndex(4)].getSize();
426
532
  }
427
533
  }
534
+ else if ((_b = this._ssrPostProcess) === null || _b === void 0 ? void 0 : _b.inputTexture) {
535
+ textureSize.width = this._ssrPostProcess.inputTexture.width;
536
+ textureSize.height = this._ssrPostProcess.inputTexture.height;
537
+ }
428
538
  return textureSize;
429
539
  }
430
540
  _updateEffectDefines() {
@@ -444,6 +554,9 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
444
554
  if (this._environmentTexture.boundingBoxSize) {
445
555
  defines.push("#define SSR_USE_LOCAL_REFLECTIONMAP_CUBIC");
446
556
  }
557
+ if (this._environmentTexture.gammaSpace) {
558
+ defines.push("#define SSR_ENVIRONMENT_CUBE_IS_GAMMASPACE");
559
+ }
447
560
  }
448
561
  if (this._environmentTextureIsProbe) {
449
562
  defines.push("#define SSR_INVERTCUBICMAP");
@@ -457,6 +570,9 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
457
570
  if (this._attenuateIntersectionDistance) {
458
571
  defines.push("#define SSR_ATTENUATE_INTERSECTION_DISTANCE");
459
572
  }
573
+ if (this._attenuateIntersectionIterations) {
574
+ defines.push("#define SSR_ATTENUATE_INTERSECTION_NUMITERATIONS");
575
+ }
460
576
  if (this._attenuateFacingCamera) {
461
577
  defines.push("#define SSR_ATTENUATE_FACING_CAMERA");
462
578
  }
@@ -466,16 +582,25 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
466
582
  if (this._clipToFrustum) {
467
583
  defines.push("#define SSRAYTRACE_CLIP_TO_FRUSTUM");
468
584
  }
469
- if (this._blurDispersionStrength > 0) {
585
+ if (this._useBlur()) {
470
586
  defines.push("#define SSR_USE_BLUR");
471
587
  }
472
588
  if (this._debug) {
473
589
  defines.push("#define SSRAYTRACE_DEBUG");
474
590
  }
591
+ if (this._inputTextureColorIsInGammaSpace) {
592
+ defines.push("#define SSR_INPUT_IS_GAMMA_SPACE");
593
+ }
594
+ if (this._generateOutputInGammaSpace) {
595
+ defines.push("#define SSR_OUTPUT_IS_GAMMA_SPACE");
596
+ }
475
597
  (_a = this._ssrPostProcess) === null || _a === void 0 ? void 0 : _a.updateEffect(defines.join("\n"));
476
598
  }
477
599
  _buildPipeline() {
478
600
  var _a;
601
+ if (!this.isSupported) {
602
+ return;
603
+ }
479
604
  if (!this._isEnabled) {
480
605
  this._isDirty = true;
481
606
  return;
@@ -495,9 +620,10 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
495
620
  if (camera) {
496
621
  this._depthRendererCamera = camera;
497
622
  this._depthRenderer = new DepthRenderer(this._scene, undefined, undefined, undefined, 1, true, "SSRBackDepth");
498
- this._depthRenderer.clearColor.r = 1e8; // put a big value because we use the storeCameraSpaceZ mode
623
+ this._depthRenderer.clearColor.r = 1e8; // "infinity": put a big value because we use the storeCameraSpaceZ mode
499
624
  this._depthRenderer.reverseCulling = true; // we generate depth for the back faces
500
625
  this._depthRenderer.getDepthMap().noPrePassRenderer = true; // we don't want the prepass renderer to attach to our depth buffer!
626
+ this._depthRenderer.forceDepthWriteTransparentMeshes = this._backfaceForceDepthWriteTransparentMeshes;
501
627
  this._resizeDepthRenderer();
502
628
  camera.customRenderTargets.push(this._depthRenderer.getDepthMap());
503
629
  }
@@ -506,7 +632,7 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
506
632
  this.addEffect(new PostProcessRenderEffect(engine, this.SSRRenderEffect, () => {
507
633
  return this._ssrPostProcess;
508
634
  }, true));
509
- if (this._blurDispersionStrength > 0) {
635
+ if (this._useBlur()) {
510
636
  this._createBlurAndCombinerPostProcesses();
511
637
  this.addEffect(new PostProcessRenderEffect(engine, this.SSRBlurRenderEffect, () => {
512
638
  return [this._blurPostProcessX, this._blurPostProcessY];
@@ -525,8 +651,8 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
525
651
  }
526
652
  const textureSize = this._getTextureSize();
527
653
  const depthRendererSize = this._depthRenderer.getDepthMap().getSize();
528
- const width = Math.floor(textureSize.width / this._backfaceDepthTextureSizeFactor);
529
- const height = Math.floor(textureSize.height / this._backfaceDepthTextureSizeFactor);
654
+ const width = Math.floor(textureSize.width / (this._backfaceDepthTextureDownsample + 1));
655
+ const height = Math.floor(textureSize.height / (this._backfaceDepthTextureDownsample + 1));
530
656
  if (depthRendererSize.width !== width || depthRendererSize.height !== height) {
531
657
  this._depthRenderer.getDepthMap().resize({ width, height });
532
658
  }
@@ -578,6 +704,7 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
578
704
  "vReflectionPosition",
579
705
  "vReflectionSize",
580
706
  "backSizeFactor",
707
+ "reflectivityThreshold",
581
708
  ], ["textureSampler", "normalSampler", "reflectivitySampler", "depthSampler", "envCubeSampler", "backDepthSampler"], 1.0, null, this._textureType, this._scene.getEngine(), false, "", this._textureType);
582
709
  this._updateEffectDefines();
583
710
  this._ssrPostProcess.onApply = (effect) => {
@@ -603,7 +730,7 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
603
730
  }
604
731
  if (this._enableAutomaticThicknessComputation && this._depthRenderer) {
605
732
  effect.setTexture("backDepthSampler", this._depthRenderer.getDepthMap());
606
- effect.setFloat("backSizeFactor", this._backfaceDepthTextureSizeFactor);
733
+ effect.setFloat("backSizeFactor", this._backfaceDepthTextureDownsample + 1);
607
734
  }
608
735
  const camera = this._scene.activeCamera;
609
736
  if (!camera) {
@@ -626,6 +753,7 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
626
753
  effect.setFloat("nearPlaneZ", camera.minZ);
627
754
  effect.setFloat("maxDistance", this.maxDistance);
628
755
  effect.setFloat("selfCollisionNumSkip", this.selfCollisionNumSkip);
756
+ effect.setFloat("reflectivityThreshold", this.reflectivityThreshold);
629
757
  const textureSize = this._getTextureSize();
630
758
  Matrix.ScalingToRef(textureSize.width, textureSize.height, 1, TmpVectors.Matrix[2]);
631
759
  projectionMatrix.multiplyToRef(this._scene.getEngine().isWebGPU ? trsWebGPU : trs, TmpVectors.Matrix[3]);
@@ -646,59 +774,47 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
646
774
  }
647
775
  _createBlurAndCombinerPostProcesses() {
648
776
  const engine = this._scene.getEngine();
649
- this._blurPostProcessX = new PostProcess("SSRblurX", "screenSpaceReflection2Blur", ["blurQuality", "texelOffsetScale"], ["textureSampler"], 1, null, 2, engine, false, "", this._textureType);
777
+ this._blurPostProcessX = new PostProcess("SSRblurX", "screenSpaceReflection2Blur", ["texelOffsetScale"], ["textureSampler"], this._useBlur() ? 1 / (this._ssrDownsample + 1) : 1, null, 2, engine, false, "", this._textureType);
650
778
  this._blurPostProcessX.autoClear = false;
651
779
  this._blurPostProcessX.onApplyObservable.add((effect) => {
652
780
  var _a, _b;
653
- let width = this._scene.getEngine().getRenderWidth();
654
- if (this._prePassRenderer) {
655
- const colorIndex = this._prePassRenderer.getIndex(4);
656
- const renderTarget = this._prePassRenderer.getRenderTarget();
657
- if (renderTarget && renderTarget.textures) {
658
- width = renderTarget.textures[colorIndex].getSize().width;
659
- }
660
- }
661
- else {
662
- width = (_b = (_a = this._ssrPostProcess) === null || _a === void 0 ? void 0 : _a.inputTexture.width) !== null && _b !== void 0 ? _b : width;
663
- }
664
- effect.setFloat("blurQuality", this.blurQuality);
781
+ const width = (_b = (_a = this._blurPostProcessX) === null || _a === void 0 ? void 0 : _a.inputTexture.width) !== null && _b !== void 0 ? _b : this._scene.getEngine().getRenderWidth();
665
782
  effect.setFloat2("texelOffsetScale", this._blurDispersionStrength / width, 0);
666
783
  });
667
- this._blurPostProcessY = new PostProcess("SSRblurY", "screenSpaceReflection2Blur", ["blurQuality", "texelOffsetScale"], ["textureSampler"], 1, null, 2, engine, false, "", this._textureType);
784
+ this._blurPostProcessY = new PostProcess("SSRblurY", "screenSpaceReflection2Blur", ["texelOffsetScale"], ["textureSampler"], this._useBlur() ? 1 / (this._blurDownsample + 1) : 1, null, 2, engine, false, "", this._textureType);
668
785
  this._blurPostProcessY.autoClear = false;
669
786
  this._blurPostProcessY.onApplyObservable.add((effect) => {
670
787
  var _a, _b;
671
- let height = this._scene.getEngine().getRenderHeight();
672
- if (this._prePassRenderer) {
673
- const colorIndex = this._prePassRenderer.getIndex(4);
674
- const renderTarget = this._prePassRenderer.getRenderTarget();
675
- if (renderTarget && renderTarget.textures) {
676
- height = renderTarget.textures[colorIndex].getSize().height;
677
- }
678
- }
679
- else {
680
- height = (_b = (_a = this._ssrPostProcess) === null || _a === void 0 ? void 0 : _a.inputTexture.height) !== null && _b !== void 0 ? _b : height;
681
- }
682
- effect.setFloat("blurQuality", this.blurQuality);
788
+ const height = (_b = (_a = this._blurPostProcessY) === null || _a === void 0 ? void 0 : _a.inputTexture.height) !== null && _b !== void 0 ? _b : this._scene.getEngine().getRenderHeight();
683
789
  effect.setFloat2("texelOffsetScale", 0, this._blurDispersionStrength / height);
684
790
  });
685
- this._blurCombinerPostProcess = new PostProcess("SSRblurCombiner", "screenSpaceReflection2BlurCombiner", ["strength", "reflectionSpecularFalloffExponent"], ["textureSampler", "mainSampler", "reflectivitySampler"], 1, null, 1, engine, false, "", this._textureType);
791
+ let defines = "";
792
+ if (this._debug) {
793
+ defines += "#define SSRAYTRACE_DEBUG\n";
794
+ }
795
+ if (this._inputTextureColorIsInGammaSpace) {
796
+ defines += "#define SSR_INPUT_IS_GAMMA_SPACE\n";
797
+ }
798
+ if (this._generateOutputInGammaSpace) {
799
+ defines += "#define SSR_OUTPUT_IS_GAMMA_SPACE\n";
800
+ }
801
+ this._blurCombinerPostProcess = new PostProcess("SSRblurCombiner", "screenSpaceReflection2BlurCombiner", ["strength", "reflectionSpecularFalloffExponent", "reflectivityThreshold"], ["textureSampler", "mainSampler", "reflectivitySampler"], this._useBlur() ? 1 / (this._blurDownsample + 1) : 1, null, 1, engine, false, defines, this._textureType);
686
802
  this._blurCombinerPostProcess.autoClear = false;
687
803
  this._blurCombinerPostProcess.onApplyObservable.add((effect) => {
804
+ var _a;
688
805
  const geometryBufferRenderer = this._geometryBufferRenderer;
689
806
  const prePassRenderer = this._prePassRenderer;
690
807
  if (!prePassRenderer && !geometryBufferRenderer) {
691
808
  return;
692
809
  }
693
- if (prePassRenderer) {
694
- const colorIndex = prePassRenderer.getIndex(4);
810
+ if (prePassRenderer && ((_a = this._scene.activeCamera) === null || _a === void 0 ? void 0 : _a._getFirstPostProcess()) === this._ssrPostProcess) {
695
811
  const renderTarget = prePassRenderer.getRenderTarget();
696
812
  if (renderTarget && renderTarget.textures) {
697
- effect.setTexture("mainSampler", renderTarget.textures[colorIndex]);
813
+ effect.setTexture("mainSampler", renderTarget.textures[prePassRenderer.getIndex(4)]);
698
814
  }
699
815
  }
700
816
  else {
701
- effect._bindTexture("mainSampler", this._ssrPostProcess.inputTexture.texture);
817
+ effect.setTextureFromPostProcess("mainSampler", this._ssrPostProcess);
702
818
  }
703
819
  if (geometryBufferRenderer) {
704
820
  const roughnessIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.REFLECTIVITY_TEXTURE_TYPE);
@@ -710,6 +826,7 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline {
710
826
  }
711
827
  effect.setFloat("strength", this.strength);
712
828
  effect.setFloat("reflectionSpecularFalloffExponent", this.reflectionSpecularFalloffExponent);
829
+ effect.setFloat("reflectivityThreshold", this.reflectivityThreshold);
713
830
  });
714
831
  }
715
832
  /**
@@ -759,12 +876,21 @@ __decorate([
759
876
  __decorate([
760
877
  serialize()
761
878
  ], SSRRenderingPipeline.prototype, "selfCollisionNumSkip", void 0);
879
+ __decorate([
880
+ serialize()
881
+ ], SSRRenderingPipeline.prototype, "reflectivityThreshold", void 0);
882
+ __decorate([
883
+ serialize("_ssrDownsample")
884
+ ], SSRRenderingPipeline.prototype, "_ssrDownsample", void 0);
885
+ __decorate([
886
+ serialize()
887
+ ], SSRRenderingPipeline.prototype, "ssrDownsample", null);
762
888
  __decorate([
763
889
  serialize("blurDispersionStrength")
764
890
  ], SSRRenderingPipeline.prototype, "_blurDispersionStrength", void 0);
765
891
  __decorate([
766
- serialize()
767
- ], SSRRenderingPipeline.prototype, "blurQuality", void 0);
892
+ serialize("blurDownsample")
893
+ ], SSRRenderingPipeline.prototype, "_blurDownsample", void 0);
768
894
  __decorate([
769
895
  serialize("enableSmoothReflections")
770
896
  ], SSRRenderingPipeline.prototype, "_enableSmoothReflections", void 0);
@@ -780,6 +906,9 @@ __decorate([
780
906
  __decorate([
781
907
  serialize("attenuateIntersectionDistance")
782
908
  ], SSRRenderingPipeline.prototype, "_attenuateIntersectionDistance", void 0);
909
+ __decorate([
910
+ serialize("attenuateIntersectionIterations")
911
+ ], SSRRenderingPipeline.prototype, "_attenuateIntersectionIterations", void 0);
783
912
  __decorate([
784
913
  serialize("attenuateFacingCamera")
785
914
  ], SSRRenderingPipeline.prototype, "_attenuateFacingCamera", void 0);
@@ -793,11 +922,20 @@ __decorate([
793
922
  serialize("enableAutomaticThicknessComputation")
794
923
  ], SSRRenderingPipeline.prototype, "_enableAutomaticThicknessComputation", void 0);
795
924
  __decorate([
796
- serialize("backfaceDepthTextureSizeFactor")
797
- ], SSRRenderingPipeline.prototype, "_backfaceDepthTextureSizeFactor", void 0);
925
+ serialize("backfaceDepthTextureDownsample")
926
+ ], SSRRenderingPipeline.prototype, "_backfaceDepthTextureDownsample", void 0);
927
+ __decorate([
928
+ serialize("backfaceForceDepthWriteTransparentMeshes")
929
+ ], SSRRenderingPipeline.prototype, "_backfaceForceDepthWriteTransparentMeshes", void 0);
798
930
  __decorate([
799
931
  serialize("isEnabled")
800
932
  ], SSRRenderingPipeline.prototype, "_isEnabled", void 0);
933
+ __decorate([
934
+ serialize("inputTextureColorIsInGammaSpace")
935
+ ], SSRRenderingPipeline.prototype, "_inputTextureColorIsInGammaSpace", void 0);
936
+ __decorate([
937
+ serialize("generateOutputInGammaSpace")
938
+ ], SSRRenderingPipeline.prototype, "_generateOutputInGammaSpace", void 0);
801
939
  __decorate([
802
940
  serialize("debug")
803
941
  ], SSRRenderingPipeline.prototype, "_debug", void 0);