@itwin/frontend-tiles 4.1.0-dev.7 → 4.1.0-dev.71
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/CHANGELOG.md +80 -1
- package/lib/cjs/BatchedTile.d.ts +1 -1
- package/lib/cjs/BatchedTile.d.ts.map +1 -1
- package/lib/cjs/BatchedTile.js +12 -32
- package/lib/cjs/BatchedTile.js.map +1 -1
- package/lib/cjs/BatchedTileTree.d.ts +3 -1
- package/lib/cjs/BatchedTileTree.d.ts.map +1 -1
- package/lib/cjs/BatchedTileTree.js +13 -0
- package/lib/cjs/BatchedTileTree.js.map +1 -1
- package/lib/cjs/BatchedTileTreeReference.js.map +1 -1
- package/lib/cjs/BatchedTilesetReader.js.map +1 -1
- package/lib/cjs/FrontendTiles.d.ts +83 -5
- package/lib/cjs/FrontendTiles.d.ts.map +1 -1
- package/lib/cjs/FrontendTiles.js +85 -3
- package/lib/cjs/FrontendTiles.js.map +1 -1
- package/lib/esm/BatchedTile.d.ts +1 -1
- package/lib/esm/BatchedTile.d.ts.map +1 -1
- package/lib/esm/BatchedTile.js +13 -33
- package/lib/esm/BatchedTile.js.map +1 -1
- package/lib/esm/BatchedTileTree.d.ts +3 -1
- package/lib/esm/BatchedTileTree.d.ts.map +1 -1
- package/lib/esm/BatchedTileTree.js +15 -2
- package/lib/esm/BatchedTileTree.js.map +1 -1
- package/lib/esm/BatchedTileTreeReference.js.map +1 -1
- package/lib/esm/BatchedTilesetReader.js.map +1 -1
- package/lib/esm/FrontendTiles.d.ts +83 -5
- package/lib/esm/FrontendTiles.d.ts.map +1 -1
- package/lib/esm/FrontendTiles.js +83 -3
- package/lib/esm/FrontendTiles.js.map +1 -1
- package/package.json +30 -21
- package/.rush/temp/operation/build/all.log +0 -3
- package/.rush/temp/operation/build/state.json +0 -3
- package/.rush/temp/package-deps_build.json +0 -24
- package/.rush/temp/shrinkwrap-deps.json +0 -266
- package/CHANGELOG.json +0 -53
- package/config/rush-project.json +0 -6
- package/frontend-tiles.build.error.log +0 -1
- package/frontend-tiles.build.log +0 -2
- package/lib/cjs/tsconfig.tsbuildinfo +0 -1
- package/lib/esm/tsconfig.tsbuildinfo +0 -1
- package/src/BatchedModels.ts +0 -58
- package/src/BatchedSpatialTileTreeRefs.ts +0 -226
- package/src/BatchedTile.ts +0 -206
- package/src/BatchedTileContentReader.ts +0 -96
- package/src/BatchedTileTree.ts +0 -74
- package/src/BatchedTileTreeReference.ts +0 -113
- package/src/BatchedTileTreeSupplier.ts +0 -52
- package/src/BatchedTilesetReader.ts +0 -113
- package/src/FrontendTiles.ts +0 -52
- package/src/LoggerCategory.ts +0 -8
- package/src/frontend-tiles.ts +0 -6
- package/tsconfig.json +0 -6
|
@@ -1,113 +0,0 @@
|
|
|
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 { Range3d, Transform } from "@itwin/core-geometry";
|
|
7
|
-
import {
|
|
8
|
-
BatchType, FeatureAppearance, FeatureAppearanceProvider, FeatureAppearanceSource, GeometryClass, RenderSchedule,
|
|
9
|
-
} from "@itwin/core-common";
|
|
10
|
-
import {
|
|
11
|
-
AnimationNodeId, formatAnimationBranchId, SceneContext, TileDrawArgs, TileTree, TileTreeOwner, TileTreeReference,
|
|
12
|
-
} from "@itwin/core-frontend";
|
|
13
|
-
import { BatchedModels } from "./BatchedModels";
|
|
14
|
-
|
|
15
|
-
/** @internal */
|
|
16
|
-
export abstract class BatchedTileTreeReference extends TileTreeReference {
|
|
17
|
-
protected readonly _treeOwner: TileTreeOwner;
|
|
18
|
-
|
|
19
|
-
protected constructor(treeOwner: TileTreeOwner) {
|
|
20
|
-
super();
|
|
21
|
-
this._treeOwner = treeOwner;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
public override get treeOwner(): TileTreeOwner {
|
|
25
|
-
return this._treeOwner;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
protected computeBaseTransform(tree: TileTree): Transform {
|
|
29
|
-
return super.computeTransform(tree);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
protected override computeTransform(tree: TileTree): Transform {
|
|
33
|
-
const baseTf = this.computeBaseTransform(tree);
|
|
34
|
-
// ###TODO this.view.modelDisplayTransformProvider?.getModelDisplayTransform(modelId...)
|
|
35
|
-
return baseTf;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export class PrimaryBatchedTileTreeReference extends BatchedTileTreeReference implements FeatureAppearanceProvider {
|
|
40
|
-
private readonly _models: BatchedModels;
|
|
41
|
-
|
|
42
|
-
public constructor(treeOwner: TileTreeOwner, models: BatchedModels) {
|
|
43
|
-
super(treeOwner);
|
|
44
|
-
this._models = models;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
public override unionFitRange(range: Range3d): void {
|
|
48
|
-
this._models.unionRange(range);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
public override getAppearanceProvider(): FeatureAppearanceProvider | undefined {
|
|
52
|
-
return this;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
public getFeatureAppearance(
|
|
56
|
-
source: FeatureAppearanceSource,
|
|
57
|
-
elemLo: number, elemHi: number,
|
|
58
|
-
subcatLo: number, subcatHi: number,
|
|
59
|
-
geomClass: GeometryClass,
|
|
60
|
-
modelLo: number, modelHi: number,
|
|
61
|
-
type: BatchType,
|
|
62
|
-
animationNodeId: number
|
|
63
|
-
): FeatureAppearance | undefined {
|
|
64
|
-
if (!this._models.isViewed(modelLo, modelHi))
|
|
65
|
-
return undefined;
|
|
66
|
-
|
|
67
|
-
return source.getAppearance(elemLo, elemHi, subcatLo, subcatHi, geomClass, modelLo, modelHi, type, animationNodeId);
|
|
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
|
-
}
|
|
113
|
-
}
|
|
@@ -1,52 +0,0 @@
|
|
|
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 { comparePossiblyUndefined, compareStrings, Logger } from "@itwin/core-bentley";
|
|
7
|
-
import { RenderSchedule } from "@itwin/core-common";
|
|
8
|
-
import {
|
|
9
|
-
IModelConnection, TileTree, TileTreeOwner, TileTreeSupplier,
|
|
10
|
-
} from "@itwin/core-frontend";
|
|
11
|
-
import { loggerCategory } from "./LoggerCategory";
|
|
12
|
-
import { BatchedTilesetReader } from "./BatchedTilesetReader";
|
|
13
|
-
import { BatchedTileTree } from "./BatchedTileTree";
|
|
14
|
-
|
|
15
|
-
/** @internal */
|
|
16
|
-
export interface BatchedTileTreeId {
|
|
17
|
-
baseUrl: URL;
|
|
18
|
-
script?: RenderSchedule.Script;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
class BatchedTileTreeSupplier implements TileTreeSupplier {
|
|
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);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
public async createTileTree(treeId: BatchedTileTreeId, iModel: IModelConnection): Promise<TileTree | undefined> {
|
|
28
|
-
const baseUrl = treeId.baseUrl;
|
|
29
|
-
const url = new URL("tileset.json", baseUrl);
|
|
30
|
-
url.search = baseUrl.search;
|
|
31
|
-
try {
|
|
32
|
-
const response = await fetch(url.toString());
|
|
33
|
-
const json = await response.json();
|
|
34
|
-
|
|
35
|
-
const reader = new BatchedTilesetReader(json, iModel, baseUrl);
|
|
36
|
-
const params = await reader.readTileTreeParams();
|
|
37
|
-
|
|
38
|
-
params.script = treeId.script;
|
|
39
|
-
return new BatchedTileTree(params);
|
|
40
|
-
} catch (err) {
|
|
41
|
-
Logger.logException(loggerCategory, err);
|
|
42
|
-
return undefined;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const batchedTileTreeSupplier: TileTreeSupplier = new BatchedTileTreeSupplier();
|
|
48
|
-
|
|
49
|
-
/** @internal */
|
|
50
|
-
export function getBatchedTileTreeOwner(iModel: IModelConnection, treeId: BatchedTileTreeId): TileTreeOwner {
|
|
51
|
-
return iModel.tiles.getTileTreeOwner(treeId, batchedTileTreeSupplier);
|
|
52
|
-
}
|
|
@@ -1,113 +0,0 @@
|
|
|
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 {
|
|
7
|
-
Matrix3d, Point3d, Range3d, Transform, Vector3d,
|
|
8
|
-
} from "@itwin/core-geometry";
|
|
9
|
-
import { Tileset3dSchema as schema } from "@itwin/core-common";
|
|
10
|
-
import { IModelConnection, RealityModelTileUtils, TileLoadPriority } from "@itwin/core-frontend";
|
|
11
|
-
import { BatchedTileTreeParams } from "./BatchedTileTree";
|
|
12
|
-
import { BatchedTile, BatchedTileParams } from "./BatchedTile";
|
|
13
|
-
|
|
14
|
-
function isTileset3d(json: unknown): json is schema.Tileset {
|
|
15
|
-
if (typeof json !== "object")
|
|
16
|
-
return false;
|
|
17
|
-
|
|
18
|
-
const props = json as schema.Tileset;
|
|
19
|
-
|
|
20
|
-
if (!props.root || !props.asset)
|
|
21
|
-
return false;
|
|
22
|
-
|
|
23
|
-
// ###TODO spec requires geometricError to be present on tileset and all tiles; exporter is omitting from tileset.
|
|
24
|
-
if (undefined === props.geometricError)
|
|
25
|
-
props.geometricError = props.root.geometricError;
|
|
26
|
-
|
|
27
|
-
return true;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function rangeFromBoundingVolume(vol: schema.BoundingVolume): Range3d {
|
|
31
|
-
if (vol.box) {
|
|
32
|
-
const center = new Point3d(vol.box[0], vol.box[1], vol.box[2]);
|
|
33
|
-
const ux = new Vector3d(vol.box[3], vol.box[4], vol.box[5]);
|
|
34
|
-
const uy = new Vector3d(vol.box[6], vol.box[7], vol.box[8]);
|
|
35
|
-
const uz = new Vector3d(vol.box[9], vol.box[10], vol.box[11]);
|
|
36
|
-
|
|
37
|
-
const range = Range3d.createNull();
|
|
38
|
-
for (let i = -1; i <= 1; i += 2)
|
|
39
|
-
for (let j = -1; j <= 1; j += 2)
|
|
40
|
-
for (let k = -1; k <= 1; k += 2)
|
|
41
|
-
range.extendPoint(center.plus3Scaled(ux, i, uy, j, uz, k));
|
|
42
|
-
|
|
43
|
-
return range;
|
|
44
|
-
} else if (vol.sphere) {
|
|
45
|
-
const center = new Point3d(vol.sphere[0], vol.sphere[1], vol.sphere[2]);
|
|
46
|
-
const radius = vol.sphere[3];
|
|
47
|
-
return Range3d.createXYZXYZ(center.x - radius, center.y - radius, center.z - radius, center.x + radius, center.y + radius, center.z + radius);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// We won't get region bounding volumes in our tiles.
|
|
51
|
-
throw new Error("region bounding volume unimplemented");
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function transformFromJSON(json: schema.Transform): Transform {
|
|
55
|
-
const translation = new Point3d(json[12], json[13], json[14]);
|
|
56
|
-
const matrix = Matrix3d.createRowValues(
|
|
57
|
-
json[0], json[4], json[8],
|
|
58
|
-
json[1], json[5], json[9],
|
|
59
|
-
json[2], json[6], json[10]
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
return Transform.createOriginAndMatrix(translation, matrix);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/** @internal */
|
|
66
|
-
export class BatchedTilesetReader {
|
|
67
|
-
private readonly _iModel: IModelConnection;
|
|
68
|
-
private readonly _tileset: schema.Tileset;
|
|
69
|
-
public readonly baseUrl: URL;
|
|
70
|
-
|
|
71
|
-
public constructor(json: unknown, iModel: IModelConnection, baseUrl: URL) {
|
|
72
|
-
if (!isTileset3d(json))
|
|
73
|
-
throw new Error("Invalid tileset JSON");
|
|
74
|
-
|
|
75
|
-
this._iModel = iModel;
|
|
76
|
-
this._tileset = json;
|
|
77
|
-
this.baseUrl = baseUrl;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
public readTileParams(json: schema.Tile, parent?: BatchedTile): BatchedTileParams {
|
|
81
|
-
const content = json.content;
|
|
82
|
-
const geometricError = json.geometricError;
|
|
83
|
-
const range = rangeFromBoundingVolume(json.boundingVolume);
|
|
84
|
-
const isLeaf = undefined === json.children || json.children.length === 0;
|
|
85
|
-
|
|
86
|
-
// ###TODO evaluate this. The geometric errors in the tiles seem far too small.
|
|
87
|
-
const maximumSizeScale = 8;
|
|
88
|
-
return {
|
|
89
|
-
parent,
|
|
90
|
-
contentId: content?.uri ?? "",
|
|
91
|
-
range,
|
|
92
|
-
contentRange: content?.boundingVolume ? rangeFromBoundingVolume(content.boundingVolume) : undefined,
|
|
93
|
-
isLeaf,
|
|
94
|
-
maximumSize: maximumSizeScale * RealityModelTileUtils.maximumSizeFromGeometricTolerance(range, geometricError),
|
|
95
|
-
childrenProps: isLeaf ? undefined : json.children,
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
public async readTileTreeParams(): Promise<BatchedTileTreeParams> {
|
|
100
|
-
const root = this._tileset.root;
|
|
101
|
-
const location = root.transform ? transformFromJSON(root.transform) : Transform.createIdentity();
|
|
102
|
-
|
|
103
|
-
return {
|
|
104
|
-
id: "spatial-models",
|
|
105
|
-
modelId: this._iModel.transientIds.getNext(),
|
|
106
|
-
iModel: this._iModel,
|
|
107
|
-
location,
|
|
108
|
-
priority: TileLoadPriority.Primary,
|
|
109
|
-
rootTile: this.readTileParams(root),
|
|
110
|
-
reader: this,
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
}
|
package/src/FrontendTiles.ts
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
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 { IModelConnection, SpatialTileTreeReferences, SpatialViewState } from "@itwin/core-frontend";
|
|
7
|
-
import { createBatchedSpatialTileTreeReferences } from "./BatchedSpatialTileTreeRefs";
|
|
8
|
-
|
|
9
|
-
/** A function that can provide the base URL where a tileset representing all of the spatial models in a given iModel are stored.
|
|
10
|
-
* The tileset is expected to reside at "baseUrl/tileset.json" and to have been produced by the [mesh export service](https://developer.bentley.com/apis/mesh-export/).
|
|
11
|
-
* If no such tileset exists for the given iModel, return `undefined`.
|
|
12
|
-
* @see [[FrontendTilesOptions.computeSpatialTilesetBaseUrl]].
|
|
13
|
-
* @alpha
|
|
14
|
-
*/
|
|
15
|
-
export type ComputeSpatialTilesetBaseUrl = (iModel: IModelConnection) => Promise<URL | undefined>;
|
|
16
|
-
|
|
17
|
-
/** Options supplied to [[initializeFrontendTiles]].
|
|
18
|
-
* @alpha
|
|
19
|
-
*/
|
|
20
|
-
export interface FrontendTilesOptions {
|
|
21
|
-
/** Provide the base URL for the pre-published tileset for a given iModel. */
|
|
22
|
-
computeSpatialTilesetBaseUrl: ComputeSpatialTilesetBaseUrl;
|
|
23
|
-
/** The maximum number of levels in the tile tree to skip loading if they do not provide the desired level of detail for the current view.
|
|
24
|
-
* Default: 4.
|
|
25
|
-
* Reducing this value will load more intermediate tiles, which causes more gradual refinement: low-resolution tiles will display quickly, followed more gradually by
|
|
26
|
-
* successively higher-resolution ones.
|
|
27
|
-
* Increasing the value jumps more directly to tiles of the exact level of detail desired, which may load more, smaller tiles up-front, leaving some areas of the view
|
|
28
|
-
* vacant for longer; and when zooming out some newly-exposed areas of the view may remain vacant for longer because no lower-resolution tiles are initially available to
|
|
29
|
-
* fill them. However, tiles close to the viewer (and therefore likely of most interest to them) will refine to an appropriate level of detail more quickly.
|
|
30
|
-
*/
|
|
31
|
-
maxLevelsToSkip?: number;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/** @internal */
|
|
35
|
-
export const createFallbackSpatialTileTreeReferences = SpatialTileTreeReferences.create;
|
|
36
|
-
|
|
37
|
-
let maxLevelsToSkip = 4;
|
|
38
|
-
|
|
39
|
-
/** @internal */
|
|
40
|
-
export function getMaxLevelsToSkip(): number {
|
|
41
|
-
return maxLevelsToSkip;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/** Initialize the frontend-tiles package to obtain tiles for spatial views.
|
|
45
|
-
* @alpha
|
|
46
|
-
*/
|
|
47
|
-
export function initializeFrontendTiles(options: FrontendTilesOptions): void {
|
|
48
|
-
if (undefined !== options.maxLevelsToSkip && options.maxLevelsToSkip >= 0)
|
|
49
|
-
maxLevelsToSkip = options.maxLevelsToSkip;
|
|
50
|
-
|
|
51
|
-
SpatialTileTreeReferences.create = (view: SpatialViewState) => createBatchedSpatialTileTreeReferences(view, options.computeSpatialTilesetBaseUrl);
|
|
52
|
-
}
|
package/src/LoggerCategory.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
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
|
-
/** @internal */
|
|
7
|
-
export const loggerCategory = "frontend-tiles";
|
|
8
|
-
|
package/src/frontend-tiles.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
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
|
-
export * from "./FrontendTiles";
|