@itwin/frontend-devtools 5.0.0-dev.40 → 5.0.0-dev.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/lib/cjs/effects/Explosion.js +4 -4
  3. package/lib/cjs/effects/Explosion.js.map +1 -1
  4. package/lib/cjs/effects/Snow.d.ts +1 -1
  5. package/lib/cjs/effects/Snow.d.ts.map +1 -1
  6. package/lib/cjs/effects/Snow.js +5 -4
  7. package/lib/cjs/effects/Snow.js.map +1 -1
  8. package/lib/cjs/widgets/DiagnosticsPanel.d.ts +1 -1
  9. package/lib/cjs/widgets/DiagnosticsPanel.d.ts.map +1 -1
  10. package/lib/cjs/widgets/DiagnosticsPanel.js +1 -1
  11. package/lib/cjs/widgets/DiagnosticsPanel.js.map +1 -1
  12. package/lib/cjs/widgets/FpsTracker.d.ts +1 -1
  13. package/lib/cjs/widgets/FpsTracker.d.ts.map +1 -1
  14. package/lib/cjs/widgets/FpsTracker.js +1 -1
  15. package/lib/cjs/widgets/FpsTracker.js.map +1 -1
  16. package/lib/cjs/widgets/GpuProfiler.d.ts +1 -1
  17. package/lib/cjs/widgets/GpuProfiler.d.ts.map +1 -1
  18. package/lib/cjs/widgets/GpuProfiler.js +1 -1
  19. package/lib/cjs/widgets/GpuProfiler.js.map +1 -1
  20. package/lib/cjs/widgets/MemoryTracker.d.ts +1 -1
  21. package/lib/cjs/widgets/MemoryTracker.d.ts.map +1 -1
  22. package/lib/cjs/widgets/MemoryTracker.js +1 -1
  23. package/lib/cjs/widgets/MemoryTracker.js.map +1 -1
  24. package/lib/cjs/widgets/RenderCommandBreakdown.d.ts +1 -1
  25. package/lib/cjs/widgets/RenderCommandBreakdown.d.ts.map +1 -1
  26. package/lib/cjs/widgets/RenderCommandBreakdown.js +1 -1
  27. package/lib/cjs/widgets/RenderCommandBreakdown.js.map +1 -1
  28. package/lib/cjs/widgets/TileMemoryBreakdown.d.ts +1 -1
  29. package/lib/cjs/widgets/TileMemoryBreakdown.d.ts.map +1 -1
  30. package/lib/cjs/widgets/TileMemoryBreakdown.js +1 -1
  31. package/lib/cjs/widgets/TileMemoryBreakdown.js.map +1 -1
  32. package/lib/cjs/widgets/TileStatisticsTracker.d.ts +1 -1
  33. package/lib/cjs/widgets/TileStatisticsTracker.d.ts.map +1 -1
  34. package/lib/cjs/widgets/TileStatisticsTracker.js +1 -1
  35. package/lib/cjs/widgets/TileStatisticsTracker.js.map +1 -1
  36. package/lib/cjs/widgets/ToolSettingsTracker.d.ts +1 -1
  37. package/lib/cjs/widgets/ToolSettingsTracker.d.ts.map +1 -1
  38. package/lib/cjs/widgets/ToolSettingsTracker.js +1 -1
  39. package/lib/cjs/widgets/ToolSettingsTracker.js.map +1 -1
  40. package/lib/esm/effects/Explosion.js +4 -4
  41. package/lib/esm/effects/Explosion.js.map +1 -1
  42. package/lib/esm/effects/Snow.d.ts +1 -1
  43. package/lib/esm/effects/Snow.d.ts.map +1 -1
  44. package/lib/esm/effects/Snow.js +5 -4
  45. package/lib/esm/effects/Snow.js.map +1 -1
  46. package/lib/esm/widgets/DiagnosticsPanel.d.ts +1 -1
  47. package/lib/esm/widgets/DiagnosticsPanel.d.ts.map +1 -1
  48. package/lib/esm/widgets/DiagnosticsPanel.js +1 -1
  49. package/lib/esm/widgets/DiagnosticsPanel.js.map +1 -1
  50. package/lib/esm/widgets/FpsTracker.d.ts +1 -1
  51. package/lib/esm/widgets/FpsTracker.d.ts.map +1 -1
  52. package/lib/esm/widgets/FpsTracker.js +1 -1
  53. package/lib/esm/widgets/FpsTracker.js.map +1 -1
  54. package/lib/esm/widgets/GpuProfiler.d.ts +1 -1
  55. package/lib/esm/widgets/GpuProfiler.d.ts.map +1 -1
  56. package/lib/esm/widgets/GpuProfiler.js +1 -1
  57. package/lib/esm/widgets/GpuProfiler.js.map +1 -1
  58. package/lib/esm/widgets/MemoryTracker.d.ts +1 -1
  59. package/lib/esm/widgets/MemoryTracker.d.ts.map +1 -1
  60. package/lib/esm/widgets/MemoryTracker.js +1 -1
  61. package/lib/esm/widgets/MemoryTracker.js.map +1 -1
  62. package/lib/esm/widgets/RenderCommandBreakdown.d.ts +1 -1
  63. package/lib/esm/widgets/RenderCommandBreakdown.d.ts.map +1 -1
  64. package/lib/esm/widgets/RenderCommandBreakdown.js +1 -1
  65. package/lib/esm/widgets/RenderCommandBreakdown.js.map +1 -1
  66. package/lib/esm/widgets/TileMemoryBreakdown.d.ts +1 -1
  67. package/lib/esm/widgets/TileMemoryBreakdown.d.ts.map +1 -1
  68. package/lib/esm/widgets/TileMemoryBreakdown.js +1 -1
  69. package/lib/esm/widgets/TileMemoryBreakdown.js.map +1 -1
  70. package/lib/esm/widgets/TileStatisticsTracker.d.ts +1 -1
  71. package/lib/esm/widgets/TileStatisticsTracker.d.ts.map +1 -1
  72. package/lib/esm/widgets/TileStatisticsTracker.js +1 -1
  73. package/lib/esm/widgets/TileStatisticsTracker.js.map +1 -1
  74. package/lib/esm/widgets/ToolSettingsTracker.d.ts +1 -1
  75. package/lib/esm/widgets/ToolSettingsTracker.d.ts.map +1 -1
  76. package/lib/esm/widgets/ToolSettingsTracker.js +1 -1
  77. package/lib/esm/widgets/ToolSettingsTracker.js.map +1 -1
  78. package/package.json +6 -6
@@ -26,6 +26,7 @@ const defaultSnowParams = {
26
26
  * @beta
27
27
  */
28
28
  export class SnowDecorator {
29
+ static { Symbol.dispose; }
29
30
  constructor(viewport, texture) {
30
31
  /** The list of particles being drawn. */
31
32
  this._particles = [];
@@ -41,13 +42,13 @@ export class SnowDecorator {
41
42
  // Transfer ownership of the texture to the new decorator.
42
43
  const tex = this._texture;
43
44
  this._texture = undefined;
44
- this.dispose();
45
+ this[Symbol.dispose]();
45
46
  new SnowDecorator(viewport, tex);
46
47
  });
47
48
  // When the viewport is destroyed, dispose of this decorator too.
48
- const removeOnDispose = viewport.onDisposed.addListener(() => this.dispose());
49
+ const removeOnDispose = viewport.onDisposed.addListener(() => this[Symbol.dispose]());
49
50
  const removeDecorator = IModelApp.viewManager.addDecorator(this);
50
- this.dispose = () => {
51
+ this[Symbol.dispose] = () => {
51
52
  removeDecorator();
52
53
  removeOnRender();
53
54
  removeOnDispose();
@@ -148,7 +149,7 @@ export class SnowDecorator {
148
149
  if (undefined === enable)
149
150
  enable = undefined === decorator;
150
151
  if (undefined !== decorator && !enable)
151
- decorator.dispose();
152
+ decorator[Symbol.dispose]();
152
153
  else if (undefined === decorator && enable) {
153
154
  // Create a texture to use for the particles.
154
155
  // Note: the decorator takes ownership of the texture, and disposes of it when the decorator is disposed.
@@ -1 +1 @@
1
- {"version":3,"file":"Snow.js","sourceRoot":"","sources":["../../../src/effects/Snow.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Effects\n */\n\nimport { dispose } from \"@itwin/core-bentley\";\nimport { Point2d, Range1d, Range2d, Vector2d } from \"@itwin/core-geometry\";\nimport { RenderTexture, TextureTransparency } from \"@itwin/core-common\";\nimport {\n DecorateContext, Decorator, GraphicType, imageElementFromUrl, IModelApp, ParticleCollectionBuilder, ParticleProps, Tool, Viewport,\n} from \"@itwin/core-frontend\";\nimport { parseToggle } from \"../tools/parseToggle\";\nimport { randomFloat, randomInteger } from \"./Random\";\n\n/** Represents one particle displayed by a [[SnowDecorator]].\n * Particle positions are in [CoordSystem.View]($frontend).\n * @beta\n */\nexport interface SnowParticle extends ParticleProps {\n /** Make x, y, and z from ParticleProps writable. */\n x: number;\n y: number;\n z: number;\n\n /** Current velocity, in pixels per second. */\n velocity: Vector2d;\n}\n\n/** Parameters controlling how a [[SnowDecorator]] works.\n * @beta\n */\nexport interface SnowParams {\n /** The number of snow particles to produce. This could alternatively be expressed as a density so that small viewports would not be more crowded than larger ones. */\n numParticles: number;\n /** Range from which to randomly select each particle's size, in pixels. */\n sizeRange: Range1d;\n /** Range from which to randomly select each particle's transparency. */\n transparencyRange: Range1d;\n /** Range from which to randomly select each particle's initial velocity, in pixels per second. */\n velocityRange: Range2d;\n /** Range from which to randomly select an acceleration to apply to each particle's velocity each frame, in pixels per second squared, to simulate wind. */\n accelerationRange: Range2d;\n /** Wind velocity in pixels per second in X. */\n windVelocity: number;\n}\n\n/** The default snow effect parameters used by newly-created SnowDecorators. */\nconst defaultSnowParams: SnowParams = {\n numParticles: 2000,\n sizeRange: Range1d.createXX(3, 22),\n transparencyRange: Range1d.createXX(0, 50),\n velocityRange: new Range2d(-30, 50, 30, 130),\n accelerationRange: new Range2d(-1, -0.25, 1, 0.25),\n windVelocity: 0,\n};\n\n/** Simulates snowfall in a [Viewport]($frontend) using particle effects.\n * @see [[SnowEffect]] for a [Tool]($frontend) that toggles this decorator.\n * @see [ParticleCollectionBuilder]($frontend) for defining custom particle effects.\n * @beta\n */\nexport class SnowDecorator implements Decorator {\n /** The viewport being decorated. */\n public readonly viewport: Viewport;\n /** Invoked when this decorator is to be destroyed. */\n public readonly dispose: VoidFunction;\n /** The initial width and height of the viewport, from which we randomly select each particle's initial position. */\n private readonly _dimensions: Point2d;\n /** The list of particles being drawn. */\n private readonly _particles: SnowParticle[] = [];\n /** The image to display for each particle. */\n private _texture?: RenderTexture;\n /** The last time `updateParticles()` was invoked, in milliseconds. */\n private _lastUpdateTime: number;\n private readonly _params: SnowParams;\n\n private constructor(viewport: Viewport, texture: RenderTexture | undefined) {\n this._params = { ...defaultSnowParams };\n this.viewport = viewport;\n this._dimensions = new Point2d(viewport.viewRect.width, viewport.viewRect.height);\n this._lastUpdateTime = Date.now();\n this._texture = texture;\n\n // Tell the viewport to re-render the decorations every frame so that the snow particles animate smoothly.\n const removeOnRender = viewport.onRender.addListener(() => viewport.invalidateDecorations());\n\n // When the viewport is resized, replace this decorator with a new one to match the new dimensions.\n const removeOnResized = viewport.onResized.addListener(() => {\n // Transfer ownership of the texture to the new decorator.\n const tex = this._texture;\n this._texture = undefined;\n this.dispose();\n new SnowDecorator(viewport, tex);\n });\n\n // When the viewport is destroyed, dispose of this decorator too.\n const removeOnDispose = viewport.onDisposed.addListener(() => this.dispose());\n const removeDecorator = IModelApp.viewManager.addDecorator(this);\n\n this.dispose = () => {\n removeDecorator();\n removeOnRender();\n removeOnDispose();\n removeOnResized();\n this._texture = dispose(this._texture);\n SnowDecorator._decorators.delete(viewport);\n };\n\n SnowDecorator._decorators.set(viewport, this);\n\n // Initialize the particles.\n for (let i = 0; i < this._params.numParticles; i++)\n this._particles.push(this.emit(true));\n }\n\n public decorate(context: DecorateContext): void {\n if (context.viewport !== this.viewport || !this._texture)\n return;\n\n // Update the particles.\n const now = Date.now();\n const deltaMillis = now - this._lastUpdateTime;\n this._lastUpdateTime = now;\n this.updateParticles(deltaMillis / 1000);\n\n // Create particle graphics.\n const builder = ParticleCollectionBuilder.create({\n viewport: this.viewport,\n isViewCoords: true,\n texture: this._texture,\n size: (this._params.sizeRange.high - this._params.sizeRange.low) / 2,\n });\n\n for (const particle of this._particles)\n builder.addParticle(particle);\n\n const graphic = builder.finish();\n if (graphic)\n context.addDecoration(GraphicType.ViewOverlay, graphic);\n }\n\n /** Change some of the parameters affecting this decorator. */\n public configure(params: Partial<SnowParams>): void {\n for (const key of Object.keys(params)) {\n const val = (params as any)[key];\n if (undefined !== val)\n (this._params as any)[key] = val;\n }\n }\n\n /** Emit a new particle with randomized properties. */\n private emit(randomizeHeight: boolean): SnowParticle {\n return {\n x: randomInteger(0, this._dimensions.x),\n y: randomizeHeight ? randomInteger(0, this._dimensions.y) : 0,\n z: 0,\n size: randomInteger(this._params.sizeRange.low, this._params.sizeRange.high),\n transparency: randomInteger(this._params.transparencyRange.low, this._params.transparencyRange.high),\n velocity: new Vector2d(randomFloat(this._params.velocityRange.low.x, this._params.velocityRange.high.x),\n randomFloat(this._params.velocityRange.low.y, this._params.velocityRange.high.y)),\n };\n }\n\n // Update the positions and velocities of all the particles based on the amount of time that has passed since the last update.\n private updateParticles(elapsedSeconds: number): void {\n // Determine if someone changed the desired number of particles.\n const particleDiscrepancy = this._params.numParticles - this._particles.length;\n if (particleDiscrepancy > 0) {\n // Birth new particles up to the new maximum.\n for (let i = 0; i < particleDiscrepancy; i++)\n this._particles.push(this.emit(true));\n } else {\n // Destroy extra particles.\n this._particles.length = this._params.numParticles;\n }\n\n const acceleration = new Vector2d();\n const velocity = new Vector2d();\n for (let i = 0; i < this._particles.length; i++) {\n // Apply some acceleration to produce random drift.\n const particle = this._particles[i];\n acceleration.set(randomFloat(this._params.accelerationRange.low.x, this._params.accelerationRange.high.x),\n randomFloat(this._params.accelerationRange.low.y, this._params.accelerationRange.high.y));\n\n acceleration.scale(elapsedSeconds, acceleration);\n particle.velocity.plus(acceleration, particle.velocity);\n\n // Apply velocity.\n particle.velocity.clone(velocity);\n velocity.scale(elapsedSeconds, velocity);\n particle.x += velocity.x;\n particle.y += velocity.y;\n\n // Apply wind\n particle.x += this._params.windVelocity * elapsedSeconds;\n\n // Particles that travel beyond the viewport's left or right edges wrap around to the other side.\n if (particle.x < 0)\n particle.x = this._dimensions.x - 1;\n else if (particle.x >= this._dimensions.x)\n particle.x = 0;\n\n // Particles that travel beyond the viewport's bottom or top edges are replaced by newborn particles.\n if (particle.y < 0 || particle.y >= this._dimensions.y)\n this._particles[i] = this.emit(false);\n }\n }\n\n private static readonly _decorators = new Map<Viewport, SnowDecorator>();\n\n /** Toggle this decorator for the specified viewport.\n * @param viewport The viewport to which the effect should be applied or removed.\n * @param enable `true` to enable the effect, `false` to disable it, or `undefined` to toggle the current state.\n */\n public static async toggle(viewport: Viewport, enable?: boolean): Promise<void> {\n const decorator = this._decorators.get(viewport);\n if (undefined === enable)\n enable = undefined === decorator;\n\n if (undefined !== decorator && !enable)\n decorator.dispose();\n else if (undefined === decorator && enable) {\n // Create a texture to use for the particles.\n // Note: the decorator takes ownership of the texture, and disposes of it when the decorator is disposed.\n const image = await imageElementFromUrl(`${IModelApp.publicPath}sprites/particle_snow.png`);\n const texture = IModelApp.renderSystem.createTexture({\n ownership: \"external\",\n image: { source: image, transparency: TextureTransparency.Mixed },\n });\n\n new SnowDecorator(viewport, texture);\n }\n }\n}\n\n/** Toggles a decorator that simulates snow using particle effects.\n * @see [[SnowDecorator]] for the implementation of the decorator.\n * @beta\n */\nexport class SnowEffect extends Tool {\n public static override toolId = \"SnowEffect\";\n\n public override async run(enable?: boolean): Promise<boolean> {\n const vp = IModelApp.viewManager.selectedView;\n if (vp)\n await SnowDecorator.toggle(vp, enable);\n\n return true;\n }\n\n public override async parseAndRun(...args: string[]): Promise<boolean> {\n const enable = parseToggle(args[0]);\n if (typeof enable !== \"string\")\n await this.run(enable);\n\n return true;\n }\n}\n"]}
1
+ {"version":3,"file":"Snow.js","sourceRoot":"","sources":["../../../src/effects/Snow.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Effects\n */\n\nimport { dispose } from \"@itwin/core-bentley\";\nimport { Point2d, Range1d, Range2d, Vector2d } from \"@itwin/core-geometry\";\nimport { RenderTexture, TextureTransparency } from \"@itwin/core-common\";\nimport {\n DecorateContext, Decorator, GraphicType, imageElementFromUrl, IModelApp, ParticleCollectionBuilder, ParticleProps, Tool, Viewport,\n} from \"@itwin/core-frontend\";\nimport { parseToggle } from \"../tools/parseToggle\";\nimport { randomFloat, randomInteger } from \"./Random\";\n\n/** Represents one particle displayed by a [[SnowDecorator]].\n * Particle positions are in [CoordSystem.View]($frontend).\n * @beta\n */\nexport interface SnowParticle extends ParticleProps {\n /** Make x, y, and z from ParticleProps writable. */\n x: number;\n y: number;\n z: number;\n\n /** Current velocity, in pixels per second. */\n velocity: Vector2d;\n}\n\n/** Parameters controlling how a [[SnowDecorator]] works.\n * @beta\n */\nexport interface SnowParams {\n /** The number of snow particles to produce. This could alternatively be expressed as a density so that small viewports would not be more crowded than larger ones. */\n numParticles: number;\n /** Range from which to randomly select each particle's size, in pixels. */\n sizeRange: Range1d;\n /** Range from which to randomly select each particle's transparency. */\n transparencyRange: Range1d;\n /** Range from which to randomly select each particle's initial velocity, in pixels per second. */\n velocityRange: Range2d;\n /** Range from which to randomly select an acceleration to apply to each particle's velocity each frame, in pixels per second squared, to simulate wind. */\n accelerationRange: Range2d;\n /** Wind velocity in pixels per second in X. */\n windVelocity: number;\n}\n\n/** The default snow effect parameters used by newly-created SnowDecorators. */\nconst defaultSnowParams: SnowParams = {\n numParticles: 2000,\n sizeRange: Range1d.createXX(3, 22),\n transparencyRange: Range1d.createXX(0, 50),\n velocityRange: new Range2d(-30, 50, 30, 130),\n accelerationRange: new Range2d(-1, -0.25, 1, 0.25),\n windVelocity: 0,\n};\n\n/** Simulates snowfall in a [Viewport]($frontend) using particle effects.\n * @see [[SnowEffect]] for a [Tool]($frontend) that toggles this decorator.\n * @see [ParticleCollectionBuilder]($frontend) for defining custom particle effects.\n * @beta\n */\nexport class SnowDecorator implements Decorator {\n /** The viewport being decorated. */\n public readonly viewport: Viewport;\n /** Invoked when this decorator is to be destroyed. */\n public readonly [Symbol.dispose]: VoidFunction;\n /** The initial width and height of the viewport, from which we randomly select each particle's initial position. */\n private readonly _dimensions: Point2d;\n /** The list of particles being drawn. */\n private readonly _particles: SnowParticle[] = [];\n /** The image to display for each particle. */\n private _texture?: RenderTexture;\n /** The last time `updateParticles()` was invoked, in milliseconds. */\n private _lastUpdateTime: number;\n private readonly _params: SnowParams;\n\n private constructor(viewport: Viewport, texture: RenderTexture | undefined) {\n this._params = { ...defaultSnowParams };\n this.viewport = viewport;\n this._dimensions = new Point2d(viewport.viewRect.width, viewport.viewRect.height);\n this._lastUpdateTime = Date.now();\n this._texture = texture;\n\n // Tell the viewport to re-render the decorations every frame so that the snow particles animate smoothly.\n const removeOnRender = viewport.onRender.addListener(() => viewport.invalidateDecorations());\n\n // When the viewport is resized, replace this decorator with a new one to match the new dimensions.\n const removeOnResized = viewport.onResized.addListener(() => {\n // Transfer ownership of the texture to the new decorator.\n const tex = this._texture;\n this._texture = undefined;\n this[Symbol.dispose]();\n new SnowDecorator(viewport, tex);\n });\n\n // When the viewport is destroyed, dispose of this decorator too.\n const removeOnDispose = viewport.onDisposed.addListener(() => this[Symbol.dispose]());\n const removeDecorator = IModelApp.viewManager.addDecorator(this);\n\n this[Symbol.dispose] = () => {\n removeDecorator();\n removeOnRender();\n removeOnDispose();\n removeOnResized();\n this._texture = dispose(this._texture);\n SnowDecorator._decorators.delete(viewport);\n };\n\n SnowDecorator._decorators.set(viewport, this);\n\n // Initialize the particles.\n for (let i = 0; i < this._params.numParticles; i++)\n this._particles.push(this.emit(true));\n }\n\n public decorate(context: DecorateContext): void {\n if (context.viewport !== this.viewport || !this._texture)\n return;\n\n // Update the particles.\n const now = Date.now();\n const deltaMillis = now - this._lastUpdateTime;\n this._lastUpdateTime = now;\n this.updateParticles(deltaMillis / 1000);\n\n // Create particle graphics.\n const builder = ParticleCollectionBuilder.create({\n viewport: this.viewport,\n isViewCoords: true,\n texture: this._texture,\n size: (this._params.sizeRange.high - this._params.sizeRange.low) / 2,\n });\n\n for (const particle of this._particles)\n builder.addParticle(particle);\n\n const graphic = builder.finish();\n if (graphic)\n context.addDecoration(GraphicType.ViewOverlay, graphic);\n }\n\n /** Change some of the parameters affecting this decorator. */\n public configure(params: Partial<SnowParams>): void {\n for (const key of Object.keys(params)) {\n const val = (params as any)[key];\n if (undefined !== val)\n (this._params as any)[key] = val;\n }\n }\n\n /** Emit a new particle with randomized properties. */\n private emit(randomizeHeight: boolean): SnowParticle {\n return {\n x: randomInteger(0, this._dimensions.x),\n y: randomizeHeight ? randomInteger(0, this._dimensions.y) : 0,\n z: 0,\n size: randomInteger(this._params.sizeRange.low, this._params.sizeRange.high),\n transparency: randomInteger(this._params.transparencyRange.low, this._params.transparencyRange.high),\n velocity: new Vector2d(randomFloat(this._params.velocityRange.low.x, this._params.velocityRange.high.x),\n randomFloat(this._params.velocityRange.low.y, this._params.velocityRange.high.y)),\n };\n }\n\n // Update the positions and velocities of all the particles based on the amount of time that has passed since the last update.\n private updateParticles(elapsedSeconds: number): void {\n // Determine if someone changed the desired number of particles.\n const particleDiscrepancy = this._params.numParticles - this._particles.length;\n if (particleDiscrepancy > 0) {\n // Birth new particles up to the new maximum.\n for (let i = 0; i < particleDiscrepancy; i++)\n this._particles.push(this.emit(true));\n } else {\n // Destroy extra particles.\n this._particles.length = this._params.numParticles;\n }\n\n const acceleration = new Vector2d();\n const velocity = new Vector2d();\n for (let i = 0; i < this._particles.length; i++) {\n // Apply some acceleration to produce random drift.\n const particle = this._particles[i];\n acceleration.set(randomFloat(this._params.accelerationRange.low.x, this._params.accelerationRange.high.x),\n randomFloat(this._params.accelerationRange.low.y, this._params.accelerationRange.high.y));\n\n acceleration.scale(elapsedSeconds, acceleration);\n particle.velocity.plus(acceleration, particle.velocity);\n\n // Apply velocity.\n particle.velocity.clone(velocity);\n velocity.scale(elapsedSeconds, velocity);\n particle.x += velocity.x;\n particle.y += velocity.y;\n\n // Apply wind\n particle.x += this._params.windVelocity * elapsedSeconds;\n\n // Particles that travel beyond the viewport's left or right edges wrap around to the other side.\n if (particle.x < 0)\n particle.x = this._dimensions.x - 1;\n else if (particle.x >= this._dimensions.x)\n particle.x = 0;\n\n // Particles that travel beyond the viewport's bottom or top edges are replaced by newborn particles.\n if (particle.y < 0 || particle.y >= this._dimensions.y)\n this._particles[i] = this.emit(false);\n }\n }\n\n private static readonly _decorators = new Map<Viewport, SnowDecorator>();\n\n /** Toggle this decorator for the specified viewport.\n * @param viewport The viewport to which the effect should be applied or removed.\n * @param enable `true` to enable the effect, `false` to disable it, or `undefined` to toggle the current state.\n */\n public static async toggle(viewport: Viewport, enable?: boolean): Promise<void> {\n const decorator = this._decorators.get(viewport);\n if (undefined === enable)\n enable = undefined === decorator;\n\n if (undefined !== decorator && !enable)\n decorator[Symbol.dispose]();\n else if (undefined === decorator && enable) {\n // Create a texture to use for the particles.\n // Note: the decorator takes ownership of the texture, and disposes of it when the decorator is disposed.\n const image = await imageElementFromUrl(`${IModelApp.publicPath}sprites/particle_snow.png`);\n const texture = IModelApp.renderSystem.createTexture({\n ownership: \"external\",\n image: { source: image, transparency: TextureTransparency.Mixed },\n });\n\n new SnowDecorator(viewport, texture);\n }\n }\n}\n\n/** Toggles a decorator that simulates snow using particle effects.\n * @see [[SnowDecorator]] for the implementation of the decorator.\n * @beta\n */\nexport class SnowEffect extends Tool {\n public static override toolId = \"SnowEffect\";\n\n public override async run(enable?: boolean): Promise<boolean> {\n const vp = IModelApp.viewManager.selectedView;\n if (vp)\n await SnowDecorator.toggle(vp, enable);\n\n return true;\n }\n\n public override async parseAndRun(...args: string[]): Promise<boolean> {\n const enable = parseToggle(args[0]);\n if (typeof enable !== \"string\")\n await this.run(enable);\n\n return true;\n }\n}\n"]}
@@ -32,7 +32,7 @@ export declare class DiagnosticsPanel {
32
32
  readonly keyinField?: KeyinField;
33
33
  constructor(vp: Viewport, props?: DiagnosticsPanelProps);
34
34
  get element(): HTMLElement;
35
- dispose(): void;
35
+ [Symbol.dispose](): void;
36
36
  private addSeparator;
37
37
  }
38
38
  //# sourceMappingURL=DiagnosticsPanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DiagnosticsPanel.d.ts","sourceRoot":"","sources":["../../../src/widgets/DiagnosticsPanel.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAO1C;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,yCAAyC;IACzC,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,GAAG,CAAC,EAAE,OAAO,CAAC;QACd,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAc;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAa;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAgB;IAChD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAsB;IAC5D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAyB;IAC1D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAwB;IACvD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAc;IAC5C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAsB;IAC5D,SAAgB,UAAU,CAAC,EAAE,UAAU,CAAC;gBAErB,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,qBAAqB;IAoD9D,IAAW,OAAO,IAAI,WAAW,CAA0B;IAEpD,OAAO,IAAI,IAAI;IAatB,OAAO,CAAC,YAAY;CAGrB"}
1
+ {"version":3,"file":"DiagnosticsPanel.d.ts","sourceRoot":"","sources":["../../../src/widgets/DiagnosticsPanel.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAO1C;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,yCAAyC;IACzC,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,GAAG,CAAC,EAAE,OAAO,CAAC;QACd,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAc;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAa;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAgB;IAChD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAsB;IAC5D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAyB;IAC1D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAwB;IACvD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAc;IAC5C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAsB;IAC5D,SAAgB,UAAU,CAAC,EAAE,UAAU,CAAC;gBAErB,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,qBAAqB;IAoD9D,IAAW,OAAO,IAAI,WAAW,CAA0B;IAEpD,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAa/B,OAAO,CAAC,YAAY;CAGrB"}
@@ -60,7 +60,7 @@ export class DiagnosticsPanel {
60
60
  this._toolSettingsTracker = new ToolSettingsTracker(this._element, vp);
61
61
  }
62
62
  get element() { return this._element; }
63
- dispose() {
63
+ [Symbol.dispose]() {
64
64
  dispose(this._fpsTracker);
65
65
  dispose(this._memoryTracker);
66
66
  dispose(this._tileMemoryBreakdown);
@@ -1 +1 @@
1
- {"version":3,"file":"DiagnosticsPanel.js","sourceRoot":"","sources":["../../../src/widgets/DiagnosticsPanel.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Widgets\n */\n\nimport { dispose } from \"@itwin/core-bentley\";\nimport { Viewport } from \"@itwin/core-frontend\";\nimport { FpsTracker } from \"./FpsTracker\";\nimport { GpuProfiler } from \"./GpuProfiler\";\nimport { KeyinField } from \"./KeyinField\";\nimport { MemoryTracker } from \"./MemoryTracker\";\nimport { RenderCommandBreakdown } from \"./RenderCommandBreakdown\";\nimport { TileMemoryBreakdown } from \"./TileMemoryBreakdown\";\nimport { TileStatisticsTracker } from \"./TileStatisticsTracker\";\nimport { ToolSettingsTracker } from \"./ToolSettingsTracker\";\n\n/** Options for configuring a [[DiagnosticsPanel]].\n * @beta\n */\nexport interface DiagnosticsPanelProps {\n /** Widgets to exclude from the panel. */\n exclude?: {\n keyin?: boolean;\n fps?: boolean;\n tileStats?: boolean;\n memory?: boolean;\n tileMemoryBreakdown?: boolean;\n renderCommands?: boolean;\n gpuProfiler?: boolean;\n toolSettings?: boolean;\n };\n}\n\n/** Consolidates many other widgets into a single panel.\n * @beta\n */\nexport class DiagnosticsPanel {\n private readonly _element: HTMLElement;\n private readonly _parentElement?: HTMLElement;\n private readonly _fpsTracker?: FpsTracker;\n private readonly _memoryTracker?: MemoryTracker;\n private readonly _tileMemoryBreakdown?: TileMemoryBreakdown;\n private readonly _renderCommands?: RenderCommandBreakdown;\n private readonly _statsTracker?: TileStatisticsTracker;\n private readonly _gpuProfiler?: GpuProfiler;\n private readonly _toolSettingsTracker?: ToolSettingsTracker;\n public readonly keyinField?: KeyinField;\n\n public constructor(vp: Viewport, props?: DiagnosticsPanelProps) {\n const exclude = (undefined !== props && undefined !== props.exclude) ? props.exclude : {};\n\n this._element = document.createElement(\"div\");\n this._element.className = \"debugPanel\";\n\n if (true !== exclude.fps) {\n this._fpsTracker = new FpsTracker(this._element, vp);\n this.addSeparator();\n }\n\n if (true !== exclude.keyin) {\n this.keyinField = new KeyinField({\n parent: this._element,\n baseId: \"diagnosticsPanelKeyin\",\n wantButton: true,\n wantLabel: true,\n historyLength: 20,\n });\n\n this.addSeparator();\n }\n\n if (true !== exclude.tileStats) {\n this._statsTracker = new TileStatisticsTracker(this._element, vp);\n this.addSeparator();\n }\n\n if (true !== exclude.tileMemoryBreakdown) {\n this._tileMemoryBreakdown = new TileMemoryBreakdown(this._element);\n this.addSeparator();\n }\n\n if (!exclude.renderCommands) {\n this._renderCommands = new RenderCommandBreakdown(this._element);\n this.addSeparator();\n }\n\n if (true !== exclude.memory) {\n this._memoryTracker = new MemoryTracker(this._element, vp);\n this.addSeparator();\n }\n\n if (true !== exclude.gpuProfiler) {\n this._gpuProfiler = new GpuProfiler(this._element);\n this.addSeparator();\n }\n\n if (true !== exclude.toolSettings)\n this._toolSettingsTracker = new ToolSettingsTracker(this._element, vp);\n }\n\n public get element(): HTMLElement { return this._element; }\n\n public dispose(): void {\n dispose(this._fpsTracker);\n dispose(this._memoryTracker);\n dispose(this._tileMemoryBreakdown);\n dispose(this._renderCommands);\n dispose(this._statsTracker);\n dispose(this._gpuProfiler);\n dispose(this._toolSettingsTracker);\n\n if (undefined !== this._parentElement)\n this._parentElement.removeChild(this._element);\n }\n\n private addSeparator(): void {\n this._element.appendChild(document.createElement(\"hr\"));\n }\n}\n"]}
1
+ {"version":3,"file":"DiagnosticsPanel.js","sourceRoot":"","sources":["../../../src/widgets/DiagnosticsPanel.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Widgets\n */\n\nimport { dispose } from \"@itwin/core-bentley\";\nimport { Viewport } from \"@itwin/core-frontend\";\nimport { FpsTracker } from \"./FpsTracker\";\nimport { GpuProfiler } from \"./GpuProfiler\";\nimport { KeyinField } from \"./KeyinField\";\nimport { MemoryTracker } from \"./MemoryTracker\";\nimport { RenderCommandBreakdown } from \"./RenderCommandBreakdown\";\nimport { TileMemoryBreakdown } from \"./TileMemoryBreakdown\";\nimport { TileStatisticsTracker } from \"./TileStatisticsTracker\";\nimport { ToolSettingsTracker } from \"./ToolSettingsTracker\";\n\n/** Options for configuring a [[DiagnosticsPanel]].\n * @beta\n */\nexport interface DiagnosticsPanelProps {\n /** Widgets to exclude from the panel. */\n exclude?: {\n keyin?: boolean;\n fps?: boolean;\n tileStats?: boolean;\n memory?: boolean;\n tileMemoryBreakdown?: boolean;\n renderCommands?: boolean;\n gpuProfiler?: boolean;\n toolSettings?: boolean;\n };\n}\n\n/** Consolidates many other widgets into a single panel.\n * @beta\n */\nexport class DiagnosticsPanel {\n private readonly _element: HTMLElement;\n private readonly _parentElement?: HTMLElement;\n private readonly _fpsTracker?: FpsTracker;\n private readonly _memoryTracker?: MemoryTracker;\n private readonly _tileMemoryBreakdown?: TileMemoryBreakdown;\n private readonly _renderCommands?: RenderCommandBreakdown;\n private readonly _statsTracker?: TileStatisticsTracker;\n private readonly _gpuProfiler?: GpuProfiler;\n private readonly _toolSettingsTracker?: ToolSettingsTracker;\n public readonly keyinField?: KeyinField;\n\n public constructor(vp: Viewport, props?: DiagnosticsPanelProps) {\n const exclude = (undefined !== props && undefined !== props.exclude) ? props.exclude : {};\n\n this._element = document.createElement(\"div\");\n this._element.className = \"debugPanel\";\n\n if (true !== exclude.fps) {\n this._fpsTracker = new FpsTracker(this._element, vp);\n this.addSeparator();\n }\n\n if (true !== exclude.keyin) {\n this.keyinField = new KeyinField({\n parent: this._element,\n baseId: \"diagnosticsPanelKeyin\",\n wantButton: true,\n wantLabel: true,\n historyLength: 20,\n });\n\n this.addSeparator();\n }\n\n if (true !== exclude.tileStats) {\n this._statsTracker = new TileStatisticsTracker(this._element, vp);\n this.addSeparator();\n }\n\n if (true !== exclude.tileMemoryBreakdown) {\n this._tileMemoryBreakdown = new TileMemoryBreakdown(this._element);\n this.addSeparator();\n }\n\n if (!exclude.renderCommands) {\n this._renderCommands = new RenderCommandBreakdown(this._element);\n this.addSeparator();\n }\n\n if (true !== exclude.memory) {\n this._memoryTracker = new MemoryTracker(this._element, vp);\n this.addSeparator();\n }\n\n if (true !== exclude.gpuProfiler) {\n this._gpuProfiler = new GpuProfiler(this._element);\n this.addSeparator();\n }\n\n if (true !== exclude.toolSettings)\n this._toolSettingsTracker = new ToolSettingsTracker(this._element, vp);\n }\n\n public get element(): HTMLElement { return this._element; }\n\n public [Symbol.dispose](): void {\n dispose(this._fpsTracker);\n dispose(this._memoryTracker);\n dispose(this._tileMemoryBreakdown);\n dispose(this._renderCommands);\n dispose(this._statsTracker);\n dispose(this._gpuProfiler);\n dispose(this._toolSettingsTracker);\n\n if (undefined !== this._parentElement)\n this._parentElement.removeChild(this._element);\n }\n\n private addSeparator(): void {\n this._element.appendChild(document.createElement(\"hr\"));\n }\n}\n"]}
@@ -12,7 +12,7 @@ export declare class FpsTracker {
12
12
  private _curIntervalId?;
13
13
  private readonly _vp;
14
14
  constructor(parent: HTMLElement, viewport: Viewport);
15
- dispose(): void;
15
+ [Symbol.dispose](): void;
16
16
  private clearInterval;
17
17
  private toggle;
18
18
  private updateFPS;
@@ -1 +1 @@
1
- {"version":3,"file":"FpsTracker.d.ts","sourceRoot":"","sources":["../../../src/widgets/FpsTracker.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAA8B,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAG5E;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,CAAqB;IACtC,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAW;gBAEZ,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ;IAUnD,OAAO,IAAI,IAAI;IAItB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,MAAM;IAed,OAAO,CAAC,SAAS;CAKlB"}
1
+ {"version":3,"file":"FpsTracker.d.ts","sourceRoot":"","sources":["../../../src/widgets/FpsTracker.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAA8B,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAG5E;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,CAAqB;IACtC,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAW;gBAEZ,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ;IAUnD,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAI/B,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,MAAM;IAed,OAAO,CAAC,SAAS;CAKlB"}
@@ -21,7 +21,7 @@ export class FpsTracker {
21
21
  handler: (cb) => this.toggle(cb.checked),
22
22
  }).label;
23
23
  }
24
- dispose() {
24
+ [Symbol.dispose]() {
25
25
  this.toggle(false);
26
26
  }
27
27
  clearInterval() {
@@ -1 +1 @@
1
- {"version":3,"file":"FpsTracker.js","sourceRoot":"","sources":["../../../src/widgets/FpsTracker.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAoB,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;GAGG;AACH,MAAM,OAAO,UAAU;IAMrB,YAAmB,MAAmB,EAAE,QAAkB;QACxD,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC;YAC3B,MAAM;YACN,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,mBAAmB;YACvB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC;SACzC,CAAC,CAAC,KAAK,CAAC;IACX,CAAC;IAEM,OAAO;QACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAEO,aAAa;QACnB,IAAI,SAAS,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YACtC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC1C,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAClC,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,OAAgB;QAC7B,IAAI,CAAC,GAAG,CAAC,mBAAmB,GAAG,OAAO,CAAC;QACvC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,QAAQ,GAAG,IAAI,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACpD,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;YACtE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,iBAAiB,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,WAAW,CAAC;QACtC,CAAC;QAEA,IAAI,CAAC,GAAG,CAAC,MAAiB,CAAC,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC;IACjE,CAAC;IAEO,SAAS;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,QAAS,CAAC;QAC/B,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,QAAQ,GAAG,EAAE,CAAC;IACxC,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Widgets\n */\n\nimport { PerformanceMetrics, Target, Viewport } from \"@itwin/core-frontend\";\nimport { createCheckBox } from \"../ui/CheckBox\";\n\n/** Displays average frames-per-second.\n * NOTE: Enabling fps tracking causes a new frame to render on every tick of the render loop, which may negatively impact battery life.\n * @beta\n */\nexport class FpsTracker {\n private readonly _label: HTMLLabelElement;\n private _metrics?: PerformanceMetrics;\n private _curIntervalId?: number;\n private readonly _vp: Viewport;\n\n public constructor(parent: HTMLElement, viewport: Viewport) {\n this._vp = viewport;\n this._label = createCheckBox({\n parent,\n name: \"Track FPS\",\n id: \"fpsTracker_toggle\",\n handler: (cb) => this.toggle(cb.checked),\n }).label;\n }\n\n public dispose(): void {\n this.toggle(false);\n }\n\n private clearInterval(): void {\n if (undefined !== this._curIntervalId) {\n window.clearInterval(this._curIntervalId);\n this._curIntervalId = undefined;\n }\n }\n\n private toggle(enabled: boolean): void {\n this._vp.continuousRendering = enabled;\n if (enabled) {\n this._metrics = new PerformanceMetrics(false, true);\n this._curIntervalId = window.setInterval(() => this.updateFPS(), 500);\n this._label.innerText = \"Tracking FPS...\";\n } else {\n this._metrics = undefined;\n this.clearInterval();\n this._label.innerText = \"Track FPS\";\n }\n\n (this._vp.target as Target).performanceMetrics = this._metrics;\n }\n\n private updateFPS(): void {\n const metrics = this._metrics!;\n const fps = (metrics.spfTimes.length / metrics.spfSum).toFixed(2);\n this._label.innerText = `FPS: ${fps}`;\n }\n}\n"]}
1
+ {"version":3,"file":"FpsTracker.js","sourceRoot":"","sources":["../../../src/widgets/FpsTracker.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAoB,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;GAGG;AACH,MAAM,OAAO,UAAU;IAMrB,YAAmB,MAAmB,EAAE,QAAkB;QACxD,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC;YAC3B,MAAM;YACN,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,mBAAmB;YACvB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC;SACzC,CAAC,CAAC,KAAK,CAAC;IACX,CAAC;IAEM,CAAC,MAAM,CAAC,OAAO,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAEO,aAAa;QACnB,IAAI,SAAS,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YACtC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC1C,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAClC,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,OAAgB;QAC7B,IAAI,CAAC,GAAG,CAAC,mBAAmB,GAAG,OAAO,CAAC;QACvC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,QAAQ,GAAG,IAAI,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACpD,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;YACtE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,iBAAiB,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,WAAW,CAAC;QACtC,CAAC;QAEA,IAAI,CAAC,GAAG,CAAC,MAAiB,CAAC,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC;IACjE,CAAC;IAEO,SAAS;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,QAAS,CAAC;QAC/B,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,QAAQ,GAAG,EAAE,CAAC;IACxC,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Widgets\n */\n\nimport { PerformanceMetrics, Target, Viewport } from \"@itwin/core-frontend\";\nimport { createCheckBox } from \"../ui/CheckBox\";\n\n/** Displays average frames-per-second.\n * NOTE: Enabling fps tracking causes a new frame to render on every tick of the render loop, which may negatively impact battery life.\n * @beta\n */\nexport class FpsTracker {\n private readonly _label: HTMLLabelElement;\n private _metrics?: PerformanceMetrics;\n private _curIntervalId?: number;\n private readonly _vp: Viewport;\n\n public constructor(parent: HTMLElement, viewport: Viewport) {\n this._vp = viewport;\n this._label = createCheckBox({\n parent,\n name: \"Track FPS\",\n id: \"fpsTracker_toggle\",\n handler: (cb) => this.toggle(cb.checked),\n }).label;\n }\n\n public [Symbol.dispose](): void {\n this.toggle(false);\n }\n\n private clearInterval(): void {\n if (undefined !== this._curIntervalId) {\n window.clearInterval(this._curIntervalId);\n this._curIntervalId = undefined;\n }\n }\n\n private toggle(enabled: boolean): void {\n this._vp.continuousRendering = enabled;\n if (enabled) {\n this._metrics = new PerformanceMetrics(false, true);\n this._curIntervalId = window.setInterval(() => this.updateFPS(), 500);\n this._label.innerText = \"Tracking FPS...\";\n } else {\n this._metrics = undefined;\n this.clearInterval();\n this._label.innerText = \"Track FPS\";\n }\n\n (this._vp.target as Target).performanceMetrics = this._metrics;\n }\n\n private updateFPS(): void {\n const metrics = this._metrics!;\n const fps = (metrics.spfTimes.length / metrics.spfSum).toFixed(2);\n this._label.innerText = `FPS: ${fps}`;\n }\n}\n"]}
@@ -8,7 +8,7 @@ export declare class GpuProfiler {
8
8
  private _recordedResults;
9
9
  private _isRecording;
10
10
  constructor(parent: HTMLElement);
11
- dispose(): void;
11
+ [Symbol.dispose](): void;
12
12
  private toggleProfileCheckBox;
13
13
  private _clickRecord;
14
14
  private stopRecording;
@@ -1 +1 @@
1
- {"version":3,"file":"GpuProfiler.d.ts","sourceRoot":"","sources":["../../../src/widgets/GpuProfiler.ts"],"names":[],"mappings":"AA2FA,aAAa;AACb,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiB;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA2B;IAEzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,YAAY,CAAU;gBAEX,MAAM,EAAE,WAAW;IAmC/B,OAAO,IAAI,IAAI;IAItB,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,YAAY,CAQlB;IAEF,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,gBAAgB,CA0EtB;CACH"}
1
+ {"version":3,"file":"GpuProfiler.d.ts","sourceRoot":"","sources":["../../../src/widgets/GpuProfiler.ts"],"names":[],"mappings":"AA2FA,aAAa;AACb,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiB;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA2B;IAEzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,YAAY,CAAU;gBAEX,MAAM,EAAE,WAAW;IAmC/B,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAI/B,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,YAAY,CAQlB;IAEF,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,gBAAgB,CA0EtB;CACH"}
@@ -160,7 +160,7 @@ export class GpuProfiler {
160
160
  this._div.appendChild(this._resultsDiv);
161
161
  parent.appendChild(this._div);
162
162
  }
163
- dispose() {
163
+ [Symbol.dispose]() {
164
164
  this._debugControl.resultsCallback = undefined;
165
165
  }
166
166
  toggleProfileCheckBox(isEnabled) {
@@ -1 +1 @@
1
- {"version":3,"file":"GpuProfiler.js","sourceRoot":"","sources":["../../../src/widgets/GpuProfiler.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Widgets\n */\n\nimport { saveAs } from \"file-saver\";\nimport { GLTimerResult, IModelApp, RenderSystemDebugControl } from \"@itwin/core-frontend\";\nimport { createCheckBox } from \"../ui/CheckBox\";\n\n/** Trace Event Format, viewable with chrome://tracing\n * https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/edit\n */\ninterface ChromeTrace {\n traceEvents: ChromeTraceEvent[];\n}\n\ninterface ChromeTraceEvent {\n /** Required by chrome://tracing */\n pid: 1;\n /** Timestamp in microseconds */\n ts: number;\n /** Duration in microseconds */\n dur: number;\n /** Denotes \"complete\" event */\n ph: \"X\";\n /** Label for chrome://tracing view */\n name: string;\n /** dummy value, args must be defined for entries to be clickable in chrome://tracing */\n args: ChromeTraceEventArgs;\n}\n\ninterface ChromeTraceEventArgs { 0: 0 }\nconst dummyArgs: ChromeTraceEventArgs = { 0: 0 }; // Reuse instead of allocating for each entry\n\n/**\n * @param name Label for the trace event\n * @param start Timestamp in microseconds of when trace event started\n * @param duration Duration in microseconds of trace event\n */\nfunction createTraceEvent(name: string, start: number, duration: number): ChromeTraceEvent {\n return {\n pid: 1,\n ts: start,\n dur: duration,\n ph: \"X\",\n name,\n args: dummyArgs,\n };\n}\n\nfunction createTraceFromTimerResults(timerResults: GLTimerResult[]): ChromeTrace {\n const traceEvents: ChromeTraceEvent[] = [];\n\n const addChildren = (startTime: number, children: GLTimerResult[]) => {\n for (const child of children) {\n if (child.nanoseconds < 100)\n continue;\n const microseconds = child.nanoseconds / 1E3;\n traceEvents.push(createTraceEvent(child.label, startTime, microseconds));\n if (child.children)\n addChildren(startTime, child.children);\n startTime += microseconds;\n }\n };\n\n let frameStartTime = 0;\n let frameNumber = 0;\n for (const tr of timerResults) {\n const microseconds = tr.nanoseconds / 1E3;\n traceEvents.push(createTraceEvent(`Frame ${frameNumber}`, frameStartTime, microseconds));\n if (tr.children)\n addChildren(frameStartTime, tr.children);\n frameStartTime += microseconds;\n ++frameNumber;\n }\n\n return { traceEvents };\n}\n\n/** @internal */\ninterface GpuProfilerResults {\n label: string;\n sum: number;\n paddingLeft: string;\n values: number[];\n}\n\n/** @alpha */\nexport class GpuProfiler {\n private readonly _div: HTMLDivElement;\n private readonly _resultsDiv: HTMLDivElement;\n private readonly _results: GpuProfilerResults[];\n private readonly _debugControl: RenderSystemDebugControl;\n\n private readonly _recordButton!: HTMLButtonElement;\n private _recordedResults: GLTimerResult[];\n private _isRecording: boolean;\n\n public constructor(parent: HTMLElement) {\n this._debugControl = IModelApp.renderSystem.debugControl!;\n\n const checkBox = createCheckBox({\n parent,\n name: \"Profile GPU\",\n id: \"gpu-profiler-toggle\",\n handler: (cb) => this.toggleProfileCheckBox(cb.checked),\n });\n\n if (!this._debugControl.isGLTimerSupported) {\n checkBox.checkbox.disabled = true;\n checkBox.div.title = \"EXT_disjoint_timer_query is not available in this browser\";\n }\n\n this._div = document.createElement(\"div\");\n this._div.style.display = \"none\";\n\n this._recordButton = document.createElement(\"button\");\n this._recordButton.style.textAlign = \"center\";\n this._isRecording = false;\n this._recordButton.innerText = \"Record Profile\";\n this._recordButton.title = \"Record a profile to open with chrome://tracing\";\n this._recordedResults = [];\n this._recordButton.addEventListener(\"click\", this._clickRecord);\n this._div.appendChild(this._recordButton);\n\n this._results = [];\n this._resultsDiv = document.createElement(\"div\");\n this._resultsDiv.style.textAlign = \"left\";\n this._div.appendChild(this._resultsDiv);\n\n parent.appendChild(this._div);\n }\n\n public dispose(): void {\n this._debugControl.resultsCallback = undefined;\n }\n\n private toggleProfileCheckBox(isEnabled: boolean): void {\n if (isEnabled) {\n this._debugControl.resultsCallback = this._resultsCallback;\n this._resultsDiv.innerHTML = \"\";\n this._div.style.display = \"block\";\n } else {\n this._debugControl.resultsCallback = undefined;\n this._div.style.display = \"none\";\n this.stopRecording();\n }\n }\n\n private _clickRecord = () => {\n if (!this._isRecording) {\n this._isRecording = true;\n this._recordButton.innerText = \"Stop Recording\";\n return;\n }\n\n this.stopRecording();\n };\n\n private stopRecording() {\n this._isRecording = false;\n this._recordButton.innerText = \"Record Profile\";\n\n if (this._recordedResults.length !== 0) {\n const chromeTrace = createTraceFromTimerResults(this._recordedResults);\n const blob = new Blob([JSON.stringify(chromeTrace)], { type: \"application/json;charset=utf-8\" });\n saveAs(blob, \"gpu-profile.json\");\n this._recordedResults = [];\n }\n }\n\n private _resultsCallback = (result: GLTimerResult): void => {\n if (this._isRecording)\n this._recordedResults.push(result);\n\n const fragment = document.createDocumentFragment();\n const numSavedFrames = 120;\n let lastValue: string;\n const changedResults = new Array<boolean>(this._results.length); // default values false\n const printDepth = (depth: number, currentRes: GLTimerResult) => {\n const index = this._results.findIndex((res) => res.label === currentRes.label);\n if (index < 0) { // Add brand new entry\n const data: GpuProfilerResults = {\n label: currentRes.label,\n paddingLeft: `${depth}em`,\n sum: currentRes.nanoseconds,\n values: [currentRes.nanoseconds],\n };\n if (lastValue === undefined) {\n this._results.unshift(data);\n changedResults.unshift(true);\n } else if (currentRes.label === \"Read Pixels\") {\n this._results.push(data); // Read Pixels should go at the end of the list\n changedResults.push(true);\n } else {\n const prevIndex = this._results.findIndex((res) => res.label === lastValue);\n this._results.splice(prevIndex + 1, 0, data);\n changedResults.splice(prevIndex + 1, 0, true);\n }\n } else { // Edit old entry\n let oldVal = 0.0;\n const savedResults = this._results[index];\n if (savedResults.values.length >= numSavedFrames) { // keep up to numSavedFrames values to average between\n oldVal = savedResults.values.shift()!;\n }\n const newVal = currentRes.nanoseconds < 100 ? 0.0 : currentRes.nanoseconds; // high-pass filter, empty queries have some noise\n savedResults.sum += newVal - oldVal;\n savedResults.values.push(newVal);\n changedResults[index] = true;\n }\n lastValue = currentRes.label;\n\n if (!currentRes.children)\n return;\n\n for (const childRes of currentRes.children)\n printDepth(depth + 1, childRes);\n };\n printDepth(0, result);\n\n this._results.forEach((value, index) => {\n if (!changedResults[index]) { // if no data received on this item, add a value of 0.0 to the avg.\n const oldVal = value.values.length >= numSavedFrames ? value.values.shift()! : 0.0;\n value.sum -= oldVal;\n value.values.push(0.0);\n }\n const div = document.createElement(\"div\");\n div.style.display = \"flex\";\n div.style.width = \"75%\";\n const textLabel = document.createElement(\"text\");\n textLabel.innerText = `${value.label}`;\n textLabel.style.paddingLeft = value.paddingLeft;\n div.appendChild(textLabel);\n const divLine = document.createElement(\"div\");\n divLine.style.flexGrow = \"1\";\n divLine.style.borderBottom = \"dotted 1px\";\n div.appendChild(divLine);\n const textValue = document.createElement(\"text\");\n textValue.innerText = `${(value.sum / value.values.length / 1.E6).toFixed(3)} ms\\n`;\n div.appendChild(textValue);\n fragment.appendChild(div);\n });\n\n this._resultsDiv.innerHTML = \"\";\n this._resultsDiv.appendChild(fragment);\n };\n}\n"]}
1
+ {"version":3,"file":"GpuProfiler.js","sourceRoot":"","sources":["../../../src/widgets/GpuProfiler.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Widgets\n */\n\nimport { saveAs } from \"file-saver\";\nimport { GLTimerResult, IModelApp, RenderSystemDebugControl } from \"@itwin/core-frontend\";\nimport { createCheckBox } from \"../ui/CheckBox\";\n\n/** Trace Event Format, viewable with chrome://tracing\n * https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/edit\n */\ninterface ChromeTrace {\n traceEvents: ChromeTraceEvent[];\n}\n\ninterface ChromeTraceEvent {\n /** Required by chrome://tracing */\n pid: 1;\n /** Timestamp in microseconds */\n ts: number;\n /** Duration in microseconds */\n dur: number;\n /** Denotes \"complete\" event */\n ph: \"X\";\n /** Label for chrome://tracing view */\n name: string;\n /** dummy value, args must be defined for entries to be clickable in chrome://tracing */\n args: ChromeTraceEventArgs;\n}\n\ninterface ChromeTraceEventArgs { 0: 0 }\nconst dummyArgs: ChromeTraceEventArgs = { 0: 0 }; // Reuse instead of allocating for each entry\n\n/**\n * @param name Label for the trace event\n * @param start Timestamp in microseconds of when trace event started\n * @param duration Duration in microseconds of trace event\n */\nfunction createTraceEvent(name: string, start: number, duration: number): ChromeTraceEvent {\n return {\n pid: 1,\n ts: start,\n dur: duration,\n ph: \"X\",\n name,\n args: dummyArgs,\n };\n}\n\nfunction createTraceFromTimerResults(timerResults: GLTimerResult[]): ChromeTrace {\n const traceEvents: ChromeTraceEvent[] = [];\n\n const addChildren = (startTime: number, children: GLTimerResult[]) => {\n for (const child of children) {\n if (child.nanoseconds < 100)\n continue;\n const microseconds = child.nanoseconds / 1E3;\n traceEvents.push(createTraceEvent(child.label, startTime, microseconds));\n if (child.children)\n addChildren(startTime, child.children);\n startTime += microseconds;\n }\n };\n\n let frameStartTime = 0;\n let frameNumber = 0;\n for (const tr of timerResults) {\n const microseconds = tr.nanoseconds / 1E3;\n traceEvents.push(createTraceEvent(`Frame ${frameNumber}`, frameStartTime, microseconds));\n if (tr.children)\n addChildren(frameStartTime, tr.children);\n frameStartTime += microseconds;\n ++frameNumber;\n }\n\n return { traceEvents };\n}\n\n/** @internal */\ninterface GpuProfilerResults {\n label: string;\n sum: number;\n paddingLeft: string;\n values: number[];\n}\n\n/** @alpha */\nexport class GpuProfiler {\n private readonly _div: HTMLDivElement;\n private readonly _resultsDiv: HTMLDivElement;\n private readonly _results: GpuProfilerResults[];\n private readonly _debugControl: RenderSystemDebugControl;\n\n private readonly _recordButton!: HTMLButtonElement;\n private _recordedResults: GLTimerResult[];\n private _isRecording: boolean;\n\n public constructor(parent: HTMLElement) {\n this._debugControl = IModelApp.renderSystem.debugControl!;\n\n const checkBox = createCheckBox({\n parent,\n name: \"Profile GPU\",\n id: \"gpu-profiler-toggle\",\n handler: (cb) => this.toggleProfileCheckBox(cb.checked),\n });\n\n if (!this._debugControl.isGLTimerSupported) {\n checkBox.checkbox.disabled = true;\n checkBox.div.title = \"EXT_disjoint_timer_query is not available in this browser\";\n }\n\n this._div = document.createElement(\"div\");\n this._div.style.display = \"none\";\n\n this._recordButton = document.createElement(\"button\");\n this._recordButton.style.textAlign = \"center\";\n this._isRecording = false;\n this._recordButton.innerText = \"Record Profile\";\n this._recordButton.title = \"Record a profile to open with chrome://tracing\";\n this._recordedResults = [];\n this._recordButton.addEventListener(\"click\", this._clickRecord);\n this._div.appendChild(this._recordButton);\n\n this._results = [];\n this._resultsDiv = document.createElement(\"div\");\n this._resultsDiv.style.textAlign = \"left\";\n this._div.appendChild(this._resultsDiv);\n\n parent.appendChild(this._div);\n }\n\n public [Symbol.dispose](): void {\n this._debugControl.resultsCallback = undefined;\n }\n\n private toggleProfileCheckBox(isEnabled: boolean): void {\n if (isEnabled) {\n this._debugControl.resultsCallback = this._resultsCallback;\n this._resultsDiv.innerHTML = \"\";\n this._div.style.display = \"block\";\n } else {\n this._debugControl.resultsCallback = undefined;\n this._div.style.display = \"none\";\n this.stopRecording();\n }\n }\n\n private _clickRecord = () => {\n if (!this._isRecording) {\n this._isRecording = true;\n this._recordButton.innerText = \"Stop Recording\";\n return;\n }\n\n this.stopRecording();\n };\n\n private stopRecording() {\n this._isRecording = false;\n this._recordButton.innerText = \"Record Profile\";\n\n if (this._recordedResults.length !== 0) {\n const chromeTrace = createTraceFromTimerResults(this._recordedResults);\n const blob = new Blob([JSON.stringify(chromeTrace)], { type: \"application/json;charset=utf-8\" });\n saveAs(blob, \"gpu-profile.json\");\n this._recordedResults = [];\n }\n }\n\n private _resultsCallback = (result: GLTimerResult): void => {\n if (this._isRecording)\n this._recordedResults.push(result);\n\n const fragment = document.createDocumentFragment();\n const numSavedFrames = 120;\n let lastValue: string;\n const changedResults = new Array<boolean>(this._results.length); // default values false\n const printDepth = (depth: number, currentRes: GLTimerResult) => {\n const index = this._results.findIndex((res) => res.label === currentRes.label);\n if (index < 0) { // Add brand new entry\n const data: GpuProfilerResults = {\n label: currentRes.label,\n paddingLeft: `${depth}em`,\n sum: currentRes.nanoseconds,\n values: [currentRes.nanoseconds],\n };\n if (lastValue === undefined) {\n this._results.unshift(data);\n changedResults.unshift(true);\n } else if (currentRes.label === \"Read Pixels\") {\n this._results.push(data); // Read Pixels should go at the end of the list\n changedResults.push(true);\n } else {\n const prevIndex = this._results.findIndex((res) => res.label === lastValue);\n this._results.splice(prevIndex + 1, 0, data);\n changedResults.splice(prevIndex + 1, 0, true);\n }\n } else { // Edit old entry\n let oldVal = 0.0;\n const savedResults = this._results[index];\n if (savedResults.values.length >= numSavedFrames) { // keep up to numSavedFrames values to average between\n oldVal = savedResults.values.shift()!;\n }\n const newVal = currentRes.nanoseconds < 100 ? 0.0 : currentRes.nanoseconds; // high-pass filter, empty queries have some noise\n savedResults.sum += newVal - oldVal;\n savedResults.values.push(newVal);\n changedResults[index] = true;\n }\n lastValue = currentRes.label;\n\n if (!currentRes.children)\n return;\n\n for (const childRes of currentRes.children)\n printDepth(depth + 1, childRes);\n };\n printDepth(0, result);\n\n this._results.forEach((value, index) => {\n if (!changedResults[index]) { // if no data received on this item, add a value of 0.0 to the avg.\n const oldVal = value.values.length >= numSavedFrames ? value.values.shift()! : 0.0;\n value.sum -= oldVal;\n value.values.push(0.0);\n }\n const div = document.createElement(\"div\");\n div.style.display = \"flex\";\n div.style.width = \"75%\";\n const textLabel = document.createElement(\"text\");\n textLabel.innerText = `${value.label}`;\n textLabel.style.paddingLeft = value.paddingLeft;\n div.appendChild(textLabel);\n const divLine = document.createElement(\"div\");\n divLine.style.flexGrow = \"1\";\n divLine.style.borderBottom = \"dotted 1px\";\n div.appendChild(divLine);\n const textValue = document.createElement(\"text\");\n textValue.innerText = `${(value.sum / value.values.length / 1.E6).toFixed(3)} ms\\n`;\n div.appendChild(textValue);\n fragment.appendChild(div);\n });\n\n this._resultsDiv.innerHTML = \"\";\n this._resultsDiv.appendChild(fragment);\n };\n}\n"]}
@@ -16,7 +16,7 @@ export declare class MemoryTracker {
16
16
  private readonly _textures;
17
17
  private readonly _buffers;
18
18
  constructor(parent: HTMLElement, vp: Viewport);
19
- dispose(): void;
19
+ [Symbol.dispose](): void;
20
20
  private addSelector;
21
21
  private addPurgeButton;
22
22
  private addStatistics;
@@ -1 +1 @@
1
- {"version":3,"file":"MemoryTracker.d.ts","sourceRoot":"","sources":["../../../src/widgets/MemoryTracker.ts"],"names":[],"mappings":"AAUA,OAAO,EACmE,QAAQ,EACjF,MAAM,sBAAsB,CAAC;AAoG9B,gBAAgB;AAChB,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYrD;AAgDD;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAW;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAc;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;gBAEpB,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ;IAwC7C,OAAO,IAAI,IAAI;IAItB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,MAAM;IAqBd,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,KAAK;CAQd"}
1
+ {"version":3,"file":"MemoryTracker.d.ts","sourceRoot":"","sources":["../../../src/widgets/MemoryTracker.ts"],"names":[],"mappings":"AAUA,OAAO,EACmE,QAAQ,EACjF,MAAM,sBAAsB,CAAC;AAoG9B,gBAAgB;AAChB,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYrD;AAgDD;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAW;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAc;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;gBAEpB,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ;IAwC7C,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAI/B,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,MAAM;IAqBd,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,KAAK;CAQd"}
@@ -161,7 +161,7 @@ export class MemoryTracker {
161
161
  this._purgeButton = this.addPurgeButton(this._div);
162
162
  parent.appendChild(this._div);
163
163
  }
164
- dispose() {
164
+ [Symbol.dispose]() {
165
165
  this.clearInterval();
166
166
  }
167
167
  addSelector(parent) {
@@ -1 +1 @@
1
- {"version":3,"file":"MemoryTracker.js","sourceRoot":"","sources":["../../../src/widgets/MemoryTracker.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Widgets\n */\n\nimport { assert, BeTimePoint } from \"@itwin/core-bentley\";\nimport {\n DisclosedTileTreeSet, IModelApp, RenderMemory, TileTree, TileTreeOwner, Viewport,\n} from \"@itwin/core-frontend\";\nimport { ComboBoxEntry, createComboBox } from \"../ui/ComboBox\";\n\nfunction collectTileTreeMemory(stats: RenderMemory.Statistics, owner: TileTreeOwner): void {\n const tree = owner.tileTree;\n if (undefined !== tree)\n tree.collectStatistics(stats);\n}\n\n// Returns the number of tile trees processed.\ntype CalcMem = (stats: RenderMemory.Statistics, vp: Viewport) => number;\ntype PurgeMem = (olderThan?: BeTimePoint) => void;\n\nconst enum MemIndex { // eslint-disable-line no-restricted-syntax\n None = -1,\n ViewportTileTrees,\n SelectedTiles,\n AllTileTrees,\n RenderTarget,\n // eslint-disable-next-line @typescript-eslint/no-shadow\n Viewport, // RenderTarget + Viewed Tile Trees\n System,\n All, // All Tile Trees + System + (RenderTarget for each ViewManager viewport)\n\n COUNT,\n}\n\n// Includes None (-1) at index 0\nconst memLabels = [\n \"None\",\n \"Viewed Tile Trees\",\n \"Selected Tiles\",\n \"All Tile Trees\",\n \"Render Target\",\n \"Viewport\",\n \"System\",\n \"All\",\n];\n\nfunction collectStatisticsForViewedTileTrees(vp: Viewport, stats: RenderMemory.Statistics): number {\n vp.collectStatistics(stats);\n const trees = new DisclosedTileTreeSet();\n vp.discloseTileTrees(trees);\n return trees.size;\n}\n\nfunction collectStatisticsForSelectedTiles(vp: Viewport, stats: RenderMemory.Statistics): number {\n const trees = new Set<TileTree>();\n const selectedTiles = IModelApp.tileAdmin.getTilesForUser(vp)?.selected;\n if (selectedTiles) {\n for (const tile of selectedTiles) {\n trees.add(tile.tree);\n tile.collectStatistics(stats);\n }\n }\n\n return trees.size;\n}\n\nfunction collectStatisticsForAllTileTrees(vp: Viewport, stats: RenderMemory.Statistics): number {\n let numTrees = 0;\n vp.view.iModel.tiles.forEachTreeOwner((owner) => {\n collectTileTreeMemory(stats, owner);\n if (undefined !== owner.tileTree)\n ++numTrees;\n });\n return numTrees;\n}\n\nconst calcMem: CalcMem[] = [\n (stats, vp) => collectStatisticsForViewedTileTrees(vp, stats),\n (stats, vp) => collectStatisticsForSelectedTiles(vp, stats),\n (stats, vp) => collectStatisticsForAllTileTrees(vp, stats),\n (stats, vp) => {\n vp.target.collectStatistics(stats);\n return 0;\n },\n (stats, vp) => {\n vp.target.collectStatistics(stats);\n return collectStatisticsForViewedTileTrees(vp, stats);\n },\n (stats, vp) => {\n vp.target.renderSystem.collectStatistics(stats);\n return 0;\n },\n (stats, vp) => {\n vp.target.renderSystem.collectStatistics(stats);\n for (const x of IModelApp.viewManager)\n x.target.collectStatistics(stats);\n\n return collectStatisticsForAllTileTrees(vp, stats);\n },\n];\n\n// ###TODO...\nconst purgeMem: Array<PurgeMem | undefined> = [\n undefined,\n (olderThan?) => IModelApp.viewManager.purgeTileTrees(olderThan ? olderThan : BeTimePoint.now()),\n];\n\n/** @internal */\nexport function formatMemory(numBytes: number): string {\n let suffix = \"b\";\n if (numBytes >= 1024) {\n numBytes /= 1024;\n suffix = \"kb\";\n if (numBytes >= 1024) {\n numBytes /= 1024;\n suffix = \"mb\";\n }\n }\n\n return numBytes.toFixed(2) + suffix;\n}\n\nclass MemoryPanel {\n private readonly _label: string;\n private readonly _labels: string[];\n private readonly _elems: HTMLElement[] = [];\n private readonly _div: HTMLDivElement;\n private readonly _header: HTMLElement;\n\n public constructor(parent: HTMLElement, label: string, labels: string[]) {\n this._label = label;\n this._labels = labels;\n this._div = document.createElement(\"div\");\n\n this._header = document.createElement(\"label\")!;\n this._header.style.fontWeight = \"bold\";\n this._div.appendChild(this._header);\n\n const numElems = labels.length;\n for (let i = 0; i < numElems; i++) {\n const elem = document.createElement(\"label\");\n this._elems.push(elem);\n this._div.appendChild(elem);\n }\n\n parent.appendChild(this._div);\n }\n\n public update(stats: RenderMemory.Consumers[], total: number): void {\n assert(this._labels.length === stats.length);\n assert(this._labels.length === this._elems.length);\n\n this._header.innerHTML = `${this._label}: ${formatMemory(total)}`;\n\n for (let i = 0; i < this._labels.length; i++) {\n const elem = this._elems[i];\n const stat = stats[i];\n if (0 === stat.totalBytes) {\n elem.style.display = \"none\";\n continue;\n }\n\n elem.style.display = \"block\";\n elem.innerHTML = `${this._labels[i]} (${stat.count}): ${formatMemory(stat.totalBytes)}`; // + \"\\n(max: \" + formatMemory(stat.maxBytes) + \")\";\n }\n }\n}\n\n/** Displays GPU memory allocated to tile trees - either all tile trees in the system, or only those associated with a specific Viewport.\n * @beta\n */\nexport class MemoryTracker {\n private readonly _stats = new RenderMemory.Statistics();\n private readonly _vp: Viewport;\n private readonly _div: HTMLDivElement;\n private _curIntervalId?: number;\n private _memIndex = MemIndex.None;\n private readonly _totalElem: HTMLElement;\n private readonly _totalTreesElem: HTMLElement;\n private readonly _purgeButton: HTMLButtonElement;\n private readonly _textures: MemoryPanel;\n private readonly _buffers: MemoryPanel;\n\n public constructor(parent: HTMLElement, vp: Viewport) {\n this._vp = vp;\n\n this._div = document.createElement(\"div\");\n this._div.style.display = \"none\";\n this._div.style.textAlign = \"right\";\n\n this.addSelector(parent);\n\n const table = document.createElement(\"table\");\n table.style.width = \"100%\";\n table.setAttribute(\"border\", \"1\");\n this._div.appendChild(table);\n\n const row0 = document.createElement(\"tr\");\n const cell00 = document.createElement(\"td\");\n const cell01 = document.createElement(\"td\");\n cell00.style.width = cell01.style.width = \"50%\";\n row0.appendChild(cell00);\n row0.appendChild(cell01);\n table.appendChild(row0);\n\n const row1 = document.createElement(\"tr\");\n const cell10 = document.createElement(\"td\");\n const cell11 = document.createElement(\"td\");\n cell10.style.width = cell11.style.width = \"50%\";\n row1.appendChild(cell10);\n row1.appendChild(cell11);\n table.appendChild(row1);\n\n this._textures = new MemoryPanel(cell00, \"Textures\", [\"Surface Textures\", \"Vertex Tables\", \"Edge Tables\", \"Feature Tables\", \"Feature Overrides\", \"Clip Volumes\", \"Planar Classifiers\", \"Shadow Maps\", \"Texture Attachments\", \"Thematic Textures\"]);\n this._buffers = new MemoryPanel(cell01, \"Buffers\", [\"Surfaces\", \"Visible Edges\", \"Silhouettes\", \"Polyline Edges\", \"Indexed Edges\", \"Polylines\", \"Point Strings\", \"Point Clouds\", \"Instances\", \"Terrain\", \"Reality Mesh\"]);\n this._totalElem = this.addStatistics(cell10);\n this._totalTreesElem = this.addStatistics(cell11);\n\n this._purgeButton = this.addPurgeButton(this._div);\n\n parent.appendChild(this._div);\n }\n\n public dispose(): void {\n this.clearInterval();\n }\n\n private addSelector(parent: HTMLElement): void {\n const entries: ComboBoxEntry[] = [];\n for (let i = MemIndex.None; i < MemIndex.COUNT; i++)\n entries.push({ name: memLabels[i + 1], value: i });\n\n createComboBox({\n parent,\n name: \"Track Memory: \",\n id: \"memTracker_type\",\n value: MemIndex.None,\n handler: (select) => this.change(Number.parseInt(select.value, 10)),\n entries,\n });\n }\n\n private addPurgeButton(parent: HTMLElement): HTMLButtonElement {\n const div = document.createElement(\"div\");\n div.style.textAlign = \"center\";\n\n const button = document.createElement(\"button\");\n button.innerText = \"Purge\";\n button.addEventListener(\"click\", () => this.purge());\n\n div.appendChild(button);\n parent.appendChild(div);\n\n return button;\n }\n\n private addStatistics(parent: HTMLElement): HTMLElement {\n const div = document.createElement(\"div\");\n const text = document.createElement(\"text\");\n text.style.fontWeight = \"bold\";\n div.appendChild(text);\n parent.appendChild(div);\n return text;\n }\n\n private clearInterval(): void {\n if (undefined !== this._curIntervalId) {\n window.clearInterval(this._curIntervalId);\n this._curIntervalId = undefined;\n }\n }\n\n private change(newIndex: MemIndex): void {\n if (newIndex === this._memIndex)\n return;\n\n this._memIndex = newIndex;\n if (MemIndex.None === newIndex) {\n this.clearInterval();\n this._div.style.display = \"none\";\n return;\n }\n\n if (undefined === this._curIntervalId) {\n this._curIntervalId = window.setInterval(() => this.update(), 1000);\n this._div.style.display = \"block\";\n }\n\n this._purgeButton.disabled = undefined === purgeMem[this._memIndex];\n\n this.update();\n }\n\n private update(): void {\n const calc = calcMem[this._memIndex];\n this._stats.clear();\n const numTrees = calc(this._stats, this._vp);\n this._totalElem.innerText = `Total: ${formatMemory(this._stats.totalBytes)}`;\n this._totalTreesElem.innerText = `Total Tile Trees: ${numTrees}`;\n\n this._textures.update(this._stats.consumers, this._stats.totalBytes - this._stats.buffers.totalBytes);\n this._buffers.update(this._stats.buffers.consumers, this._stats.buffers.totalBytes);\n }\n\n private purge(): void {\n const purge = purgeMem[this._memIndex];\n if (undefined !== purge) {\n purge();\n this._vp.invalidateScene(); // to trigger reloading of tiles we actually do want to continue drawing\n this.update();\n }\n }\n}\n"]}
1
+ {"version":3,"file":"MemoryTracker.js","sourceRoot":"","sources":["../../../src/widgets/MemoryTracker.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Widgets\n */\n\nimport { assert, BeTimePoint } from \"@itwin/core-bentley\";\nimport {\n DisclosedTileTreeSet, IModelApp, RenderMemory, TileTree, TileTreeOwner, Viewport,\n} from \"@itwin/core-frontend\";\nimport { ComboBoxEntry, createComboBox } from \"../ui/ComboBox\";\n\nfunction collectTileTreeMemory(stats: RenderMemory.Statistics, owner: TileTreeOwner): void {\n const tree = owner.tileTree;\n if (undefined !== tree)\n tree.collectStatistics(stats);\n}\n\n// Returns the number of tile trees processed.\ntype CalcMem = (stats: RenderMemory.Statistics, vp: Viewport) => number;\ntype PurgeMem = (olderThan?: BeTimePoint) => void;\n\nconst enum MemIndex { // eslint-disable-line no-restricted-syntax\n None = -1,\n ViewportTileTrees,\n SelectedTiles,\n AllTileTrees,\n RenderTarget,\n // eslint-disable-next-line @typescript-eslint/no-shadow\n Viewport, // RenderTarget + Viewed Tile Trees\n System,\n All, // All Tile Trees + System + (RenderTarget for each ViewManager viewport)\n\n COUNT,\n}\n\n// Includes None (-1) at index 0\nconst memLabels = [\n \"None\",\n \"Viewed Tile Trees\",\n \"Selected Tiles\",\n \"All Tile Trees\",\n \"Render Target\",\n \"Viewport\",\n \"System\",\n \"All\",\n];\n\nfunction collectStatisticsForViewedTileTrees(vp: Viewport, stats: RenderMemory.Statistics): number {\n vp.collectStatistics(stats);\n const trees = new DisclosedTileTreeSet();\n vp.discloseTileTrees(trees);\n return trees.size;\n}\n\nfunction collectStatisticsForSelectedTiles(vp: Viewport, stats: RenderMemory.Statistics): number {\n const trees = new Set<TileTree>();\n const selectedTiles = IModelApp.tileAdmin.getTilesForUser(vp)?.selected;\n if (selectedTiles) {\n for (const tile of selectedTiles) {\n trees.add(tile.tree);\n tile.collectStatistics(stats);\n }\n }\n\n return trees.size;\n}\n\nfunction collectStatisticsForAllTileTrees(vp: Viewport, stats: RenderMemory.Statistics): number {\n let numTrees = 0;\n vp.view.iModel.tiles.forEachTreeOwner((owner) => {\n collectTileTreeMemory(stats, owner);\n if (undefined !== owner.tileTree)\n ++numTrees;\n });\n return numTrees;\n}\n\nconst calcMem: CalcMem[] = [\n (stats, vp) => collectStatisticsForViewedTileTrees(vp, stats),\n (stats, vp) => collectStatisticsForSelectedTiles(vp, stats),\n (stats, vp) => collectStatisticsForAllTileTrees(vp, stats),\n (stats, vp) => {\n vp.target.collectStatistics(stats);\n return 0;\n },\n (stats, vp) => {\n vp.target.collectStatistics(stats);\n return collectStatisticsForViewedTileTrees(vp, stats);\n },\n (stats, vp) => {\n vp.target.renderSystem.collectStatistics(stats);\n return 0;\n },\n (stats, vp) => {\n vp.target.renderSystem.collectStatistics(stats);\n for (const x of IModelApp.viewManager)\n x.target.collectStatistics(stats);\n\n return collectStatisticsForAllTileTrees(vp, stats);\n },\n];\n\n// ###TODO...\nconst purgeMem: Array<PurgeMem | undefined> = [\n undefined,\n (olderThan?) => IModelApp.viewManager.purgeTileTrees(olderThan ? olderThan : BeTimePoint.now()),\n];\n\n/** @internal */\nexport function formatMemory(numBytes: number): string {\n let suffix = \"b\";\n if (numBytes >= 1024) {\n numBytes /= 1024;\n suffix = \"kb\";\n if (numBytes >= 1024) {\n numBytes /= 1024;\n suffix = \"mb\";\n }\n }\n\n return numBytes.toFixed(2) + suffix;\n}\n\nclass MemoryPanel {\n private readonly _label: string;\n private readonly _labels: string[];\n private readonly _elems: HTMLElement[] = [];\n private readonly _div: HTMLDivElement;\n private readonly _header: HTMLElement;\n\n public constructor(parent: HTMLElement, label: string, labels: string[]) {\n this._label = label;\n this._labels = labels;\n this._div = document.createElement(\"div\");\n\n this._header = document.createElement(\"label\")!;\n this._header.style.fontWeight = \"bold\";\n this._div.appendChild(this._header);\n\n const numElems = labels.length;\n for (let i = 0; i < numElems; i++) {\n const elem = document.createElement(\"label\");\n this._elems.push(elem);\n this._div.appendChild(elem);\n }\n\n parent.appendChild(this._div);\n }\n\n public update(stats: RenderMemory.Consumers[], total: number): void {\n assert(this._labels.length === stats.length);\n assert(this._labels.length === this._elems.length);\n\n this._header.innerHTML = `${this._label}: ${formatMemory(total)}`;\n\n for (let i = 0; i < this._labels.length; i++) {\n const elem = this._elems[i];\n const stat = stats[i];\n if (0 === stat.totalBytes) {\n elem.style.display = \"none\";\n continue;\n }\n\n elem.style.display = \"block\";\n elem.innerHTML = `${this._labels[i]} (${stat.count}): ${formatMemory(stat.totalBytes)}`; // + \"\\n(max: \" + formatMemory(stat.maxBytes) + \")\";\n }\n }\n}\n\n/** Displays GPU memory allocated to tile trees - either all tile trees in the system, or only those associated with a specific Viewport.\n * @beta\n */\nexport class MemoryTracker {\n private readonly _stats = new RenderMemory.Statistics();\n private readonly _vp: Viewport;\n private readonly _div: HTMLDivElement;\n private _curIntervalId?: number;\n private _memIndex = MemIndex.None;\n private readonly _totalElem: HTMLElement;\n private readonly _totalTreesElem: HTMLElement;\n private readonly _purgeButton: HTMLButtonElement;\n private readonly _textures: MemoryPanel;\n private readonly _buffers: MemoryPanel;\n\n public constructor(parent: HTMLElement, vp: Viewport) {\n this._vp = vp;\n\n this._div = document.createElement(\"div\");\n this._div.style.display = \"none\";\n this._div.style.textAlign = \"right\";\n\n this.addSelector(parent);\n\n const table = document.createElement(\"table\");\n table.style.width = \"100%\";\n table.setAttribute(\"border\", \"1\");\n this._div.appendChild(table);\n\n const row0 = document.createElement(\"tr\");\n const cell00 = document.createElement(\"td\");\n const cell01 = document.createElement(\"td\");\n cell00.style.width = cell01.style.width = \"50%\";\n row0.appendChild(cell00);\n row0.appendChild(cell01);\n table.appendChild(row0);\n\n const row1 = document.createElement(\"tr\");\n const cell10 = document.createElement(\"td\");\n const cell11 = document.createElement(\"td\");\n cell10.style.width = cell11.style.width = \"50%\";\n row1.appendChild(cell10);\n row1.appendChild(cell11);\n table.appendChild(row1);\n\n this._textures = new MemoryPanel(cell00, \"Textures\", [\"Surface Textures\", \"Vertex Tables\", \"Edge Tables\", \"Feature Tables\", \"Feature Overrides\", \"Clip Volumes\", \"Planar Classifiers\", \"Shadow Maps\", \"Texture Attachments\", \"Thematic Textures\"]);\n this._buffers = new MemoryPanel(cell01, \"Buffers\", [\"Surfaces\", \"Visible Edges\", \"Silhouettes\", \"Polyline Edges\", \"Indexed Edges\", \"Polylines\", \"Point Strings\", \"Point Clouds\", \"Instances\", \"Terrain\", \"Reality Mesh\"]);\n this._totalElem = this.addStatistics(cell10);\n this._totalTreesElem = this.addStatistics(cell11);\n\n this._purgeButton = this.addPurgeButton(this._div);\n\n parent.appendChild(this._div);\n }\n\n public [Symbol.dispose](): void {\n this.clearInterval();\n }\n\n private addSelector(parent: HTMLElement): void {\n const entries: ComboBoxEntry[] = [];\n for (let i = MemIndex.None; i < MemIndex.COUNT; i++)\n entries.push({ name: memLabels[i + 1], value: i });\n\n createComboBox({\n parent,\n name: \"Track Memory: \",\n id: \"memTracker_type\",\n value: MemIndex.None,\n handler: (select) => this.change(Number.parseInt(select.value, 10)),\n entries,\n });\n }\n\n private addPurgeButton(parent: HTMLElement): HTMLButtonElement {\n const div = document.createElement(\"div\");\n div.style.textAlign = \"center\";\n\n const button = document.createElement(\"button\");\n button.innerText = \"Purge\";\n button.addEventListener(\"click\", () => this.purge());\n\n div.appendChild(button);\n parent.appendChild(div);\n\n return button;\n }\n\n private addStatistics(parent: HTMLElement): HTMLElement {\n const div = document.createElement(\"div\");\n const text = document.createElement(\"text\");\n text.style.fontWeight = \"bold\";\n div.appendChild(text);\n parent.appendChild(div);\n return text;\n }\n\n private clearInterval(): void {\n if (undefined !== this._curIntervalId) {\n window.clearInterval(this._curIntervalId);\n this._curIntervalId = undefined;\n }\n }\n\n private change(newIndex: MemIndex): void {\n if (newIndex === this._memIndex)\n return;\n\n this._memIndex = newIndex;\n if (MemIndex.None === newIndex) {\n this.clearInterval();\n this._div.style.display = \"none\";\n return;\n }\n\n if (undefined === this._curIntervalId) {\n this._curIntervalId = window.setInterval(() => this.update(), 1000);\n this._div.style.display = \"block\";\n }\n\n this._purgeButton.disabled = undefined === purgeMem[this._memIndex];\n\n this.update();\n }\n\n private update(): void {\n const calc = calcMem[this._memIndex];\n this._stats.clear();\n const numTrees = calc(this._stats, this._vp);\n this._totalElem.innerText = `Total: ${formatMemory(this._stats.totalBytes)}`;\n this._totalTreesElem.innerText = `Total Tile Trees: ${numTrees}`;\n\n this._textures.update(this._stats.consumers, this._stats.totalBytes - this._stats.buffers.totalBytes);\n this._buffers.update(this._stats.buffers.consumers, this._stats.buffers.totalBytes);\n }\n\n private purge(): void {\n const purge = purgeMem[this._memIndex];\n if (undefined !== purge) {\n purge();\n this._vp.invalidateScene(); // to trigger reloading of tiles we actually do want to continue drawing\n this.update();\n }\n }\n}\n"]}
@@ -8,7 +8,7 @@ export declare class RenderCommandBreakdown {
8
8
  private readonly _cells;
9
9
  private readonly _total;
10
10
  constructor(parent: HTMLElement);
11
- dispose(): void;
11
+ [Symbol.dispose](): void;
12
12
  private toggle;
13
13
  private clearInterval;
14
14
  private update;
@@ -1 +1 @@
1
- {"version":3,"file":"RenderCommandBreakdown.d.ts","sourceRoot":"","sources":["../../../src/widgets/RenderCommandBreakdown.ts"],"names":[],"mappings":"AAIA;;GAEG;AAKH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;gBAElB,MAAM,EAAE,WAAW;IAkB/B,OAAO,IAAI,IAAI;IAItB,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,MAAM;CAoBf"}
1
+ {"version":3,"file":"RenderCommandBreakdown.d.ts","sourceRoot":"","sources":["../../../src/widgets/RenderCommandBreakdown.ts"],"names":[],"mappings":"AAIA;;GAEG;AAKH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;gBAElB,MAAM,EAAE,WAAW;IAkB/B,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAI/B,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,MAAM;CAoBf"}
@@ -23,7 +23,7 @@ export class RenderCommandBreakdown {
23
23
  this._div.appendChild(this._total = document.createElement("div"));
24
24
  this._total.innerText = "Total: 0";
25
25
  }
26
- dispose() {
26
+ [Symbol.dispose]() {
27
27
  this.clearInterval();
28
28
  }
29
29
  toggle() {
@@ -1 +1 @@
1
- {"version":3,"file":"RenderCommandBreakdown.js","sourceRoot":"","sources":["../../../src/widgets/RenderCommandBreakdown.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Widgets\n */\n\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport { createCheckBox } from \"../ui/CheckBox\";\n\nexport class RenderCommandBreakdown {\n private readonly _div: HTMLDivElement;\n private readonly _cellDiv: HTMLDivElement;\n private _curIntervalId?: number;\n private readonly _cells = new Map<string, HTMLElement>();\n private readonly _total: HTMLElement;\n\n public constructor(parent: HTMLElement) {\n createCheckBox({\n parent,\n name: \"Render Commands\",\n id: \"renderCommandBreakdown\",\n handler: () => this.toggle(),\n });\n\n parent.appendChild(this._div = document.createElement(\"div\"));\n this._div.style.display = \"none\";\n this._div.style.textAlign = \"right\";\n\n this._div.appendChild(this._cellDiv = document.createElement(\"div\"));\n\n this._div.appendChild(this._total = document.createElement(\"div\"));\n this._total.innerText = \"Total: 0\";\n }\n\n public dispose(): void {\n this.clearInterval();\n }\n\n private toggle(): void {\n if (undefined !== this._curIntervalId) {\n this._div.style.display = \"none\";\n this.clearInterval();\n } else {\n this._div.style.display = \"block\";\n this.update();\n this._curIntervalId = window.setInterval(() => this.update(), 500);\n }\n }\n\n private clearInterval(): void {\n if (undefined !== this._curIntervalId) {\n window.clearInterval(this._curIntervalId);\n this._curIntervalId = undefined;\n }\n }\n\n private update(): void {\n const ctrl = IModelApp.viewManager.selectedView?.target.debugControl;\n if (!ctrl)\n return;\n\n const cmds = ctrl.getRenderCommands();\n let total = 0;\n for (const cmd of cmds) {\n let cell = this._cells.get(cmd.name);\n if (!cell) {\n this._cellDiv.appendChild(cell = document.createElement(\"div\"));\n this._cells.set(cmd.name, cell);\n }\n\n total += cmd.count;\n cell.innerText = `${cmd.name}: ${cmd.count}`;\n }\n\n this._total.innerText = `Total: ${total}`;\n }\n}\n"]}
1
+ {"version":3,"file":"RenderCommandBreakdown.js","sourceRoot":"","sources":["../../../src/widgets/RenderCommandBreakdown.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Widgets\n */\n\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport { createCheckBox } from \"../ui/CheckBox\";\n\nexport class RenderCommandBreakdown {\n private readonly _div: HTMLDivElement;\n private readonly _cellDiv: HTMLDivElement;\n private _curIntervalId?: number;\n private readonly _cells = new Map<string, HTMLElement>();\n private readonly _total: HTMLElement;\n\n public constructor(parent: HTMLElement) {\n createCheckBox({\n parent,\n name: \"Render Commands\",\n id: \"renderCommandBreakdown\",\n handler: () => this.toggle(),\n });\n\n parent.appendChild(this._div = document.createElement(\"div\"));\n this._div.style.display = \"none\";\n this._div.style.textAlign = \"right\";\n\n this._div.appendChild(this._cellDiv = document.createElement(\"div\"));\n\n this._div.appendChild(this._total = document.createElement(\"div\"));\n this._total.innerText = \"Total: 0\";\n }\n\n public [Symbol.dispose](): void {\n this.clearInterval();\n }\n\n private toggle(): void {\n if (undefined !== this._curIntervalId) {\n this._div.style.display = \"none\";\n this.clearInterval();\n } else {\n this._div.style.display = \"block\";\n this.update();\n this._curIntervalId = window.setInterval(() => this.update(), 500);\n }\n }\n\n private clearInterval(): void {\n if (undefined !== this._curIntervalId) {\n window.clearInterval(this._curIntervalId);\n this._curIntervalId = undefined;\n }\n }\n\n private update(): void {\n const ctrl = IModelApp.viewManager.selectedView?.target.debugControl;\n if (!ctrl)\n return;\n\n const cmds = ctrl.getRenderCommands();\n let total = 0;\n for (const cmd of cmds) {\n let cell = this._cells.get(cmd.name);\n if (!cell) {\n this._cellDiv.appendChild(cell = document.createElement(\"div\"));\n this._cells.set(cmd.name, cell);\n }\n\n total += cmd.count;\n cell.innerText = `${cmd.name}: ${cmd.count}`;\n }\n\n this._total.innerText = `Total: ${total}`;\n }\n}\n"]}
@@ -23,7 +23,7 @@ export declare class TileMemoryBreakdown {
23
23
  private readonly _totalsElements;
24
24
  /** Construct a new breakdown widget as a child of the specified parent element. */
25
25
  constructor(parent: HTMLElement);
26
- dispose(): void;
26
+ [Symbol.dispose](): void;
27
27
  private toggle;
28
28
  private clearInterval;
29
29
  private update;
@@ -1 +1 @@
1
- {"version":3,"file":"TileMemoryBreakdown.d.ts","sourceRoot":"","sources":["../../../src/widgets/TileMemoryBreakdown.ts"],"names":[],"mappings":"AAIA;;GAEG;AAwHH;;;;;;;;;;;;;GAaG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqB;IAErD,mFAAmF;gBAChE,MAAM,EAAE,WAAW;IA0C/B,OAAO,IAAI,IAAI;IAItB,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,MAAM;CAyBf"}
1
+ {"version":3,"file":"TileMemoryBreakdown.d.ts","sourceRoot":"","sources":["../../../src/widgets/TileMemoryBreakdown.ts"],"names":[],"mappings":"AAIA;;GAEG;AAwHH;;;;;;;;;;;;;GAaG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqB;IAErD,mFAAmF;gBAChE,MAAM,EAAE,WAAW;IA0C/B,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAI/B,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,MAAM;CAyBf"}
@@ -154,7 +154,7 @@ export class TileMemoryBreakdown {
154
154
  leftCell.appendChild(div);
155
155
  }
156
156
  }
157
- dispose() {
157
+ [Symbol.dispose]() {
158
158
  this.clearInterval();
159
159
  }
160
160
  toggle() {