CMPTLoader.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { Group, DefaultLoadingManager } from 'three';
  2. import { CMPTLoaderBase } from '../base/CMPTLoaderBase.js';
  3. import { B3DMLoader } from './B3DMLoader.js';
  4. import { PNTSLoader } from './PNTSLoader.js';
  5. import { I3DMLoader } from './I3DMLoader.js';
  6. export class CMPTLoader extends CMPTLoaderBase {
  7. constructor( manager = DefaultLoadingManager ) {
  8. super();
  9. this.manager = manager;
  10. }
  11. parse( buffer ) {
  12. const result = super.parse( buffer );
  13. const manager = this.manager;
  14. const group = new Group();
  15. const results = [];
  16. const promises = [];
  17. for ( const i in result.tiles ) {
  18. const { type, buffer } = result.tiles[ i ];
  19. switch ( type ) {
  20. case 'b3dm': {
  21. const slicedBuffer = buffer.slice();
  22. const promise = new B3DMLoader( manager )
  23. .parse( slicedBuffer.buffer )
  24. .then( res => {
  25. results.push( res );
  26. group.add( res.scene );
  27. } );
  28. promises.push(promise);
  29. break;
  30. }
  31. case 'pnts': {
  32. const slicedBuffer = buffer.slice();
  33. const pointsResult = new PNTSLoader( manager ).parse( slicedBuffer.buffer );
  34. results.push( pointsResult );
  35. group.add( pointsResult.scene );
  36. break;
  37. }
  38. case 'i3dm': {
  39. const slicedBuffer = buffer.slice();
  40. const promise = new I3DMLoader( manager )
  41. .parse( slicedBuffer.buffer )
  42. .then( res => {
  43. results.push( res );
  44. group.add( res.scene );
  45. } );
  46. promises.push(promise);
  47. break;
  48. }
  49. }
  50. }
  51. return Promise.all( promises ).then( () => {
  52. return {
  53. tiles: results,
  54. scene: group,
  55. };
  56. } );
  57. }
  58. }