@loaders.gl/3d-tiles
Version:
3D Tiles, an open standard for streaming massive heterogeneous 3D geospatial datasets.
46 lines (45 loc) • 2.39 kB
JavaScript
// loaders.gl
// SPDX-License-Identifier: MIT AND Apache-2.0
// Copyright vis.gl contributors
// This file is derived from the Cesium code base under Apache 2 license
// See LICENSE.md and https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md
import { padToNBytes, copyBinaryToDataView, copyPaddedStringToDataView } from '@loaders.gl/loader-utils';
import { MAGIC_ARRAY } from "../constants.js";
import { encode3DTileHeader, encode3DTileByteLength } from "./helpers/encode-3d-tile-header.js";
// Procedurally encode the tile array dataView for testing purposes
export function encodeBatchedModel3DTile(tile, dataView, byteOffset, options) {
const { featuresLength = 0, batchTable } = tile;
const featureTableJson = {
BATCH_LENGTH: featuresLength
};
const featureTableJsonString = JSON.stringify(featureTableJson);
const batchTableJsonString = batchTable ? JSON.stringify(batchTable) : '';
const featureTableJsonByteLength = padToNBytes(featureTableJsonString.length, 8);
const batchTableJsonByteLength = batchTableJsonString
? padToNBytes(batchTableJsonString.length, 8)
: 0;
// Add default magic for this tile type
tile = { magic: MAGIC_ARRAY.BATCHED_MODEL, ...tile };
const byteOffsetStart = byteOffset;
byteOffset = encode3DTileHeader(tile, dataView, byteOffset);
if (dataView) {
dataView.setUint32(12, featureTableJsonByteLength, true); // featureTableJsonByteLength
dataView.setUint32(16, 0, true); // featureTableBinaryByteLength
dataView.setUint32(20, batchTableJsonByteLength, true); // batchTableJsonByteLength
dataView.setUint32(24, 0, true); // batchTableBinaryByteLength
}
byteOffset += 16;
// TODO feature table binary
byteOffset = copyPaddedStringToDataView(dataView, byteOffset, featureTableJsonString, 8);
if (batchTable) {
byteOffset = copyPaddedStringToDataView(dataView, byteOffset, batchTableJsonString, 8);
}
// Add encoded GLTF to the end of data
const gltfEncoded = tile.gltfEncoded;
if (gltfEncoded) {
byteOffset = copyBinaryToDataView(dataView, byteOffset, gltfEncoded, gltfEncoded.byteLength);
}
// Go "back" and rewrite the tile's `byteLength` now that we know the value
encode3DTileByteLength(dataView, byteOffsetStart, byteOffset - byteOffsetStart);
return byteOffset;
}