import { AnimationClip, BufferAttribute, BufferGeometry, Camera, FileLoader, Group, ImageBitmapLoader, InterleavedBufferAttribute, Loader, LoadingManager, Material, Mesh, MeshStandardMaterial, Object3D, Skeleton, SkinnedMesh, Texture, TextureLoader, } from "three"; import { MeshoptDecoder } from "../libs/meshopt_decoder.module.js"; import { DRACOLoader } from "./DRACOLoader.js"; import { KTX2Loader } from "./KTX2Loader.js"; export interface GLTF { animations: AnimationClip[]; scene: Group; scenes: Group[]; cameras: Camera[]; asset: { copyright?: string | undefined; generator?: string | undefined; version?: string | undefined; minVersion?: string | undefined; extensions?: any; extras?: any; }; parser: GLTFParser; userData: Record; } export class GLTFLoader extends Loader { dracoLoader: DRACOLoader | null; ktx2Loader: KTX2Loader | null; meshoptDecoder: typeof MeshoptDecoder | null; constructor(manager?: LoadingManager); setDRACOLoader(dracoLoader: DRACOLoader): this; setKTX2Loader(ktx2Loader: KTX2Loader | null): this; setMeshoptDecoder(meshoptDecoder: typeof MeshoptDecoder | null): this; register(callback: (parser: GLTFParser) => GLTFLoaderPlugin): this; unregister(callback: (parser: GLTFParser) => GLTFLoaderPlugin): this; parse( data: ArrayBuffer | string, path: string, onLoad: (gltf: GLTF) => void, onError?: (event: ErrorEvent) => void, ): void; parseAsync(data: ArrayBuffer | string, path: string): Promise; } export type GLTFReferenceType = "materials" | "nodes" | "textures" | "meshes"; export interface GLTFReference { materials?: number; nodes?: number; textures?: number; meshes?: number; } export class GLTFParser { json: any; options: { path: string; manager: LoadingManager; ktx2Loader: KTX2Loader; meshoptDecoder: /* MeshoptDecoder */ any; crossOrigin: string; requestHeader: { [header: string]: string }; }; fileLoader: FileLoader; textureLoader: TextureLoader | ImageBitmapLoader; plugins: { [name: string]: GLTFLoaderPlugin }; extensions: { [name: string]: any }; associations: Map; setExtensions(extensions: { [name: string]: any }): void; setPlugins(plugins: { [name: string]: GLTFLoaderPlugin }): void; parse(onLoad: (gltf: GLTF) => void, onError?: (event: ErrorEvent) => void): void; getDependency: (type: string, index: number) => Promise; getDependencies: (type: string) => Promise; loadBuffer: (bufferIndex: number) => Promise; loadBufferView: (bufferViewIndex: number) => Promise; loadAccessor: (accessorIndex: number) => Promise; loadTexture: (textureIndex: number) => Promise; loadTextureImage: (textureIndex: number, sourceIndex: number, loader: Loader) => Promise; loadImageSource: (sourceIndex: number, loader: Loader) => Promise; assignTexture: ( materialParams: { [key: string]: any }, mapName: string, mapDef: { index: number; texCoord?: number | undefined; extensions?: any; }, colorSpace?: string | undefined, ) => Promise; assignFinalMaterial: (object: Mesh) => void; getMaterialType: () => typeof MeshStandardMaterial; loadMaterial: (materialIndex: number) => Promise; createUniqueName: (originalName: string) => string; createNodeMesh: (nodeIndex: number) => Promise; loadGeometries: ( /** * GLTF.Primitive[] * See: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/schema/mesh.primitive.schema.json */ primitives: Array<{ [key: string]: any }>, ) => Promise; loadMesh: (meshIndex: number) => Promise; loadCamera: (cameraIndex: number) => Promise; loadSkin: (skinIndex: number) => Promise; loadAnimation: (animationIndex: number) => Promise; loadNode: (nodeIndex: number) => Promise; loadScene: () => Promise; } export interface GLTFLoaderPlugin { readonly name: string; beforeRoot?: (() => Promise | null) | undefined; afterRoot?: ((result: GLTF) => Promise | null) | undefined; loadNode?: ((nodeIndex: number) => Promise | null) | undefined; loadMesh?: ((meshIndex: number) => Promise | null) | undefined; loadBufferView?: ((bufferViewIndex: number) => Promise | null) | undefined; loadMaterial?: ((materialIndex: number) => Promise | null) | undefined; loadTexture?: ((textureIndex: number) => Promise | null) | undefined; getMaterialType?: ((materialIndex: number) => typeof Material | null) | undefined; extendMaterialParams?: | ((materialIndex: number, materialParams: { [key: string]: any }) => Promise | null) | undefined; createNodeMesh?: ((nodeIndex: number) => Promise | null) | undefined; createNodeAttachment?: ((nodeIndex: number) => Promise | null) | undefined; }