CMPTLoader.js 1.5 KB

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