1234567891011121314151617181920212223242526272829303132333435363738394041 |
- import { GLTFLoader, DRACOLoader } from 'three-stdlib'
- import { useLoader } from '@tresjs/core'
- import { Object3D } from 'three'
- export interface GLTFLoaderOptions {
- draco?: boolean
- decoderPath?: string
- }
- export interface TresObject extends Object3D {
- geometry: THREE.BufferGeometry
- material: THREE.Material
- }
- export interface GLTFResult {
- nodes: Array<TresObject>
- materials: Array<THREE.Material>
- scene: THREE.Scene
- }
- let dracoLoader: DRACOLoader | null = null
- function setExtensions(options: GLTFLoaderOptions, extendLoader?: (loader: GLTFLoader) => void) {
- return (loader: GLTFLoader) => {
- if (extendLoader) {
- extendLoader(loader as GLTFLoader)
- }
- if (!dracoLoader) {
- dracoLoader = new DRACOLoader()
- }
- dracoLoader.setDecoderPath(options.decoderPath || 'https://www.gstatic.com/draco/versioned/decoders/1.4.3/')
- }
- }
- export async function useGLTF(
- path: string | string[],
- options: GLTFLoaderOptions = {
- draco: false,
- },
- extendLoader?: (loader: GLTFLoader) => void,
- ): Promise<GLTFResult> {
- return (await useLoader(GLTFLoader, path, setExtensions(options, extendLoader))) as unknown as GLTFResult
- }
|