// // AssetKind.h:资产分类的单一事实来源(Content Browser / 编辑器共用)。 // // 原先分类逻辑散在 AssetBrowserPanel.cpp 匿名 ns(Kind/KindOf/KindTag), // 现在上提为头文件:面板、拖拽源、缩略图缓存按同一份扩展名表分派。 // #ifndef HELLOVULKAN_ASSETKIND_H #define HELLOVULKAN_ASSETKIND_H #include #include #include #include namespace EditorAsset { // 资产类别(按扩展名分派;同时是类型过滤的身份) enum class AssetKind { Model, Texture, Scene, Material, AnimClip, Prefab, Other }; // 统一小写扩展名(含点,如 ".png";无扩展名 = 空串) inline std::string LowerExt(const std::filesystem::path& p) { std::string ext = p.extension().string(); std::transform(ext.begin(), ext.end(), ext.begin(), [](unsigned char c) { return std::tolower(c); }); return ext; } // 纹理扩展名表(单一事实来源:分类 / 缩略图 / 材质纹理槽选择器共用)。 // 口径 = 引擎 Texture 可直接加载者: // stb_image 8-bit 系 png/jpg/tga/bmp/psd/gif/pnm // + .hdr(环境贴图,stbi_loadf / stbi_load 走内置 hdr→ldr) // + .dds(引擎 DdsLoader,BC 压缩直传) inline bool IsTexturePath(const std::filesystem::path& p) { static const char* kExts[] = { ".png", ".jpg", ".jpeg", ".tga", ".bmp", ".psd", ".gif", ".ppm", ".pgm", ".pnm", ".hdr", ".dds"}; const std::string ext = LowerExt(p); for (const char* e : kExts) { if (ext == e) return true; } return false; } // 扩展名 → 类别 inline AssetKind KindOfPath(const std::filesystem::path& p) { const std::string ext = LowerExt(p); if (ext == ".gltf" || ext == ".glb" || ext == ".fbx" || ext == ".obj") { return AssetKind::Model; } if (IsTexturePath(p)) { return AssetKind::Texture; } if (ext == ".scene") { return AssetKind::Scene; } if (ext == ".material") { return AssetKind::Material; } if (ext == ".animctrl") { return AssetKind::AnimClip; } if (ext == ".prefab") { return AssetKind::Prefab; } return AssetKind::Other; } // 全称标签(tooltip / 网格标题;替代原下标对齐数组) inline const char* KindLabel(AssetKind kind) { switch (kind) { case AssetKind::Model: return "Model"; case AssetKind::Texture: return "Texture/Environment"; case AssetKind::Scene: return "Scene"; case AssetKind::Material: return "Material"; case AssetKind::AnimClip: return "Controller"; case AssetKind::Prefab: return "Prefab"; default: return "File"; } } // 列表类型列的短标签(替代原 "[M]"/"[T]" 前缀) inline const char* KindShortLabel(AssetKind kind) { switch (kind) { case AssetKind::Model: return "MDL"; case AssetKind::Texture: return "TEX"; case AssetKind::Scene: return "SCN"; case AssetKind::Material: return "MAT"; case AssetKind::AnimClip: return "CTRL"; case AssetKind::Prefab: return "PFB"; default: return "FILE"; } } // 可解码为 8-bit 缩略图的扩展名:stbi_load 原生支持者(含 .hdr —— // stbi_load 内部走 hdr→ldr 色调映射)。仅 .dds 例外(BC 压缩块,需 // 专用解码器)→ 占位块 inline bool IsThumbnailable(const std::filesystem::path& p) { return IsTexturePath(p) && LowerExt(p) != ".dds"; } } // namespace EditorAsset #endif //HELLOVULKAN_ASSETKIND_H