@loaders.gl/3d-tiles
Version:
3D Tiles, an open standard for streaming massive heterogeneous 3D geospatial datasets.
56 lines (42 loc) • 2.02 kB
text/typescript
// 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 {copyStringToDataView} from '@loaders.gl/loader-utils';
import {MAGIC_ARRAY} from '../constants';
import {encode3DTileHeader, encode3DTileByteLength} from './helpers/encode-3d-tile-header';
// Procedurally encode the tile array buffer for testing purposes
// eslint-disable-next-line max-statements
export function encodeInstancedModel3DTile(tile, dataView, byteOffset, options) {
const {featuresLength = 1, gltfFormat = 1, gltfUri = ''} = tile;
const gltfUriByteLength = gltfUri.length;
const featureTableJson = {
INSTANCES_LENGTH: featuresLength,
POSITION: new Array(featuresLength * 3).fill(0)
};
const featureTableJsonString = JSON.stringify(featureTableJson);
const featureTableJsonByteLength = featureTableJsonString.length;
// Add default magic for this tile type
tile = {magic: MAGIC_ARRAY.INSTANCED_MODEL, ...tile};
const byteOffsetStart = byteOffset;
byteOffset = encode3DTileHeader(tile, dataView, 0);
if (dataView) {
dataView.setUint32(12, featureTableJsonByteLength, true); // featureTableJsonByteLength
dataView.setUint32(16, 0, true); // featureTableBinaryByteLength
dataView.setUint32(20, 0, true); // batchTableJsonByteLength
dataView.setUint32(24, 0, true); // batchTableBinaryByteLength
dataView.setUint32(28, gltfFormat, true); // gltfFormat
}
byteOffset += 20;
byteOffset += copyStringToDataView(
dataView,
byteOffset,
featureTableJsonString,
featureTableJsonByteLength
);
byteOffset += copyStringToDataView(dataView, byteOffset, gltfUri, gltfUriByteLength);
// Go "back" and rewrite the tile's `byteLength` now that we know the value
encode3DTileByteLength(dataView, byteOffsetStart, byteOffset - byteOffsetStart);
return byteOffset;
}