Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: opt GLTFLoader code #6

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions packages/loader/src/GLTFLoader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ import { GLTFParserContext } from "./gltf/parser/GLTFParserContext";
@resourceLoader(AssetType.Prefab, ["gltf", "glb"])
export class GLTFLoader extends Loader<GLTFResource> {
load(item: LoadItem, resourceManager: ResourceManager): Record<string, AssetPromise<any>> {
const url = item.url;
const { keepMeshData = false, pipeline } = item.params || {};
const { url } = item;
const params = <GLTFParams>item.params;
const context = new GLTFParserContext(url);
const glTFResource = new GLTFResource(resourceManager.engine, url);
const masterPromiseInfo = context.masterPromiseInfo;

context.glTFResource = glTFResource;
context.keepMeshData = keepMeshData;
context.keepMeshData = params.keepMeshData ?? false;

masterPromiseInfo.onCancel(() => {
const { chainPromises } = context;
Expand All @@ -22,8 +22,8 @@ export class GLTFLoader extends Loader<GLTFResource> {
}
});

(pipeline || GLTFPipeline.defaultPipeline)
.parse(context)
(params.pipeline || GLTFPipeline.defaultPipeline)
._parse(context)
.then(masterPromiseInfo.resolve)
.catch((e) => {
console.error(e);
Expand All @@ -40,4 +40,6 @@ export class GLTFLoader extends Loader<GLTFResource> {
export interface GLTFParams {
/** Keep raw mesh data for glTF parser, default is false. */
keepMeshData: boolean;
/** Custom glTF pipeline. */
pipeline: GLTFPipeline;
}
15 changes: 14 additions & 1 deletion packages/loader/src/gltf/GLTFPipeline.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,13 @@ import { GLTFSkinParser } from "./parser/GLTFSkinParser";
import { GLTFTextureParser } from "./parser/GLTFTextureParser";
import { GLTFValidator } from "./parser/GLTFValidator";

/**
* GLTF pipeline.
*/
export class GLTFPipeline {
/**
* Default pipeline.
*/
static defaultPipeline = new GLTFPipeline(
GLTFBufferParser,
GLTFValidator,
Expand All @@ -27,13 +33,20 @@ export class GLTFPipeline {

private _parsers: GLTFParser[] = [];

/**
* Constructor of GLTFPipeline.
* @param parsers - Parsers to be executed in order
*/
constructor(...parsers: (new () => GLTFParser)[]) {
parsers.forEach((pipe: new () => GLTFParser, index: number) => {
this._parsers[index] = new pipe();
});
}

parse(context: GLTFParserContext): AssetPromise<GLTFResource> {
/**
* @internal
*/
_parse(context: GLTFParserContext): AssetPromise<GLTFResource> {
const glTFResource = context.glTFResource;
let lastParser;

Expand Down
1 change: 1 addition & 0 deletions packages/loader/src/gltf/GLTFSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -854,4 +854,5 @@ export interface IGLTF extends IProperty {
textures?: ITexture[];
}

/** glTF extensible owner schema. */
export type GLTFExtensionOwnerSchema = IMeshPrimitive | IMaterial | ITextureInfo | INode;
16 changes: 9 additions & 7 deletions packages/loader/src/gltf/extensions/GLTFExtensionParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,24 @@ export abstract class GLTFExtensionParser {
_mode: GLTFExtensionMode;

/**
* Some plugins require initialization.
* Initialize the parser.
* @remarks Some plugins require initialization.
* @returns The void or promise
*/
initialize(): void | Promise<void> {}

/**
* Create a resource instance.
* @remarks This method overrides the default resource creation
* Create and parse the resource.
* @remarks This method overrides the default resource creation.
* @param context - The parser context
* @param extensionSchema - The extension schema
* @param ownerSchema - The extension owner schema
* @param extensionOwnerSchema - The extension owner schema
* @returns The resource or promise
*/
createAndParse(
context: GLTFParserContext,
extensionSchema: GLTFExtensionSchema,
ownerSchema: GLTFExtensionOwnerSchema
extensionOwnerSchema: GLTFExtensionOwnerSchema
): EngineObject | Promise<EngineObject> {
throw "Not implemented.";
}
Expand All @@ -39,14 +41,14 @@ export abstract class GLTFExtensionParser {
* @param context - The parser context
* @param resource - The resource
* @param extensionSchema - The extension schema
* @param ownerSchema - The extension owner schema
* @param extensionOwnerSchema - The extension owner schema
* @returns The void or promise
*/
additiveParse(
context: GLTFParserContext,
resource: EngineObject,
extensionSchema: GLTFExtensionSchema,
ownerSchema: GLTFExtensionOwnerSchema
extensionOwnerSchema: GLTFExtensionOwnerSchema
): void | Promise<void> {
throw "Not implemented.";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,18 @@ import { IKHRDracoMeshCompression } from "./GLTFExtensionSchema";
class KHR_draco_mesh_compression extends GLTFExtensionParser {
private static _decoder: DRACODecoder;

/**
* @override
*/
initialize(): void {
if (!KHR_draco_mesh_compression._decoder) {
KHR_draco_mesh_compression._decoder = new DRACODecoder();
}
}

/**
* @override
*/
createAndParse(context: GLTFParserContext, schema: IKHRDracoMeshCompression, gltfPrimitive: IMeshPrimitive) {
const { gltf, buffers } = context;
const { bufferViews, accessors } = gltf;
Expand Down
3 changes: 3 additions & 0 deletions packages/loader/src/gltf/extensions/KHR_lights_punctual.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ import { IKHRLightsPunctual_Light } from "./GLTFExtensionSchema";

@registerGLTFExtension("KHR_lights_punctual", GLTFExtensionMode.AdditiveParse)
class KHR_lights_punctual extends GLTFExtensionParser {
/**
* @override
*/
additiveParse(context: GLTFParserContext, entity: Entity, schema: IKHRLightsPunctual_Light): void {
const { color, intensity = 1, type, range, spot } = schema;
const glTFResource = context.glTFResource;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ import { IKHRMaterialsClearcoat } from "./GLTFExtensionSchema";

@registerGLTFExtension("KHR_materials_clearcoat", GLTFExtensionMode.AdditiveParse)
class KHR_materials_clearcoat extends GLTFExtensionParser {
/**
* @override
*/
additiveParse(context: GLTFParserContext, material: PBRMaterial, schema: IKHRMaterialsClearcoat): void {
const { textures } = context.glTFResource;
const {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ import { IKHRMaterialsPbrSpecularGlossiness } from "./GLTFExtensionSchema";

@registerGLTFExtension("KHR_materials_pbrSpecularGlossiness", GLTFExtensionMode.CreateAndParse)
class KHR_materials_pbrSpecularGlossiness extends GLTFExtensionParser {

/**
* @override
*/
createAndParse(
context: GLTFParserContext,
schema: IKHRMaterialsPbrSpecularGlossiness,
Expand Down
4 changes: 4 additions & 0 deletions packages/loader/src/gltf/extensions/KHR_materials_unlit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ import { GLTFExtensionMode, GLTFExtensionParser } from "./GLTFExtensionParser";

@registerGLTFExtension("KHR_materials_unlit", GLTFExtensionMode.CreateAndParse)
class KHR_materials_unlit extends GLTFExtensionParser {

/**
* @override
*/
createAndParse(context: GLTFParserContext, _, ownerSchema: IMaterial): UnlitMaterial {
const { engine } = context.glTFResource;
const material = new UnlitMaterial(engine);
Expand Down
4 changes: 4 additions & 0 deletions packages/loader/src/gltf/extensions/KHR_materials_variants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ import { IKHRMaterialVariants_Mapping } from "./GLTFExtensionSchema";

@registerGLTFExtension("KHR_materials_variants", GLTFExtensionMode.AdditiveParse)
class KHR_materials_variants extends GLTFExtensionParser {

/**
* @override
*/
additiveParse(context: GLTFParserContext, renderer: Renderer, schema: IKHRMaterialVariants_Mapping): void {
const {
gltf: {
Expand Down
4 changes: 4 additions & 0 deletions packages/loader/src/gltf/extensions/KHR_texture_transform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ import { IKHRTextureTransform } from "./GLTFExtensionSchema";

@registerGLTFExtension("KHR_texture_transform", GLTFExtensionMode.AdditiveParse)
class KHR_texture_transform extends GLTFExtensionParser {

/**
* @override
*/
additiveParse(
context: GLTFParserContext,
material: PBRBaseMaterial | UnlitMaterial,
Expand Down
3 changes: 3 additions & 0 deletions packages/loader/src/gltf/extensions/OASIS_materials_remap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ import { IOasisMaterialRemap } from "./GLTFExtensionSchema";

@registerGLTFExtension("OASIS_materials_remap", GLTFExtensionMode.CreateAndParse)
class OasisMaterialsRemap extends GLTFExtensionParser {
/**
* @override
*/
createAndParse(context: GLTFParserContext, schema: IOasisMaterialRemap): Promise<Material> {
const { engine } = context.glTFResource;
// @ts-ignore
Expand Down