@itwin/frontend-tiles 3.7.4 → 4.0.0-dev.100

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 (90) hide show
  1. package/.rush/temp/operation/build/all.log +3 -0
  2. package/.rush/temp/operation/build/state.json +3 -0
  3. package/.rush/temp/{package-deps_build_ci.json → package-deps_build.json} +11 -10
  4. package/.rush/temp/shrinkwrap-deps.json +195 -46
  5. package/config/rush-project.json +1 -2
  6. package/lib/cjs/BatchedModels.d.ts +16 -0
  7. package/lib/cjs/BatchedModels.d.ts.map +1 -0
  8. package/lib/cjs/BatchedModels.js +48 -0
  9. package/lib/cjs/BatchedModels.js.map +1 -0
  10. package/lib/cjs/BatchedSpatialTileTreeRefs.d.ts +4 -4
  11. package/lib/cjs/BatchedSpatialTileTreeRefs.d.ts.map +1 -1
  12. package/lib/cjs/BatchedSpatialTileTreeRefs.js +180 -133
  13. package/lib/cjs/BatchedSpatialTileTreeRefs.js.map +1 -1
  14. package/lib/cjs/BatchedTile.d.ts +24 -24
  15. package/lib/cjs/BatchedTile.d.ts.map +1 -1
  16. package/lib/cjs/BatchedTile.js +168 -168
  17. package/lib/cjs/BatchedTile.js.map +1 -1
  18. package/lib/cjs/BatchedTileContentReader.d.ts +22 -22
  19. package/lib/cjs/BatchedTileContentReader.js +74 -76
  20. package/lib/cjs/BatchedTileContentReader.js.map +1 -1
  21. package/lib/cjs/BatchedTileTree.d.ts +24 -22
  22. package/lib/cjs/BatchedTileTree.d.ts.map +1 -1
  23. package/lib/cjs/BatchedTileTree.js +53 -52
  24. package/lib/cjs/BatchedTileTree.js.map +1 -1
  25. package/lib/cjs/BatchedTileTreeReference.d.ts +33 -21
  26. package/lib/cjs/BatchedTileTreeReference.d.ts.map +1 -1
  27. package/lib/cjs/BatchedTileTreeReference.js +74 -73
  28. package/lib/cjs/BatchedTileTreeReference.js.map +1 -1
  29. package/lib/cjs/BatchedTileTreeSupplier.d.ts +9 -5
  30. package/lib/cjs/BatchedTileTreeSupplier.d.ts.map +1 -1
  31. package/lib/cjs/BatchedTileTreeSupplier.js +40 -38
  32. package/lib/cjs/BatchedTileTreeSupplier.js.map +1 -1
  33. package/lib/cjs/BatchedTilesetReader.d.ts +13 -13
  34. package/lib/cjs/BatchedTilesetReader.js +87 -88
  35. package/lib/cjs/BatchedTilesetReader.js.map +1 -1
  36. package/lib/cjs/FrontendTiles.d.ts +32 -32
  37. package/lib/cjs/FrontendTiles.d.ts.map +1 -1
  38. package/lib/cjs/FrontendTiles.js +26 -26
  39. package/lib/cjs/LoggerCategory.d.ts +2 -2
  40. package/lib/cjs/LoggerCategory.js +9 -9
  41. package/lib/cjs/frontend-tiles.d.ts +1 -1
  42. package/lib/cjs/frontend-tiles.js +21 -17
  43. package/lib/cjs/frontend-tiles.js.map +1 -1
  44. package/lib/cjs/tsconfig.tsbuildinfo +1 -1
  45. package/lib/esm/BatchedModels.d.ts +16 -0
  46. package/lib/esm/BatchedModels.d.ts.map +1 -0
  47. package/lib/esm/BatchedModels.js +44 -0
  48. package/lib/esm/BatchedModels.js.map +1 -0
  49. package/lib/esm/BatchedSpatialTileTreeRefs.d.ts +4 -4
  50. package/lib/esm/BatchedSpatialTileTreeRefs.d.ts.map +1 -1
  51. package/lib/esm/BatchedSpatialTileTreeRefs.js +176 -129
  52. package/lib/esm/BatchedSpatialTileTreeRefs.js.map +1 -1
  53. package/lib/esm/BatchedTile.d.ts +24 -24
  54. package/lib/esm/BatchedTile.d.ts.map +1 -1
  55. package/lib/esm/BatchedTile.js +164 -164
  56. package/lib/esm/BatchedTile.js.map +1 -1
  57. package/lib/esm/BatchedTileContentReader.d.ts +22 -22
  58. package/lib/esm/BatchedTileContentReader.js +70 -72
  59. package/lib/esm/BatchedTileContentReader.js.map +1 -1
  60. package/lib/esm/BatchedTileTree.d.ts +24 -22
  61. package/lib/esm/BatchedTileTree.d.ts.map +1 -1
  62. package/lib/esm/BatchedTileTree.js +49 -48
  63. package/lib/esm/BatchedTileTree.js.map +1 -1
  64. package/lib/esm/BatchedTileTreeReference.d.ts +33 -21
  65. package/lib/esm/BatchedTileTreeReference.d.ts.map +1 -1
  66. package/lib/esm/BatchedTileTreeReference.js +68 -69
  67. package/lib/esm/BatchedTileTreeReference.js.map +1 -1
  68. package/lib/esm/BatchedTileTreeSupplier.d.ts +9 -5
  69. package/lib/esm/BatchedTileTreeSupplier.d.ts.map +1 -1
  70. package/lib/esm/BatchedTileTreeSupplier.js +36 -34
  71. package/lib/esm/BatchedTileTreeSupplier.js.map +1 -1
  72. package/lib/esm/BatchedTilesetReader.d.ts +13 -13
  73. package/lib/esm/BatchedTilesetReader.js +83 -84
  74. package/lib/esm/BatchedTilesetReader.js.map +1 -1
  75. package/lib/esm/FrontendTiles.d.ts +32 -32
  76. package/lib/esm/FrontendTiles.d.ts.map +1 -1
  77. package/lib/esm/FrontendTiles.js +21 -21
  78. package/lib/esm/LoggerCategory.d.ts +2 -2
  79. package/lib/esm/LoggerCategory.js +6 -6
  80. package/lib/esm/frontend-tiles.d.ts +1 -1
  81. package/lib/esm/frontend-tiles.js +5 -5
  82. package/lib/esm/tsconfig.tsbuildinfo +1 -1
  83. package/package.json +18 -19
  84. package/src/BatchedModels.ts +58 -0
  85. package/src/BatchedSpatialTileTreeRefs.ts +79 -13
  86. package/src/BatchedTile.ts +1 -0
  87. package/src/BatchedTileTree.ts +4 -1
  88. package/src/BatchedTileTreeReference.ts +69 -58
  89. package/src/BatchedTileTreeSupplier.ts +15 -8
  90. package/.rush/temp/operation/build_ci/state.json +0 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/frontend-tiles",
3
- "version": "3.7.4",
3
+ "version": "4.0.0-dev.100",
4
4
  "description": "Experimental alternative technique for visualizing the contents of iModels",
5
5
  "main": "lib/cjs/frontend-tiles.js",
6
6
  "module": "lib/esm/frontend-tiles.js",
@@ -8,7 +8,8 @@
8
8
  "license": "MIT",
9
9
  "repository": {
10
10
  "type": "git",
11
- "url": "https://github.com/iTwin/itwinjs-core/tree/master/extensions/frontend-tiles"
11
+ "url": "https://github.com/iTwin/itwinjs-core.git",
12
+ "directory": "extensions/frontend-tiles"
12
13
  },
13
14
  "keywords": [
14
15
  "Bentley",
@@ -22,22 +23,22 @@
22
23
  "url": "http://www.bentley.com"
23
24
  },
24
25
  "peerDependencies": {
25
- "@itwin/core-bentley": "3.7.4",
26
- "@itwin/core-common": "3.7.4",
27
- "@itwin/core-frontend": "3.7.4",
28
- "@itwin/core-geometry": "3.7.4"
26
+ "@itwin/core-bentley": "4.0.0-dev.100",
27
+ "@itwin/core-common": "4.0.0-dev.100",
28
+ "@itwin/core-frontend": "4.0.0-dev.100",
29
+ "@itwin/core-geometry": "4.0.0-dev.100"
29
30
  },
30
31
  "devDependencies": {
31
- "@itwin/build-tools": "3.7.4",
32
- "@itwin/core-bentley": "3.7.4",
33
- "@itwin/core-common": "3.7.4",
34
- "@itwin/core-frontend": "3.7.4",
35
- "@itwin/core-geometry": "3.7.4",
36
- "@itwin/eslint-plugin": "3.7.4",
37
- "@types/node": "18.11.5",
38
- "eslint": "^7.11.0",
32
+ "@itwin/eslint-plugin": "^4.0.0-dev.33",
33
+ "@types/node": "^18.11.5",
34
+ "eslint": "^8.36.0",
39
35
  "rimraf": "^3.0.2",
40
- "typescript": "~4.4.0"
36
+ "typescript": "~5.0.2",
37
+ "@itwin/build-tools": "4.0.0-dev.100",
38
+ "@itwin/core-bentley": "4.0.0-dev.100",
39
+ "@itwin/core-common": "4.0.0-dev.100",
40
+ "@itwin/core-frontend": "4.0.0-dev.100",
41
+ "@itwin/core-geometry": "4.0.0-dev.100"
41
42
  },
42
43
  "eslintConfig": {
43
44
  "plugins": [
@@ -46,8 +47,7 @@
46
47
  "extends": "plugin:@itwin/itwinjs-recommended"
47
48
  },
48
49
  "scripts": {
49
- "build": "npm run -s build:cjs",
50
- "build:ci": "npm run -s build && npm run -s build:esm",
50
+ "build": "npm run -s build:cjs && npm run -s build:esm",
51
51
  "build:cjs": "tsc 1>&2 --outDir lib/cjs",
52
52
  "build:esm": "tsc 1>&2 --module ES2020 --outDir lib/esm",
53
53
  "clean": "rimraf lib .rush/temp/package-deps*.json",
@@ -56,6 +56,5 @@
56
56
  "lint": "eslint -f visualstudio \"./src/**/*.ts\" 1>&2",
57
57
  "test": "",
58
58
  "cover": ""
59
- },
60
- "readme": "# @itwin/frontend-tiles\r\n\r\nCopyright © Bentley Systems, Incorporated. All rights reserved. See LICENSE.md for license terms and full copyright notice.\r\n\r\n## Description\r\n\r\nThe __@itwin/frontend-tiles__ package provides an experimental alternative technique for visualizing the contents of an iModel. Use `initializeFrontendTiles` to activate it.\r\n\r\n## Documentation\r\n\r\nSee the [iTwin.js](https://www.itwinjs.org) documentation for more information.\r\n\r\n"
59
+ }
61
60
  }
@@ -0,0 +1,58 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+
6
+ import { Id64, Id64String } from "@itwin/core-bentley";
7
+ import { Range3d } from "@itwin/core-geometry";
8
+ import { ModelExtentsProps } from "@itwin/core-common";
9
+ import { IModelConnection, SpatialViewState } from "@itwin/core-frontend";
10
+
11
+ export class BatchedModels {
12
+ private readonly _iModel: IModelConnection;
13
+ private _viewedModels!: Set<Id64String>;
14
+ private readonly _viewedModelIdPairs = new Id64.Uint32Set();
15
+ private readonly _modelRanges = new Map<Id64String, Range3d>();
16
+ private _modelRangePromise?: Promise<void>;
17
+
18
+ public constructor(view: SpatialViewState) {
19
+ this._iModel = view.iModel;
20
+ this.setViewedModels(view.modelSelector.models);
21
+ }
22
+
23
+ public setViewedModels(models: Set<Id64String>): void {
24
+ this._viewedModels = models;
25
+ this._viewedModelIdPairs.clear();
26
+ this._viewedModelIdPairs.addIds(models);
27
+
28
+ this._modelRangePromise = undefined;
29
+ const modelIds = Array.from(models).filter((modelId) => !this._modelRanges.has(modelId));
30
+ if (modelIds.length === 0)
31
+ return;
32
+
33
+ const modelRangePromise = this._modelRangePromise = this._iModel.models.queryExtents(modelIds).then((extents: ModelExtentsProps[]) => {
34
+ if (modelRangePromise !== this._modelRangePromise)
35
+ return;
36
+
37
+ this._modelRangePromise = undefined;
38
+ for (const extent of extents)
39
+ this._modelRanges.set(extent.id, Range3d.fromJSON(extent.extents));
40
+ }).catch(() => { });
41
+ }
42
+
43
+ public views(modelId: Id64String): boolean {
44
+ return this._viewedModels.has(modelId);
45
+ }
46
+
47
+ public isViewed(modelIdLo: number, modelIdHi: number): boolean {
48
+ return this._viewedModelIdPairs.has(modelIdLo, modelIdHi);
49
+ }
50
+
51
+ public unionRange(range: Range3d): void {
52
+ for (const id of this._viewedModels) {
53
+ const extent = this._modelRanges.get(id);
54
+ if (extent)
55
+ range.extendRange(extent);
56
+ }
57
+ }
58
+ }
@@ -3,38 +3,105 @@
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
 
6
+ import { assert } from "@itwin/core-bentley";
7
+ import { RenderSchedule } from "@itwin/core-common";
6
8
  import {
7
9
  AttachToViewportArgs, IModelConnection, SpatialTileTreeReferences, SpatialViewState, TileTreeLoadStatus, TileTreeOwner, TileTreeReference,
8
10
  } from "@itwin/core-frontend";
9
- import { BatchedTileTreeReference } from "./BatchedTileTreeReference";
11
+ import { AnimatedBatchedTileTreeReference, PrimaryBatchedTileTreeReference } from "./BatchedTileTreeReference";
12
+ import { getBatchedTileTreeOwner } from "./BatchedTileTreeSupplier";
13
+ import { BatchedModels } from "./BatchedModels";
10
14
  import { ComputeSpatialTilesetBaseUrl, createFallbackSpatialTileTreeReferences } from "./FrontendTiles";
11
15
 
12
16
  // Obtains tiles pre-published by mesh export service.
13
17
  class BatchedSpatialTileTreeReferences implements SpatialTileTreeReferences {
14
- private readonly _treeRef: BatchedTileTreeReference;
18
+ private readonly _view: SpatialViewState;
19
+ private readonly _models: BatchedModels;
20
+ private _currentScript?: RenderSchedule.Script;
21
+ private _primaryRef!: PrimaryBatchedTileTreeReference;
22
+ private readonly _animatedRefs: AnimatedBatchedTileTreeReference[] = [];
23
+ private _onModelSelectorChanged?: () => void;
15
24
 
16
- public constructor(treeRef: BatchedTileTreeReference) {
17
- this._treeRef = treeRef;
25
+ public constructor(baseUrl: URL, view: SpatialViewState) {
26
+ this._view = view;
27
+ this._models = new BatchedModels(view);
28
+
29
+ const script = view.displayStyle.scheduleScript;
30
+ this._currentScript = script?.requiresBatching ? script : undefined;
31
+
32
+ this.load(baseUrl, view.iModel);
33
+
34
+ assert(undefined !== this._primaryRef);
35
+ }
36
+
37
+ private load(baseUrl: URL, iModel: IModelConnection): void {
38
+ const treeOwner = getBatchedTileTreeOwner(iModel, { baseUrl, script: this._currentScript });
39
+ this._primaryRef = new PrimaryBatchedTileTreeReference(treeOwner, this._models);
40
+
41
+ this.populateAnimatedReferences(treeOwner);
42
+
43
+ const onScriptChanged = (newScript: RenderSchedule.Script | undefined) => {
44
+ if (!newScript?.requiresBatching)
45
+ newScript = undefined;
46
+
47
+ const currentScript = this._currentScript;
48
+ this._currentScript = newScript;
49
+
50
+ if (newScript !== currentScript)
51
+ if (!newScript || !currentScript || !newScript.equals(currentScript))
52
+ this.load(baseUrl, iModel);
53
+ };
54
+
55
+ let removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));
56
+ this._view.onDisplayStyleChanged.addListener((newStyle) => {
57
+ removeScriptChangedListener();
58
+ onScriptChanged(newStyle.scheduleScript);
59
+ removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));
60
+ });
18
61
  }
19
62
 
20
63
  public *[Symbol.iterator](): Iterator<TileTreeReference> {
21
- yield this._treeRef;
64
+ yield this._primaryRef;
65
+
66
+ for (const animatedRef of this._animatedRefs)
67
+ yield animatedRef;
68
+ }
69
+
70
+ private populateAnimatedReferences(treeOwner: TileTreeOwner): void {
71
+ this._animatedRefs.length = 0;
72
+ const script = this._currentScript;
73
+ if (!script)
74
+ return;
75
+
76
+ const getCurrentTimePoint = () => this._view.displayStyle.settings.timePoint ?? script.duration.low;
77
+ for (const timeline of script.modelTimelines) {
78
+ const nodeIds = timeline.transformBatchIds;
79
+ for (const nodeId of nodeIds) {
80
+ this._animatedRefs.push(new AnimatedBatchedTileTreeReference(treeOwner, {
81
+ timeline,
82
+ nodeId,
83
+ getCurrentTimePoint,
84
+ }));
85
+ }
86
+ }
22
87
  }
23
88
 
24
89
  public update(): void {
25
- this._treeRef.updateViewedModels();
90
+ this._models.setViewedModels(this._view.modelSelector.models);
91
+ if (this._onModelSelectorChanged)
92
+ this._onModelSelectorChanged();
26
93
  }
27
94
 
28
95
  public attachToViewport(args: AttachToViewportArgs): void {
29
- this._treeRef.attachToViewport(args);
96
+ this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();
30
97
  }
31
98
 
32
99
  public detachFromViewport(): void {
33
- this._treeRef.detachFromViewport();
100
+ this._onModelSelectorChanged = undefined;
34
101
  }
35
102
 
36
103
  public setDeactivated(): void {
37
- // This exists chiefly for debugging. Unimplemented here.
104
+ // Used for debugging. Unimplemented here.
38
105
  }
39
106
  }
40
107
 
@@ -79,8 +146,7 @@ class ProxySpatialTileTreeReferences implements SpatialTileTreeReferences {
79
146
  this._proxyRef = new ProxyTileTreeReference(view.iModel);
80
147
  getBaseUrl.then((url: URL | undefined) => {
81
148
  if (url) {
82
- const ref = BatchedTileTreeReference.create(view, url);
83
- this.setTreeRefs(new BatchedSpatialTileTreeReferences(ref));
149
+ this.setTreeRefs(new BatchedSpatialTileTreeReferences(url, view));
84
150
  } else {
85
151
  this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));
86
152
  }
@@ -155,6 +221,6 @@ export function createBatchedSpatialTileTreeReferences(view: SpatialViewState, c
155
221
  if (entry instanceof Promise)
156
222
  return new ProxySpatialTileTreeReferences(view, entry);
157
223
 
158
- const ref = BatchedTileTreeReference.create(view, entry);
159
- return new BatchedSpatialTileTreeReferences(ref);
224
+ return new BatchedSpatialTileTreeReferences(entry, view);
160
225
  }
226
+
@@ -141,6 +141,7 @@ export class BatchedTile extends Tile {
141
141
  isLeaf: this.isLeaf,
142
142
  system,
143
143
  isCanceled: shouldAbort,
144
+ timeline: this.batchedTree.scheduleScript,
144
145
  options: {
145
146
  tileId: this.contentId,
146
147
  },
@@ -4,7 +4,7 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
 
6
6
  import { BeTimePoint } from "@itwin/core-bentley";
7
- import { RenderMode, ViewFlagOverrides } from "@itwin/core-common";
7
+ import { RenderMode, RenderSchedule, ViewFlagOverrides } from "@itwin/core-common";
8
8
  import {
9
9
  Tile, TileDrawArgs, TileTree, TileTreeParams,
10
10
  } from "@itwin/core-frontend";
@@ -15,6 +15,7 @@ import { BatchedTilesetReader } from "./BatchedTilesetReader";
15
15
  export interface BatchedTileTreeParams extends TileTreeParams {
16
16
  rootTile: BatchedTileParams;
17
17
  reader: BatchedTilesetReader;
18
+ script?: RenderSchedule.Script;
18
19
  }
19
20
 
20
21
  const viewFlagOverrides: ViewFlagOverrides = {
@@ -26,11 +27,13 @@ const viewFlagOverrides: ViewFlagOverrides = {
26
27
  export class BatchedTileTree extends TileTree {
27
28
  private readonly _rootTile: BatchedTile;
28
29
  public readonly reader: BatchedTilesetReader;
30
+ public readonly scheduleScript?: RenderSchedule.Script;
29
31
 
30
32
  public constructor(params: BatchedTileTreeParams) {
31
33
  super(params);
32
34
  this._rootTile = new BatchedTile(params.rootTile, this);
33
35
  this.reader = params.reader;
36
+ this.scheduleScript = params.script;
34
37
  }
35
38
 
36
39
  public override get rootTile(): BatchedTile {
@@ -3,85 +3,53 @@
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
 
6
- import { Id64, Id64String } from "@itwin/core-bentley";
7
- import { Range3d } from "@itwin/core-geometry";
6
+ import { Range3d, Transform } from "@itwin/core-geometry";
8
7
  import {
9
- BatchType, FeatureAppearance, FeatureAppearanceProvider, FeatureAppearanceSource, GeometryClass, ModelExtentsProps,
8
+ BatchType, FeatureAppearance, FeatureAppearanceProvider, FeatureAppearanceSource, GeometryClass, RenderSchedule,
10
9
  } from "@itwin/core-common";
11
10
  import {
12
- AttachToViewportArgs, SpatialViewState, TileTreeOwner, TileTreeReference,
11
+ AnimationNodeId, formatAnimationBranchId, SceneContext, TileDrawArgs, TileTree, TileTreeOwner, TileTreeReference,
13
12
  } from "@itwin/core-frontend";
14
- import { getBatchedTileTreeOwner } from "./BatchedTileTreeSupplier";
13
+ import { BatchedModels } from "./BatchedModels";
15
14
 
16
15
  /** @internal */
17
- export class BatchedTileTreeReference extends TileTreeReference implements FeatureAppearanceProvider {
18
- private readonly _treeOwner: TileTreeOwner;
19
- private readonly _view: SpatialViewState;
20
- private readonly _viewedModels = new Id64.Uint32Set();
21
- private readonly _modelRanges = new Map<Id64String, Range3d>();
22
- private _modelRangePromise?: Promise<void>;
23
- private _onModelSelectorChanged?: () => void;
24
-
25
- private constructor(treeOwner: TileTreeOwner, view: SpatialViewState) {
16
+ export abstract class BatchedTileTreeReference extends TileTreeReference {
17
+ protected readonly _treeOwner: TileTreeOwner;
18
+
19
+ protected constructor(treeOwner: TileTreeOwner) {
26
20
  super();
27
21
  this._treeOwner = treeOwner;
28
- this._view = view;
29
- }
30
-
31
- public static create(view: SpatialViewState, baseUrl: URL): BatchedTileTreeReference {
32
- const owner = getBatchedTileTreeOwner(view.iModel, baseUrl);
33
- return new BatchedTileTreeReference(owner, view);
34
22
  }
35
23
 
36
24
  public override get treeOwner(): TileTreeOwner {
37
25
  return this._treeOwner;
38
26
  }
39
27
 
40
- public attachToViewport(args: AttachToViewportArgs): void {
41
- this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();
42
- this.updateViewedModels();
28
+ protected computeBaseTransform(tree: TileTree): Transform {
29
+ return super.computeTransform(tree);
43
30
  }
44
31
 
45
- public detachFromViewport(): void {
46
- this._onModelSelectorChanged = undefined;
32
+ protected override computeTransform(tree: TileTree): Transform {
33
+ const baseTf = this.computeBaseTransform(tree);
34
+ // ###TODO this.view.modelDisplayTransformProvider?.getModelDisplayTransform(modelId...)
35
+ return baseTf;
47
36
  }
37
+ }
38
+
39
+ export class PrimaryBatchedTileTreeReference extends BatchedTileTreeReference implements FeatureAppearanceProvider {
40
+ private readonly _models: BatchedModels;
48
41
 
49
- public updateViewedModels(): void {
50
- this._viewedModels.clear();
51
- this._viewedModels.addIds(this._view.modelSelector.models);
52
- if (!this._onModelSelectorChanged) {
53
- // Don't bother updating model ranges if we're not attached to a viewport.
54
- return;
55
- }
56
-
57
- this._onModelSelectorChanged();
58
-
59
- this._modelRangePromise = undefined;
60
- const modelIds = Array.from(this._view.modelSelector.models).filter((modelId) => !this._modelRanges.has(modelId));
61
- if (modelIds.length === 0)
62
- return;
63
-
64
- const modelRangePromise = this._modelRangePromise = this._treeOwner.iModel.models.queryExtents(modelIds).then((extents: ModelExtentsProps[]) => {
65
- if (modelRangePromise !== this._modelRangePromise)
66
- return;
67
-
68
- this._modelRangePromise = undefined;
69
- for (const extent of extents)
70
- this._modelRanges.set(extent.id, Range3d.fromJSON(extent.extents));
71
- }).catch(() => { });
42
+ public constructor(treeOwner: TileTreeOwner, models: BatchedModels) {
43
+ super(treeOwner);
44
+ this._models = models;
72
45
  }
73
46
 
74
- public override unionFitRange(union: Range3d): void {
75
- this._viewedModels.forEach((low: number, high: number) => {
76
- const id = Id64.fromUint32Pair(low, high);
77
- const extent = this._modelRanges.get(id);
78
- if (extent)
79
- union.extendRange(extent);
80
- });
47
+ public override unionFitRange(range: Range3d): void {
48
+ this._models.unionRange(range);
81
49
  }
82
50
 
83
51
  public override getAppearanceProvider(): FeatureAppearanceProvider | undefined {
84
- return this._onModelSelectorChanged ? this : undefined;
52
+ return this;
85
53
  }
86
54
 
87
55
  public getFeatureAppearance(
@@ -93,10 +61,53 @@ export class BatchedTileTreeReference extends TileTreeReference implements Featu
93
61
  type: BatchType,
94
62
  animationNodeId: number
95
63
  ): FeatureAppearance | undefined {
96
- // ###TODO: Until MultiModelPackedFeatureTable is hooked up we'll always get the transient model Id - remove check after that.
97
- if (modelHi !== 0xffffff00 && !this._viewedModels.has(modelLo, modelHi))
64
+ if (!this._models.isViewed(modelLo, modelHi))
98
65
  return undefined;
99
66
 
100
67
  return source.getAppearance(elemLo, elemHi, subcatLo, subcatHi, geomClass, modelLo, modelHi, type, animationNodeId);
101
68
  }
69
+
70
+ public override getAnimationTransformNodeId() {
71
+ return AnimationNodeId.Untransformed;
72
+ }
73
+ }
74
+
75
+ export interface AnimationNode {
76
+ readonly timeline: RenderSchedule.ModelTimeline;
77
+ readonly nodeId: number;
78
+ getCurrentTimePoint(): number;
79
+ }
80
+
81
+ export class AnimatedBatchedTileTreeReference extends BatchedTileTreeReference {
82
+ private readonly _node: AnimationNode;
83
+ private readonly _branchId: string;
84
+
85
+ public constructor(treeOwner: TileTreeOwner, node: AnimationNode) {
86
+ super(treeOwner);
87
+ this._node = node;
88
+ this._branchId = formatAnimationBranchId(node.timeline.modelId, node.nodeId);
89
+ }
90
+
91
+ public override getAnimationTransformNodeId(): number {
92
+ return this._node.nodeId;
93
+ }
94
+
95
+ public override computeBaseTransform(tree: TileTree): Transform {
96
+ const tf = super.computeBaseTransform(tree);
97
+ const animTf = this._node.timeline.getTransform(this._node.nodeId, this._node.getCurrentTimePoint());
98
+ if (animTf)
99
+ animTf.multiplyTransformTransform(tf, tf);
100
+
101
+ return tf;
102
+ }
103
+
104
+ public override createDrawArgs(context: SceneContext): TileDrawArgs | undefined {
105
+ const animBranch = context.viewport.target.animationBranches?.branchStates.get(this._branchId);
106
+ if (animBranch && animBranch.omit)
107
+ return undefined;
108
+
109
+ const args = super.createDrawArgs(context);
110
+ // ###TODO args.boundingRange = args.tree.getTransformNodeRange(this._animationTransformNodeId);
111
+ return args;
112
+ }
102
113
  }
@@ -3,7 +3,8 @@
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
 
6
- import { compareStrings, Logger } from "@itwin/core-bentley";
6
+ import { comparePossiblyUndefined, compareStrings, Logger } from "@itwin/core-bentley";
7
+ import { RenderSchedule } from "@itwin/core-common";
7
8
  import {
8
9
  IModelConnection, TileTree, TileTreeOwner, TileTreeSupplier,
9
10
  } from "@itwin/core-frontend";
@@ -12,15 +13,19 @@ import { BatchedTilesetReader } from "./BatchedTilesetReader";
12
13
  import { BatchedTileTree } from "./BatchedTileTree";
13
14
 
14
15
  /** @internal */
15
- export type TreeId = URL;
16
+ export interface BatchedTileTreeId {
17
+ baseUrl: URL;
18
+ script?: RenderSchedule.Script;
19
+ }
16
20
 
17
21
  class BatchedTileTreeSupplier implements TileTreeSupplier {
18
- public compareTileTreeIds(lhs: TreeId, rhs: TreeId): number {
19
- // Currently each iModel has exactly 1 unique tile tree for all spatial models.
20
- return compareStrings(lhs.toString(), rhs.toString());
22
+ public compareTileTreeIds(lhs: BatchedTileTreeId, rhs: BatchedTileTreeId): number {
23
+ return compareStrings(lhs.toString(), rhs.toString())
24
+ || comparePossiblyUndefined((x, y) => x.compareTo(y), lhs.script, rhs.script);
21
25
  }
22
26
 
23
- public async createTileTree(baseUrl: TreeId, iModel: IModelConnection): Promise<TileTree | undefined> {
27
+ public async createTileTree(treeId: BatchedTileTreeId, iModel: IModelConnection): Promise<TileTree | undefined> {
28
+ const baseUrl = treeId.baseUrl;
24
29
  const url = new URL("tileset.json", baseUrl);
25
30
  url.search = baseUrl.search;
26
31
  try {
@@ -29,6 +34,8 @@ class BatchedTileTreeSupplier implements TileTreeSupplier {
29
34
 
30
35
  const reader = new BatchedTilesetReader(json, iModel, baseUrl);
31
36
  const params = await reader.readTileTreeParams();
37
+
38
+ params.script = treeId.script;
32
39
  return new BatchedTileTree(params);
33
40
  } catch (err) {
34
41
  Logger.logException(loggerCategory, err);
@@ -40,6 +47,6 @@ class BatchedTileTreeSupplier implements TileTreeSupplier {
40
47
  const batchedTileTreeSupplier: TileTreeSupplier = new BatchedTileTreeSupplier();
41
48
 
42
49
  /** @internal */
43
- export function getBatchedTileTreeOwner(iModel: IModelConnection, baseUrl: URL): TileTreeOwner {
44
- return iModel.tiles.getTileTreeOwner(baseUrl, batchedTileTreeSupplier);
50
+ export function getBatchedTileTreeOwner(iModel: IModelConnection, treeId: BatchedTileTreeId): TileTreeOwner {
51
+ return iModel.tiles.getTileTreeOwner(treeId, batchedTileTreeSupplier);
45
52
  }
@@ -1,3 +0,0 @@
1
- {
2
- "nonCachedDurationMs": 18590.74739998579
3
- }