@itwin/core-frontend 3.1.0-dev.7 → 3.1.0-dev.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/BriefcaseConnection.d.ts.map +1 -1
- package/lib/cjs/BriefcaseConnection.js +6 -5
- package/lib/cjs/BriefcaseConnection.js.map +1 -1
- package/lib/cjs/DrawingViewState.js +3 -3
- package/lib/cjs/DrawingViewState.js.map +1 -1
- package/lib/cjs/SheetViewState.js +3 -3
- package/lib/cjs/SheetViewState.js.map +1 -1
- package/lib/cjs/Viewport.d.ts +6 -3
- package/lib/cjs/Viewport.d.ts.map +1 -1
- package/lib/cjs/Viewport.js +16 -9
- package/lib/cjs/Viewport.js.map +1 -1
- package/lib/cjs/tile/DynamicIModelTile.d.ts.map +1 -1
- package/lib/cjs/tile/DynamicIModelTile.js +1 -1
- package/lib/cjs/tile/DynamicIModelTile.js.map +1 -1
- package/lib/cjs/tile/LRUTileList.d.ts +29 -29
- package/lib/cjs/tile/LRUTileList.d.ts.map +1 -1
- package/lib/cjs/tile/LRUTileList.js +50 -50
- package/lib/cjs/tile/LRUTileList.js.map +1 -1
- package/lib/cjs/tile/OrbitGtTileTree.js +1 -1
- package/lib/cjs/tile/OrbitGtTileTree.js.map +1 -1
- package/lib/cjs/tile/RealityModelTileTree.d.ts.map +1 -1
- package/lib/cjs/tile/RealityModelTileTree.js +1 -1
- package/lib/cjs/tile/RealityModelTileTree.js.map +1 -1
- package/lib/cjs/tile/RealityTile.d.ts +2 -2
- package/lib/cjs/tile/RealityTile.d.ts.map +1 -1
- package/lib/cjs/tile/RealityTile.js +2 -2
- package/lib/cjs/tile/RealityTile.js.map +1 -1
- package/lib/cjs/tile/RealityTileLoader.d.ts +2 -2
- package/lib/cjs/tile/RealityTileLoader.d.ts.map +1 -1
- package/lib/cjs/tile/RealityTileLoader.js +1 -1
- package/lib/cjs/tile/RealityTileLoader.js.map +1 -1
- package/lib/cjs/tile/RealityTileTree.js +1 -1
- package/lib/cjs/tile/RealityTileTree.js.map +1 -1
- package/lib/cjs/tile/Tile.d.ts +5 -4
- package/lib/cjs/tile/Tile.d.ts.map +1 -1
- package/lib/cjs/tile/Tile.js +3 -2
- package/lib/cjs/tile/Tile.js.map +1 -1
- package/lib/cjs/tile/TileAdmin.d.ts +43 -45
- package/lib/cjs/tile/TileAdmin.d.ts.map +1 -1
- package/lib/cjs/tile/TileAdmin.js +104 -99
- package/lib/cjs/tile/TileAdmin.js.map +1 -1
- package/lib/cjs/tile/TileRequest.d.ts +12 -9
- package/lib/cjs/tile/TileRequest.d.ts.map +1 -1
- package/lib/cjs/tile/TileRequest.js +19 -11
- package/lib/cjs/tile/TileRequest.js.map +1 -1
- package/lib/cjs/tile/TileRequestChannel.js +3 -3
- package/lib/cjs/tile/TileRequestChannel.js.map +1 -1
- package/lib/cjs/tile/TileTree.js +1 -1
- package/lib/cjs/tile/TileTree.js.map +1 -1
- package/lib/cjs/tile/TileTreeReference.d.ts +1 -1
- package/lib/cjs/tile/TileTreeReference.js +1 -1
- package/lib/cjs/tile/TileTreeReference.js.map +1 -1
- package/lib/cjs/tile/TileUsageMarker.d.ts +9 -9
- package/lib/cjs/tile/TileUsageMarker.d.ts.map +1 -1
- package/lib/cjs/tile/TileUsageMarker.js +9 -9
- package/lib/cjs/tile/TileUsageMarker.js.map +1 -1
- package/lib/cjs/tile/TileUser.d.ts +33 -0
- package/lib/cjs/tile/TileUser.d.ts.map +1 -0
- package/lib/cjs/tile/TileUser.js +28 -0
- package/lib/cjs/tile/TileUser.js.map +1 -0
- package/lib/cjs/tile/TileUserSet.d.ts +28 -0
- package/lib/cjs/tile/TileUserSet.d.ts.map +1 -0
- package/lib/cjs/tile/TileUserSet.js +123 -0
- package/lib/cjs/tile/TileUserSet.js.map +1 -0
- package/lib/cjs/tile/internal.d.ts +2 -0
- package/lib/cjs/tile/internal.d.ts.map +1 -1
- package/lib/cjs/tile/internal.js +2 -0
- package/lib/cjs/tile/internal.js.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts +1 -2
- package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +1 -1
- package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/AzureMapsLayerImageryProvider.d.ts +1 -2
- package/lib/cjs/tile/map/ImageryProviders/AzureMapsLayerImageryProvider.d.ts.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/AzureMapsLayerImageryProvider.js +1 -1
- package/lib/cjs/tile/map/ImageryProviders/AzureMapsLayerImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/BingImageryProvider.js +1 -1
- package/lib/cjs/tile/map/ImageryProviders/BingImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/MapBoxLayerImageryProvider.d.ts +1 -2
- package/lib/cjs/tile/map/ImageryProviders/MapBoxLayerImageryProvider.d.ts.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/MapBoxLayerImageryProvider.js +1 -1
- package/lib/cjs/tile/map/ImageryProviders/MapBoxLayerImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/ImageryTileTree.d.ts +2 -2
- package/lib/cjs/tile/map/ImageryTileTree.d.ts.map +1 -1
- package/lib/cjs/tile/map/ImageryTileTree.js +1 -1
- package/lib/cjs/tile/map/ImageryTileTree.js.map +1 -1
- package/lib/cjs/tile/map/MapTileTree.d.ts +3 -3
- package/lib/cjs/tile/map/MapTileTree.js +4 -4
- package/lib/cjs/tile/map/MapTileTree.js.map +1 -1
- package/lib/esm/BriefcaseConnection.d.ts.map +1 -1
- package/lib/esm/BriefcaseConnection.js +6 -5
- package/lib/esm/BriefcaseConnection.js.map +1 -1
- package/lib/esm/DrawingViewState.js +3 -3
- package/lib/esm/DrawingViewState.js.map +1 -1
- package/lib/esm/SheetViewState.js +3 -3
- package/lib/esm/SheetViewState.js.map +1 -1
- package/lib/esm/Viewport.d.ts +6 -3
- package/lib/esm/Viewport.d.ts.map +1 -1
- package/lib/esm/Viewport.js +17 -10
- package/lib/esm/Viewport.js.map +1 -1
- package/lib/esm/tile/DynamicIModelTile.d.ts.map +1 -1
- package/lib/esm/tile/DynamicIModelTile.js +1 -1
- package/lib/esm/tile/DynamicIModelTile.js.map +1 -1
- package/lib/esm/tile/LRUTileList.d.ts +29 -29
- package/lib/esm/tile/LRUTileList.d.ts.map +1 -1
- package/lib/esm/tile/LRUTileList.js +47 -47
- package/lib/esm/tile/LRUTileList.js.map +1 -1
- package/lib/esm/tile/OrbitGtTileTree.js +1 -1
- package/lib/esm/tile/OrbitGtTileTree.js.map +1 -1
- package/lib/esm/tile/RealityModelTileTree.d.ts.map +1 -1
- package/lib/esm/tile/RealityModelTileTree.js +1 -1
- package/lib/esm/tile/RealityModelTileTree.js.map +1 -1
- package/lib/esm/tile/RealityTile.d.ts +2 -2
- package/lib/esm/tile/RealityTile.d.ts.map +1 -1
- package/lib/esm/tile/RealityTile.js +2 -2
- package/lib/esm/tile/RealityTile.js.map +1 -1
- package/lib/esm/tile/RealityTileLoader.d.ts +2 -2
- package/lib/esm/tile/RealityTileLoader.d.ts.map +1 -1
- package/lib/esm/tile/RealityTileLoader.js +1 -1
- package/lib/esm/tile/RealityTileLoader.js.map +1 -1
- package/lib/esm/tile/RealityTileTree.js +1 -1
- package/lib/esm/tile/RealityTileTree.js.map +1 -1
- package/lib/esm/tile/Tile.d.ts +5 -4
- package/lib/esm/tile/Tile.d.ts.map +1 -1
- package/lib/esm/tile/Tile.js +3 -2
- package/lib/esm/tile/Tile.js.map +1 -1
- package/lib/esm/tile/TileAdmin.d.ts +43 -45
- package/lib/esm/tile/TileAdmin.d.ts.map +1 -1
- package/lib/esm/tile/TileAdmin.js +105 -100
- package/lib/esm/tile/TileAdmin.js.map +1 -1
- package/lib/esm/tile/TileRequest.d.ts +12 -9
- package/lib/esm/tile/TileRequest.d.ts.map +1 -1
- package/lib/esm/tile/TileRequest.js +19 -11
- package/lib/esm/tile/TileRequest.js.map +1 -1
- package/lib/esm/tile/TileRequestChannel.js +3 -3
- package/lib/esm/tile/TileRequestChannel.js.map +1 -1
- package/lib/esm/tile/TileTree.js +1 -1
- package/lib/esm/tile/TileTree.js.map +1 -1
- package/lib/esm/tile/TileTreeReference.d.ts +1 -1
- package/lib/esm/tile/TileTreeReference.js +1 -1
- package/lib/esm/tile/TileTreeReference.js.map +1 -1
- package/lib/esm/tile/TileUsageMarker.d.ts +9 -9
- package/lib/esm/tile/TileUsageMarker.d.ts.map +1 -1
- package/lib/esm/tile/TileUsageMarker.js +9 -9
- package/lib/esm/tile/TileUsageMarker.js.map +1 -1
- package/lib/esm/tile/TileUser.d.ts +33 -0
- package/lib/esm/tile/TileUser.d.ts.map +1 -0
- package/lib/esm/tile/TileUser.js +25 -0
- package/lib/esm/tile/TileUser.js.map +1 -0
- package/lib/esm/tile/TileUserSet.d.ts +28 -0
- package/lib/esm/tile/TileUserSet.d.ts.map +1 -0
- package/lib/esm/tile/TileUserSet.js +118 -0
- package/lib/esm/tile/TileUserSet.js.map +1 -0
- package/lib/esm/tile/internal.d.ts +2 -0
- package/lib/esm/tile/internal.d.ts.map +1 -1
- package/lib/esm/tile/internal.js +2 -0
- package/lib/esm/tile/internal.js.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts +1 -2
- package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +1 -1
- package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/AzureMapsLayerImageryProvider.d.ts +1 -2
- package/lib/esm/tile/map/ImageryProviders/AzureMapsLayerImageryProvider.d.ts.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/AzureMapsLayerImageryProvider.js +1 -1
- package/lib/esm/tile/map/ImageryProviders/AzureMapsLayerImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/BingImageryProvider.js +1 -1
- package/lib/esm/tile/map/ImageryProviders/BingImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/MapBoxLayerImageryProvider.d.ts +1 -2
- package/lib/esm/tile/map/ImageryProviders/MapBoxLayerImageryProvider.d.ts.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/MapBoxLayerImageryProvider.js +1 -1
- package/lib/esm/tile/map/ImageryProviders/MapBoxLayerImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/ImageryTileTree.d.ts +2 -2
- package/lib/esm/tile/map/ImageryTileTree.d.ts.map +1 -1
- package/lib/esm/tile/map/ImageryTileTree.js +1 -1
- package/lib/esm/tile/map/ImageryTileTree.js.map +1 -1
- package/lib/esm/tile/map/MapTileTree.d.ts +3 -3
- package/lib/esm/tile/map/MapTileTree.js +4 -4
- package/lib/esm/tile/map/MapTileTree.js.map +1 -1
- package/package.json +20 -20
- package/lib/cjs/ViewportSet.d.ts +0 -28
- package/lib/cjs/ViewportSet.d.ts.map +0 -1
- package/lib/cjs/ViewportSet.js +0 -126
- package/lib/cjs/ViewportSet.js.map +0 -1
- package/lib/esm/ViewportSet.d.ts +0 -28
- package/lib/esm/ViewportSet.d.ts.map +0 -1
- package/lib/esm/ViewportSet.js +0 -121
- package/lib/esm/ViewportSet.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicIModelTile.d.ts","sourceRoot":"","sources":["../../../src/tile/DynamicIModelTile.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EACG,WAAW,EAA8C,SAAS,EAC3E,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACM,qBAAqB,EAAkD,yBAAyB,EAC5G,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"DynamicIModelTile.d.ts","sourceRoot":"","sources":["../../../src/tile/DynamicIModelTile.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EACG,WAAW,EAA8C,SAAS,EAC3E,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACM,qBAAqB,EAAkD,yBAAyB,EAC5G,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACuB,cAAc,EAAE,IAAI,EAAe,YAAY,EAAE,UAAU,EAAmC,QAAQ,EACnI,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AACH,8BAAsB,iBAAkB,SAAQ,IAAI;IAClD,SAAS,aAAa,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ;WAI1C,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,iBAAiB;IAIxG,6EAA6E;aAC7D,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,IAAI;IAErF,+GAA+G;IAC/G,aAAoB,kBAAkB,IAAI,yBAAyB,CAAC;IAEpE,kCAAkC;IAClC,aAAoB,cAAc,IAAI,SAAS,CAAC;IAEhD,2EAA2E;aAC3D,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI;IAEvE,4EAA4E;aAC5D,aAAa,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;CAC5D"}
|
|
@@ -250,7 +250,7 @@ class GraphicsTile extends internal_1.Tile {
|
|
|
250
250
|
this.toleranceLog10 = toleranceLog10;
|
|
251
251
|
this.tolerance = 10 ** toleranceLog10;
|
|
252
252
|
}
|
|
253
|
-
computeLoadPriority(
|
|
253
|
+
computeLoadPriority() {
|
|
254
254
|
// We want the element's graphics to be updated as soon as possible
|
|
255
255
|
return 0;
|
|
256
256
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicIModelTile.js","sourceRoot":"","sources":["../../../src/tile/DynamicIModelTile.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\nimport {\r\n assert, BeTimePoint, ByteStream, compareStrings, DbOpcode, Id64, Id64Array, Id64String, partitionArray, SortedArray,\r\n} from \"@itwin/core-bentley\";\r\nimport { Range3d, Transform } from \"@itwin/core-geometry\";\r\nimport {\r\n BatchType, ElementGeometryChange, ElementGraphicsRequestProps, FeatureAppearance, FeatureAppearanceProvider, FeatureAppearanceSource, GeometryClass, TileFormat,\r\n} from \"@itwin/core-common\";\r\nimport { RenderSystem } from \"../render/RenderSystem\";\r\nimport { Viewport } from \"../Viewport\";\r\nimport { IModelApp } from \"../IModelApp\";\r\nimport {\r\n ImdlReader, IModelTileTree, RootIModelTile, Tile, TileContent, TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTree,\r\n} from \"./internal\";\r\n\r\n/** The root tile for the branch of an [[IModelTileTree]] containing graphics for elements that have been modified during the current\r\n * Not intended for direct consumption - exported for use by [[IModelTileTree]].\r\n * [[GraphicalEditingScope]].\r\n * @internal\r\n */\r\nexport abstract class DynamicIModelTile extends Tile {\r\n protected constructor(params: TileParams, tree: TileTree) {\r\n super(params, tree);\r\n }\r\n\r\n public static create(root: RootIModelTile, elements: Iterable<ElementGeometryChange>): DynamicIModelTile {\r\n return new RootTile(root, elements);\r\n }\r\n\r\n /** Updates the tiles when elements are modified during the editing scope. */\r\n public abstract handleGeometryChanges(changes: Iterable<ElementGeometryChange>): void;\r\n\r\n /** Overrides symbology of the *static* [[IModelTile]]s to hide elements that have been deleted or modified. */\r\n public abstract get appearanceProvider(): FeatureAppearanceProvider;\r\n\r\n /** Exposed strictly for tests. */\r\n public abstract get hiddenElements(): Id64Array;\r\n\r\n /** Select tiles for display, requesting content for tiles as necessary. */\r\n public abstract selectTiles(selected: Tile[], args: TileDrawArgs): void;\r\n\r\n /** Discard tiles that have not been used since the specified time point. */\r\n public abstract pruneChildren(olderThan: BeTimePoint): void;\r\n}\r\n\r\n/** The child tiles of the root tile, representing inserted or modified elements and sorted by element Id. */\r\nclass ElementTiles extends SortedArray<ElementTile> {\r\n public constructor() {\r\n super((lhs, rhs) => compareStrings(lhs.contentId, rhs.contentId));\r\n }\r\n\r\n public get array(): ElementTile[] {\r\n return this._array;\r\n }\r\n}\r\n\r\n/** The root tile. Each of its children represent a newly-inserted or modified element. */\r\nclass RootTile extends DynamicIModelTile implements FeatureAppearanceProvider {\r\n private readonly _hiddenElements: Id64.Uint32Set;\r\n public readonly transformToTree: Transform;\r\n private readonly _elements: ElementTiles;\r\n\r\n private get _imodelRoot() { return this.parent as RootIModelTile; }\r\n\r\n private get _elementChildren(): ElementTile[] {\r\n assert(undefined !== this.children);\r\n assert(this.children === this._elements.array);\r\n return this._elements.array;\r\n }\r\n\r\n public constructor(parent: RootIModelTile, elements: Iterable<ElementGeometryChange>) {\r\n const params: TileParams = {\r\n parent,\r\n isLeaf: false,\r\n contentId: \"dynamic\",\r\n range: Range3d.createNull(),\r\n maximumSize: parent.tileScreenSize,\r\n };\r\n\r\n super(params, parent.tree);\r\n\r\n this._hiddenElements = new Id64.Uint32Set();\r\n\r\n const inverseTransform = parent.tree.iModelTransform.inverse();\r\n assert(undefined !== inverseTransform);\r\n this.transformToTree = inverseTransform;\r\n\r\n this._elements = new ElementTiles();\r\n this.loadChildren(); // initially empty.\r\n assert(undefined !== this.children);\r\n\r\n this.setIsReady();\r\n this.handleGeometryChanges(elements);\r\n }\r\n\r\n public get hiddenElements(): Id64Array {\r\n return this._hiddenElements.toId64Array();\r\n }\r\n\r\n public get appearanceProvider(): FeatureAppearanceProvider {\r\n return this;\r\n }\r\n\r\n public getFeatureAppearance(source: FeatureAppearanceSource, elemLo: number, elemHi: number, subcatLo: number, subcatHi: number, geomClass: GeometryClass, modelLo: number, modelHi: number, type: BatchType, animationNodeId: number): FeatureAppearance | undefined {\r\n if (this._hiddenElements.has(elemLo, elemHi))\r\n return undefined;\r\n\r\n return source.getAppearance(elemLo, elemHi, subcatLo, subcatHi, geomClass, modelLo, modelHi, type, animationNodeId);\r\n }\r\n\r\n public handleGeometryChanges(changes: Iterable<ElementGeometryChange>): void {\r\n assert(undefined !== this.children);\r\n\r\n for (const change of changes) {\r\n if (change.type !== DbOpcode.Insert)\r\n this._hiddenElements.addId(change.id);\r\n\r\n let tile = this._elements.findEquivalent((t: ElementTile) => compareStrings(t.contentId, change.id));\r\n if (change.type === DbOpcode.Delete) {\r\n if (tile) {\r\n tile.dispose();\r\n this._elements.remove(tile);\r\n }\r\n } else {\r\n const range = change.range.isNull ? change.range.clone() : this.transformToTree.multiplyRange(change.range);\r\n if (tile)\r\n tile.update(range);\r\n else\r\n this._elements.insert(tile = new ElementTile(this, change.id, range));\r\n }\r\n }\r\n\r\n // Recompute range.\r\n this.range.setNull();\r\n for (const element of this._elements)\r\n this.range.extendRange(element.range);\r\n\r\n this._imodelRoot.updateDynamicRange(this);\r\n }\r\n\r\n protected _loadChildren(resolve: (children: Tile[] | undefined) => void, _reject: (errpr: Error) => void): void {\r\n // This is invoked from constructor. We will add a child per element later - for now just mark the children as having been loaded.\r\n resolve(this._elements.array);\r\n }\r\n\r\n public get channel(): TileRequestChannel {\r\n throw new Error(\"Root dynamic tile has no content\");\r\n }\r\n\r\n public async requestContent(): Promise<TileRequest.Response> {\r\n assert(false, \"Root dynamic tile has no content\");\r\n return undefined;\r\n }\r\n\r\n public async readContent(_data: TileRequest.ResponseData, _system: RenderSystem, _isCanceled: () => boolean): Promise<TileContent> {\r\n throw new Error(\"Root dynamic tile has no content\");\r\n }\r\n\r\n public selectTiles(selected: Tile[], args: TileDrawArgs): void {\r\n for (const child of this._elementChildren)\r\n child.selectTiles(selected, args);\r\n }\r\n\r\n public pruneChildren(olderThan: BeTimePoint): void {\r\n // Never discard ElementTiles - do discard not-recently-used graphics.\r\n for (const child of this._elementChildren)\r\n child.pruneChildren(olderThan);\r\n }\r\n}\r\n\r\n/** Represents a single element that has been inserted or had its geometric properties modified during the current [[GraphicalEditingScope]].\r\n * It has no graphics of its own; it has any number of child tiles, each of which have graphics of a different level of detail.\r\n * Its contentId is the element's Id.\r\n */\r\nclass ElementTile extends Tile {\r\n public constructor(parent: RootTile, elementId: Id64String, range: Range3d) {\r\n super({\r\n parent,\r\n isLeaf: false,\r\n contentId: elementId,\r\n range,\r\n maximumSize: parent.maximumSize,\r\n }, parent.tree);\r\n\r\n this.loadChildren();\r\n this.setIsReady();\r\n }\r\n\r\n protected _loadChildren(resolve: (children: Tile[] | undefined) => void, _reject: (error: Error) => void): void {\r\n // Invoked from constructor. We'll add child tiles later as needed.\r\n resolve([]);\r\n }\r\n\r\n public get channel(): TileRequestChannel {\r\n throw new Error(\"ElementTile has no content\");\r\n }\r\n\r\n public async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\r\n assert(false, \"ElementTile has no content\");\r\n return undefined;\r\n }\r\n\r\n public async readContent(_data: TileRequest.ResponseData, _system: RenderSystem, _isCanceled: () => boolean): Promise<TileContent> {\r\n throw new Error(\"ElementTile has no content\");\r\n }\r\n\r\n public pruneChildren(olderThan: BeTimePoint): void {\r\n const children = this.children as GraphicsTile[];\r\n assert(undefined !== children);\r\n\r\n const partitionIndex = partitionArray(children, (child) => !child.usageMarker.isExpired(olderThan));\r\n\r\n // Remove expired children.\r\n if (partitionIndex < children.length) {\r\n const expired = children.splice(partitionIndex);\r\n for (const child of expired)\r\n child.dispose();\r\n }\r\n\r\n // Restore ordering.\r\n children.sort((x, y) => y.toleranceLog10 - x.toleranceLog10);\r\n }\r\n\r\n public selectTiles(selected: Tile[], args: TileDrawArgs): void {\r\n assert(undefined !== this.children);\r\n if (this.isRegionCulled(args))\r\n return;\r\n\r\n args.markUsed(this);\r\n\r\n // ###TODO: Test content range culled.\r\n\r\n // Compute the ideal chord tolerance.\r\n assert(this.maximumSize > 0);\r\n const pixelSize = args.getPixelSizeInMetersAtClosestPoint(this);\r\n assert(pixelSize > 0);\r\n\r\n // Round down to the nearest power of ten.\r\n const toleranceLog10 = Math.floor(Math.log10(pixelSize));\r\n\r\n // Find (or create) a child tile of desired tolerance. Also find a child tile that can be substituted for the desired tile if that tile's content is not yet loaded.\r\n // NB: Children are sorted in descending order by log10(tolerance)\r\n const children = this.children as GraphicsTile[];\r\n let closestMatch: GraphicsTile | undefined;\r\n let exactMatch: GraphicsTile | undefined;\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n const tol = child.toleranceLog10;\r\n if (tol > toleranceLog10) {\r\n assert(undefined === exactMatch);\r\n if (child.hasGraphics)\r\n closestMatch = child;\r\n } else if (tol === toleranceLog10) {\r\n exactMatch = child;\r\n } else if (tol < toleranceLog10) {\r\n if (!exactMatch)\r\n children.splice(i++, 0, exactMatch = new GraphicsTile(this, toleranceLog10));\r\n\r\n if (child.hasGraphics && (!closestMatch || closestMatch.toleranceLog10 > toleranceLog10))\r\n closestMatch = child;\r\n }\r\n }\r\n\r\n if (!exactMatch) {\r\n assert(children.length === 0 || children[children.length - 1].toleranceLog10 > toleranceLog10);\r\n children.push(exactMatch = new GraphicsTile(this, toleranceLog10));\r\n }\r\n\r\n if (!exactMatch.isReady) {\r\n args.insertMissing(exactMatch);\r\n if (closestMatch) {\r\n selected.push(closestMatch);\r\n args.markUsed(closestMatch);\r\n }\r\n } else if (exactMatch.hasGraphics) {\r\n selected.push(exactMatch);\r\n args.markUsed(exactMatch);\r\n }\r\n }\r\n\r\n public update(range: Range3d): void {\r\n range.clone(this.range);\r\n\r\n // Discard out-dated graphics.\r\n assert(undefined !== this.children);\r\n for (const child of this.children)\r\n child.dispose();\r\n\r\n this.children.length = 0;\r\n }\r\n}\r\n\r\nfunction* makeIdSequence() {\r\n let current = 0;\r\n while (true) {\r\n if (current >= Number.MAX_SAFE_INTEGER)\r\n current = 0;\r\n\r\n yield ++current;\r\n }\r\n}\r\n\r\nconst requestIdSequence = makeIdSequence();\r\n\r\n/** Supplies graphics of a specific LOD for a single element. */\r\nclass GraphicsTile extends Tile {\r\n public readonly toleranceLog10: number;\r\n public readonly tolerance: number;\r\n\r\n public constructor(parent: ElementTile, toleranceLog10: number) {\r\n assert(Math.round(toleranceLog10) === toleranceLog10);\r\n super({\r\n parent,\r\n isLeaf: true,\r\n contentId: `${parent.contentId}_${toleranceLog10}`,\r\n range: parent.range,\r\n maximumSize: parent.maximumSize,\r\n }, parent.tree);\r\n\r\n this.toleranceLog10 = toleranceLog10;\r\n this.tolerance = 10 ** toleranceLog10;\r\n }\r\n\r\n public override computeLoadPriority(_viewports: Iterable<Viewport>): number {\r\n // We want the element's graphics to be updated as soon as possible\r\n return 0;\r\n }\r\n\r\n protected _loadChildren(resolve: (children: Tile[] | undefined) => void, _reject: (error: Error) => void): void {\r\n resolve(undefined);\r\n }\r\n\r\n public get channel(): TileRequestChannel {\r\n return IModelApp.tileAdmin.channels.elementGraphicsRpc;\r\n }\r\n\r\n public async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\r\n // ###TODO tree flags (enforce display priority)\r\n // ###TODO classifiers, animation\r\n\r\n assert(undefined !== this.parent);\r\n\r\n const requestId = requestIdSequence.next();\r\n assert(!requestId.done);\r\n\r\n assert(this.tree instanceof IModelTileTree);\r\n const idProvider = this.tree.contentIdProvider;\r\n\r\n const props: ElementGraphicsRequestProps = {\r\n id: requestId.value.toString(16),\r\n elementId: this.parent.contentId,\r\n toleranceLog10: this.toleranceLog10,\r\n formatVersion: idProvider.majorFormatVersion,\r\n location: this.tree.iModelTransform.toJSON(),\r\n contentFlags: idProvider.contentFlags,\r\n omitEdges: !this.tree.hasEdges,\r\n clipToProjectExtents: true,\r\n sectionCut: this.tree.stringifiedSectionClip,\r\n };\r\n\r\n return IModelApp.tileAdmin.requestElementGraphics(this.tree.iModel, props);\r\n }\r\n\r\n public async readContent(data: TileRequest.ResponseData, system: RenderSystem, isCanceled: () => boolean): Promise<TileContent> {\r\n if (undefined === isCanceled)\r\n isCanceled = () => !this.isLoading;\r\n\r\n assert(data instanceof Uint8Array);\r\n const stream = ByteStream.fromUint8Array(data);\r\n\r\n const position = stream.curPos;\r\n const format = stream.nextUint32;\r\n stream.curPos = position;\r\n\r\n // ###TODO: IModelGraphics format wraps IModel format.\r\n assert(TileFormat.IModel === format);\r\n\r\n const tree = this.tree;\r\n assert(tree instanceof IModelTileTree);\r\n const { iModel, modelId, is3d, containsTransformNodes } = tree;\r\n const reader = ImdlReader.create({\r\n stream, iModel, modelId, is3d, system, isCanceled, containsTransformNodes,\r\n type: tree.batchType,\r\n loadEdges: tree.hasEdges,\r\n options: { tileId: this.contentId },\r\n });\r\n\r\n let content: TileContent = { isLeaf: true };\r\n if (reader) {\r\n try {\r\n content = await reader.read();\r\n } catch {\r\n //\r\n }\r\n }\r\n\r\n return content;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"DynamicIModelTile.js","sourceRoot":"","sources":["../../../src/tile/DynamicIModelTile.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\nimport {\r\n assert, BeTimePoint, ByteStream, compareStrings, DbOpcode, Id64, Id64Array, Id64String, partitionArray, SortedArray,\r\n} from \"@itwin/core-bentley\";\r\nimport { Range3d, Transform } from \"@itwin/core-geometry\";\r\nimport {\r\n BatchType, ElementGeometryChange, ElementGraphicsRequestProps, FeatureAppearance, FeatureAppearanceProvider, FeatureAppearanceSource, GeometryClass, TileFormat,\r\n} from \"@itwin/core-common\";\r\nimport { RenderSystem } from \"../render/RenderSystem\";\r\nimport { IModelApp } from \"../IModelApp\";\r\nimport {\r\n ImdlReader, IModelTileTree, RootIModelTile, Tile, TileContent, TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTree,\r\n} from \"./internal\";\r\n\r\n/** The root tile for the branch of an [[IModelTileTree]] containing graphics for elements that have been modified during the current\r\n * Not intended for direct consumption - exported for use by [[IModelTileTree]].\r\n * [[GraphicalEditingScope]].\r\n * @internal\r\n */\r\nexport abstract class DynamicIModelTile extends Tile {\r\n protected constructor(params: TileParams, tree: TileTree) {\r\n super(params, tree);\r\n }\r\n\r\n public static create(root: RootIModelTile, elements: Iterable<ElementGeometryChange>): DynamicIModelTile {\r\n return new RootTile(root, elements);\r\n }\r\n\r\n /** Updates the tiles when elements are modified during the editing scope. */\r\n public abstract handleGeometryChanges(changes: Iterable<ElementGeometryChange>): void;\r\n\r\n /** Overrides symbology of the *static* [[IModelTile]]s to hide elements that have been deleted or modified. */\r\n public abstract get appearanceProvider(): FeatureAppearanceProvider;\r\n\r\n /** Exposed strictly for tests. */\r\n public abstract get hiddenElements(): Id64Array;\r\n\r\n /** Select tiles for display, requesting content for tiles as necessary. */\r\n public abstract selectTiles(selected: Tile[], args: TileDrawArgs): void;\r\n\r\n /** Discard tiles that have not been used since the specified time point. */\r\n public abstract pruneChildren(olderThan: BeTimePoint): void;\r\n}\r\n\r\n/** The child tiles of the root tile, representing inserted or modified elements and sorted by element Id. */\r\nclass ElementTiles extends SortedArray<ElementTile> {\r\n public constructor() {\r\n super((lhs, rhs) => compareStrings(lhs.contentId, rhs.contentId));\r\n }\r\n\r\n public get array(): ElementTile[] {\r\n return this._array;\r\n }\r\n}\r\n\r\n/** The root tile. Each of its children represent a newly-inserted or modified element. */\r\nclass RootTile extends DynamicIModelTile implements FeatureAppearanceProvider {\r\n private readonly _hiddenElements: Id64.Uint32Set;\r\n public readonly transformToTree: Transform;\r\n private readonly _elements: ElementTiles;\r\n\r\n private get _imodelRoot() { return this.parent as RootIModelTile; }\r\n\r\n private get _elementChildren(): ElementTile[] {\r\n assert(undefined !== this.children);\r\n assert(this.children === this._elements.array);\r\n return this._elements.array;\r\n }\r\n\r\n public constructor(parent: RootIModelTile, elements: Iterable<ElementGeometryChange>) {\r\n const params: TileParams = {\r\n parent,\r\n isLeaf: false,\r\n contentId: \"dynamic\",\r\n range: Range3d.createNull(),\r\n maximumSize: parent.tileScreenSize,\r\n };\r\n\r\n super(params, parent.tree);\r\n\r\n this._hiddenElements = new Id64.Uint32Set();\r\n\r\n const inverseTransform = parent.tree.iModelTransform.inverse();\r\n assert(undefined !== inverseTransform);\r\n this.transformToTree = inverseTransform;\r\n\r\n this._elements = new ElementTiles();\r\n this.loadChildren(); // initially empty.\r\n assert(undefined !== this.children);\r\n\r\n this.setIsReady();\r\n this.handleGeometryChanges(elements);\r\n }\r\n\r\n public get hiddenElements(): Id64Array {\r\n return this._hiddenElements.toId64Array();\r\n }\r\n\r\n public get appearanceProvider(): FeatureAppearanceProvider {\r\n return this;\r\n }\r\n\r\n public getFeatureAppearance(source: FeatureAppearanceSource, elemLo: number, elemHi: number, subcatLo: number, subcatHi: number, geomClass: GeometryClass, modelLo: number, modelHi: number, type: BatchType, animationNodeId: number): FeatureAppearance | undefined {\r\n if (this._hiddenElements.has(elemLo, elemHi))\r\n return undefined;\r\n\r\n return source.getAppearance(elemLo, elemHi, subcatLo, subcatHi, geomClass, modelLo, modelHi, type, animationNodeId);\r\n }\r\n\r\n public handleGeometryChanges(changes: Iterable<ElementGeometryChange>): void {\r\n assert(undefined !== this.children);\r\n\r\n for (const change of changes) {\r\n if (change.type !== DbOpcode.Insert)\r\n this._hiddenElements.addId(change.id);\r\n\r\n let tile = this._elements.findEquivalent((t: ElementTile) => compareStrings(t.contentId, change.id));\r\n if (change.type === DbOpcode.Delete) {\r\n if (tile) {\r\n tile.dispose();\r\n this._elements.remove(tile);\r\n }\r\n } else {\r\n const range = change.range.isNull ? change.range.clone() : this.transformToTree.multiplyRange(change.range);\r\n if (tile)\r\n tile.update(range);\r\n else\r\n this._elements.insert(tile = new ElementTile(this, change.id, range));\r\n }\r\n }\r\n\r\n // Recompute range.\r\n this.range.setNull();\r\n for (const element of this._elements)\r\n this.range.extendRange(element.range);\r\n\r\n this._imodelRoot.updateDynamicRange(this);\r\n }\r\n\r\n protected _loadChildren(resolve: (children: Tile[] | undefined) => void, _reject: (errpr: Error) => void): void {\r\n // This is invoked from constructor. We will add a child per element later - for now just mark the children as having been loaded.\r\n resolve(this._elements.array);\r\n }\r\n\r\n public get channel(): TileRequestChannel {\r\n throw new Error(\"Root dynamic tile has no content\");\r\n }\r\n\r\n public async requestContent(): Promise<TileRequest.Response> {\r\n assert(false, \"Root dynamic tile has no content\");\r\n return undefined;\r\n }\r\n\r\n public async readContent(_data: TileRequest.ResponseData, _system: RenderSystem, _isCanceled: () => boolean): Promise<TileContent> {\r\n throw new Error(\"Root dynamic tile has no content\");\r\n }\r\n\r\n public selectTiles(selected: Tile[], args: TileDrawArgs): void {\r\n for (const child of this._elementChildren)\r\n child.selectTiles(selected, args);\r\n }\r\n\r\n public pruneChildren(olderThan: BeTimePoint): void {\r\n // Never discard ElementTiles - do discard not-recently-used graphics.\r\n for (const child of this._elementChildren)\r\n child.pruneChildren(olderThan);\r\n }\r\n}\r\n\r\n/** Represents a single element that has been inserted or had its geometric properties modified during the current [[GraphicalEditingScope]].\r\n * It has no graphics of its own; it has any number of child tiles, each of which have graphics of a different level of detail.\r\n * Its contentId is the element's Id.\r\n */\r\nclass ElementTile extends Tile {\r\n public constructor(parent: RootTile, elementId: Id64String, range: Range3d) {\r\n super({\r\n parent,\r\n isLeaf: false,\r\n contentId: elementId,\r\n range,\r\n maximumSize: parent.maximumSize,\r\n }, parent.tree);\r\n\r\n this.loadChildren();\r\n this.setIsReady();\r\n }\r\n\r\n protected _loadChildren(resolve: (children: Tile[] | undefined) => void, _reject: (error: Error) => void): void {\r\n // Invoked from constructor. We'll add child tiles later as needed.\r\n resolve([]);\r\n }\r\n\r\n public get channel(): TileRequestChannel {\r\n throw new Error(\"ElementTile has no content\");\r\n }\r\n\r\n public async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\r\n assert(false, \"ElementTile has no content\");\r\n return undefined;\r\n }\r\n\r\n public async readContent(_data: TileRequest.ResponseData, _system: RenderSystem, _isCanceled: () => boolean): Promise<TileContent> {\r\n throw new Error(\"ElementTile has no content\");\r\n }\r\n\r\n public pruneChildren(olderThan: BeTimePoint): void {\r\n const children = this.children as GraphicsTile[];\r\n assert(undefined !== children);\r\n\r\n const partitionIndex = partitionArray(children, (child) => !child.usageMarker.isExpired(olderThan));\r\n\r\n // Remove expired children.\r\n if (partitionIndex < children.length) {\r\n const expired = children.splice(partitionIndex);\r\n for (const child of expired)\r\n child.dispose();\r\n }\r\n\r\n // Restore ordering.\r\n children.sort((x, y) => y.toleranceLog10 - x.toleranceLog10);\r\n }\r\n\r\n public selectTiles(selected: Tile[], args: TileDrawArgs): void {\r\n assert(undefined !== this.children);\r\n if (this.isRegionCulled(args))\r\n return;\r\n\r\n args.markUsed(this);\r\n\r\n // ###TODO: Test content range culled.\r\n\r\n // Compute the ideal chord tolerance.\r\n assert(this.maximumSize > 0);\r\n const pixelSize = args.getPixelSizeInMetersAtClosestPoint(this);\r\n assert(pixelSize > 0);\r\n\r\n // Round down to the nearest power of ten.\r\n const toleranceLog10 = Math.floor(Math.log10(pixelSize));\r\n\r\n // Find (or create) a child tile of desired tolerance. Also find a child tile that can be substituted for the desired tile if that tile's content is not yet loaded.\r\n // NB: Children are sorted in descending order by log10(tolerance)\r\n const children = this.children as GraphicsTile[];\r\n let closestMatch: GraphicsTile | undefined;\r\n let exactMatch: GraphicsTile | undefined;\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n const tol = child.toleranceLog10;\r\n if (tol > toleranceLog10) {\r\n assert(undefined === exactMatch);\r\n if (child.hasGraphics)\r\n closestMatch = child;\r\n } else if (tol === toleranceLog10) {\r\n exactMatch = child;\r\n } else if (tol < toleranceLog10) {\r\n if (!exactMatch)\r\n children.splice(i++, 0, exactMatch = new GraphicsTile(this, toleranceLog10));\r\n\r\n if (child.hasGraphics && (!closestMatch || closestMatch.toleranceLog10 > toleranceLog10))\r\n closestMatch = child;\r\n }\r\n }\r\n\r\n if (!exactMatch) {\r\n assert(children.length === 0 || children[children.length - 1].toleranceLog10 > toleranceLog10);\r\n children.push(exactMatch = new GraphicsTile(this, toleranceLog10));\r\n }\r\n\r\n if (!exactMatch.isReady) {\r\n args.insertMissing(exactMatch);\r\n if (closestMatch) {\r\n selected.push(closestMatch);\r\n args.markUsed(closestMatch);\r\n }\r\n } else if (exactMatch.hasGraphics) {\r\n selected.push(exactMatch);\r\n args.markUsed(exactMatch);\r\n }\r\n }\r\n\r\n public update(range: Range3d): void {\r\n range.clone(this.range);\r\n\r\n // Discard out-dated graphics.\r\n assert(undefined !== this.children);\r\n for (const child of this.children)\r\n child.dispose();\r\n\r\n this.children.length = 0;\r\n }\r\n}\r\n\r\nfunction* makeIdSequence() {\r\n let current = 0;\r\n while (true) {\r\n if (current >= Number.MAX_SAFE_INTEGER)\r\n current = 0;\r\n\r\n yield ++current;\r\n }\r\n}\r\n\r\nconst requestIdSequence = makeIdSequence();\r\n\r\n/** Supplies graphics of a specific LOD for a single element. */\r\nclass GraphicsTile extends Tile {\r\n public readonly toleranceLog10: number;\r\n public readonly tolerance: number;\r\n\r\n public constructor(parent: ElementTile, toleranceLog10: number) {\r\n assert(Math.round(toleranceLog10) === toleranceLog10);\r\n super({\r\n parent,\r\n isLeaf: true,\r\n contentId: `${parent.contentId}_${toleranceLog10}`,\r\n range: parent.range,\r\n maximumSize: parent.maximumSize,\r\n }, parent.tree);\r\n\r\n this.toleranceLog10 = toleranceLog10;\r\n this.tolerance = 10 ** toleranceLog10;\r\n }\r\n\r\n public override computeLoadPriority(): number {\r\n // We want the element's graphics to be updated as soon as possible\r\n return 0;\r\n }\r\n\r\n protected _loadChildren(resolve: (children: Tile[] | undefined) => void, _reject: (error: Error) => void): void {\r\n resolve(undefined);\r\n }\r\n\r\n public get channel(): TileRequestChannel {\r\n return IModelApp.tileAdmin.channels.elementGraphicsRpc;\r\n }\r\n\r\n public async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\r\n // ###TODO tree flags (enforce display priority)\r\n // ###TODO classifiers, animation\r\n\r\n assert(undefined !== this.parent);\r\n\r\n const requestId = requestIdSequence.next();\r\n assert(!requestId.done);\r\n\r\n assert(this.tree instanceof IModelTileTree);\r\n const idProvider = this.tree.contentIdProvider;\r\n\r\n const props: ElementGraphicsRequestProps = {\r\n id: requestId.value.toString(16),\r\n elementId: this.parent.contentId,\r\n toleranceLog10: this.toleranceLog10,\r\n formatVersion: idProvider.majorFormatVersion,\r\n location: this.tree.iModelTransform.toJSON(),\r\n contentFlags: idProvider.contentFlags,\r\n omitEdges: !this.tree.hasEdges,\r\n clipToProjectExtents: true,\r\n sectionCut: this.tree.stringifiedSectionClip,\r\n };\r\n\r\n return IModelApp.tileAdmin.requestElementGraphics(this.tree.iModel, props);\r\n }\r\n\r\n public async readContent(data: TileRequest.ResponseData, system: RenderSystem, isCanceled: () => boolean): Promise<TileContent> {\r\n if (undefined === isCanceled)\r\n isCanceled = () => !this.isLoading;\r\n\r\n assert(data instanceof Uint8Array);\r\n const stream = ByteStream.fromUint8Array(data);\r\n\r\n const position = stream.curPos;\r\n const format = stream.nextUint32;\r\n stream.curPos = position;\r\n\r\n // ###TODO: IModelGraphics format wraps IModel format.\r\n assert(TileFormat.IModel === format);\r\n\r\n const tree = this.tree;\r\n assert(tree instanceof IModelTileTree);\r\n const { iModel, modelId, is3d, containsTransformNodes } = tree;\r\n const reader = ImdlReader.create({\r\n stream, iModel, modelId, is3d, system, isCanceled, containsTransformNodes,\r\n type: tree.batchType,\r\n loadEdges: tree.hasEdges,\r\n options: { tileId: this.contentId },\r\n });\r\n\r\n let content: TileContent = { isLeaf: true };\r\n if (reader) {\r\n try {\r\n content = await reader.read();\r\n } catch {\r\n //\r\n }\r\n }\r\n\r\n return content;\r\n }\r\n}\r\n"]}
|
|
@@ -4,34 +4,34 @@
|
|
|
4
4
|
import { ReadonlySortedArray, SortedArray } from "@itwin/core-bentley";
|
|
5
5
|
import { RenderMemory } from "../render/RenderMemory";
|
|
6
6
|
import { Tile } from "./internal";
|
|
7
|
-
/** Maintains in sorted order a set of
|
|
7
|
+
/** Maintains in sorted order a set of [[TileUser]] Ids for which a given tile has been selected for display. The number of users in a set is expected to be very small - often only 1 for a typical application.
|
|
8
8
|
* Strictly for use by LRUTileList.
|
|
9
|
-
* @see
|
|
9
|
+
* @see TileUserIdSets.
|
|
10
10
|
* @internal
|
|
11
11
|
*/
|
|
12
|
-
export declare class
|
|
13
|
-
constructor(
|
|
14
|
-
equals(set:
|
|
15
|
-
add(
|
|
16
|
-
drop(
|
|
12
|
+
export declare class TileUserIdSet extends ReadonlySortedArray<number> {
|
|
13
|
+
constructor(userId?: number);
|
|
14
|
+
equals(set: TileUserIdSet): boolean;
|
|
15
|
+
add(userId: number): void;
|
|
16
|
+
drop(userId: number): void;
|
|
17
17
|
clear(): void;
|
|
18
|
-
copyFrom(src:
|
|
19
|
-
clone():
|
|
18
|
+
copyFrom(src: TileUserIdSet): void;
|
|
19
|
+
clone(): TileUserIdSet;
|
|
20
20
|
}
|
|
21
|
-
/** Maintains a set of
|
|
21
|
+
/** Maintains a set of TileUserIdSets such that each set represents a unique combination of TileUser ids and each set contains at least one TileUser id.
|
|
22
22
|
* Exported strictly for tests.
|
|
23
23
|
* @see LRUTileList.
|
|
24
24
|
* @internal
|
|
25
25
|
*/
|
|
26
|
-
export declare class
|
|
26
|
+
export declare class TileUserIdSets extends SortedArray<TileUserIdSet> {
|
|
27
27
|
private readonly _scratch;
|
|
28
28
|
constructor();
|
|
29
|
-
/** Remove the specified
|
|
30
|
-
drop(
|
|
31
|
-
/** Obtain a
|
|
32
|
-
plus(
|
|
33
|
-
/** Obtain a
|
|
34
|
-
minus(
|
|
29
|
+
/** Remove the specified TileUser Id from all sets and remove empty and duplicate sets. */
|
|
30
|
+
drop(userId: number): void;
|
|
31
|
+
/** Obtain a TileUserIdSet owned by this object containing userId and (if specified) userIds. */
|
|
32
|
+
plus(userId: number, userIds?: TileUserIdSet): TileUserIdSet;
|
|
33
|
+
/** Obtain a TileUserIdSet owned by this object containing all of userIds (if specified) but not userId. Returns undefined if the resultant set would be empty. */
|
|
34
|
+
minus(userId: number, userIds?: TileUserIdSet): TileUserIdSet | undefined;
|
|
35
35
|
private scratch;
|
|
36
36
|
private getEquivalent;
|
|
37
37
|
}
|
|
@@ -44,12 +44,12 @@ export interface LRUTileListNode {
|
|
|
44
44
|
next?: LRUTileListNode;
|
|
45
45
|
/** The number of bytes of GPU memory allocated to the tile's content. The only node in a LRUTileListNode with `bytesUsed` less than 1 is the sentinel node. */
|
|
46
46
|
bytesUsed: number;
|
|
47
|
-
/** For a tile, the Ids of all of the
|
|
48
|
-
* Undefined if the tile is not
|
|
47
|
+
/** For a tile, the Ids of all of the TileUsers for which the tile is currently in use. The TileUserIdSet is owned by the LRUTileList's TileUserIdSets member.
|
|
48
|
+
* Undefined if the tile is not in use by any TileUser.
|
|
49
49
|
*/
|
|
50
|
-
|
|
50
|
+
tileUserIds?: TileUserIdSet | undefined;
|
|
51
51
|
}
|
|
52
|
-
/** An intrusive doubly-linked list of LRUTileListNodes, containing Tiles partitioned by a singleton sentinel node into two partitions and ordered from least-recently- to most-recently-
|
|
52
|
+
/** An intrusive doubly-linked list of LRUTileListNodes, containing Tiles partitioned by a singleton sentinel node into two partitions and ordered from least-recently- to most-recently-used by any TileUser.
|
|
53
53
|
* Used by TileAdmin to keep track of and impose limits upon the total amount of GPU memory allocated to tile content.
|
|
54
54
|
*
|
|
55
55
|
* Illustration of the structure of the list:
|
|
@@ -70,8 +70,8 @@ export interface LRUTileListNode {
|
|
|
70
70
|
*
|
|
71
71
|
* - When a tile's content is loaded, it is added to the end of the "not selected" partition. Its memory usage is computed and added to the list's total.
|
|
72
72
|
* - When a tile's content is unloaded, it is removed from the list. Its memory usage is deducted from the list's totla.
|
|
73
|
-
* - Just before a Viewport selects tiles for display, it is removed from each tile's set of viewports in which they are selected. If a tile's set of
|
|
74
|
-
* - When a tile becomes selected for
|
|
73
|
+
* - Just before a TileUser selects tiles for use (e.g., Viewport selects tiles for display), it is removed from each tile's set of viewports in which they are selected. If a tile's set of users becomes empty as a result, it is moved to the end of the "not selected" partition.
|
|
74
|
+
* - When a tile becomes selected for use by a TileUser, the user is added to its user set and the tile is moved to the end of the "selected" partition.
|
|
75
75
|
*
|
|
76
76
|
* When the system determines that GPU memory should be freed up, it can simply pop nodes off the beginning of the "not selected" partition, freeing their content, until the target memory usage is reached or no more non-selected nodes exist.
|
|
77
77
|
*
|
|
@@ -81,7 +81,7 @@ export interface LRUTileListNode {
|
|
|
81
81
|
export declare class LRUTileList {
|
|
82
82
|
protected readonly _sentinel: LRUTileListNode;
|
|
83
83
|
protected readonly _stats: RenderMemory.Statistics;
|
|
84
|
-
protected readonly
|
|
84
|
+
protected readonly _userIdSets: TileUserIdSets;
|
|
85
85
|
protected _head: LRUTileListNode;
|
|
86
86
|
protected _tail: LRUTileListNode;
|
|
87
87
|
protected _totalBytesUsed: number;
|
|
@@ -97,12 +97,12 @@ export declare class LRUTileList {
|
|
|
97
97
|
* Invoked by TileAdmin when a tile's content is unloaded, including when the list itself disposes of the content in its `freeMemory` method.
|
|
98
98
|
*/
|
|
99
99
|
drop(tile: Tile): void;
|
|
100
|
-
/** Mark the tiles as
|
|
101
|
-
|
|
102
|
-
/** Mark the tiles as no longer
|
|
103
|
-
* If this results in a tile being no longer selected for any
|
|
100
|
+
/** Mark the tiles as in use by the specified TileUser. They are moved to the end of the "selected" partition. */
|
|
101
|
+
markUsed(userId: number, tiles: Iterable<Tile>): void;
|
|
102
|
+
/** Mark the tiles as no longer in user by the specified TileUser.
|
|
103
|
+
* If this results in a tile being no longer selected for any user, it is moved to the end of the "not selected" partition.
|
|
104
104
|
*/
|
|
105
|
-
|
|
105
|
+
clearUsed(userId: number): void;
|
|
106
106
|
/** Dispose of the contents of tiles currently not selected for display until the total amount of memory consumed is no more than `maxBytes`
|
|
107
107
|
* or until the contents of all un-selected tiles have been disposed.
|
|
108
108
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LRUTileList.d.ts","sourceRoot":"","sources":["../../../src/tile/LRUTileList.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAU,mBAAmB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,mBAAmB,CAAC,MAAM,CAAC;gBACzC,
|
|
1
|
+
{"version":3,"file":"LRUTileList.d.ts","sourceRoot":"","sources":["../../../src/tile/LRUTileList.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,19 +7,19 @@
|
|
|
7
7
|
* @module Tiles
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.LRUTileList = exports.
|
|
10
|
+
exports.LRUTileList = exports.TileUserIdSets = exports.TileUserIdSet = void 0;
|
|
11
11
|
const core_bentley_1 = require("@itwin/core-bentley");
|
|
12
12
|
const RenderMemory_1 = require("../render/RenderMemory");
|
|
13
|
-
/** Maintains in sorted order a set of
|
|
13
|
+
/** Maintains in sorted order a set of [[TileUser]] Ids for which a given tile has been selected for display. The number of users in a set is expected to be very small - often only 1 for a typical application.
|
|
14
14
|
* Strictly for use by LRUTileList.
|
|
15
|
-
* @see
|
|
15
|
+
* @see TileUserIdSets.
|
|
16
16
|
* @internal
|
|
17
17
|
*/
|
|
18
|
-
class
|
|
19
|
-
constructor(
|
|
18
|
+
class TileUserIdSet extends core_bentley_1.ReadonlySortedArray {
|
|
19
|
+
constructor(userId) {
|
|
20
20
|
super((lhs, rhs) => lhs - rhs);
|
|
21
|
-
if (undefined !==
|
|
22
|
-
this._array.push(
|
|
21
|
+
if (undefined !== userId)
|
|
22
|
+
this._array.push(userId);
|
|
23
23
|
}
|
|
24
24
|
equals(set) {
|
|
25
25
|
if (this.length !== set.length)
|
|
@@ -29,11 +29,11 @@ class ViewportIdSet extends core_bentley_1.ReadonlySortedArray {
|
|
|
29
29
|
return false;
|
|
30
30
|
return true;
|
|
31
31
|
}
|
|
32
|
-
add(
|
|
33
|
-
this._insert(
|
|
32
|
+
add(userId) {
|
|
33
|
+
this._insert(userId);
|
|
34
34
|
}
|
|
35
|
-
drop(
|
|
36
|
-
this._remove(
|
|
35
|
+
drop(userId) {
|
|
36
|
+
this._remove(userId);
|
|
37
37
|
}
|
|
38
38
|
clear() {
|
|
39
39
|
this._clear();
|
|
@@ -41,22 +41,22 @@ class ViewportIdSet extends core_bentley_1.ReadonlySortedArray {
|
|
|
41
41
|
copyFrom(src) {
|
|
42
42
|
this._array.length = src.length;
|
|
43
43
|
let i = 0;
|
|
44
|
-
for (const
|
|
45
|
-
this._array[i++] =
|
|
44
|
+
for (const userId of src)
|
|
45
|
+
this._array[i++] = userId;
|
|
46
46
|
}
|
|
47
47
|
clone() {
|
|
48
|
-
const clone = new
|
|
48
|
+
const clone = new TileUserIdSet();
|
|
49
49
|
clone.copyFrom(this);
|
|
50
50
|
return clone;
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
-
exports.
|
|
54
|
-
/** Maintains a set of
|
|
53
|
+
exports.TileUserIdSet = TileUserIdSet;
|
|
54
|
+
/** Maintains a set of TileUserIdSets such that each set represents a unique combination of TileUser ids and each set contains at least one TileUser id.
|
|
55
55
|
* Exported strictly for tests.
|
|
56
56
|
* @see LRUTileList.
|
|
57
57
|
* @internal
|
|
58
58
|
*/
|
|
59
|
-
class
|
|
59
|
+
class TileUserIdSets extends core_bentley_1.SortedArray {
|
|
60
60
|
constructor() {
|
|
61
61
|
super((lhs, rhs) => {
|
|
62
62
|
if (lhs === rhs)
|
|
@@ -73,15 +73,15 @@ class ViewportIdSets extends core_bentley_1.SortedArray {
|
|
|
73
73
|
}
|
|
74
74
|
return 0;
|
|
75
75
|
});
|
|
76
|
-
this._scratch = new
|
|
76
|
+
this._scratch = new TileUserIdSet();
|
|
77
77
|
}
|
|
78
|
-
/** Remove the specified
|
|
79
|
-
drop(
|
|
78
|
+
/** Remove the specified TileUser Id from all sets and remove empty and duplicate sets. */
|
|
79
|
+
drop(userId) {
|
|
80
80
|
// Remove from all sets, and delete empty sets.
|
|
81
81
|
let i = 0;
|
|
82
82
|
for ( /* */; i < this._array.length; i++) {
|
|
83
83
|
const set = this._array[i];
|
|
84
|
-
set.drop(
|
|
84
|
+
set.drop(userId);
|
|
85
85
|
if (set.length === 0)
|
|
86
86
|
this._array.splice(i, 1);
|
|
87
87
|
}
|
|
@@ -97,22 +97,22 @@ class ViewportIdSets extends core_bentley_1.SortedArray {
|
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
|
-
/** Obtain a
|
|
101
|
-
plus(
|
|
102
|
-
const scratch = this.scratch(
|
|
103
|
-
scratch.add(
|
|
100
|
+
/** Obtain a TileUserIdSet owned by this object containing userId and (if specified) userIds. */
|
|
101
|
+
plus(userId, userIds) {
|
|
102
|
+
const scratch = this.scratch(userIds);
|
|
103
|
+
scratch.add(userId);
|
|
104
104
|
return this.getEquivalent(scratch);
|
|
105
105
|
}
|
|
106
|
-
/** Obtain a
|
|
107
|
-
minus(
|
|
108
|
-
const scratch = this.scratch(
|
|
109
|
-
scratch.drop(
|
|
106
|
+
/** Obtain a TileUserIdSet owned by this object containing all of userIds (if specified) but not userId. Returns undefined if the resultant set would be empty. */
|
|
107
|
+
minus(userId, userIds) {
|
|
108
|
+
const scratch = this.scratch(userIds);
|
|
109
|
+
scratch.drop(userId);
|
|
110
110
|
return scratch.length > 0 ? this.getEquivalent(scratch) : undefined;
|
|
111
111
|
}
|
|
112
|
-
scratch(
|
|
112
|
+
scratch(userIds) {
|
|
113
113
|
const scratch = this._scratch;
|
|
114
|
-
if (
|
|
115
|
-
scratch.copyFrom(
|
|
114
|
+
if (userIds)
|
|
115
|
+
scratch.copyFrom(userIds);
|
|
116
116
|
else
|
|
117
117
|
scratch.clear();
|
|
118
118
|
return scratch;
|
|
@@ -127,7 +127,7 @@ class ViewportIdSets extends core_bentley_1.SortedArray {
|
|
|
127
127
|
return newSet;
|
|
128
128
|
}
|
|
129
129
|
}
|
|
130
|
-
exports.
|
|
130
|
+
exports.TileUserIdSets = TileUserIdSets;
|
|
131
131
|
function isLinked(node) {
|
|
132
132
|
return undefined !== node.previous || undefined !== node.next;
|
|
133
133
|
}
|
|
@@ -139,7 +139,7 @@ function* lruListIterator(start, end) {
|
|
|
139
139
|
yield prev;
|
|
140
140
|
}
|
|
141
141
|
}
|
|
142
|
-
/** An intrusive doubly-linked list of LRUTileListNodes, containing Tiles partitioned by a singleton sentinel node into two partitions and ordered from least-recently- to most-recently-
|
|
142
|
+
/** An intrusive doubly-linked list of LRUTileListNodes, containing Tiles partitioned by a singleton sentinel node into two partitions and ordered from least-recently- to most-recently-used by any TileUser.
|
|
143
143
|
* Used by TileAdmin to keep track of and impose limits upon the total amount of GPU memory allocated to tile content.
|
|
144
144
|
*
|
|
145
145
|
* Illustration of the structure of the list:
|
|
@@ -160,8 +160,8 @@ function* lruListIterator(start, end) {
|
|
|
160
160
|
*
|
|
161
161
|
* - When a tile's content is loaded, it is added to the end of the "not selected" partition. Its memory usage is computed and added to the list's total.
|
|
162
162
|
* - When a tile's content is unloaded, it is removed from the list. Its memory usage is deducted from the list's totla.
|
|
163
|
-
* - Just before a Viewport selects tiles for display, it is removed from each tile's set of viewports in which they are selected. If a tile's set of
|
|
164
|
-
* - When a tile becomes selected for
|
|
163
|
+
* - Just before a TileUser selects tiles for use (e.g., Viewport selects tiles for display), it is removed from each tile's set of viewports in which they are selected. If a tile's set of users becomes empty as a result, it is moved to the end of the "not selected" partition.
|
|
164
|
+
* - When a tile becomes selected for use by a TileUser, the user is added to its user set and the tile is moved to the end of the "selected" partition.
|
|
165
165
|
*
|
|
166
166
|
* When the system determines that GPU memory should be freed up, it can simply pop nodes off the beginning of the "not selected" partition, freeing their content, until the target memory usage is reached or no more non-selected nodes exist.
|
|
167
167
|
*
|
|
@@ -171,7 +171,7 @@ function* lruListIterator(start, end) {
|
|
|
171
171
|
class LRUTileList {
|
|
172
172
|
constructor() {
|
|
173
173
|
this._stats = new RenderMemory_1.RenderMemory.Statistics();
|
|
174
|
-
this.
|
|
174
|
+
this._userIdSets = new TileUserIdSets();
|
|
175
175
|
this._totalBytesUsed = 0;
|
|
176
176
|
this._head = this._tail = this._sentinel = { bytesUsed: 0 };
|
|
177
177
|
}
|
|
@@ -186,12 +186,12 @@ class LRUTileList {
|
|
|
186
186
|
next = node.next;
|
|
187
187
|
node.previous = node.next = undefined;
|
|
188
188
|
node.bytesUsed = 0;
|
|
189
|
-
node.
|
|
189
|
+
node.tileUserIds = undefined;
|
|
190
190
|
node = next;
|
|
191
191
|
}
|
|
192
192
|
this._head = this._tail = this._sentinel;
|
|
193
193
|
this._totalBytesUsed = 0;
|
|
194
|
-
this.
|
|
194
|
+
this._userIdSets.clear();
|
|
195
195
|
}
|
|
196
196
|
/** Compute the amount of GPU memory allocated to the tile's content and, if greater than zero, add the tile to the end of the "not selected" partition.
|
|
197
197
|
* Invoked by TileAdmin whenever a tile's content is set to a valid RenderGraphic.
|
|
@@ -201,7 +201,7 @@ class LRUTileList {
|
|
|
201
201
|
if (isLinked(tile))
|
|
202
202
|
return;
|
|
203
203
|
(0, core_bentley_1.assert)(tile.bytesUsed === 0);
|
|
204
|
-
(0, core_bentley_1.assert)(tile.
|
|
204
|
+
(0, core_bentley_1.assert)(tile.tileUserIds === undefined);
|
|
205
205
|
this._stats.clear();
|
|
206
206
|
tile.collectStatistics(this._stats, false);
|
|
207
207
|
tile.bytesUsed = this.computeBytesUsed(tile);
|
|
@@ -225,33 +225,33 @@ class LRUTileList {
|
|
|
225
225
|
this._totalBytesUsed -= tile.bytesUsed;
|
|
226
226
|
(0, core_bentley_1.assert)(this._totalBytesUsed >= 0);
|
|
227
227
|
this.unlink(tile);
|
|
228
|
-
tile.
|
|
228
|
+
tile.tileUserIds = undefined;
|
|
229
229
|
tile.bytesUsed = 0;
|
|
230
230
|
this.assertList();
|
|
231
231
|
}
|
|
232
|
-
/** Mark the tiles as
|
|
233
|
-
|
|
232
|
+
/** Mark the tiles as in use by the specified TileUser. They are moved to the end of the "selected" partition. */
|
|
233
|
+
markUsed(userId, tiles) {
|
|
234
234
|
for (const tile of tiles) {
|
|
235
235
|
if (tile.bytesUsed <= 0)
|
|
236
236
|
continue;
|
|
237
237
|
(0, core_bentley_1.assert)(isLinked(tile));
|
|
238
238
|
if (isLinked(tile)) {
|
|
239
|
-
tile.
|
|
239
|
+
tile.tileUserIds = this._userIdSets.plus(userId, tile.tileUserIds);
|
|
240
240
|
this.moveToEnd(tile);
|
|
241
241
|
}
|
|
242
242
|
}
|
|
243
243
|
}
|
|
244
|
-
/** Mark the tiles as no longer
|
|
245
|
-
* If this results in a tile being no longer selected for any
|
|
244
|
+
/** Mark the tiles as no longer in user by the specified TileUser.
|
|
245
|
+
* If this results in a tile being no longer selected for any user, it is moved to the end of the "not selected" partition.
|
|
246
246
|
*/
|
|
247
|
-
|
|
248
|
-
this.
|
|
247
|
+
clearUsed(userId) {
|
|
248
|
+
this._userIdSets.drop(userId);
|
|
249
249
|
let prev = this._sentinel;
|
|
250
250
|
while (prev && prev.next) {
|
|
251
251
|
const tile = prev.next;
|
|
252
252
|
(0, core_bentley_1.assert)(tile !== this._sentinel);
|
|
253
|
-
tile.
|
|
254
|
-
if (undefined === tile.
|
|
253
|
+
tile.tileUserIds = this._userIdSets.minus(userId, tile.tileUserIds);
|
|
254
|
+
if (undefined === tile.tileUserIds)
|
|
255
255
|
this.moveBeforeSentinel(tile);
|
|
256
256
|
else
|
|
257
257
|
prev = tile;
|