UNPKG

3d-tiles-renderer

Version:

https://github.com/AnalyticalGraphicsInc/3d-tiles/tree/master/specification

112 lines (78 loc) 2.7 kB
/** @import { LoadingManager } from 'three' */ import { Group, DefaultLoadingManager, Matrix4 } from 'three'; import { CMPTLoaderBase } from '3d-tiles-renderer/core'; import { B3DMLoader } from './B3DMLoader.js'; import { PNTSLoader } from './PNTSLoader.js'; import { I3DMLoader } from './I3DMLoader.js'; import { WGS84_ELLIPSOID } from '../math/GeoConstants.js'; /** * Loader for the legacy 3D Tiles Composite (cmpt) format. Parses a cmpt container * that bundles multiple b3dm, i3dm, and pnts tiles, returning a scene Group containing * all sub-tile scenes. * @extends CMPTLoaderBase * @param {LoadingManager} [manager] */ export class CMPTLoader extends CMPTLoaderBase { constructor( manager = DefaultLoadingManager ) { super(); this.manager = manager; this.adjustmentTransform = new Matrix4(); this.ellipsoid = WGS84_ELLIPSOID.clone(); } /** * Parses a cmpt buffer and resolves to an object containing a `Group` with all * sub-tile scenes added as children, and the individual sub-tile results. * @param {ArrayBuffer} buffer * @returns {Promise<{ scene: Group, tiles: Array }>} */ parse( buffer ) { const result = super.parse( buffer ); const { manager, ellipsoid, adjustmentTransform } = this; const promises = []; for ( const i in result.tiles ) { const { type, buffer } = result.tiles[ i ]; switch ( type ) { case 'b3dm': { const slicedBuffer = buffer.slice(); const loader = new B3DMLoader( manager ); loader.workingPath = this.workingPath; loader.fetchOptions = this.fetchOptions; loader.adjustmentTransform.copy( adjustmentTransform ); const promise = loader.parse( slicedBuffer.buffer ); promises.push( promise ); break; } case 'pnts': { const slicedBuffer = buffer.slice(); const loader = new PNTSLoader( manager ); loader.workingPath = this.workingPath; loader.fetchOptions = this.fetchOptions; const promise = loader.parse( slicedBuffer.buffer ); promises.push( promise ); break; } case 'i3dm': { const slicedBuffer = buffer.slice(); const loader = new I3DMLoader( manager ); loader.workingPath = this.workingPath; loader.fetchOptions = this.fetchOptions; loader.ellipsoid.copy( ellipsoid ); loader.adjustmentTransform.copy( adjustmentTransform ); const promise = loader.parse( slicedBuffer.buffer ); promises.push( promise ); break; } } } return Promise.all( promises ).then( results => { const group = new Group(); results.forEach( result => { group.add( result.scene ); } ); return { tiles: results, scene: group, }; } ); } }