3d-tiles-renderer
Version:
https://github.com/AnalyticalGraphicsInc/3d-tiles/tree/master/specification
112 lines (78 loc) • 2.7 kB
JavaScript
/** @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,
};
} );
}
}