From 212924d431e9513f582db8d9b6de1aae89bafed2 Mon Sep 17 00:00:00 2001 From: Hu Song Date: Thu, 5 Jan 2023 16:47:01 +0800 Subject: [PATCH] Fix resource load can't be catched bug (#1316) * fix: resource load can't be catched bug --- .../loader/src/AnimatorControllerLoader.ts | 132 +++++++++--------- packages/loader/src/MaterialLoader.ts | 130 ++++++++--------- packages/loader/src/MeshLoader.ts | 5 +- packages/loader/src/SpriteAtlasLoader.ts | 2 +- packages/loader/src/SpriteLoader.ts | 20 +-- packages/loader/src/gltf/parser/MeshParser.ts | 10 +- .../loader/src/gltf/parser/SceneParser.ts | 6 +- .../loader/src/gltf/parser/TextureParser.ts | 10 +- .../resources/prefab/ReflectionParser.ts | 4 +- 9 files changed, 165 insertions(+), 154 deletions(-) diff --git a/packages/loader/src/AnimatorControllerLoader.ts b/packages/loader/src/AnimatorControllerLoader.ts index c8d79463b..7382163d5 100644 --- a/packages/loader/src/AnimatorControllerLoader.ts +++ b/packages/loader/src/AnimatorControllerLoader.ts @@ -18,74 +18,76 @@ class AnimatorControllerLoader extends Loader { this.request(item.url, { ...item, type: "json" - }).then((data) => { - const animatorController = new AnimatorController(); - const { layers } = data; - const promises = []; - layers.forEach((layerData, layerIndex: number) => { - const { name, blendingMode, weight, stateMachine: stateMachineData } = layerData; - const layer = new AnimatorControllerLayer(name); - layer.blendingMode = blendingMode; - layer.weight = weight; - if (stateMachineData) { - const { states } = stateMachineData; - const stateMachine = (layer.stateMachine = new AnimatorStateMachine()); - states.forEach((stateData, stateIndex: number) => { - const { - name, - speed, - wrapMode, - clipStartNormalizedTime, - clipEndNormalizedTime, - isDefaultState, - clip: clipData - } = stateData; - const state = stateMachine.addState(name); - isDefaultState && (stateMachine.defaultState = state); - state.speed = speed; - state.wrapMode = wrapMode; - state.clipStartTime = clipStartNormalizedTime; - state.clipEndTime = clipEndNormalizedTime; - if (clipData) { - promises.push( - new Promise((resolve) => { - //@ts-ignore - resourceManager.getResourceByRef(clipData).then((clip) => { - resolve({ - layerIndex, - stateIndex, - clip + }) + .then((data) => { + const animatorController = new AnimatorController(); + const { layers } = data; + const promises = []; + layers.forEach((layerData, layerIndex: number) => { + const { name, blendingMode, weight, stateMachine: stateMachineData } = layerData; + const layer = new AnimatorControllerLayer(name); + layer.blendingMode = blendingMode; + layer.weight = weight; + if (stateMachineData) { + const { states } = stateMachineData; + const stateMachine = (layer.stateMachine = new AnimatorStateMachine()); + states.forEach((stateData, stateIndex: number) => { + const { + name, + speed, + wrapMode, + clipStartNormalizedTime, + clipEndNormalizedTime, + isDefaultState, + clip: clipData + } = stateData; + const state = stateMachine.addState(name); + isDefaultState && (stateMachine.defaultState = state); + state.speed = speed; + state.wrapMode = wrapMode; + state.clipStartTime = clipStartNormalizedTime; + state.clipEndTime = clipEndNormalizedTime; + if (clipData) { + promises.push( + new Promise((resolve) => { + //@ts-ignore + resourceManager.getResourceByRef(clipData).then((clip) => { + resolve({ + layerIndex, + stateIndex, + clip + }); }); - }); - }) - ); - } - }); - states.forEach((stateData) => { - const { name, transitions } = stateData; - transitions.forEach((transitionData) => { - const { targetStateName, duration, offset, exitTime } = transitionData; - const sourceState = stateMachine.findStateByName(name); - const destState = stateMachine.findStateByName(targetStateName); - const transition = new AnimatorStateTransition(); - transition.destinationState = destState; - transition.duration = duration; - transition.exitTime = exitTime; - transition.offset = offset; - sourceState.addTransition(transition); + }) + ); + } }); - }); - } - animatorController.addLayer(layer); - }); - Promise.all(promises).then((clipData) => { - clipData.forEach((data) => { - const { layerIndex, stateIndex, clip } = data; - animatorController.layers[layerIndex].stateMachine.states[stateIndex].clip = clip; + states.forEach((stateData) => { + const { name, transitions } = stateData; + transitions.forEach((transitionData) => { + const { targetStateName, duration, offset, exitTime } = transitionData; + const sourceState = stateMachine.findStateByName(name); + const destState = stateMachine.findStateByName(targetStateName); + const transition = new AnimatorStateTransition(); + transition.destinationState = destState; + transition.duration = duration; + transition.exitTime = exitTime; + transition.offset = offset; + sourceState.addTransition(transition); + }); + }); + } + animatorController.addLayer(layer); }); - resolve(animatorController); - }); - }); + Promise.all(promises).then((clipData) => { + clipData.forEach((data) => { + const { layerIndex, stateIndex, clip } = data; + animatorController.layers[layerIndex].stateMachine.states[stateIndex].clip = clip; + }); + resolve(animatorController); + }); + }) + .catch(reject); }); } } diff --git a/packages/loader/src/MaterialLoader.ts b/packages/loader/src/MaterialLoader.ts index 4304c8813..53689702b 100644 --- a/packages/loader/src/MaterialLoader.ts +++ b/packages/loader/src/MaterialLoader.ts @@ -22,81 +22,83 @@ class MaterialLoader extends Loader { this.request(item.url, { ...item, type: "json" - }).then((json: { [key: string]: any }) => { - const engine = resourceManager.engine; - const { name, shader, shaderData, macros, renderState } = json; + }) + .then((json: { [key: string]: any }) => { + const engine = resourceManager.engine; + const { name, shader, shaderData, macros, renderState } = json; - let material; - switch (shader) { - case "pbr": - material = new PBRMaterial(engine); - break; - case "pbr-specular": - material = new PBRSpecularMaterial(engine); - break; - case "unlit": - material = new UnlitMaterial(engine); - break; - case "blinn-phong": - material = new BlinnPhongMaterial(engine); - break; - case "bake-pbr": - // @todo refactor custom shader later - // @ts-ignore - material = new PBRBaseMaterial(engine, Shader.find("bake-pbr")); - break; - } - material.name = name; - - const texturePromises = new Array>(); - const materialShaderData = material.shaderData; - for (let key in shaderData) { - const { type, value } = shaderData[key]; - - switch (type) { - case "Vector2": - materialShaderData.setVector2(key, new Vector2(value.x, value.y)); + let material; + switch (shader) { + case "pbr": + material = new PBRMaterial(engine); break; - case "Vector3": - materialShaderData.setVector3(key, new Vector3(value.x, value.y, value.z)); + case "pbr-specular": + material = new PBRSpecularMaterial(engine); break; - case "Vector4": - materialShaderData.setVector4(key, new Vector4(value.x, value.y, value.z, value.w)); + case "unlit": + material = new UnlitMaterial(engine); break; - case "Color": - materialShaderData.setColor(key, new Color(value.r, value.g, value.b, value.a)); + case "blinn-phong": + material = new BlinnPhongMaterial(engine); break; - case "Float": - materialShaderData.setFloat(key, value); - break; - case "Texture": - texturePromises.push( - // @ts-ignore - resourceManager.getResourceByRef(value).then((texture) => { - materialShaderData.setTexture(key, texture); - }) - ); + case "bake-pbr": + // @todo refactor custom shader later + // @ts-ignore + material = new PBRBaseMaterial(engine, Shader.find("bake-pbr")); break; } - } + material.name = name; - for (let i = 0, length = macros.length; i < length; i++) { - const { name, value } = macros[i]; - if (value == undefined) { - materialShaderData.enableMacro(name); - } else { - materialShaderData.enableMacro(name, value); + const texturePromises = new Array>(); + const materialShaderData = material.shaderData; + for (let key in shaderData) { + const { type, value } = shaderData[key]; + + switch (type) { + case "Vector2": + materialShaderData.setVector2(key, new Vector2(value.x, value.y)); + break; + case "Vector3": + materialShaderData.setVector3(key, new Vector3(value.x, value.y, value.z)); + break; + case "Vector4": + materialShaderData.setVector4(key, new Vector4(value.x, value.y, value.z, value.w)); + break; + case "Color": + materialShaderData.setColor(key, new Color(value.r, value.g, value.b, value.a)); + break; + case "Float": + materialShaderData.setFloat(key, value); + break; + case "Texture": + texturePromises.push( + // @ts-ignore + resourceManager.getResourceByRef(value).then((texture) => { + materialShaderData.setTexture(key, texture); + }) + ); + break; + } } - } - for (let key in renderState) { - material[key] = renderState[key]; - } + for (let i = 0, length = macros.length; i < length; i++) { + const { name, value } = macros[i]; + if (value == undefined) { + materialShaderData.enableMacro(name); + } else { + materialShaderData.enableMacro(name, value); + } + } - Promise.all(texturePromises).then(() => { - resolve(material); - }); - }); + for (let key in renderState) { + material[key] = renderState[key]; + } + + return Promise.all(texturePromises).then(() => { + resolve(material); + }); + }) + .catch(reject); }); } } diff --git a/packages/loader/src/MeshLoader.ts b/packages/loader/src/MeshLoader.ts index d0b0d30a1..ecec23f79 100644 --- a/packages/loader/src/MeshLoader.ts +++ b/packages/loader/src/MeshLoader.ts @@ -12,7 +12,7 @@ import { decode } from "./resource-deserialize"; @resourceLoader(AssetType.Mesh, ["mesh"]) class MeshLoader extends Loader { load(item: LoadItem, resourceManager: ResourceManager): AssetPromise { - return new AssetPromise((resolve) => { + return new AssetPromise((resolve, reject) => { this.request(item.url, { ...item, type: "arraybuffer" @@ -22,7 +22,8 @@ class MeshLoader extends Loader { }) .then((mesh) => { resolve(mesh); - }); + }) + .catch(reject); }); } } diff --git a/packages/loader/src/SpriteAtlasLoader.ts b/packages/loader/src/SpriteAtlasLoader.ts index 0d2960e41..5a10a6825 100644 --- a/packages/loader/src/SpriteAtlasLoader.ts +++ b/packages/loader/src/SpriteAtlasLoader.ts @@ -43,7 +43,7 @@ class SpriteAtlasLoader extends Loader { ) ); chainPromises.push(imagePromises); - imagePromises.then((imgs) => { + return imagePromises.then((imgs) => { const { engine } = resourceManager; // Generate a SpriteAtlas object. const { _tempRect: tempRect, _tempVec2: tempVec2 } = this; diff --git a/packages/loader/src/SpriteLoader.ts b/packages/loader/src/SpriteLoader.ts index c14c2be2a..8bbd1cc9f 100644 --- a/packages/loader/src/SpriteLoader.ts +++ b/packages/loader/src/SpriteLoader.ts @@ -16,15 +16,17 @@ class SpriteLoader extends Loader { this.request(item.url, { ...item, type: "json" - }).then((data) => { - // @ts-ignore - resourceManager.getResourceByRef(data.texture).then((texture) => { - const sprite = new Sprite(resourceManager.engine, texture); - sprite.region = data.region; - sprite.pivot = data.pivot; - resolve(sprite); - }); - }); + }) + .then((data) => { + // @ts-ignore + resourceManager.getResourceByRef(data.texture).then((texture) => { + const sprite = new Sprite(resourceManager.engine, texture); + sprite.region = data.region; + sprite.pivot = data.pivot; + resolve(sprite); + }); + }) + .catch(reject); }); } } diff --git a/packages/loader/src/gltf/parser/MeshParser.ts b/packages/loader/src/gltf/parser/MeshParser.ts index a5b883fab..8795bf03f 100644 --- a/packages/loader/src/gltf/parser/MeshParser.ts +++ b/packages/loader/src/gltf/parser/MeshParser.ts @@ -104,10 +104,12 @@ export class MeshParser extends Parser { meshPromises[i] = Promise.all(primitivePromises); } - AssetPromise.all(meshPromises).then((meshes: ModelMesh[][]) => { - glTFResource.meshes = meshes; - meshesPromiseInfo.resolve(meshes); - }); + AssetPromise.all(meshPromises) + .then((meshes: ModelMesh[][]) => { + glTFResource.meshes = meshes; + meshesPromiseInfo.resolve(meshes); + }) + .catch(meshesPromiseInfo.reject); return meshesPromiseInfo.promise; } diff --git a/packages/loader/src/gltf/parser/SceneParser.ts b/packages/loader/src/gltf/parser/SceneParser.ts index 82874bafc..bec4fd40a 100644 --- a/packages/loader/src/gltf/parser/SceneParser.ts +++ b/packages/loader/src/gltf/parser/SceneParser.ts @@ -66,9 +66,9 @@ export class SceneParser extends Parser { gltf.extensions && delete gltf.extensions["OASIS_materials_remap"]; - AssetPromise.all(promises).then(() => { - defaultSceneRootPromiseInfo.resolve(glTFResource.defaultSceneRoot); - }); + AssetPromise.all(promises) + .then(() => defaultSceneRootPromiseInfo.resolve(glTFResource.defaultSceneRoot)) + .catch(defaultSceneRootPromiseInfo.reject); return defaultSceneRootPromiseInfo.promise; } diff --git a/packages/loader/src/gltf/parser/TextureParser.ts b/packages/loader/src/gltf/parser/TextureParser.ts index f9466b4f0..3c52d9d34 100644 --- a/packages/loader/src/gltf/parser/TextureParser.ts +++ b/packages/loader/src/gltf/parser/TextureParser.ts @@ -54,10 +54,12 @@ export class TextureParser extends Parser { }); } }) - ).then((textures: Texture2D[]) => { - glTFResource.textures = textures; - texturesPromiseInfo.resolve(textures); - }); + ) + .then((textures: Texture2D[]) => { + glTFResource.textures = textures; + texturesPromiseInfo.resolve(textures); + }) + .catch(texturesPromiseInfo.reject); return texturesPromiseInfo.promise; } } diff --git a/packages/loader/src/resource-deserialize/resources/prefab/ReflectionParser.ts b/packages/loader/src/resource-deserialize/resources/prefab/ReflectionParser.ts index 0a783b5ed..d2c55f1ae 100644 --- a/packages/loader/src/resource-deserialize/resources/prefab/ReflectionParser.ts +++ b/packages/loader/src/resource-deserialize/resources/prefab/ReflectionParser.ts @@ -120,7 +120,7 @@ export class ReflectionParser { } } - return new Promise((resolve) => { + return new Promise((resolve, reject) => { Promise.all(promises).then(() => { const handle = this.customParseComponentHandles[instance.constructor.name]; if (handle) { @@ -130,7 +130,7 @@ export class ReflectionParser { } else { resolve(instance); } - }); + }).catch(reject) }); }