Files
engine/packages/loader/src/GLTFLoader.ts
SwayYan a831b41cd4 Add loader for Shader and ShaderChunk asset (#2027)
* feat: add loader for shader asset
2024-11-06 23:20:07 +08:00

66 lines
2.0 KiB
TypeScript

import {
AssetPromise,
AssetType,
Engine,
EngineConfiguration,
Loader,
LoadItem,
resourceLoader,
ResourceManager
} from "@galacean/engine-core";
import { GLTFResource } from "./gltf/GLTFResource";
import { GLTFParserContext } from "./gltf/parser";
import { getMeshoptDecoder, ready } from "./gltf/extensions/MeshoptDecoder";
@resourceLoader(AssetType.GLTF, ["gltf", "glb"])
export class GLTFLoader extends Loader<GLTFResource> {
/**
* Release glTF loader memory(includes meshopt workers).
* @remarks If use loader after releasing, we should release again.
*/
static release(): void {
if (ready) {
getMeshoptDecoder().then((meshoptDecoder) => {
meshoptDecoder.release();
});
}
}
override initialize(_: Engine, configuration: EngineConfiguration): Promise<void> {
const meshOptOptions = configuration.glTFLoader?.meshOpt ?? configuration.glTF?.meshOpt;
if (meshOptOptions) {
return getMeshoptDecoder().then((meshoptDecoder) => {
meshoptDecoder.useWorkers(meshOptOptions.workerCount);
});
}
return Promise.resolve();
}
override load(item: LoadItem, resourceManager: ResourceManager): AssetPromise<GLTFResource> {
const params = <GLTFParams>item.params;
const glTFResource = new GLTFResource(resourceManager.engine, item.url);
const context = new GLTFParserContext(glTFResource, resourceManager, {
keepMeshData: false,
...params
});
return new AssetPromise((resolve, reject, setTaskCompleteProgress, setTaskDetailProgress) => {
context._setTaskCompleteProgress = setTaskCompleteProgress;
context._setTaskDetailProgress = setTaskDetailProgress;
context.parse().then(resolve).catch(reject);
});
}
}
/**
* GlTF loader params.
*/
export interface GLTFParams {
/**
* @beta Now only contains vertex information, need to improve.
* Keep raw mesh data for glTF parser, default is false.
*/
keepMeshData?: boolean;
[key: string]: any;
}