B3DMLoader.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { B3DMLoaderBase } from '../base/B3DMLoaderBase.js';
  2. import { DefaultLoadingManager } from 'three';
  3. import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
  4. export class B3DMLoader extends B3DMLoaderBase {
  5. constructor( manager = DefaultLoadingManager ) {
  6. super();
  7. this.manager = manager;
  8. }
  9. parse( buffer ) {
  10. const b3dm = super.parse( buffer );
  11. const gltfBuffer = b3dm.glbBytes.slice().buffer;
  12. return new Promise( ( resolve, reject ) => {
  13. const manager = this.manager;
  14. const fetchOptions = this.fetchOptions;
  15. const loader = manager.getHandler( 'path.gltf' ) || new GLTFLoader( manager );
  16. if ( fetchOptions.credentials === 'include' && fetchOptions.mode === 'cors' ) {
  17. loader.setCrossOrigin( 'use-credentials' );
  18. }
  19. if ( 'credentials' in fetchOptions ) {
  20. loader.setWithCredentials( fetchOptions.credentials === 'include' );
  21. }
  22. if ( fetchOptions.headers ) {
  23. loader.setRequestHeader( fetchOptions.headers );
  24. }
  25. // GLTFLoader assumes the working path ends in a slash
  26. let workingPath = this.workingPath;
  27. if ( ! /[\\/]$/.test( workingPath ) && workingPath.length ) {
  28. workingPath += '/';
  29. }
  30. loader.parse( gltfBuffer, workingPath, model => {
  31. const { batchTable, featureTable } = b3dm;
  32. const { scene } = model;
  33. const rtcCenter = featureTable.getData( 'RTC_CENTER' );
  34. if ( rtcCenter ) {
  35. scene.position.x += rtcCenter[ 0 ];
  36. scene.position.y += rtcCenter[ 1 ];
  37. scene.position.z += rtcCenter[ 2 ];
  38. }
  39. model.batchTable = batchTable;
  40. model.featureTable = featureTable;
  41. scene.batchTable = batchTable;
  42. scene.featureTable = featureTable;
  43. resolve( model );
  44. }, reject );
  45. } );
  46. }
  47. }