UNPKG

@itwin/core-common

Version:

iTwin.js components common to frontend and backend

116 lines 5.99 kB
/*--------------------------------------------------------------------------------------------- * Copyright (c) Bentley Systems, Incorporated. All rights reserved. * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ /** @packageDocumentation * @module Tile */ import { assert } from "@itwin/core-bentley"; import { Range3d } from "@itwin/core-geometry"; import { nextPoint3d64FromByteStream, TileFormat, TileHeader } from "./TileIO"; /** Flags describing the geometry contained within a tile in iMdl format. * @internal */ export var ImdlFlags; (function (ImdlFlags) { /** No special flags */ ImdlFlags[ImdlFlags["None"] = 0] = "None"; /** The tile contains some curved geometry */ ImdlFlags[ImdlFlags["ContainsCurves"] = 1] = "ContainsCurves"; /** Some geometry within the tile range was omitted based on its size */ ImdlFlags[ImdlFlags["Incomplete"] = 4] = "Incomplete"; /** The tile must be refined by sub-division, not magnification. */ ImdlFlags[ImdlFlags["DisallowMagnification"] = 8] = "DisallowMagnification"; /** The tile's feature table contains features from multiple models. */ ImdlFlags[ImdlFlags["MultiModelFeatureTable"] = 16] = "MultiModelFeatureTable"; })(ImdlFlags || (ImdlFlags = {})); /** Describes the maximum major and minor version of the iMdl tile format supported by this version of this package. * @internal */ export var CurrentImdlVersion; (function (CurrentImdlVersion) { /** The unsigned 16-bit major version number. If the major version specified in the tile header is greater than this value, then this * front-end is not capable of reading the tile content. Otherwise, this front-end can read the tile content even if the header specifies a * greater minor version than CurrentVersion.Minor, although some data may be skipped. */ CurrentImdlVersion[CurrentImdlVersion["Major"] = 37] = "Major"; /** The unsigned 16-bit minor version number. If the major version in the tile header is equal to CurrentVersion.Major, then this package can * read the tile content even if the minor version in the tile header is greater than this value, although some data may be skipped. */ CurrentImdlVersion[CurrentImdlVersion["Minor"] = 0] = "Minor"; /** The unsigned 32-bit version number derived from the 16-bit major and minor version numbers. */ CurrentImdlVersion[CurrentImdlVersion["Combined"] = 2424832] = "Combined"; })(CurrentImdlVersion || (CurrentImdlVersion = {})); /** Header embedded at the beginning of binary tile data in iMdl format describing its contents. * @internal */ export class ImdlHeader extends TileHeader { /** The size of this header in bytes. */ headerLength; /** Flags describing the geometry contained within the tile */ flags; /** A bounding box no larger than the tile's range, tightly enclosing the tile's geometry; or a null range if the tile is empty */ contentRange; /** The chord tolerance in meters at which the tile's geometry was faceted */ tolerance; /** The number of elements which contributed at least some geometry to the tile content */ numElementsIncluded; /** The number of elements within the tile range which contributed no geometry to the tile content */ numElementsExcluded; /** The total number of bytes in the binary tile data, including this header */ tileLength; /** A bitfield wherein each set bit indicates an empty sub-volume. */ emptySubRanges; get versionMajor() { return this.version >>> 0x10; } get versionMinor() { return (this.version & 0xffff) >>> 0; } get isValid() { return TileFormat.IModel === this.format; } get isReadableVersion() { return this.versionMajor <= CurrentImdlVersion.Major; } /** Deserialize a header from the binary data at the stream's current position. * If the binary data does not contain a valid header, the Header will be marked 'invalid'. */ constructor(stream) { super(stream); this.headerLength = stream.readUint32(); this.flags = stream.readUint32(); this.contentRange = new Range3d(); nextPoint3d64FromByteStream(stream, this.contentRange.low); nextPoint3d64FromByteStream(stream, this.contentRange.high); this.tolerance = stream.readFloat64(); this.numElementsIncluded = stream.readUint32(); this.numElementsExcluded = stream.readUint32(); this.tileLength = stream.readUint32(); // empty sub-volume bit field introduced in format v02.00 this.emptySubRanges = this.versionMajor >= 2 ? stream.readUint32() : 0; // Skip any unprocessed bytes in header const remainingHeaderBytes = this.headerLength - stream.curPos; assert(remainingHeaderBytes >= 0); stream.advance(remainingHeaderBytes); if (stream.isPastTheEnd) this.invalidate(); } } /** Header preceding the feature table embedded in an iMdl tile's content. * @internal */ export class FeatureTableHeader { // The number of bytes the entire table occupies. length; // The number of subcategories in the table. // NOTE: This used to be "max features" which was useless and unused. It is only accurate if ImdlFlags.HasMultiModelFeatureTable is set. numSubCategories; // The number of features in the table. count; static readFrom(stream) { const length = stream.readUint32(); const maxFeatures = stream.readUint32(); const count = stream.readUint32(); return stream.isPastTheEnd ? undefined : new FeatureTableHeader(length, maxFeatures, count); } static sizeInBytes = 12; constructor(length, numSubCategories, count) { this.length = length; this.numSubCategories = numSubCategories; this.count = count; } } //# sourceMappingURL=IModelTileIO.js.map