UNPKG

@itwin/core-common

Version:

iTwin.js components common to frontend and backend

70 lines 3.64 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 { utf8ToString } from "@itwin/core-bentley"; import { TileFormat, TileHeader } from "./TileIO"; /** Header preceding tile content in [b3dm](https://github.com/AnalyticalGraphicsInc/3d-tiles/tree/master/specification/TileFormats/Batched3DModel) format. * @internal */ export class B3dmHeader extends TileHeader { length; featureTableJsonLength; featureTableBinaryLength; batchTableJsonLength; batchTableBinaryLength; featureTableJson; batchTableJson; get isValid() { return TileFormat.B3dm === this.format; } constructor(stream) { super(stream); this.length = stream.readUint32(); this.featureTableJsonLength = stream.readUint32(); this.featureTableBinaryLength = stream.readUint32(); this.batchTableJsonLength = stream.readUint32(); this.batchTableBinaryLength = stream.readUint32(); // Keep this legacy check in for now since a lot of tilesets are still using the old header. // Legacy header #1: [batchLength] [batchTableByteLength] // Legacy header #2: [batchTableJsonByteLength] [batchTableBinaryByteLength] [batchLength] // Current header: [featureTableJsonByteLength] [featureTableBinaryByteLength] [batchTableJsonByteLength] [batchTableBinaryByteLength] // If the header is in the first legacy format 'batchTableJsonByteLength' will be the start of the JSON string (a quotation mark) or the glTF magic. // Accordingly its first byte will be either 0x22 or 0x67, and so the minimum uint32 expected is 0x22000000 = 570425344 = 570MB. It is unlikely that the feature table Json will exceed this length. // The check for the second legacy format is similar, except it checks 'batchTableBinaryByteLength' instead if (this.batchTableJsonLength >= 570425344) { // First legacy check stream.curPos = 20; this.batchTableJsonLength = this.featureTableBinaryLength; this.batchTableBinaryLength = 0; this.featureTableJsonLength = 0; this.featureTableBinaryLength = 0; } else if (this.batchTableBinaryLength >= 570425344) { // Second legacy check stream.curPos = 24; this.batchTableJsonLength = this.featureTableJsonLength; this.batchTableBinaryLength = this.featureTableBinaryLength; this.featureTableJsonLength = 0; this.featureTableBinaryLength = 0; } if (0 !== this.featureTableJsonLength) { const sceneStrData = stream.nextBytes(this.featureTableJsonLength); const sceneStr = utf8ToString(sceneStrData); if (sceneStr) this.featureTableJson = JSON.parse(sceneStr); } stream.advance(this.featureTableBinaryLength); if (0 !== this.batchTableJsonLength) { const batchStrData = stream.nextBytes(this.batchTableJsonLength); const batchStr = utf8ToString(batchStrData); if (batchStr) this.batchTableJson = JSON.parse(batchStr); } stream.advance(this.batchTableBinaryLength); if (stream.isPastTheEnd) this.invalidate(); } } //# sourceMappingURL=B3dmTileIO.js.map