index.ts 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import { GLTFLoader, DRACOLoader } from 'three-stdlib'
  2. import { useLoader } from '@tresjs/core'
  3. import { Object3D } from 'three'
  4. export interface GLTFLoaderOptions {
  5. draco?: boolean
  6. decoderPath?: string
  7. }
  8. export interface TresObject extends Object3D {
  9. geometry: THREE.BufferGeometry
  10. material: THREE.Material
  11. }
  12. export interface GLTFResult {
  13. nodes: Array<TresObject>
  14. materials: Array<THREE.Material>
  15. scene: THREE.Scene
  16. }
  17. let dracoLoader: DRACOLoader | null = null
  18. function setExtensions(options: GLTFLoaderOptions, extendLoader?: (loader: GLTFLoader) => void) {
  19. return (loader: GLTFLoader) => {
  20. if (extendLoader) {
  21. extendLoader(loader as GLTFLoader)
  22. }
  23. if (!dracoLoader) {
  24. dracoLoader = new DRACOLoader()
  25. }
  26. dracoLoader.setDecoderPath(options.decoderPath || 'https://www.gstatic.com/draco/versioned/decoders/1.4.3/')
  27. }
  28. }
  29. export async function useGLTF(
  30. path: string | string[],
  31. options: GLTFLoaderOptions = {
  32. draco: false,
  33. },
  34. extendLoader?: (loader: GLTFLoader) => void,
  35. ): Promise<GLTFResult> {
  36. return (await useLoader(GLTFLoader, path, setExtensions(options, extendLoader))) as unknown as GLTFResult
  37. }