@babylonjs/core 8.23.2 → 8.24.1
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.
- package/Behaviors/Meshes/index.d.ts +1 -0
- package/Behaviors/Meshes/index.js +1 -0
- package/Behaviors/Meshes/index.js.map +1 -1
- package/Behaviors/Meshes/pointerDragBehavior.d.ts +6 -34
- package/Behaviors/Meshes/pointerDragBehavior.js +0 -12
- package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
- package/Behaviors/Meshes/pointerDragEvents.d.ts +38 -0
- package/Behaviors/Meshes/pointerDragEvents.js +2 -0
- package/Behaviors/Meshes/pointerDragEvents.js.map +1 -0
- package/Engines/Extensions/engine.multiview.js +5 -5
- package/Engines/Extensions/engine.multiview.js.map +1 -1
- package/Engines/abstractEngine.js +3 -3
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/thinEngine.js +2 -0
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +7 -0
- package/Engines/webgpuEngine.js.map +1 -1
- package/FrameGraph/Tasks/Layers/baseLayerTask.d.ts +4 -0
- package/FrameGraph/Tasks/Layers/baseLayerTask.js +6 -0
- package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
- package/Gizmos/cameraGizmo.js +2 -2
- package/Gizmos/cameraGizmo.js.map +1 -1
- package/Gizmos/lightGizmo.js +2 -2
- package/Gizmos/lightGizmo.js.map +1 -1
- package/Gizmos/positionGizmo.d.ts +7 -6
- package/Gizmos/positionGizmo.js +3 -9
- package/Gizmos/positionGizmo.js.map +1 -1
- package/Gizmos/rotationGizmo.d.ts +7 -6
- package/Gizmos/rotationGizmo.js +3 -9
- package/Gizmos/rotationGizmo.js.map +1 -1
- package/Gizmos/scaleGizmo.d.ts +7 -6
- package/Gizmos/scaleGizmo.js +3 -9
- package/Gizmos/scaleGizmo.js.map +1 -1
- package/Instrumentation/sceneInstrumentation.d.ts +2 -0
- package/Instrumentation/sceneInstrumentation.js +58 -32
- package/Instrumentation/sceneInstrumentation.js.map +1 -1
- package/Lights/Clustered/clusteredLightContainer.d.ts +12 -0
- package/Lights/Clustered/clusteredLightContainer.js +104 -18
- package/Lights/Clustered/clusteredLightContainer.js.map +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.js +1 -0
- package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.js +1 -0
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Lights/light.d.ts +5 -0
- package/Lights/light.js +5 -0
- package/Lights/light.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.js +2 -1
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/Textures/renderTargetTexture.d.ts +5 -0
- package/Materials/Textures/renderTargetTexture.js +9 -0
- package/Materials/Textures/renderTargetTexture.js.map +1 -1
- package/Materials/materialHelper.functions.js +4 -2
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Materials/standardMaterial.js +2 -1
- package/Materials/standardMaterial.js.map +1 -1
- package/Materials/uniformBuffer.d.ts +6 -3
- package/Materials/uniformBuffer.js +35 -13
- package/Materials/uniformBuffer.js.map +1 -1
- package/Maths/math.vector.d.ts +1 -1
- package/Maths/math.vector.js +2 -2
- package/Maths/math.vector.js.map +1 -1
- package/Misc/fileTools.js +1 -1
- package/Misc/fileTools.js.map +1 -1
- package/Misc/screenshotTools.js +1 -1
- package/Misc/screenshotTools.js.map +1 -1
- package/Misc/snapshotRenderingHelper.d.ts +4 -3
- package/Misc/snapshotRenderingHelper.js +6 -5
- package/Misc/snapshotRenderingHelper.js.map +1 -1
- package/Particles/Node/Blocks/Emitters/createParticleBlock.js +7 -3
- package/Particles/Node/Blocks/Emitters/createParticleBlock.js.map +1 -1
- package/Particles/Node/Blocks/Emitters/meshShapeBlock.js +0 -3
- package/Particles/Node/Blocks/Emitters/meshShapeBlock.js.map +1 -1
- package/Particles/Node/Blocks/systemBlock.d.ts +3 -0
- package/Particles/Node/Blocks/systemBlock.js +3 -0
- package/Particles/Node/Blocks/systemBlock.js.map +1 -1
- package/Particles/Node/nodeParticleBuildState.js +1 -1
- package/Particles/Node/nodeParticleBuildState.js.map +1 -1
- package/Particles/Node/nodeParticleSystemSet.helper.d.ts +1 -1
- package/Particles/Node/nodeParticleSystemSet.helper.js +31 -1
- package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
- package/Particles/Node/nodeParticleSystemSet.js +1 -0
- package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
- package/Particles/particle.d.ts +4 -0
- package/Particles/particle.js +5 -0
- package/Particles/particle.js.map +1 -1
- package/Particles/particleSystem.d.ts +2 -0
- package/Particles/particleSystem.js +2 -0
- package/Particles/particleSystem.js.map +1 -1
- package/Particles/thinParticleSystem.d.ts +2 -0
- package/Particles/thinParticleSystem.function.d.ts +2 -0
- package/Particles/thinParticleSystem.function.js +3 -0
- package/Particles/thinParticleSystem.function.js.map +1 -1
- package/Particles/thinParticleSystem.js +11 -5
- package/Particles/thinParticleSystem.js.map +1 -1
- package/Rendering/objectRenderer.d.ts +17 -1
- package/Rendering/objectRenderer.js +55 -14
- package/Rendering/objectRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/clusteredLightingFunctions.js +1 -0
- package/Shaders/ShadersInclude/clusteredLightingFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/helperFunctions.js +1 -0
- package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/lightFragment.js +4 -4
- package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
- package/Shaders/ShadersInclude/lightFragmentDeclaration.js +1 -1
- package/Shaders/ShadersInclude/lightFragmentDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/lightUboDeclaration.js +1 -1
- package/Shaders/ShadersInclude/lightUboDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/lightVxUboDeclaration.js +1 -1
- package/Shaders/ShadersInclude/lightVxUboDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/lightsFragmentFunctions.js +2 -2
- package/Shaders/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrClusteredLightingFunctions.js +2 -2
- package/Shaders/ShadersInclude/pbrClusteredLightingFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrFragmentExtraDeclaration.js +3 -0
- package/Shaders/ShadersInclude/pbrFragmentExtraDeclaration.js.map +1 -1
- package/Shaders/default.fragment.js +3 -0
- package/Shaders/default.fragment.js.map +1 -1
- package/Shaders/default.vertex.js +6 -0
- package/Shaders/default.vertex.js.map +1 -1
- package/Shaders/pbr.vertex.js +6 -0
- package/Shaders/pbr.vertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/clusteredLightingFunctions.js +1 -0
- package/ShadersWGSL/ShadersInclude/clusteredLightingFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightFragment.js +4 -4
- package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js +2 -1
- package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js +2 -1
- package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js +3 -2
- package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +3 -2
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrFragmentExtraDeclaration.js +3 -0
- package/ShadersWGSL/ShadersInclude/pbrFragmentExtraDeclaration.js.map +1 -1
- package/ShadersWGSL/default.fragment.js +3 -0
- package/ShadersWGSL/default.fragment.js.map +1 -1
- package/ShadersWGSL/default.vertex.js +6 -0
- package/ShadersWGSL/default.vertex.js.map +1 -1
- package/ShadersWGSL/pbr.vertex.js +6 -0
- package/ShadersWGSL/pbr.vertex.js.map +1 -1
- package/States/alphaCullingState.d.ts +3 -1
- package/States/alphaCullingState.js +39 -37
- package/States/alphaCullingState.js.map +1 -1
- package/package.json +1 -1
- package/scene.d.ts +27 -1
- package/scene.js +55 -2
- 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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
|
292
|
+
this._onBeforeDrawPhaseObserver.push(this.scene.onBeforeDrawPhaseObservable.add(() => {
|
|
288
293
|
this._renderTime.beginMonitoring();
|
|
289
294
|
Tools.StartPerformanceCounter("Main render");
|
|
290
|
-
});
|
|
291
|
-
this._onAfterDrawPhaseObserver
|
|
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.
|
|
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 =
|
|
382
|
-
this._onAfterRenderTargetsRenderObserver =
|
|
393
|
+
this._onBeforeRenderTargetsRenderObserver = [];
|
|
394
|
+
this._onAfterRenderTargetsRenderObserver = [];
|
|
383
395
|
this._onAfterRenderObserver = null;
|
|
384
|
-
this._onBeforeDrawPhaseObserver =
|
|
385
|
-
this._onAfterDrawPhaseObserver =
|
|
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.
|
|
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.
|
|
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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAKtC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IA4D7B,aAAa;IACb;;OAEG;IACH,IAAW,iCAAiC;QACxC,OAAO,IAAI,CAAC,2BAA2B,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,IAAW,iCAAiC;QACxC,OAAO,IAAI,CAAC,kCAAkC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,IAAW,iCAAiC,CAAC,KAAc;QACvD,IAAI,KAAK,KAAK,IAAI,CAAC,kCAAkC,EAAE,CAAC;YACpD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,kCAAkC,GAAG,KAAK,CAAC;QAEhD,IAAI,KAAK,EAAE,CAAC;YACR,IAAI,CAAC,uCAAuC,GAAG,IAAI,CAAC,KAAK,CAAC,wCAAwC,CAAC,GAAG,CAAC,GAAG,EAAE;gBACxG,KAAK,CAAC,uBAAuB,CAAC,0BAA0B,CAAC,CAAC;gBAC1D,IAAI,CAAC,2BAA2B,CAAC,eAAe,EAAE,CAAC;YACvD,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,sCAAsC,GAAG,IAAI,CAAC,KAAK,CAAC,uCAAuC,CAAC,GAAG,CAAC,GAAG,EAAE;gBACtG,KAAK,CAAC,qBAAqB,CAAC,0BAA0B,CAAC,CAAC;gBACxD,IAAI,CAAC,2BAA2B,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,KAAK,CAAC,wCAAwC,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YACzG,IAAI,CAAC,uCAAuC,GAAG,IAAI,CAAC;YAEpD,IAAI,CAAC,KAAK,CAAC,uCAAuC,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACvG,IAAI,CAAC,sCAAsC,GAAG,IAAI,CAAC;QACvD,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAW,8BAA8B;QACrC,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,IAAW,8BAA8B;QACrC,OAAO,IAAI,CAAC,+BAA+B,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,IAAW,8BAA8B,CAAC,KAAc;QACpD,IAAI,KAAK,KAAK,IAAI,CAAC,+BAA+B,EAAE,CAAC;YACjD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,+BAA+B,GAAG,KAAK,CAAC;QAE7C,IAAI,KAAK,EAAE,CAAC;YACR,KAAK,MAAM,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;gBACtD,IAAI,CAAC,oCAAoC,CAAC,IAAI,CAC1C,cAAc,CAAC,yBAAyB,CAAC,GAAG,CAAC,GAAG,EAAE;oBAC9C,KAAK,CAAC,uBAAuB,CAAC,0BAA0B,CAAC,CAAC;oBAC1D,IAAI,CAAC,wBAAwB,CAAC,eAAe,EAAE,CAAC;gBACpD,CAAC,CAAC,CACL,CAAC;gBACF,IAAI,CAAC,mCAAmC,CAAC,IAAI,CACzC,cAAc,CAAC,2BAA2B,CAAC,GAAG,CAAC,GAAG,EAAE;oBAChD,KAAK,CAAC,qBAAqB,CAAC,0BAA0B,CAAC,CAAC;oBACxD,IAAI,CAAC,wBAAwB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACvD,CAAC,CAAC,CACL,CAAC;YACN,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;gBACzD,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBACrD,cAAc,CAAC,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9F,cAAc,CAAC,2BAA2B,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnG,CAAC;YACD,IAAI,CAAC,oCAAoC,CAAC,MAAM,GAAG,CAAC,CAAC;YACrD,IAAI,CAAC,mCAAmC,CAAC,MAAM,GAAG,CAAC,CAAC;QACxD,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAW,0BAA0B;QACjC,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,IAAW,0BAA0B;QACjC,OAAO,IAAI,CAAC,2BAA2B,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,IAAW,0BAA0B,CAAC,KAAc;QAChD,IAAI,KAAK,KAAK,IAAI,CAAC,2BAA2B,EAAE,CAAC;YAC7C,OAAO;QACX,CAAC;QAED,IAAI,CAAC,2BAA2B,GAAG,KAAK,CAAC;QAEzC,IAAI,KAAK,EAAE,CAAC;YACR,IAAI,CAAC,mCAAmC,GAAG,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,GAAG,CAAC,GAAG,EAAE;gBAChG,KAAK,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;gBAC3C,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAAC;YAChD,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,kCAAkC,GAAG,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC9F,KAAK,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;gBACzC,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YACjG,IAAI,CAAC,mCAAmC,GAAG,IAAI,CAAC;YAEhD,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YAC/F,IAAI,CAAC,kCAAkC,GAAG,IAAI,CAAC;QACnD,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAW,wBAAwB;QAC/B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,IAAW,wBAAwB;QAC/B,OAAO,IAAI,CAAC,yBAAyB,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,IAAW,wBAAwB,CAAC,KAAc;QAC9C,IAAI,KAAK,KAAK,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAC3C,OAAO;QACX,CAAC;QAED,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC;QAEvC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;YAC7B,OAAO;QACX,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACR,IAAI,CAAC,iCAAiC,GAAG,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC5F,KAAK,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;gBACzC,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,CAAC;YAC9C,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,gCAAgC,GAAG,IAAI,CAAC,KAAK,CAAC,iCAAiC,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC1F,KAAK,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;gBACvC,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAC7F,IAAI,CAAC,iCAAiC,GAAG,IAAI,CAAC;YAE9C,IAAI,CAAC,KAAK,CAAC,iCAAiC,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC3F,IAAI,CAAC,gCAAgC,GAAG,IAAI,CAAC;QACjD,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,IAAW,kBAAkB,CAAC,KAAc;QACxC,IAAI,KAAK,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACrC,OAAO;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB,EAAE,CAAC;YACxC,OAAO;QACX,CAAC;QAED,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;QAEjC,IAAI,KAAK,EAAE,CAAC;YACR,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC1E,KAAK,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;gBACzC,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;YACxC,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAAG,EAAE;gBACxE,KAAK,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;gBACvC,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;YACtC,CAAC,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC3E,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;YAErC,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACzE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;QACxC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAW,qBAAqB;QAC5B,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,IAAW,qBAAqB;QAC5B,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,IAAW,qBAAqB,CAAC,KAAc;QAC3C,IAAI,KAAK,KAAK,IAAI,CAAC,sBAAsB,EAAE,CAAC;YACxC,OAAO;QACX,CAAC;QAED,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;QAEpC,IAAI,KAAK,EAAE,CAAC;YACR,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC9E,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;YACzC,CAAC,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YAC/E,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC;QAC3C,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,IAAW,gBAAgB,CAAC,KAAc;QACtC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,IAAW,qBAAqB;QAC5B,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,IAAW,qBAAqB;QAC5B,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,IAAW,qBAAqB,CAAC,KAAc;QAC3C,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,IAAW,iBAAiB,CAAC,KAAc;QACvC,IAAI,KAAK,KAAK,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACpC,OAAO;QACX,CAAC;QAED,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAEhC,IAAI,KAAK,EAAE,CAAC;YACR,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAChC,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC5C,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;gBACnC,KAAK,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC;YACjD,CAAC,CAAC,CACL,CAAC;YACF,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAC/B,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC3C,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACtC,KAAK,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;YAC/C,CAAC,CAAC,CACL,CAAC;YACF,KAAK,MAAM,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;gBACtD,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAChC,cAAc,CAAC,wCAAwC,CAAC,GAAG,CAAC,GAAG,EAAE;oBAC7D,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;oBACnC,KAAK,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC;gBACjD,CAAC,CAAC,CACL,CAAC;gBACF,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAC/B,cAAc,CAAC,uCAAuC,CAAC,GAAG,CAAC,GAAG,EAAE;oBAC5D,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;oBACtC,KAAK,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;gBAC/C,CAAC,CAAC,CACL,CAAC;YACN,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,0BAA0B,EAAE,CAAC;QACtC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAW,uBAAuB;QAC9B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,IAAW,uBAAuB;QAC9B,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,IAAW,uBAAuB,CAAC,KAAc;QAC7C,IAAI,KAAK,KAAK,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAC1C,OAAO;QACX,CAAC;QAED,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;QAEtC,IAAI,KAAK,EAAE,CAAC;YACR,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC1F,IAAI,CAAC,iBAAiB,CAAC,eAAe,EAAE,CAAC;gBACzC,KAAK,CAAC,uBAAuB,CAAC,oBAAoB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACxF,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC5C,KAAK,CAAC,qBAAqB,CAAC,oBAAoB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YACrF,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YACnF,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC;QAC7C,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC;IAC7C,CAAC;IAED;;;;;OAKG;IACH;IACI;;OAEG;IACI,KAAY;QAAZ,UAAK,GAAL,KAAK,CAAO;QAjef,uCAAkC,GAAG,KAAK,CAAC;QAC3C,gCAA2B,GAAG,IAAI,WAAW,EAAE,CAAC;QAEhD,oCAA+B,GAAG,KAAK,CAAC;QACxC,6BAAwB,GAAG,IAAI,WAAW,EAAE,CAAC;QAE7C,sBAAiB,GAAG,KAAK,CAAC;QAC1B,eAAU,GAAG,IAAI,WAAW,EAAE,CAAC;QAE/B,uBAAkB,GAAG,KAAK,CAAC;QAC3B,gBAAW,GAAG,IAAI,WAAW,EAAE,CAAC;QAEhC,2BAAsB,GAAG,KAAK,CAAC;QAC/B,oBAAe,GAAG,IAAI,WAAW,EAAE,CAAC;QAEpC,gCAA2B,GAAG,KAAK,CAAC;QACpC,yBAAoB,GAAG,IAAI,WAAW,EAAE,CAAC;QAEzC,8BAAyB,GAAG,KAAK,CAAC;QAClC,uBAAkB,GAAG,IAAI,WAAW,EAAE,CAAC;QAEvC,wBAAmB,GAAG,KAAK,CAAC;QAC5B,iBAAY,GAAG,IAAI,WAAW,EAAE,CAAC;QAEjC,2BAAsB,GAAG,KAAK,CAAC;QAC/B,oBAAe,GAAG,IAAI,WAAW,EAAE,CAAC;QAEpC,6BAAwB,GAAG,KAAK,CAAC;QACjC,sBAAiB,GAAG,IAAI,WAAW,EAAE,CAAC;QAE9C,YAAY;QACJ,4CAAuC,GAA8B,IAAI,CAAC;QAC1E,2CAAsC,GAA8B,IAAI,CAAC;QACzE,yCAAoC,GAAyC,EAAE,CAAC;QAChF,wCAAmC,GAAyC,EAAE,CAAC;QAE/E,2BAAsB,GAA8B,IAAI,CAAC;QAEzD,+BAA0B,GAAmD,EAAE,CAAC;QAChF,8BAAyB,GAAmD,EAAE,CAAC;QAE/E,gCAA2B,GAA8B,IAAI,CAAC;QAE9D,wCAAmC,GAA8B,IAAI,CAAC;QACtE,uCAAkC,GAA8B,IAAI,CAAC;QAErE,sCAAiC,GAA8B,IAAI,CAAC;QACpE,qCAAgC,GAA8B,IAAI,CAAC;QAEnE,6BAAwB,GAA8B,IAAI,CAAC;QAC3D,4BAAuB,GAA8B,IAAI,CAAC;QAE1D,+BAA0B,GAA8B,IAAI,CAAC;QAE7D,kCAA6B,GAA+B,IAAI,CAAC;QACjE,iCAA4B,GAA+B,IAAI,CAAC;QAEhE,cAAS,GAAG,KAAK,CAAC;QA0atB,gBAAgB;QAChB,IAAI,CAAC,2BAA2B,GAAG,KAAK,CAAC,4BAA4B,CAAC,GAAG,CAAC,GAAG,EAAE;YAC3E,IAAI,IAAI,CAAC,kCAAkC,EAAE,CAAC;gBAC1C,IAAI,CAAC,2BAA2B,CAAC,aAAa,EAAE,CAAC;YACrD,CAAC;YAED,IAAI,IAAI,CAAC,+BAA+B,EAAE,CAAC;gBACvC,IAAI,CAAC,wBAAwB,CAAC,aAAa,EAAE,CAAC;YAClD,CAAC;YAED,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,KAAK,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;gBACjD,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;YACtC,CAAC;YAED,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC9B,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;YACzC,CAAC;YAED,IAAI,IAAI,CAAC,2BAA2B,EAAE,CAAC;gBACnC,IAAI,CAAC,oBAAoB,CAAC,aAAa,EAAE,CAAC;YAC9C,CAAC;YAED,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;gBACjC,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,CAAC;YAC5C,CAAC;YAED,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC9B,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,CAAC;YAC3C,CAAC;YAED,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC1B,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;YACrC,CAAC;YAED,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAChC,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC;YAC3C,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,eAAe;QACf,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,EAAE;YACjE,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,KAAK,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;gBAC/C,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;YACpC,CAAC;YAED,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC1B,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC1C,CAAC;YAED,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC9B,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,CAAC;YAC3C,CAAC;YAED,IAAI,IAAI,CAAC,kCAAkC,EAAE,CAAC;gBAC1C,IAAI,CAAC,2BAA2B,CAAC,QAAQ,EAAE,CAAC;YAChD,CAAC;YACD,IAAI,IAAI,CAAC,+BAA+B,EAAE,CAAC;gBACvC,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,CAAC;YAC7C,CAAC;YACD,IAAI,IAAI,CAAC,2BAA2B,EAAE,CAAC;gBACnC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC;YACzC,CAAC;YACD,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;gBACjC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC;YACvC,CAAC;YACD,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC1B,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAChC,CAAC;YACD,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAChC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;YACtC,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,6BAA6B;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACzD,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACrD,cAAc,CAAC,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9F,cAAc,CAAC,2BAA2B,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnG,CAAC;QACD,IAAI,CAAC,oCAAoC,CAAC,MAAM,GAAG,CAAC,CAAC;QACrD,IAAI,CAAC,mCAAmC,CAAC,MAAM,GAAG,CAAC,CAAC;IACxD,CAAC;IAEO,0BAA0B;QAC9B,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAoB,CAAC,CAAC;QACrG,IAAI,CAAC,0BAA0B,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAoB,CAAC,CAAC;QACnG,IAAI,CAAC,yBAAyB,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9D,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzD,cAAc,CAAC,wCAAwC,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAqB,CAAC,CAAC;YACvH,cAAc,CAAC,uCAAuC,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAqB,CAAC,CAAC;QACzH,CAAC;IACL,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACvE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QAEnC,IAAI,CAAC,KAAK,CAAC,wCAAwC,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACzG,IAAI,CAAC,uCAAuC,GAAG,IAAI,CAAC;QAEpD,IAAI,CAAC,KAAK,CAAC,uCAAuC,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACvG,IAAI,CAAC,sCAAsC,GAAG,IAAI,CAAC;QAEnD,IAAI,CAAC,6BAA6B,EAAE,CAAC;QAErC,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACjF,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC;QAExC,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACjG,IAAI,CAAC,mCAAmC,GAAG,IAAI,CAAC;QAEhD,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC/F,IAAI,CAAC,kCAAkC,GAAG,IAAI,CAAC;QAE/C,IAAI,IAAI,CAAC,iCAAiC,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAC7F,IAAI,CAAC,iCAAiC,GAAG,IAAI,CAAC;QAClD,CAAC;QAED,IAAI,IAAI,CAAC,gCAAgC,EAAE,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,iCAAiC,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC3F,IAAI,CAAC,gCAAgC,GAAG,IAAI,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAElC,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC3E,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;QACzC,CAAC;QAED,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACzE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAC/E,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC;QAEvC,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QACrF,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC;QAE1C,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACnF,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC;QAEnC,IAAI,CAAC,KAAM,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;CACJ","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.
|
|
218
|
+
this._proxyMesh.isVisible = this._sortedLights.length > 0;
|
|
193
219
|
// Ensure space for atleast 1 batch
|
|
194
|
-
const batches = Math.max(Math.ceil(this.
|
|
220
|
+
const batches = Math.max(Math.ceil(this._sortedLights.length / this._batchSize), 1);
|
|
195
221
|
if (this._tileMaskBatches >= batches) {
|
|
196
|
-
this._proxyMesh.thinInstanceCount = this.
|
|
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.
|
|
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.
|
|
252
|
-
const light = this.
|
|
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.
|
|
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
|
-
|
|
334
|
-
|
|
335
|
-
|
|
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.
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
this.
|
|
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("
|
|
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.
|
|
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();
|