fix: animation-only FBX assets loadable; clip data viewer
Pure-animation FBX (no meshes, skeleton clips only) was rejected at the cache layer: ParsedModel::Valid() required non-empty meshes, so Model::FromParsed/LoadModel returned null and the asset never made it into the cache. Animation assets are now first-class: - ParsedModel::Valid() = meshes or clips non-empty; parse failures (both empty) still rejected. Empty-mesh consumers already guarded (rendering skips empty mesh loop, mesh collider falls back to Box) - ParseFromDisk: fix null-deref when assimp returns a null scene - AssetCache::Find(path) + AssetManager::GetModelByPath for panels - Asset Browser hover card shows meshes/bones/clips for loaded models - Inspector model line flags "animation-only" when meshes == 0 - Animation section: collapsible clip data table (name/duration/ channel count) to verify bone-name matching of attached clips
This commit is contained in:
@@ -117,6 +117,17 @@ namespace Engine
|
||||
return (e.generation == h.generation && e.alive) ? e.path : kEmpty;
|
||||
}
|
||||
|
||||
// 按路径查活资产(未加载/已卸载返回 nullptr;不触发加载、
|
||||
// 不对坏句柄 FATAL)——面板展示用
|
||||
T* Find(const std::string& path) const
|
||||
{
|
||||
auto it = m_ByPath.find(path);
|
||||
if (it == m_ByPath.end()) return nullptr;
|
||||
const Entry& e = m_Entries[it->second.index];
|
||||
return (e.alive && e.generation == it->second.generation)
|
||||
? e.asset.get() : nullptr;
|
||||
}
|
||||
|
||||
u32 Count() const
|
||||
{
|
||||
return static_cast<u32>(m_Entries.size()) - static_cast<u32>(m_Free.size());
|
||||
@@ -160,6 +171,12 @@ namespace Engine
|
||||
ModelRef LoadModel(const std::string& path, ParsedModel&& parsed);
|
||||
Model* GetModel(ModelRef h) const { return m_Models.Get(h); }
|
||||
void UnloadModel(ModelRef h) { m_Models.Unload(h); }
|
||||
// 按路径查已加载的模型(未加载返回 null,不触发加载)——
|
||||
// 面板 hover 信息卡用
|
||||
Model* GetModelByPath(const std::string& path) const
|
||||
{
|
||||
return m_Models.Find(path);
|
||||
}
|
||||
|
||||
// ---- 外部动画并入(UE AnimSequence 归属 Skeleton 的简化版)----
|
||||
// 把动画容器文件(无网格 FBX/GLB 等)里的 clip 按骨骼节点名
|
||||
|
||||
@@ -99,7 +99,10 @@ namespace Engine
|
||||
std::vector<ModelNode> nodes;
|
||||
std::vector<ModelBone> bones;
|
||||
std::vector<AnimationClip> clips;
|
||||
bool Valid() const { return !meshes.empty(); }
|
||||
// 解析有效性:mesh 与 clip 至少其一非空。纯动画 FBX(无网格只有
|
||||
// 骨骼动画,UE 的 Animation Sequence 资产同理)是合法资产——
|
||||
// 过去只认 meshes 导致动画源文件在缓存层被整体拒载
|
||||
bool Valid() const { return !meshes.empty() || !clips.empty(); }
|
||||
};
|
||||
|
||||
class Model
|
||||
|
||||
Reference in New Issue
Block a user