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.

пре 2 година
пре 2 година
пре 2 година
пре 2 година
пре 2 година
пре 2 година
пре 2 година
пре 2 година
1234567891011121314151617181920212223242526272829303132333435363738
  1. import {Importer} from '../../assetmanager'
  2. import {USDZLoader} from 'three/examples/jsm/loaders/USDZLoader.js'
  3. import {Group, Mesh} from 'three'
  4. import {Zippable, zipSync} from 'three/examples/jsm/libs/fflate.module.js'
  5. import {BaseImporterPlugin} from '../base/BaseImporterPlugin'
  6. /**
  7. * Adds support for loading `.usdz`, `model/vnd.usd+zip` and `.usda`, `model/vnd.usda` files and data uris
  8. * @category Plugins
  9. */
  10. export class USDZLoadPlugin extends BaseImporterPlugin {
  11. public static readonly PluginType = 'USDZLoadPlugin'
  12. protected _importer = new Importer(class extends USDZLoader {
  13. currentUrl = ''
  14. async loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<Mesh> {
  15. this.currentUrl = url
  16. const res = await super.loadAsync(url, onProgress)
  17. this.currentUrl = ''
  18. return res
  19. }
  20. parse(buffer: ArrayBuffer|string): Group {
  21. // todo make changes in three.js to allow passing unzipped buffer directly for usda
  22. if (this.currentUrl.endsWith('.usda') && typeof buffer !== 'string') {
  23. const filename = this.currentUrl.split('/').pop()
  24. if (filename) {
  25. const zip: Zippable = {}
  26. zip[filename] = new Uint8Array(buffer)
  27. buffer = zipSync(zip).buffer
  28. }
  29. }
  30. return super.parse(buffer)
  31. }
  32. }, ['usdz', 'usda'], ['model/vnd.usd+zip', 'model/vnd.usdz+zip', 'model/vnd.usda'], false)
  33. }