threepipe
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

B3DMLoadPlugin.ts 2.1KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import {
  2. BaseImporterPlugin,
  3. generateUUID,
  4. GLTFLoader2,
  5. IAssetImporter,
  6. ILoader, ImportAddOptions,
  7. Importer,
  8. LoadingManager,
  9. ThreeViewer,
  10. } from 'threepipe'
  11. import type {B3DMResult} from '3d-tiles-renderer/src/three/loaders/B3DMLoader'
  12. import {B3DMLoader, B3DMScene, LoaderBase} from '3d-tiles-renderer'
  13. import {GLTF} from 'three/examples/jsm/loaders/GLTFLoader'
  14. /**
  15. * Adds support for loading .b3dm files and data uris.
  16. * Batched 3D Model (b3dm) file format is part of OGC 3D Tiles.
  17. * Specification - https://www.ogc.org/standards/3dtiles/
  18. */
  19. export class B3DMLoadPlugin extends BaseImporterPlugin {
  20. public static readonly PluginType = 'B3DMLoadPlugin'
  21. protected _importer = new Importer(B3DMLoader2, ['b3dm'], ['model/b3dm'], false)
  22. onAdded(viewer: ThreeViewer) {
  23. super.onAdded(viewer)
  24. this._importer.onCtor = (l, ai) => {
  25. if (l) l.ai = ai
  26. return l
  27. }
  28. }
  29. }
  30. // todo no need to extend GLTFLoader2 for just transform function, it can be called manually or rewritten
  31. export class B3DMLoader2 extends GLTFLoader2 implements ILoader<B3DMResult, B3DMScene> {
  32. loader
  33. ai?: IAssetImporter
  34. constructor(manager: LoadingManager) {
  35. super(manager)
  36. this.loader = new B3DMLoader(manager)
  37. }
  38. transform(res: B3DMResult, options: ImportAddOptions): B3DMScene {
  39. return super.transform(res, options) as any
  40. }
  41. parse(data: ArrayBuffer, _path: string, onLoad: (gltf: GLTF) => void, onError?: (event: ErrorEvent) => void, _url?: string) {
  42. if (!this.ai) {
  43. console.error('[B3DMLoader] load failed, IAssetImporter not set')
  44. }
  45. const tmpFile = generateUUID() + '.gltf'
  46. this.ai?.registerFile(tmpFile) // to set the gltf loader in manager
  47. ;(this.loader as LoaderBase).workingPath = _path
  48. this.loader.parse(data)
  49. .then(onLoad)
  50. .catch(onError)
  51. .finally(() => {
  52. if (tmpFile) this.ai?.unregisterFile(tmpFile)
  53. })
  54. // super.parse(data, path, onLoad, onError, url)
  55. }
  56. }