@babylonjs/core 8.24.0 → 8.24.2

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 (160) hide show
  1. package/Behaviors/Meshes/index.d.ts +1 -0
  2. package/Behaviors/Meshes/index.js +1 -0
  3. package/Behaviors/Meshes/index.js.map +1 -1
  4. package/Behaviors/Meshes/pointerDragBehavior.d.ts +6 -34
  5. package/Behaviors/Meshes/pointerDragBehavior.js +0 -12
  6. package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
  7. package/Behaviors/Meshes/pointerDragEvents.d.ts +38 -0
  8. package/Behaviors/Meshes/pointerDragEvents.js +2 -0
  9. package/Behaviors/Meshes/pointerDragEvents.js.map +1 -0
  10. package/Engines/Extensions/engine.multiview.js +5 -5
  11. package/Engines/Extensions/engine.multiview.js.map +1 -1
  12. package/Engines/abstractEngine.js +3 -3
  13. package/Engines/abstractEngine.js.map +1 -1
  14. package/Engines/engineFactory.d.ts +4 -1
  15. package/Engines/engineFactory.js.map +1 -1
  16. package/Engines/thinEngine.js +2 -0
  17. package/Engines/thinEngine.js.map +1 -1
  18. package/Engines/webgpuEngine.js +7 -0
  19. package/Engines/webgpuEngine.js.map +1 -1
  20. package/FrameGraph/Tasks/Layers/baseLayerTask.d.ts +4 -0
  21. package/FrameGraph/Tasks/Layers/baseLayerTask.js +6 -0
  22. package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
  23. package/Gizmos/cameraGizmo.js +2 -2
  24. package/Gizmos/cameraGizmo.js.map +1 -1
  25. package/Gizmos/lightGizmo.js +2 -2
  26. package/Gizmos/lightGizmo.js.map +1 -1
  27. package/Gizmos/positionGizmo.d.ts +7 -6
  28. package/Gizmos/positionGizmo.js +3 -9
  29. package/Gizmos/positionGizmo.js.map +1 -1
  30. package/Gizmos/rotationGizmo.d.ts +7 -6
  31. package/Gizmos/rotationGizmo.js +3 -9
  32. package/Gizmos/rotationGizmo.js.map +1 -1
  33. package/Gizmos/scaleGizmo.d.ts +7 -6
  34. package/Gizmos/scaleGizmo.js +3 -9
  35. package/Gizmos/scaleGizmo.js.map +1 -1
  36. package/Instrumentation/sceneInstrumentation.d.ts +2 -0
  37. package/Instrumentation/sceneInstrumentation.js +58 -32
  38. package/Instrumentation/sceneInstrumentation.js.map +1 -1
  39. package/Lights/Clustered/clusteredLightContainer.d.ts +12 -0
  40. package/Lights/Clustered/clusteredLightContainer.js +104 -18
  41. package/Lights/Clustered/clusteredLightContainer.js.map +1 -1
  42. package/Lights/Shadows/cascadedShadowGenerator.js +1 -0
  43. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  44. package/Lights/Shadows/shadowGenerator.js +1 -0
  45. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  46. package/Lights/light.d.ts +5 -0
  47. package/Lights/light.js +5 -0
  48. package/Lights/light.js.map +1 -1
  49. package/Materials/PBR/pbrBaseMaterial.js +2 -1
  50. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  51. package/Materials/Textures/renderTargetTexture.d.ts +5 -0
  52. package/Materials/Textures/renderTargetTexture.js +9 -0
  53. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  54. package/Materials/materialHelper.functions.js +4 -2
  55. package/Materials/materialHelper.functions.js.map +1 -1
  56. package/Materials/standardMaterial.js +2 -1
  57. package/Materials/standardMaterial.js.map +1 -1
  58. package/Materials/uniformBuffer.d.ts +6 -3
  59. package/Materials/uniformBuffer.js +35 -13
  60. package/Materials/uniformBuffer.js.map +1 -1
  61. package/Maths/math.vector.d.ts +1 -1
  62. package/Maths/math.vector.js +2 -2
  63. package/Maths/math.vector.js.map +1 -1
  64. package/Meshes/abstractMesh.d.ts +21 -0
  65. package/Meshes/abstractMesh.hotSpot.js +37 -25
  66. package/Meshes/abstractMesh.hotSpot.js.map +1 -1
  67. package/Meshes/abstractMesh.js.map +1 -1
  68. package/Meshes/instancedMesh.d.ts +1 -0
  69. package/Meshes/instancedMesh.js +3 -0
  70. package/Meshes/instancedMesh.js.map +1 -1
  71. package/Meshes/mesh.d.ts +0 -19
  72. package/Meshes/mesh.js +0 -19
  73. package/Meshes/mesh.js.map +1 -1
  74. package/Misc/fileTools.js +1 -1
  75. package/Misc/fileTools.js.map +1 -1
  76. package/Misc/screenshotTools.js +1 -1
  77. package/Misc/screenshotTools.js.map +1 -1
  78. package/Misc/snapshotRenderingHelper.d.ts +4 -3
  79. package/Misc/snapshotRenderingHelper.js +6 -5
  80. package/Misc/snapshotRenderingHelper.js.map +1 -1
  81. package/Particles/Node/Blocks/Emitters/createParticleBlock.js +7 -3
  82. package/Particles/Node/Blocks/Emitters/createParticleBlock.js.map +1 -1
  83. package/Particles/Node/Blocks/Emitters/meshShapeBlock.js +0 -3
  84. package/Particles/Node/Blocks/Emitters/meshShapeBlock.js.map +1 -1
  85. package/Particles/Node/Blocks/systemBlock.d.ts +3 -0
  86. package/Particles/Node/Blocks/systemBlock.js +3 -0
  87. package/Particles/Node/Blocks/systemBlock.js.map +1 -1
  88. package/Particles/Node/nodeParticleBuildState.js +1 -1
  89. package/Particles/Node/nodeParticleBuildState.js.map +1 -1
  90. package/Particles/Node/nodeParticleSystemSet.helper.d.ts +1 -1
  91. package/Particles/Node/nodeParticleSystemSet.helper.js +25 -5
  92. package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
  93. package/Particles/Node/nodeParticleSystemSet.js +1 -0
  94. package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
  95. package/Particles/particle.d.ts +4 -0
  96. package/Particles/particle.js +5 -0
  97. package/Particles/particle.js.map +1 -1
  98. package/Particles/particleSystem.d.ts +2 -0
  99. package/Particles/particleSystem.js +2 -0
  100. package/Particles/particleSystem.js.map +1 -1
  101. package/Particles/thinParticleSystem.d.ts +2 -0
  102. package/Particles/thinParticleSystem.function.d.ts +2 -0
  103. package/Particles/thinParticleSystem.function.js +3 -0
  104. package/Particles/thinParticleSystem.function.js.map +1 -1
  105. package/Particles/thinParticleSystem.js +11 -5
  106. package/Particles/thinParticleSystem.js.map +1 -1
  107. package/Rendering/objectRenderer.d.ts +17 -1
  108. package/Rendering/objectRenderer.js +55 -14
  109. package/Rendering/objectRenderer.js.map +1 -1
  110. package/Shaders/ShadersInclude/clusteredLightingFunctions.js +1 -0
  111. package/Shaders/ShadersInclude/clusteredLightingFunctions.js.map +1 -1
  112. package/Shaders/ShadersInclude/helperFunctions.js +1 -0
  113. package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
  114. package/Shaders/ShadersInclude/lightFragment.js +4 -4
  115. package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
  116. package/Shaders/ShadersInclude/lightFragmentDeclaration.js +1 -1
  117. package/Shaders/ShadersInclude/lightFragmentDeclaration.js.map +1 -1
  118. package/Shaders/ShadersInclude/lightUboDeclaration.js +1 -1
  119. package/Shaders/ShadersInclude/lightUboDeclaration.js.map +1 -1
  120. package/Shaders/ShadersInclude/lightVxUboDeclaration.js +1 -1
  121. package/Shaders/ShadersInclude/lightVxUboDeclaration.js.map +1 -1
  122. package/Shaders/ShadersInclude/lightsFragmentFunctions.js +2 -2
  123. package/Shaders/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  124. package/Shaders/ShadersInclude/pbrClusteredLightingFunctions.js +2 -2
  125. package/Shaders/ShadersInclude/pbrClusteredLightingFunctions.js.map +1 -1
  126. package/Shaders/ShadersInclude/pbrFragmentExtraDeclaration.js +3 -0
  127. package/Shaders/ShadersInclude/pbrFragmentExtraDeclaration.js.map +1 -1
  128. package/Shaders/default.fragment.js +3 -0
  129. package/Shaders/default.fragment.js.map +1 -1
  130. package/Shaders/default.vertex.js +6 -0
  131. package/Shaders/default.vertex.js.map +1 -1
  132. package/Shaders/pbr.vertex.js +6 -0
  133. package/Shaders/pbr.vertex.js.map +1 -1
  134. package/ShadersWGSL/ShadersInclude/clusteredLightingFunctions.js +1 -0
  135. package/ShadersWGSL/ShadersInclude/clusteredLightingFunctions.js.map +1 -1
  136. package/ShadersWGSL/ShadersInclude/lightFragment.js +4 -4
  137. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  138. package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js +2 -1
  139. package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js.map +1 -1
  140. package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js +2 -1
  141. package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js.map +1 -1
  142. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js +3 -2
  143. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  144. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +3 -2
  145. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  146. package/ShadersWGSL/ShadersInclude/pbrFragmentExtraDeclaration.js +3 -0
  147. package/ShadersWGSL/ShadersInclude/pbrFragmentExtraDeclaration.js.map +1 -1
  148. package/ShadersWGSL/default.fragment.js +3 -0
  149. package/ShadersWGSL/default.fragment.js.map +1 -1
  150. package/ShadersWGSL/default.vertex.js +6 -0
  151. package/ShadersWGSL/default.vertex.js.map +1 -1
  152. package/ShadersWGSL/pbr.vertex.js +6 -0
  153. package/ShadersWGSL/pbr.vertex.js.map +1 -1
  154. package/States/alphaCullingState.d.ts +3 -1
  155. package/States/alphaCullingState.js +39 -37
  156. package/States/alphaCullingState.js.map +1 -1
  157. package/package.json +1 -1
  158. package/scene.d.ts +27 -1
  159. package/scene.js +55 -2
  160. package/scene.js.map +1 -1
@@ -64,20 +64,25 @@ export class SceneInstrumentation {
64
64
  }
65
65
  this._captureRenderTargetsRenderTime = value;
66
66
  if (value) {
67
- this._onBeforeRenderTargetsRenderObserver = this.scene.onBeforeRenderTargetsRenderObservable.add(() => {
68
- Tools.StartPerformanceCounter("Render targets rendering");
69
- this._renderTargetsRenderTime.beginMonitoring();
70
- });
71
- this._onAfterRenderTargetsRenderObserver = this.scene.onAfterRenderTargetsRenderObservable.add(() => {
72
- Tools.EndPerformanceCounter("Render targets rendering");
73
- this._renderTargetsRenderTime.endMonitoring(false);
74
- });
67
+ for (const objectRenderer of this.scene.objectRenderers) {
68
+ this._onBeforeRenderTargetsRenderObserver.push(objectRenderer.onInitRenderingObservable.add(() => {
69
+ Tools.StartPerformanceCounter("Render targets rendering");
70
+ this._renderTargetsRenderTime.beginMonitoring();
71
+ }));
72
+ this._onAfterRenderTargetsRenderObserver.push(objectRenderer.onFinishRenderingObservable.add(() => {
73
+ Tools.EndPerformanceCounter("Render targets rendering");
74
+ this._renderTargetsRenderTime.endMonitoring(false);
75
+ }));
76
+ }
75
77
  }
76
78
  else {
77
- this.scene.onBeforeRenderTargetsRenderObservable.remove(this._onBeforeRenderTargetsRenderObserver);
78
- this._onBeforeRenderTargetsRenderObserver = null;
79
- this.scene.onAfterRenderTargetsRenderObservable.remove(this._onAfterRenderTargetsRenderObserver);
80
- this._onAfterRenderTargetsRenderObserver = null;
79
+ for (let i = 0; i < this.scene.objectRenderers.length; ++i) {
80
+ const objectRenderer = this.scene.objectRenderers[i];
81
+ objectRenderer.onInitRenderingObservable.remove(this._onBeforeRenderTargetsRenderObserver[i]);
82
+ objectRenderer.onFinishRenderingObservable.remove(this._onAfterRenderTargetsRenderObserver[i]);
83
+ }
84
+ this._onBeforeRenderTargetsRenderObserver.length = 0;
85
+ this._onAfterRenderTargetsRenderObserver.length = 0;
81
86
  }
82
87
  }
83
88
  /**
@@ -284,20 +289,27 @@ export class SceneInstrumentation {
284
289
  }
285
290
  this._captureRenderTime = value;
286
291
  if (value) {
287
- this._onBeforeDrawPhaseObserver = this.scene.onBeforeDrawPhaseObservable.add(() => {
292
+ this._onBeforeDrawPhaseObserver.push(this.scene.onBeforeDrawPhaseObservable.add(() => {
288
293
  this._renderTime.beginMonitoring();
289
294
  Tools.StartPerformanceCounter("Main render");
290
- });
291
- this._onAfterDrawPhaseObserver = this.scene.onAfterDrawPhaseObservable.add(() => {
295
+ }));
296
+ this._onAfterDrawPhaseObserver.push(this.scene.onAfterDrawPhaseObservable.add(() => {
292
297
  this._renderTime.endMonitoring(false);
293
298
  Tools.EndPerformanceCounter("Main render");
294
- });
299
+ }));
300
+ for (const objectRenderer of this.scene.objectRenderers) {
301
+ this._onBeforeDrawPhaseObserver.push(objectRenderer.onBeforeRenderingManagerRenderObservable.add(() => {
302
+ this._renderTime.beginMonitoring();
303
+ Tools.StartPerformanceCounter("Main render");
304
+ }));
305
+ this._onAfterDrawPhaseObserver.push(objectRenderer.onAfterRenderingManagerRenderObservable.add(() => {
306
+ this._renderTime.endMonitoring(false);
307
+ Tools.EndPerformanceCounter("Main render");
308
+ }));
309
+ }
295
310
  }
296
311
  else {
297
- this.scene.onBeforeDrawPhaseObservable.remove(this._onBeforeDrawPhaseObserver);
298
- this._onBeforeDrawPhaseObserver = null;
299
- this.scene.onAfterDrawPhaseObservable.remove(this._onAfterDrawPhaseObserver);
300
- this._onAfterDrawPhaseObserver = null;
312
+ this._removeRenderTimeObservers();
301
313
  }
302
314
  }
303
315
  /**
@@ -378,11 +390,11 @@ export class SceneInstrumentation {
378
390
  // Observers
379
391
  this._onBeforeActiveMeshesEvaluationObserver = null;
380
392
  this._onAfterActiveMeshesEvaluationObserver = null;
381
- this._onBeforeRenderTargetsRenderObserver = null;
382
- this._onAfterRenderTargetsRenderObserver = null;
393
+ this._onBeforeRenderTargetsRenderObserver = [];
394
+ this._onAfterRenderTargetsRenderObserver = [];
383
395
  this._onAfterRenderObserver = null;
384
- this._onBeforeDrawPhaseObserver = null;
385
- this._onAfterDrawPhaseObserver = null;
396
+ this._onBeforeDrawPhaseObserver = [];
397
+ this._onAfterDrawPhaseObserver = [];
386
398
  this._onBeforeAnimationsObserver = null;
387
399
  this._onBeforeParticlesRenderingObserver = null;
388
400
  this._onAfterParticlesRenderingObserver = null;
@@ -458,6 +470,26 @@ export class SceneInstrumentation {
458
470
  }
459
471
  });
460
472
  }
473
+ _removeRenderTargetsObservers() {
474
+ for (let i = 0; i < this.scene.objectRenderers.length; ++i) {
475
+ const objectRenderer = this.scene.objectRenderers[i];
476
+ objectRenderer.onInitRenderingObservable.remove(this._onBeforeRenderTargetsRenderObserver[i]);
477
+ objectRenderer.onFinishRenderingObservable.remove(this._onAfterRenderTargetsRenderObserver[i]);
478
+ }
479
+ this._onBeforeRenderTargetsRenderObserver.length = 0;
480
+ this._onAfterRenderTargetsRenderObserver.length = 0;
481
+ }
482
+ _removeRenderTimeObservers() {
483
+ this.scene.onBeforeDrawPhaseObservable.remove(this._onBeforeDrawPhaseObserver[0]);
484
+ this._onBeforeDrawPhaseObserver.length = 0;
485
+ this.scene.onAfterDrawPhaseObservable.remove(this._onAfterDrawPhaseObserver[0]);
486
+ this._onAfterDrawPhaseObserver.length = 0;
487
+ for (let i = 1; i < this._onBeforeDrawPhaseObserver.length; i++) {
488
+ const objectRenderer = this.scene.objectRenderers[i - 1];
489
+ objectRenderer.onBeforeRenderingManagerRenderObservable.remove(this._onBeforeDrawPhaseObserver[i]);
490
+ objectRenderer.onAfterRenderingManagerRenderObservable.remove(this._onAfterDrawPhaseObserver[i]);
491
+ }
492
+ }
461
493
  /**
462
494
  * Dispose and release associated resources.
463
495
  */
@@ -471,10 +503,7 @@ export class SceneInstrumentation {
471
503
  this._onBeforeActiveMeshesEvaluationObserver = null;
472
504
  this.scene.onAfterActiveMeshesEvaluationObservable.remove(this._onAfterActiveMeshesEvaluationObserver);
473
505
  this._onAfterActiveMeshesEvaluationObserver = null;
474
- this.scene.onBeforeRenderTargetsRenderObservable.remove(this._onBeforeRenderTargetsRenderObserver);
475
- this._onBeforeRenderTargetsRenderObserver = null;
476
- this.scene.onAfterRenderTargetsRenderObservable.remove(this._onAfterRenderTargetsRenderObserver);
477
- this._onAfterRenderTargetsRenderObserver = null;
506
+ this._removeRenderTargetsObservers();
478
507
  this.scene.onBeforeAnimationsObservable.remove(this._onBeforeAnimationsObserver);
479
508
  this._onBeforeAnimationsObserver = null;
480
509
  this.scene.onBeforeParticlesRenderingObservable.remove(this._onBeforeParticlesRenderingObserver);
@@ -489,10 +518,7 @@ export class SceneInstrumentation {
489
518
  this.scene.onAfterSpritesRenderingObservable.remove(this._onAfterSpritesRenderingObserver);
490
519
  this._onAfterSpritesRenderingObserver = null;
491
520
  }
492
- this.scene.onBeforeDrawPhaseObservable.remove(this._onBeforeDrawPhaseObserver);
493
- this._onBeforeDrawPhaseObserver = null;
494
- this.scene.onAfterDrawPhaseObservable.remove(this._onAfterDrawPhaseObserver);
495
- this._onAfterDrawPhaseObserver = null;
521
+ this._removeRenderTimeObservers();
496
522
  if (this._onBeforePhysicsObserver) {
497
523
  this.scene.onBeforePhysicsObservable.remove(this._onBeforePhysicsObserver);
498
524
  this._onBeforePhysicsObserver = null;
@@ -1 +1 @@
1
- {"version":3,"file":"sceneInstrumentation.js","sourceRoot":"","sources":["../../../../dev/core/src/Instrumentation/sceneInstrumentation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Tools } from \"../Misc/tools\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { PerfCounter } from \"../Misc/perfCounter\";\r\n/**\r\n * This class can be used to get instrumentation data from a Babylon engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#sceneinstrumentation\r\n */\r\nexport class SceneInstrumentation implements IDisposable {\r\n private _captureActiveMeshesEvaluationTime = false;\r\n private _activeMeshesEvaluationTime = new PerfCounter();\r\n\r\n private _captureRenderTargetsRenderTime = false;\r\n private _renderTargetsRenderTime = new PerfCounter();\r\n\r\n private _captureFrameTime = false;\r\n private _frameTime = new PerfCounter();\r\n\r\n private _captureRenderTime = false;\r\n private _renderTime = new PerfCounter();\r\n\r\n private _captureInterFrameTime = false;\r\n private _interFrameTime = new PerfCounter();\r\n\r\n private _captureParticlesRenderTime = false;\r\n private _particlesRenderTime = new PerfCounter();\r\n\r\n private _captureSpritesRenderTime = false;\r\n private _spritesRenderTime = new PerfCounter();\r\n\r\n private _capturePhysicsTime = false;\r\n private _physicsTime = new PerfCounter();\r\n\r\n private _captureAnimationsTime = false;\r\n private _animationsTime = new PerfCounter();\r\n\r\n private _captureCameraRenderTime = false;\r\n private _cameraRenderTime = new PerfCounter();\r\n\r\n // Observers\r\n private _onBeforeActiveMeshesEvaluationObserver: Nullable<Observer<Scene>> = null;\r\n private _onAfterActiveMeshesEvaluationObserver: Nullable<Observer<Scene>> = null;\r\n private _onBeforeRenderTargetsRenderObserver: Nullable<Observer<Scene>> = null;\r\n private _onAfterRenderTargetsRenderObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _onAfterRenderObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _onBeforeDrawPhaseObserver: Nullable<Observer<Scene>> = null;\r\n private _onAfterDrawPhaseObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _onBeforeAnimationsObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _onBeforeParticlesRenderingObserver: Nullable<Observer<Scene>> = null;\r\n private _onAfterParticlesRenderingObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _onBeforeSpritesRenderingObserver: Nullable<Observer<Scene>> = null;\r\n private _onAfterSpritesRenderingObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _onBeforePhysicsObserver: Nullable<Observer<Scene>> = null;\r\n private _onAfterPhysicsObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _onAfterAnimationsObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _onBeforeCameraRenderObserver: Nullable<Observer<Camera>> = null;\r\n private _onAfterCameraRenderObserver: Nullable<Observer<Camera>> = null;\r\n\r\n private _disposed = false;\r\n\r\n // Properties\r\n /**\r\n * Gets the perf counter used for active meshes evaluation time\r\n */\r\n public get activeMeshesEvaluationTimeCounter(): PerfCounter {\r\n return this._activeMeshesEvaluationTime;\r\n }\r\n\r\n /**\r\n * Gets the active meshes evaluation time capture status\r\n */\r\n public get captureActiveMeshesEvaluationTime(): boolean {\r\n return this._captureActiveMeshesEvaluationTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the active meshes evaluation time capture\r\n */\r\n public set captureActiveMeshesEvaluationTime(value: boolean) {\r\n if (value === this._captureActiveMeshesEvaluationTime) {\r\n return;\r\n }\r\n\r\n this._captureActiveMeshesEvaluationTime = value;\r\n\r\n if (value) {\r\n this._onBeforeActiveMeshesEvaluationObserver = this.scene.onBeforeActiveMeshesEvaluationObservable.add(() => {\r\n Tools.StartPerformanceCounter(\"Active meshes evaluation\");\r\n this._activeMeshesEvaluationTime.beginMonitoring();\r\n });\r\n\r\n this._onAfterActiveMeshesEvaluationObserver = this.scene.onAfterActiveMeshesEvaluationObservable.add(() => {\r\n Tools.EndPerformanceCounter(\"Active meshes evaluation\");\r\n this._activeMeshesEvaluationTime.endMonitoring(false);\r\n });\r\n } else {\r\n this.scene.onBeforeActiveMeshesEvaluationObservable.remove(this._onBeforeActiveMeshesEvaluationObserver);\r\n this._onBeforeActiveMeshesEvaluationObserver = null;\r\n\r\n this.scene.onAfterActiveMeshesEvaluationObservable.remove(this._onAfterActiveMeshesEvaluationObserver);\r\n this._onAfterActiveMeshesEvaluationObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for render targets render time\r\n */\r\n public get renderTargetsRenderTimeCounter(): PerfCounter {\r\n return this._renderTargetsRenderTime;\r\n }\r\n\r\n /**\r\n * Gets the render targets render time capture status\r\n */\r\n public get captureRenderTargetsRenderTime(): boolean {\r\n return this._captureRenderTargetsRenderTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the render targets render time capture\r\n */\r\n public set captureRenderTargetsRenderTime(value: boolean) {\r\n if (value === this._captureRenderTargetsRenderTime) {\r\n return;\r\n }\r\n\r\n this._captureRenderTargetsRenderTime = value;\r\n\r\n if (value) {\r\n this._onBeforeRenderTargetsRenderObserver = this.scene.onBeforeRenderTargetsRenderObservable.add(() => {\r\n Tools.StartPerformanceCounter(\"Render targets rendering\");\r\n this._renderTargetsRenderTime.beginMonitoring();\r\n });\r\n\r\n this._onAfterRenderTargetsRenderObserver = this.scene.onAfterRenderTargetsRenderObservable.add(() => {\r\n Tools.EndPerformanceCounter(\"Render targets rendering\");\r\n this._renderTargetsRenderTime.endMonitoring(false);\r\n });\r\n } else {\r\n this.scene.onBeforeRenderTargetsRenderObservable.remove(this._onBeforeRenderTargetsRenderObserver);\r\n this._onBeforeRenderTargetsRenderObserver = null;\r\n\r\n this.scene.onAfterRenderTargetsRenderObservable.remove(this._onAfterRenderTargetsRenderObserver);\r\n this._onAfterRenderTargetsRenderObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for particles render time\r\n */\r\n public get particlesRenderTimeCounter(): PerfCounter {\r\n return this._particlesRenderTime;\r\n }\r\n\r\n /**\r\n * Gets the particles render time capture status\r\n */\r\n public get captureParticlesRenderTime(): boolean {\r\n return this._captureParticlesRenderTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the particles render time capture\r\n */\r\n public set captureParticlesRenderTime(value: boolean) {\r\n if (value === this._captureParticlesRenderTime) {\r\n return;\r\n }\r\n\r\n this._captureParticlesRenderTime = value;\r\n\r\n if (value) {\r\n this._onBeforeParticlesRenderingObserver = this.scene.onBeforeParticlesRenderingObservable.add(() => {\r\n Tools.StartPerformanceCounter(\"Particles\");\r\n this._particlesRenderTime.beginMonitoring();\r\n });\r\n\r\n this._onAfterParticlesRenderingObserver = this.scene.onAfterParticlesRenderingObservable.add(() => {\r\n Tools.EndPerformanceCounter(\"Particles\");\r\n this._particlesRenderTime.endMonitoring(false);\r\n });\r\n } else {\r\n this.scene.onBeforeParticlesRenderingObservable.remove(this._onBeforeParticlesRenderingObserver);\r\n this._onBeforeParticlesRenderingObserver = null;\r\n\r\n this.scene.onAfterParticlesRenderingObservable.remove(this._onAfterParticlesRenderingObserver);\r\n this._onAfterParticlesRenderingObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for sprites render time\r\n */\r\n public get spritesRenderTimeCounter(): PerfCounter {\r\n return this._spritesRenderTime;\r\n }\r\n\r\n /**\r\n * Gets the sprites render time capture status\r\n */\r\n public get captureSpritesRenderTime(): boolean {\r\n return this._captureSpritesRenderTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the sprites render time capture\r\n */\r\n public set captureSpritesRenderTime(value: boolean) {\r\n if (value === this._captureSpritesRenderTime) {\r\n return;\r\n }\r\n\r\n this._captureSpritesRenderTime = value;\r\n\r\n if (!this.scene.spriteManagers) {\r\n return;\r\n }\r\n\r\n if (value) {\r\n this._onBeforeSpritesRenderingObserver = this.scene.onBeforeSpritesRenderingObservable.add(() => {\r\n Tools.StartPerformanceCounter(\"Sprites\");\r\n this._spritesRenderTime.beginMonitoring();\r\n });\r\n\r\n this._onAfterSpritesRenderingObserver = this.scene.onAfterSpritesRenderingObservable.add(() => {\r\n Tools.EndPerformanceCounter(\"Sprites\");\r\n this._spritesRenderTime.endMonitoring(false);\r\n });\r\n } else {\r\n this.scene.onBeforeSpritesRenderingObservable.remove(this._onBeforeSpritesRenderingObserver);\r\n this._onBeforeSpritesRenderingObserver = null;\r\n\r\n this.scene.onAfterSpritesRenderingObservable.remove(this._onAfterSpritesRenderingObserver);\r\n this._onAfterSpritesRenderingObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for physics time\r\n */\r\n public get physicsTimeCounter(): PerfCounter {\r\n return this._physicsTime;\r\n }\r\n\r\n /**\r\n * Gets the physics time capture status\r\n */\r\n public get capturePhysicsTime(): boolean {\r\n return this._capturePhysicsTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the physics time capture\r\n */\r\n public set capturePhysicsTime(value: boolean) {\r\n if (value === this._capturePhysicsTime) {\r\n return;\r\n }\r\n\r\n if (!this.scene.onBeforePhysicsObservable) {\r\n return;\r\n }\r\n\r\n this._capturePhysicsTime = value;\r\n\r\n if (value) {\r\n this._onBeforePhysicsObserver = this.scene.onBeforePhysicsObservable.add(() => {\r\n Tools.StartPerformanceCounter(\"Physics\");\r\n this._physicsTime.beginMonitoring();\r\n });\r\n\r\n this._onAfterPhysicsObserver = this.scene.onAfterPhysicsObservable.add(() => {\r\n Tools.EndPerformanceCounter(\"Physics\");\r\n this._physicsTime.endMonitoring();\r\n });\r\n } else {\r\n this.scene.onBeforePhysicsObservable.remove(this._onBeforePhysicsObserver);\r\n this._onBeforePhysicsObserver = null;\r\n\r\n this.scene.onAfterPhysicsObservable.remove(this._onAfterPhysicsObserver);\r\n this._onAfterPhysicsObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for animations time\r\n */\r\n public get animationsTimeCounter(): PerfCounter {\r\n return this._animationsTime;\r\n }\r\n\r\n /**\r\n * Gets the animations time capture status\r\n */\r\n public get captureAnimationsTime(): boolean {\r\n return this._captureAnimationsTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the animations time capture\r\n */\r\n public set captureAnimationsTime(value: boolean) {\r\n if (value === this._captureAnimationsTime) {\r\n return;\r\n }\r\n\r\n this._captureAnimationsTime = value;\r\n\r\n if (value) {\r\n this._onAfterAnimationsObserver = this.scene.onAfterAnimationsObservable.add(() => {\r\n this._animationsTime.endMonitoring();\r\n });\r\n } else {\r\n this.scene.onAfterAnimationsObservable.remove(this._onAfterAnimationsObserver);\r\n this._onAfterAnimationsObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for frame time capture\r\n */\r\n public get frameTimeCounter(): PerfCounter {\r\n return this._frameTime;\r\n }\r\n\r\n /**\r\n * Gets the frame time capture status\r\n */\r\n public get captureFrameTime(): boolean {\r\n return this._captureFrameTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the frame time capture\r\n */\r\n public set captureFrameTime(value: boolean) {\r\n this._captureFrameTime = value;\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for inter-frames time capture\r\n */\r\n public get interFrameTimeCounter(): PerfCounter {\r\n return this._interFrameTime;\r\n }\r\n\r\n /**\r\n * Gets the inter-frames time capture status\r\n */\r\n public get captureInterFrameTime(): boolean {\r\n return this._captureInterFrameTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the inter-frames time capture\r\n */\r\n public set captureInterFrameTime(value: boolean) {\r\n this._captureInterFrameTime = value;\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for render time capture\r\n */\r\n public get renderTimeCounter(): PerfCounter {\r\n return this._renderTime;\r\n }\r\n\r\n /**\r\n * Gets the render time capture status\r\n */\r\n public get captureRenderTime(): boolean {\r\n return this._captureRenderTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the render time capture\r\n */\r\n public set captureRenderTime(value: boolean) {\r\n if (value === this._captureRenderTime) {\r\n return;\r\n }\r\n\r\n this._captureRenderTime = value;\r\n\r\n if (value) {\r\n this._onBeforeDrawPhaseObserver = this.scene.onBeforeDrawPhaseObservable.add(() => {\r\n this._renderTime.beginMonitoring();\r\n Tools.StartPerformanceCounter(\"Main render\");\r\n });\r\n\r\n this._onAfterDrawPhaseObserver = this.scene.onAfterDrawPhaseObservable.add(() => {\r\n this._renderTime.endMonitoring(false);\r\n Tools.EndPerformanceCounter(\"Main render\");\r\n });\r\n } else {\r\n this.scene.onBeforeDrawPhaseObservable.remove(this._onBeforeDrawPhaseObserver);\r\n this._onBeforeDrawPhaseObserver = null;\r\n this.scene.onAfterDrawPhaseObservable.remove(this._onAfterDrawPhaseObserver);\r\n this._onAfterDrawPhaseObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for camera render time capture\r\n */\r\n public get cameraRenderTimeCounter(): PerfCounter {\r\n return this._cameraRenderTime;\r\n }\r\n\r\n /**\r\n * Gets the camera render time capture status\r\n */\r\n public get captureCameraRenderTime(): boolean {\r\n return this._captureCameraRenderTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the camera render time capture\r\n */\r\n public set captureCameraRenderTime(value: boolean) {\r\n if (value === this._captureCameraRenderTime) {\r\n return;\r\n }\r\n\r\n this._captureCameraRenderTime = value;\r\n\r\n if (value) {\r\n this._onBeforeCameraRenderObserver = this.scene.onBeforeCameraRenderObservable.add((camera) => {\r\n this._cameraRenderTime.beginMonitoring();\r\n Tools.StartPerformanceCounter(`Rendering camera ${camera.name}`);\r\n });\r\n\r\n this._onAfterCameraRenderObserver = this.scene.onAfterCameraRenderObservable.add((camera) => {\r\n this._cameraRenderTime.endMonitoring(false);\r\n Tools.EndPerformanceCounter(`Rendering camera ${camera.name}`);\r\n });\r\n } else {\r\n this.scene.onBeforeCameraRenderObservable.remove(this._onBeforeCameraRenderObserver);\r\n this._onBeforeCameraRenderObserver = null;\r\n this.scene.onAfterCameraRenderObservable.remove(this._onAfterCameraRenderObserver);\r\n this._onAfterCameraRenderObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for draw calls\r\n */\r\n public get drawCallsCounter(): PerfCounter {\r\n return this.scene.getEngine()._drawCalls;\r\n }\r\n\r\n /**\r\n * Instantiates a new scene instrumentation.\r\n * This class can be used to get instrumentation data from a Babylon engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#sceneinstrumentation\r\n * @param scene Defines the scene to instrument\r\n */\r\n public constructor(\r\n /**\r\n * Defines the scene to instrument\r\n */\r\n public scene: Scene\r\n ) {\r\n // Before render\r\n this._onBeforeAnimationsObserver = scene.onBeforeAnimationsObservable.add(() => {\r\n if (this._captureActiveMeshesEvaluationTime) {\r\n this._activeMeshesEvaluationTime.fetchNewFrame();\r\n }\r\n\r\n if (this._captureRenderTargetsRenderTime) {\r\n this._renderTargetsRenderTime.fetchNewFrame();\r\n }\r\n\r\n if (this._captureFrameTime) {\r\n Tools.StartPerformanceCounter(\"Scene rendering\");\r\n this._frameTime.beginMonitoring();\r\n }\r\n\r\n if (this._captureInterFrameTime) {\r\n this._interFrameTime.endMonitoring();\r\n }\r\n\r\n if (this._captureParticlesRenderTime) {\r\n this._particlesRenderTime.fetchNewFrame();\r\n }\r\n\r\n if (this._captureSpritesRenderTime) {\r\n this._spritesRenderTime.fetchNewFrame();\r\n }\r\n\r\n if (this._captureAnimationsTime) {\r\n this._animationsTime.beginMonitoring();\r\n }\r\n\r\n if (this._captureRenderTime) {\r\n this._renderTime.fetchNewFrame();\r\n }\r\n\r\n if (this._captureCameraRenderTime) {\r\n this._cameraRenderTime.fetchNewFrame();\r\n }\r\n\r\n this.scene.getEngine()._drawCalls.fetchNewFrame();\r\n });\r\n\r\n // After render\r\n this._onAfterRenderObserver = scene.onAfterRenderObservable.add(() => {\r\n if (this._captureFrameTime) {\r\n Tools.EndPerformanceCounter(\"Scene rendering\");\r\n this._frameTime.endMonitoring();\r\n }\r\n\r\n if (this._captureRenderTime) {\r\n this._renderTime.endMonitoring(false);\r\n }\r\n\r\n if (this._captureInterFrameTime) {\r\n this._interFrameTime.beginMonitoring();\r\n }\r\n\r\n if (this._captureActiveMeshesEvaluationTime) {\r\n this._activeMeshesEvaluationTime.endFrame();\r\n }\r\n if (this._captureRenderTargetsRenderTime) {\r\n this._renderTargetsRenderTime.endFrame();\r\n }\r\n if (this._captureParticlesRenderTime) {\r\n this._particlesRenderTime.endFrame();\r\n }\r\n if (this._captureSpritesRenderTime) {\r\n this._spritesRenderTime.endFrame();\r\n }\r\n if (this._captureRenderTime) {\r\n this._renderTime.endFrame();\r\n }\r\n if (this._captureCameraRenderTime) {\r\n this._cameraRenderTime.endFrame();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Dispose and release associated resources.\r\n */\r\n public dispose() {\r\n if (this._disposed) {\r\n return;\r\n }\r\n\r\n this.scene.onAfterRenderObservable.remove(this._onAfterRenderObserver);\r\n this._onAfterRenderObserver = null;\r\n\r\n this.scene.onBeforeActiveMeshesEvaluationObservable.remove(this._onBeforeActiveMeshesEvaluationObserver);\r\n this._onBeforeActiveMeshesEvaluationObserver = null;\r\n\r\n this.scene.onAfterActiveMeshesEvaluationObservable.remove(this._onAfterActiveMeshesEvaluationObserver);\r\n this._onAfterActiveMeshesEvaluationObserver = null;\r\n\r\n this.scene.onBeforeRenderTargetsRenderObservable.remove(this._onBeforeRenderTargetsRenderObserver);\r\n this._onBeforeRenderTargetsRenderObserver = null;\r\n\r\n this.scene.onAfterRenderTargetsRenderObservable.remove(this._onAfterRenderTargetsRenderObserver);\r\n this._onAfterRenderTargetsRenderObserver = null;\r\n\r\n this.scene.onBeforeAnimationsObservable.remove(this._onBeforeAnimationsObserver);\r\n this._onBeforeAnimationsObserver = null;\r\n\r\n this.scene.onBeforeParticlesRenderingObservable.remove(this._onBeforeParticlesRenderingObserver);\r\n this._onBeforeParticlesRenderingObserver = null;\r\n\r\n this.scene.onAfterParticlesRenderingObservable.remove(this._onAfterParticlesRenderingObserver);\r\n this._onAfterParticlesRenderingObserver = null;\r\n\r\n if (this._onBeforeSpritesRenderingObserver) {\r\n this.scene.onBeforeSpritesRenderingObservable.remove(this._onBeforeSpritesRenderingObserver);\r\n this._onBeforeSpritesRenderingObserver = null;\r\n }\r\n\r\n if (this._onAfterSpritesRenderingObserver) {\r\n this.scene.onAfterSpritesRenderingObservable.remove(this._onAfterSpritesRenderingObserver);\r\n this._onAfterSpritesRenderingObserver = null;\r\n }\r\n\r\n this.scene.onBeforeDrawPhaseObservable.remove(this._onBeforeDrawPhaseObserver);\r\n this._onBeforeDrawPhaseObserver = null;\r\n\r\n this.scene.onAfterDrawPhaseObservable.remove(this._onAfterDrawPhaseObserver);\r\n this._onAfterDrawPhaseObserver = null;\r\n\r\n if (this._onBeforePhysicsObserver) {\r\n this.scene.onBeforePhysicsObservable.remove(this._onBeforePhysicsObserver);\r\n this._onBeforePhysicsObserver = null;\r\n }\r\n\r\n if (this._onAfterPhysicsObserver) {\r\n this.scene.onAfterPhysicsObservable.remove(this._onAfterPhysicsObserver);\r\n this._onAfterPhysicsObserver = null;\r\n }\r\n\r\n this.scene.onAfterAnimationsObservable.remove(this._onAfterAnimationsObserver);\r\n this._onAfterAnimationsObserver = null;\r\n\r\n this.scene.onBeforeCameraRenderObservable.remove(this._onBeforeCameraRenderObserver);\r\n this._onBeforeCameraRenderObserver = null;\r\n\r\n this.scene.onAfterCameraRenderObservable.remove(this._onAfterCameraRenderObserver);\r\n this._onAfterCameraRenderObserver = null;\r\n\r\n (<any>this.scene) = null;\r\n this._disposed = true;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"sceneInstrumentation.js","sourceRoot":"","sources":["../../../../dev/core/src/Instrumentation/sceneInstrumentation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Tools } from \"../Misc/tools\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { PerfCounter } from \"../Misc/perfCounter\";\r\nimport type { ObjectRenderer } from \"../Rendering/objectRenderer\";\r\n/**\r\n * This class can be used to get instrumentation data from a Babylon engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#sceneinstrumentation\r\n */\r\nexport class SceneInstrumentation implements IDisposable {\r\n private _captureActiveMeshesEvaluationTime = false;\r\n private _activeMeshesEvaluationTime = new PerfCounter();\r\n\r\n private _captureRenderTargetsRenderTime = false;\r\n private _renderTargetsRenderTime = new PerfCounter();\r\n\r\n private _captureFrameTime = false;\r\n private _frameTime = new PerfCounter();\r\n\r\n private _captureRenderTime = false;\r\n private _renderTime = new PerfCounter();\r\n\r\n private _captureInterFrameTime = false;\r\n private _interFrameTime = new PerfCounter();\r\n\r\n private _captureParticlesRenderTime = false;\r\n private _particlesRenderTime = new PerfCounter();\r\n\r\n private _captureSpritesRenderTime = false;\r\n private _spritesRenderTime = new PerfCounter();\r\n\r\n private _capturePhysicsTime = false;\r\n private _physicsTime = new PerfCounter();\r\n\r\n private _captureAnimationsTime = false;\r\n private _animationsTime = new PerfCounter();\r\n\r\n private _captureCameraRenderTime = false;\r\n private _cameraRenderTime = new PerfCounter();\r\n\r\n // Observers\r\n private _onBeforeActiveMeshesEvaluationObserver: Nullable<Observer<Scene>> = null;\r\n private _onAfterActiveMeshesEvaluationObserver: Nullable<Observer<Scene>> = null;\r\n private _onBeforeRenderTargetsRenderObserver: Nullable<Observer<ObjectRenderer>>[] = [];\r\n private _onAfterRenderTargetsRenderObserver: Nullable<Observer<ObjectRenderer>>[] = [];\r\n\r\n private _onAfterRenderObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _onBeforeDrawPhaseObserver: Nullable<Observer<Scene> | Observer<number>>[] = [];\r\n private _onAfterDrawPhaseObserver: Nullable<Observer<Scene> | Observer<number>>[] = [];\r\n\r\n private _onBeforeAnimationsObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _onBeforeParticlesRenderingObserver: Nullable<Observer<Scene>> = null;\r\n private _onAfterParticlesRenderingObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _onBeforeSpritesRenderingObserver: Nullable<Observer<Scene>> = null;\r\n private _onAfterSpritesRenderingObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _onBeforePhysicsObserver: Nullable<Observer<Scene>> = null;\r\n private _onAfterPhysicsObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _onAfterAnimationsObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _onBeforeCameraRenderObserver: Nullable<Observer<Camera>> = null;\r\n private _onAfterCameraRenderObserver: Nullable<Observer<Camera>> = null;\r\n\r\n private _disposed = false;\r\n\r\n // Properties\r\n /**\r\n * Gets the perf counter used for active meshes evaluation time\r\n */\r\n public get activeMeshesEvaluationTimeCounter(): PerfCounter {\r\n return this._activeMeshesEvaluationTime;\r\n }\r\n\r\n /**\r\n * Gets the active meshes evaluation time capture status\r\n */\r\n public get captureActiveMeshesEvaluationTime(): boolean {\r\n return this._captureActiveMeshesEvaluationTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the active meshes evaluation time capture\r\n */\r\n public set captureActiveMeshesEvaluationTime(value: boolean) {\r\n if (value === this._captureActiveMeshesEvaluationTime) {\r\n return;\r\n }\r\n\r\n this._captureActiveMeshesEvaluationTime = value;\r\n\r\n if (value) {\r\n this._onBeforeActiveMeshesEvaluationObserver = this.scene.onBeforeActiveMeshesEvaluationObservable.add(() => {\r\n Tools.StartPerformanceCounter(\"Active meshes evaluation\");\r\n this._activeMeshesEvaluationTime.beginMonitoring();\r\n });\r\n\r\n this._onAfterActiveMeshesEvaluationObserver = this.scene.onAfterActiveMeshesEvaluationObservable.add(() => {\r\n Tools.EndPerformanceCounter(\"Active meshes evaluation\");\r\n this._activeMeshesEvaluationTime.endMonitoring(false);\r\n });\r\n } else {\r\n this.scene.onBeforeActiveMeshesEvaluationObservable.remove(this._onBeforeActiveMeshesEvaluationObserver);\r\n this._onBeforeActiveMeshesEvaluationObserver = null;\r\n\r\n this.scene.onAfterActiveMeshesEvaluationObservable.remove(this._onAfterActiveMeshesEvaluationObserver);\r\n this._onAfterActiveMeshesEvaluationObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for render targets render time\r\n */\r\n public get renderTargetsRenderTimeCounter(): PerfCounter {\r\n return this._renderTargetsRenderTime;\r\n }\r\n\r\n /**\r\n * Gets the render targets render time capture status\r\n */\r\n public get captureRenderTargetsRenderTime(): boolean {\r\n return this._captureRenderTargetsRenderTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the render targets render time capture\r\n */\r\n public set captureRenderTargetsRenderTime(value: boolean) {\r\n if (value === this._captureRenderTargetsRenderTime) {\r\n return;\r\n }\r\n\r\n this._captureRenderTargetsRenderTime = value;\r\n\r\n if (value) {\r\n for (const objectRenderer of this.scene.objectRenderers) {\r\n this._onBeforeRenderTargetsRenderObserver.push(\r\n objectRenderer.onInitRenderingObservable.add(() => {\r\n Tools.StartPerformanceCounter(\"Render targets rendering\");\r\n this._renderTargetsRenderTime.beginMonitoring();\r\n })\r\n );\r\n this._onAfterRenderTargetsRenderObserver.push(\r\n objectRenderer.onFinishRenderingObservable.add(() => {\r\n Tools.EndPerformanceCounter(\"Render targets rendering\");\r\n this._renderTargetsRenderTime.endMonitoring(false);\r\n })\r\n );\r\n }\r\n } else {\r\n for (let i = 0; i < this.scene.objectRenderers.length; ++i) {\r\n const objectRenderer = this.scene.objectRenderers[i];\r\n objectRenderer.onInitRenderingObservable.remove(this._onBeforeRenderTargetsRenderObserver[i]);\r\n objectRenderer.onFinishRenderingObservable.remove(this._onAfterRenderTargetsRenderObserver[i]);\r\n }\r\n this._onBeforeRenderTargetsRenderObserver.length = 0;\r\n this._onAfterRenderTargetsRenderObserver.length = 0;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for particles render time\r\n */\r\n public get particlesRenderTimeCounter(): PerfCounter {\r\n return this._particlesRenderTime;\r\n }\r\n\r\n /**\r\n * Gets the particles render time capture status\r\n */\r\n public get captureParticlesRenderTime(): boolean {\r\n return this._captureParticlesRenderTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the particles render time capture\r\n */\r\n public set captureParticlesRenderTime(value: boolean) {\r\n if (value === this._captureParticlesRenderTime) {\r\n return;\r\n }\r\n\r\n this._captureParticlesRenderTime = value;\r\n\r\n if (value) {\r\n this._onBeforeParticlesRenderingObserver = this.scene.onBeforeParticlesRenderingObservable.add(() => {\r\n Tools.StartPerformanceCounter(\"Particles\");\r\n this._particlesRenderTime.beginMonitoring();\r\n });\r\n\r\n this._onAfterParticlesRenderingObserver = this.scene.onAfterParticlesRenderingObservable.add(() => {\r\n Tools.EndPerformanceCounter(\"Particles\");\r\n this._particlesRenderTime.endMonitoring(false);\r\n });\r\n } else {\r\n this.scene.onBeforeParticlesRenderingObservable.remove(this._onBeforeParticlesRenderingObserver);\r\n this._onBeforeParticlesRenderingObserver = null;\r\n\r\n this.scene.onAfterParticlesRenderingObservable.remove(this._onAfterParticlesRenderingObserver);\r\n this._onAfterParticlesRenderingObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for sprites render time\r\n */\r\n public get spritesRenderTimeCounter(): PerfCounter {\r\n return this._spritesRenderTime;\r\n }\r\n\r\n /**\r\n * Gets the sprites render time capture status\r\n */\r\n public get captureSpritesRenderTime(): boolean {\r\n return this._captureSpritesRenderTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the sprites render time capture\r\n */\r\n public set captureSpritesRenderTime(value: boolean) {\r\n if (value === this._captureSpritesRenderTime) {\r\n return;\r\n }\r\n\r\n this._captureSpritesRenderTime = value;\r\n\r\n if (!this.scene.spriteManagers) {\r\n return;\r\n }\r\n\r\n if (value) {\r\n this._onBeforeSpritesRenderingObserver = this.scene.onBeforeSpritesRenderingObservable.add(() => {\r\n Tools.StartPerformanceCounter(\"Sprites\");\r\n this._spritesRenderTime.beginMonitoring();\r\n });\r\n\r\n this._onAfterSpritesRenderingObserver = this.scene.onAfterSpritesRenderingObservable.add(() => {\r\n Tools.EndPerformanceCounter(\"Sprites\");\r\n this._spritesRenderTime.endMonitoring(false);\r\n });\r\n } else {\r\n this.scene.onBeforeSpritesRenderingObservable.remove(this._onBeforeSpritesRenderingObserver);\r\n this._onBeforeSpritesRenderingObserver = null;\r\n\r\n this.scene.onAfterSpritesRenderingObservable.remove(this._onAfterSpritesRenderingObserver);\r\n this._onAfterSpritesRenderingObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for physics time\r\n */\r\n public get physicsTimeCounter(): PerfCounter {\r\n return this._physicsTime;\r\n }\r\n\r\n /**\r\n * Gets the physics time capture status\r\n */\r\n public get capturePhysicsTime(): boolean {\r\n return this._capturePhysicsTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the physics time capture\r\n */\r\n public set capturePhysicsTime(value: boolean) {\r\n if (value === this._capturePhysicsTime) {\r\n return;\r\n }\r\n\r\n if (!this.scene.onBeforePhysicsObservable) {\r\n return;\r\n }\r\n\r\n this._capturePhysicsTime = value;\r\n\r\n if (value) {\r\n this._onBeforePhysicsObserver = this.scene.onBeforePhysicsObservable.add(() => {\r\n Tools.StartPerformanceCounter(\"Physics\");\r\n this._physicsTime.beginMonitoring();\r\n });\r\n\r\n this._onAfterPhysicsObserver = this.scene.onAfterPhysicsObservable.add(() => {\r\n Tools.EndPerformanceCounter(\"Physics\");\r\n this._physicsTime.endMonitoring();\r\n });\r\n } else {\r\n this.scene.onBeforePhysicsObservable.remove(this._onBeforePhysicsObserver);\r\n this._onBeforePhysicsObserver = null;\r\n\r\n this.scene.onAfterPhysicsObservable.remove(this._onAfterPhysicsObserver);\r\n this._onAfterPhysicsObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for animations time\r\n */\r\n public get animationsTimeCounter(): PerfCounter {\r\n return this._animationsTime;\r\n }\r\n\r\n /**\r\n * Gets the animations time capture status\r\n */\r\n public get captureAnimationsTime(): boolean {\r\n return this._captureAnimationsTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the animations time capture\r\n */\r\n public set captureAnimationsTime(value: boolean) {\r\n if (value === this._captureAnimationsTime) {\r\n return;\r\n }\r\n\r\n this._captureAnimationsTime = value;\r\n\r\n if (value) {\r\n this._onAfterAnimationsObserver = this.scene.onAfterAnimationsObservable.add(() => {\r\n this._animationsTime.endMonitoring();\r\n });\r\n } else {\r\n this.scene.onAfterAnimationsObservable.remove(this._onAfterAnimationsObserver);\r\n this._onAfterAnimationsObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for frame time capture\r\n */\r\n public get frameTimeCounter(): PerfCounter {\r\n return this._frameTime;\r\n }\r\n\r\n /**\r\n * Gets the frame time capture status\r\n */\r\n public get captureFrameTime(): boolean {\r\n return this._captureFrameTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the frame time capture\r\n */\r\n public set captureFrameTime(value: boolean) {\r\n this._captureFrameTime = value;\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for inter-frames time capture\r\n */\r\n public get interFrameTimeCounter(): PerfCounter {\r\n return this._interFrameTime;\r\n }\r\n\r\n /**\r\n * Gets the inter-frames time capture status\r\n */\r\n public get captureInterFrameTime(): boolean {\r\n return this._captureInterFrameTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the inter-frames time capture\r\n */\r\n public set captureInterFrameTime(value: boolean) {\r\n this._captureInterFrameTime = value;\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for render time capture\r\n */\r\n public get renderTimeCounter(): PerfCounter {\r\n return this._renderTime;\r\n }\r\n\r\n /**\r\n * Gets the render time capture status\r\n */\r\n public get captureRenderTime(): boolean {\r\n return this._captureRenderTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the render time capture\r\n */\r\n public set captureRenderTime(value: boolean) {\r\n if (value === this._captureRenderTime) {\r\n return;\r\n }\r\n\r\n this._captureRenderTime = value;\r\n\r\n if (value) {\r\n this._onBeforeDrawPhaseObserver.push(\r\n this.scene.onBeforeDrawPhaseObservable.add(() => {\r\n this._renderTime.beginMonitoring();\r\n Tools.StartPerformanceCounter(\"Main render\");\r\n })\r\n );\r\n this._onAfterDrawPhaseObserver.push(\r\n this.scene.onAfterDrawPhaseObservable.add(() => {\r\n this._renderTime.endMonitoring(false);\r\n Tools.EndPerformanceCounter(\"Main render\");\r\n })\r\n );\r\n for (const objectRenderer of this.scene.objectRenderers) {\r\n this._onBeforeDrawPhaseObserver.push(\r\n objectRenderer.onBeforeRenderingManagerRenderObservable.add(() => {\r\n this._renderTime.beginMonitoring();\r\n Tools.StartPerformanceCounter(\"Main render\");\r\n })\r\n );\r\n this._onAfterDrawPhaseObserver.push(\r\n objectRenderer.onAfterRenderingManagerRenderObservable.add(() => {\r\n this._renderTime.endMonitoring(false);\r\n Tools.EndPerformanceCounter(\"Main render\");\r\n })\r\n );\r\n }\r\n } else {\r\n this._removeRenderTimeObservers();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for camera render time capture\r\n */\r\n public get cameraRenderTimeCounter(): PerfCounter {\r\n return this._cameraRenderTime;\r\n }\r\n\r\n /**\r\n * Gets the camera render time capture status\r\n */\r\n public get captureCameraRenderTime(): boolean {\r\n return this._captureCameraRenderTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the camera render time capture\r\n */\r\n public set captureCameraRenderTime(value: boolean) {\r\n if (value === this._captureCameraRenderTime) {\r\n return;\r\n }\r\n\r\n this._captureCameraRenderTime = value;\r\n\r\n if (value) {\r\n this._onBeforeCameraRenderObserver = this.scene.onBeforeCameraRenderObservable.add((camera) => {\r\n this._cameraRenderTime.beginMonitoring();\r\n Tools.StartPerformanceCounter(`Rendering camera ${camera.name}`);\r\n });\r\n\r\n this._onAfterCameraRenderObserver = this.scene.onAfterCameraRenderObservable.add((camera) => {\r\n this._cameraRenderTime.endMonitoring(false);\r\n Tools.EndPerformanceCounter(`Rendering camera ${camera.name}`);\r\n });\r\n } else {\r\n this.scene.onBeforeCameraRenderObservable.remove(this._onBeforeCameraRenderObserver);\r\n this._onBeforeCameraRenderObserver = null;\r\n this.scene.onAfterCameraRenderObservable.remove(this._onAfterCameraRenderObserver);\r\n this._onAfterCameraRenderObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for draw calls\r\n */\r\n public get drawCallsCounter(): PerfCounter {\r\n return this.scene.getEngine()._drawCalls;\r\n }\r\n\r\n /**\r\n * Instantiates a new scene instrumentation.\r\n * This class can be used to get instrumentation data from a Babylon engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#sceneinstrumentation\r\n * @param scene Defines the scene to instrument\r\n */\r\n public constructor(\r\n /**\r\n * Defines the scene to instrument\r\n */\r\n public scene: Scene\r\n ) {\r\n // Before render\r\n this._onBeforeAnimationsObserver = scene.onBeforeAnimationsObservable.add(() => {\r\n if (this._captureActiveMeshesEvaluationTime) {\r\n this._activeMeshesEvaluationTime.fetchNewFrame();\r\n }\r\n\r\n if (this._captureRenderTargetsRenderTime) {\r\n this._renderTargetsRenderTime.fetchNewFrame();\r\n }\r\n\r\n if (this._captureFrameTime) {\r\n Tools.StartPerformanceCounter(\"Scene rendering\");\r\n this._frameTime.beginMonitoring();\r\n }\r\n\r\n if (this._captureInterFrameTime) {\r\n this._interFrameTime.endMonitoring();\r\n }\r\n\r\n if (this._captureParticlesRenderTime) {\r\n this._particlesRenderTime.fetchNewFrame();\r\n }\r\n\r\n if (this._captureSpritesRenderTime) {\r\n this._spritesRenderTime.fetchNewFrame();\r\n }\r\n\r\n if (this._captureAnimationsTime) {\r\n this._animationsTime.beginMonitoring();\r\n }\r\n\r\n if (this._captureRenderTime) {\r\n this._renderTime.fetchNewFrame();\r\n }\r\n\r\n if (this._captureCameraRenderTime) {\r\n this._cameraRenderTime.fetchNewFrame();\r\n }\r\n\r\n this.scene.getEngine()._drawCalls.fetchNewFrame();\r\n });\r\n\r\n // After render\r\n this._onAfterRenderObserver = scene.onAfterRenderObservable.add(() => {\r\n if (this._captureFrameTime) {\r\n Tools.EndPerformanceCounter(\"Scene rendering\");\r\n this._frameTime.endMonitoring();\r\n }\r\n\r\n if (this._captureRenderTime) {\r\n this._renderTime.endMonitoring(false);\r\n }\r\n\r\n if (this._captureInterFrameTime) {\r\n this._interFrameTime.beginMonitoring();\r\n }\r\n\r\n if (this._captureActiveMeshesEvaluationTime) {\r\n this._activeMeshesEvaluationTime.endFrame();\r\n }\r\n if (this._captureRenderTargetsRenderTime) {\r\n this._renderTargetsRenderTime.endFrame();\r\n }\r\n if (this._captureParticlesRenderTime) {\r\n this._particlesRenderTime.endFrame();\r\n }\r\n if (this._captureSpritesRenderTime) {\r\n this._spritesRenderTime.endFrame();\r\n }\r\n if (this._captureRenderTime) {\r\n this._renderTime.endFrame();\r\n }\r\n if (this._captureCameraRenderTime) {\r\n this._cameraRenderTime.endFrame();\r\n }\r\n });\r\n }\r\n\r\n private _removeRenderTargetsObservers() {\r\n for (let i = 0; i < this.scene.objectRenderers.length; ++i) {\r\n const objectRenderer = this.scene.objectRenderers[i];\r\n objectRenderer.onInitRenderingObservable.remove(this._onBeforeRenderTargetsRenderObserver[i]);\r\n objectRenderer.onFinishRenderingObservable.remove(this._onAfterRenderTargetsRenderObserver[i]);\r\n }\r\n this._onBeforeRenderTargetsRenderObserver.length = 0;\r\n this._onAfterRenderTargetsRenderObserver.length = 0;\r\n }\r\n\r\n private _removeRenderTimeObservers() {\r\n this.scene.onBeforeDrawPhaseObservable.remove(this._onBeforeDrawPhaseObserver[0] as Observer<Scene>);\r\n this._onBeforeDrawPhaseObserver.length = 0;\r\n this.scene.onAfterDrawPhaseObservable.remove(this._onAfterDrawPhaseObserver[0] as Observer<Scene>);\r\n this._onAfterDrawPhaseObserver.length = 0;\r\n for (let i = 1; i < this._onBeforeDrawPhaseObserver.length; i++) {\r\n const objectRenderer = this.scene.objectRenderers[i - 1];\r\n objectRenderer.onBeforeRenderingManagerRenderObservable.remove(this._onBeforeDrawPhaseObserver[i] as Observer<number>);\r\n objectRenderer.onAfterRenderingManagerRenderObservable.remove(this._onAfterDrawPhaseObserver[i] as Observer<number>);\r\n }\r\n }\r\n\r\n /**\r\n * Dispose and release associated resources.\r\n */\r\n public dispose() {\r\n if (this._disposed) {\r\n return;\r\n }\r\n\r\n this.scene.onAfterRenderObservable.remove(this._onAfterRenderObserver);\r\n this._onAfterRenderObserver = null;\r\n\r\n this.scene.onBeforeActiveMeshesEvaluationObservable.remove(this._onBeforeActiveMeshesEvaluationObserver);\r\n this._onBeforeActiveMeshesEvaluationObserver = null;\r\n\r\n this.scene.onAfterActiveMeshesEvaluationObservable.remove(this._onAfterActiveMeshesEvaluationObserver);\r\n this._onAfterActiveMeshesEvaluationObserver = null;\r\n\r\n this._removeRenderTargetsObservers();\r\n\r\n this.scene.onBeforeAnimationsObservable.remove(this._onBeforeAnimationsObserver);\r\n this._onBeforeAnimationsObserver = null;\r\n\r\n this.scene.onBeforeParticlesRenderingObservable.remove(this._onBeforeParticlesRenderingObserver);\r\n this._onBeforeParticlesRenderingObserver = null;\r\n\r\n this.scene.onAfterParticlesRenderingObservable.remove(this._onAfterParticlesRenderingObserver);\r\n this._onAfterParticlesRenderingObserver = null;\r\n\r\n if (this._onBeforeSpritesRenderingObserver) {\r\n this.scene.onBeforeSpritesRenderingObservable.remove(this._onBeforeSpritesRenderingObserver);\r\n this._onBeforeSpritesRenderingObserver = null;\r\n }\r\n\r\n if (this._onAfterSpritesRenderingObserver) {\r\n this.scene.onAfterSpritesRenderingObservable.remove(this._onAfterSpritesRenderingObserver);\r\n this._onAfterSpritesRenderingObserver = null;\r\n }\r\n\r\n this._removeRenderTimeObservers();\r\n\r\n if (this._onBeforePhysicsObserver) {\r\n this.scene.onBeforePhysicsObservable.remove(this._onBeforePhysicsObserver);\r\n this._onBeforePhysicsObserver = null;\r\n }\r\n\r\n if (this._onAfterPhysicsObserver) {\r\n this.scene.onAfterPhysicsObservable.remove(this._onAfterPhysicsObserver);\r\n this._onAfterPhysicsObserver = null;\r\n }\r\n\r\n this.scene.onAfterAnimationsObservable.remove(this._onAfterAnimationsObserver);\r\n this._onAfterAnimationsObserver = null;\r\n\r\n this.scene.onBeforeCameraRenderObservable.remove(this._onBeforeCameraRenderObserver);\r\n this._onBeforeCameraRenderObserver = null;\r\n\r\n this.scene.onAfterCameraRenderObservable.remove(this._onAfterCameraRenderObserver);\r\n this._onAfterCameraRenderObserver = null;\r\n\r\n (<any>this.scene) = null;\r\n this._disposed = true;\r\n }\r\n}\r\n"]}
@@ -28,8 +28,10 @@ export declare class ClusteredLightContainer extends Light {
28
28
  * Gets the current list of lights added to this clustering system.
29
29
  */
30
30
  get lights(): readonly Light[];
31
+ private readonly _sortedLights;
31
32
  private _lightDataBuffer;
32
33
  private _lightDataTexture;
34
+ private _lightDataRenderId;
33
35
  private _tileMaskBatches;
34
36
  private _tileMaskTexture;
35
37
  private _tileMaskBuffer;
@@ -47,6 +49,15 @@ export declare class ClusteredLightContainer extends Light {
47
49
  */
48
50
  get verticalTiles(): number;
49
51
  set verticalTiles(vertical: number);
52
+ private _sliceScale;
53
+ private _sliceBias;
54
+ private _sliceRanges;
55
+ private _depthSlices;
56
+ /**
57
+ * The number of slices to split the depth range by and cluster lights into.
58
+ */
59
+ get depthSlices(): number;
60
+ set depthSlices(slices: number);
50
61
  private readonly _proxyMaterial;
51
62
  private readonly _proxyMesh;
52
63
  private _maxRange;
@@ -68,6 +79,7 @@ export declare class ClusteredLightContainer extends Light {
68
79
  getTypeID(): number;
69
80
  /** @internal */
70
81
  _updateBatches(): RenderTargetTexture;
82
+ private _getSliceIndex;
71
83
  private _updateLightData;
72
84
  dispose(doNotRecurse?: boolean, disposeMaterialAndTextures?: boolean): void;
73
85
  /**
@@ -4,11 +4,12 @@ import { StorageBuffer } from "../../Buffers/storageBuffer.js";
4
4
  import { ShaderMaterial } from "../../Materials/shaderMaterial.js";
5
5
  import { RawTexture } from "../../Materials/Textures/rawTexture.js";
6
6
  import { RenderTargetTexture } from "../../Materials/Textures/renderTargetTexture.js";
7
+ import { UniformBuffer } from "../../Materials/uniformBuffer.js";
7
8
  import { TmpColors } from "../../Maths/math.color.js";
8
9
  import { TmpVectors, Vector3 } from "../../Maths/math.vector.js";
9
10
  import { CreatePlane } from "../../Meshes/Builders/planeBuilder.js";
10
- import { _WarnImport } from "../../Misc/devTools.js";
11
11
  import { serialize } from "../../Misc/decorators.js";
12
+ import { _WarnImport } from "../../Misc/devTools.js";
12
13
  import { Logger } from "../../Misc/logger.js";
13
14
  import { RegisterClass } from "../../Misc/typeStore.js";
14
15
  import { Node } from "../../node.js";
@@ -18,6 +19,7 @@ import "../../Meshes/thinInstanceMesh.js";
18
19
  Node.AddNodeConstructor("Light_Type_5", (name, scene) => {
19
20
  return () => new ClusteredLightContainer(name, [], scene);
20
21
  });
22
+ const DefaultDepthSlices = 16;
21
23
  /**
22
24
  * A special light that renders all its associated spot or point lights using a clustered or forward+ system.
23
25
  */
@@ -117,6 +119,23 @@ export class ClusteredLightContainer extends Light {
117
119
  // Force the batch data to be recreated
118
120
  this._tileMaskBatches = -1;
119
121
  }
122
+ /**
123
+ * The number of slices to split the depth range by and cluster lights into.
124
+ */
125
+ get depthSlices() {
126
+ return this._depthSlices;
127
+ }
128
+ set depthSlices(slices) {
129
+ if (this._depthSlices === slices) {
130
+ return;
131
+ }
132
+ this._depthSlices = slices;
133
+ this._sliceRanges = new Float32Array(slices * 2);
134
+ // UBO size depends on the number of depth slices
135
+ this._uniformBuffer.dispose();
136
+ this._uniformBuffer = new UniformBuffer(this.getEngine(), undefined, undefined, this.name);
137
+ this._buildUniformLayout();
138
+ }
120
139
  /**
121
140
  * This limits the range of all the added lights, so even lights with extreme ranges will still have bounds for clustering.
122
141
  */
@@ -140,9 +159,15 @@ export class ClusteredLightContainer extends Light {
140
159
  constructor(name, lights = [], scene) {
141
160
  super(name, scene);
142
161
  this._lights = [];
162
+ // The lights sorted by depth
163
+ this._sortedLights = [];
164
+ this._lightDataRenderId = -1;
143
165
  this._tileMaskBatches = -1;
144
166
  this._horizontalTiles = 64;
145
167
  this._verticalTiles = 64;
168
+ this._sliceScale = 0;
169
+ this._sliceBias = 0;
170
+ this._depthSlices = DefaultDepthSlices;
146
171
  this._maxRange = 16383;
147
172
  this._minInverseSquaredRange = 1 / (this._maxRange * this._maxRange);
148
173
  const engine = this.getEngine();
@@ -173,6 +198,7 @@ export class ClusteredLightContainer extends Light {
173
198
  this._scene.removeMesh(this._proxyMesh);
174
199
  this._proxyMesh.material = this._proxyMaterial;
175
200
  this._updateBatches();
201
+ this._sliceRanges = new Float32Array(this._depthSlices * 2);
176
202
  if (this._batchSize > 0) {
177
203
  ClusteredLightContainer._SceneComponentInitialization(this._scene);
178
204
  for (const light of lights) {
@@ -189,11 +215,11 @@ export class ClusteredLightContainer extends Light {
189
215
  }
190
216
  /** @internal */
191
217
  _updateBatches() {
192
- this._proxyMesh.isVisible = this._lights.length > 0;
218
+ this._proxyMesh.isVisible = this._sortedLights.length > 0;
193
219
  // Ensure space for atleast 1 batch
194
- const batches = Math.max(Math.ceil(this._lights.length / this._batchSize), 1);
220
+ const batches = Math.max(Math.ceil(this._sortedLights.length / this._batchSize), 1);
195
221
  if (this._tileMaskBatches >= batches) {
196
- this._proxyMesh.thinInstanceCount = this._lights.length;
222
+ this._proxyMesh.thinInstanceCount = this._sortedLights.length;
197
223
  return this._tileMaskTexture;
198
224
  }
199
225
  const engine = this.getEngine();
@@ -242,14 +268,42 @@ export class ClusteredLightContainer extends Light {
242
268
  this._proxyMaterial.setVector3("tileMaskResolution", new Vector3(this._horizontalTiles, this.verticalTiles, batches));
243
269
  // We don't actually use the matrix data but we need enough capacity for the lights
244
270
  this._proxyMesh.thinInstanceSetBuffer("matrix", new Float32Array(maxLights * 16));
245
- this._proxyMesh.thinInstanceCount = this._lights.length;
271
+ this._proxyMesh.thinInstanceCount = this._sortedLights.length;
246
272
  this._tileMaskBatches = batches;
247
273
  return this._tileMaskTexture;
248
274
  }
275
+ _getSliceIndex(camera, depth) {
276
+ if (depth < camera.minZ) {
277
+ // Prevent calling log on small or negative values
278
+ return -1;
279
+ }
280
+ return Math.floor(Math.log(depth) * this._sliceScale + this._sliceBias);
281
+ }
249
282
  _updateLightData() {
283
+ const camera = this._scene.activeCamera;
284
+ const renderId = this._scene.getRenderId();
285
+ if (!camera || this._lightDataRenderId === renderId) {
286
+ return;
287
+ }
288
+ this._lightDataRenderId = renderId;
289
+ // Resort lights based on distance from camera
290
+ const view = camera.getViewMatrix();
291
+ for (const light of this._sortedLights) {
292
+ const position = light.computeTransformedInformation() ? light.transformedPosition : light.position;
293
+ const viewPosition = Vector3.TransformCoordinatesToRef(position, view, TmpVectors.Vector3[0]);
294
+ light._currentViewDepth = viewPosition.z;
295
+ }
296
+ this._sortedLights.sort((a, b) => a._currentViewDepth - b._currentViewDepth);
297
+ // DOOM 2016 subdivision scheme, copied from: https://www.aortiz.me/2018/12/21/CG.html
298
+ const logFarNear = Math.log(camera.maxZ / camera.minZ);
299
+ this._sliceScale = this._depthSlices / logFarNear;
300
+ this._sliceBias = -(this._depthSlices * Math.log(camera.minZ)) / logFarNear;
301
+ this._sliceRanges.fill(0);
302
+ // Last slice which had had its min index updated
303
+ let minSlice = -1;
250
304
  const buf = this._lightDataBuffer;
251
- for (let i = 0; i < this._lights.length; i += 1) {
252
- const light = this._lights[i];
305
+ for (let i = 0; i < this._sortedLights.length; i += 1) {
306
+ const light = this._sortedLights[i];
253
307
  const off = i * 20;
254
308
  const computed = light.computeTransformedInformation();
255
309
  const scaledIntensity = light.getScaledIntensity();
@@ -297,6 +351,27 @@ export class ClusteredLightContainer extends Light {
297
351
  buf[off + 18] = spotLight._lightAngleScale;
298
352
  buf[off + 19] = spotLight._lightAngleOffset;
299
353
  }
354
+ // Update the depth slices that include this light
355
+ const firstSlice = this._getSliceIndex(camera, light._currentViewDepth - range);
356
+ const lastSlice = this._getSliceIndex(camera, light._currentViewDepth + range);
357
+ for (let j = firstSlice; j <= lastSlice; j += 1) {
358
+ if (j < 0 || j >= this._depthSlices) {
359
+ continue;
360
+ }
361
+ else if (j > minSlice) {
362
+ // Update min index
363
+ this._sliceRanges[j * 2] = i;
364
+ minSlice = j;
365
+ }
366
+ // Update max index
367
+ this._sliceRanges[j * 2 + 1] = i;
368
+ }
369
+ }
370
+ const engine = this.getEngine();
371
+ if (engine.isWebGPU) {
372
+ // Whenever the light data changes we have to flush pending WebGPU command buffers so that
373
+ // previous render passes use the old data and later render passes use the new data.
374
+ engine.flushFramebuffer();
300
375
  }
301
376
  this._lightDataTexture.update(this._lightDataBuffer);
302
377
  }
@@ -321,8 +396,9 @@ export class ClusteredLightContainer extends Light {
321
396
  }
322
397
  this._scene.removeLight(light);
323
398
  this._lights.push(light);
399
+ this._sortedLights.push(light);
324
400
  this._proxyMesh.isVisible = true;
325
- this._proxyMesh.thinInstanceCount = this._lights.length;
401
+ this._proxyMesh.thinInstanceCount = this._sortedLights.length;
326
402
  }
327
403
  /**
328
404
  * Removes a light from the clustering system.
@@ -330,15 +406,21 @@ export class ClusteredLightContainer extends Light {
330
406
  * @returns the index where the light was in the light list
331
407
  */
332
408
  removeLight(light) {
333
- const index = this.lights.indexOf(light);
334
- if (index === -1) {
335
- return index;
409
+ // Convert to `Light` array without cast so `indexOf` has correct typing
410
+ const sortedLights = this._sortedLights;
411
+ const sortedIndex = sortedLights.indexOf(light);
412
+ if (sortedIndex !== -1) {
413
+ sortedLights.splice(sortedIndex, 1);
414
+ this._proxyMesh.thinInstanceCount = sortedLights.length;
415
+ if (sortedLights.length === 0) {
416
+ this._proxyMesh.isVisible = false;
417
+ }
336
418
  }
337
- this._lights.splice(index, 1);
338
- this._scene.addLight(light);
339
- this._proxyMesh.thinInstanceCount = this._lights.length;
340
- if (this._lights.length === 0) {
341
- this._proxyMesh.isVisible = false;
419
+ const index = this._lights.indexOf(light);
420
+ if (index !== -1) {
421
+ this._lights.splice(index, 1);
422
+ // We treat the unsorted array as the "real" one so only add back to the scene if it was found in that
423
+ this._scene.addLight(light);
342
424
  }
343
425
  return index;
344
426
  }
@@ -346,7 +428,9 @@ export class ClusteredLightContainer extends Light {
346
428
  this._uniformBuffer.addUniform("vLightData", 4);
347
429
  this._uniformBuffer.addUniform("vLightDiffuse", 4);
348
430
  this._uniformBuffer.addUniform("vLightSpecular", 4);
349
- this._uniformBuffer.addUniform("vNumLights", 1);
431
+ this._uniformBuffer.addUniform("vSliceData", 2);
432
+ // _depthSlices might not be initialized yet
433
+ this._uniformBuffer.addUniform("vSliceRanges", 2, this._depthSlices ?? DefaultDepthSlices);
350
434
  this._uniformBuffer.addUniform("shadowsInfo", 3);
351
435
  this._uniformBuffer.addUniform("depthValues", 2);
352
436
  this._uniformBuffer.create();
@@ -356,7 +440,8 @@ export class ClusteredLightContainer extends Light {
356
440
  const hscale = this._horizontalTiles / engine.getRenderWidth();
357
441
  const vscale = this._verticalTiles / engine.getRenderHeight();
358
442
  this._uniformBuffer.updateFloat4("vLightData", hscale, vscale, this._verticalTiles, this._tileMaskBatches, lightIndex);
359
- this._uniformBuffer.updateFloat("vNumLights", this._lights.length, lightIndex);
443
+ this._uniformBuffer.updateFloat2("vSliceData", this._sliceScale, this._sliceBias, lightIndex);
444
+ this._uniformBuffer.updateFloatArray("vSliceRanges", this._sliceRanges, lightIndex);
360
445
  return this;
361
446
  }
362
447
  transferTexturesToEffect(effect, lightIndex) {
@@ -377,6 +462,7 @@ export class ClusteredLightContainer extends Light {
377
462
  prepareLightSpecificDefines(defines, lightIndex) {
378
463
  defines["CLUSTLIGHT" + lightIndex] = true;
379
464
  defines["CLUSTLIGHT_BATCH"] = this._batchSize;
465
+ defines["CLUSTLIGHT_SLICES"] = this._depthSlices;
380
466
  }
381
467
  _isReady() {
382
468
  this._updateBatches();