diff --git a/Engine/src/Renderer/Model.cpp b/Engine/src/Renderer/Model.cpp index 0bf2026..bfd8e55 100644 --- a/Engine/src/Renderer/Model.cpp +++ b/Engine/src/Renderer/Model.cpp @@ -193,22 +193,21 @@ ParsedModel Model::ParseFromDisk(const std::string& path) aiProcess_JoinIdenticalVertices | aiProcess_LimitBoneWeights); // 每顶点限 4 权重(= 顶点格式 boneIds 容量) - if (!scene || (scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE) || !scene->mRootNode) { - // scene 可能为 null(文件损坏/格式不支持),先判空再打印资产清单 - if (scene != nullptr) { - ENGINE_WARN("Assimp warn: model dose not have mesh assets\nmodel has following asset:"); - - ENGINE_WARN("\tMeshes Count: {}", scene->mNumMeshes); - ENGINE_WARN("\tAnimations Count: {}", scene->mNumAnimations); - ENGINE_WARN("\tCameras Count: {}", scene->mNumCameras); - ENGINE_WARN("\tLights Count: {}", scene->mNumLights); - ENGINE_WARN("\tMaterials Count: {}", scene->mNumMaterials); - ENGINE_WARN("\tSkeletons Count: {}", scene->mNumSkeletons); - ENGINE_WARN("\tTextures Count: {}", scene->mNumTextures); - } - ENGINE_ERROR("Assimp error: {}", importer.GetErrorString()); + // 硬失败只有两种:scene 为 null(文件损坏/格式不支持)、无根节点。 + // 注意 INCOMPLETE 不能当失败判据——assimp 对"无网格场景"统一打此 + // 标记(FBXConverter:没读到 mesh 就置位),纯动画 FBX 必中,数据 + // 本身完好。继续解析,最终有效性由 Valid()(mesh 或 clip 至少 + // 其一非空)统一裁决 + if (!scene || !scene->mRootNode) { + ENGINE_ERROR("Model parse failed: '{}' ({})", + path, importer.GetErrorString()); return out; // meshes/clips 空 = 无效 } + if (scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE) { + ENGINE_WARN("Assimp: no meshes in '{}' (anims: {}, materials: {}) " + "- continuing for animation data", + path, scene->mNumAnimations, scene->mNumMaterials); + } // 骨骼动画三件套:node 表(global 累乘骨架)→ 动画轨道 → 骨骼注册 //(DFS 序;ProcessNode 的 mesh 遍历序与其独立,nodeIdx 靠 name 查表)