B3DMLoader.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { B3DMLoaderBase } from '../base/B3DMLoaderBase.js';
  2. import { DefaultLoadingManager, Matrix4 } 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. this.adjustmentTransform = new Matrix4();
  9. }
  10. parse( buffer ) {
  11. const b3dm = super.parse( buffer );
  12. const gltfBuffer = b3dm.glbBytes.slice().buffer;
  13. return new Promise( ( resolve, reject ) => {
  14. const manager = this.manager;
  15. const fetchOptions = this.fetchOptions;
  16. const loader = manager.getHandler( 'path.gltf' ) || new GLTFLoader( manager );
  17. if ( fetchOptions.credentials === 'include' && fetchOptions.mode === 'cors' ) {
  18. loader.setCrossOrigin( 'use-credentials' );
  19. }
  20. if ( 'credentials' in fetchOptions ) {
  21. loader.setWithCredentials( fetchOptions.credentials === 'include' );
  22. }
  23. if ( fetchOptions.headers ) {
  24. loader.setRequestHeader( fetchOptions.headers );
  25. }
  26. // GLTFLoader assumes the working path ends in a slash
  27. let workingPath = this.workingPath;
  28. if ( ! /[\\/]$/.test( workingPath ) && workingPath.length ) {
  29. workingPath += '/';
  30. }
  31. const adjustmentTransform = this.adjustmentTransform;
  32. loader.parse( gltfBuffer, workingPath, model => {
  33. const { batchTable, featureTable } = b3dm;
  34. const { scene } = model;
  35. const rtcCenter = featureTable.getData( 'RTC_CENTER' );
  36. if ( rtcCenter ) {
  37. scene.position.x += rtcCenter[ 0 ];
  38. scene.position.y += rtcCenter[ 1 ];
  39. scene.position.z += rtcCenter[ 2 ];
  40. }
  41. model.scene.matrix.multiply( adjustmentTransform );
  42. model.scene.matrix.decompose( model.scene.position, model.scene.quaternion, model.scene.scale );
  43. model.batchTable = batchTable;
  44. model.featureTable = featureTable;
  45. scene.batchTable = batchTable;
  46. scene.featureTable = featureTable;
  47. resolve( model );
  48. }, reject );
  49. } );
  50. }
  51. }