Implemented proper error output when compiling files

This commit is contained in:
Xiao Qi 2023-03-07 22:59:50 +08:00
parent 0f88c23604
commit c4cea569e1
2 changed files with 47 additions and 28 deletions

View File

@ -39,14 +39,13 @@ namespace SH_COMP
class MeshCompiler class MeshCompiler
{ {
static std::string filename;
static AccessorReference accessors; static AccessorReference accessors;
static BufferViewReference bufferViews; static BufferViewReference bufferViews;
static BufferData buffer; static BufferData buffer;
static inline void LoadFromFile(AssetPath path, ModelRef asset) noexcept; static inline bool LoadFromFile(AssetPath path, ModelRef asset) noexcept;
static inline void ProcessMesh(ModelData const& data, ModelRef asset) noexcept; static inline bool ProcessMesh(ModelData const& data, ModelRef asset) noexcept;
static inline void ProcessAnimationChannels(ModelData const& data, ModelRef asset) noexcept; static inline void ProcessAnimationChannels(ModelData const& data, ModelRef asset) noexcept;
static inline void ProcessRigNodes(ModelData const& data, ModelRef asset) noexcept; static inline void ProcessRigNodes(ModelData const& data, ModelRef asset) noexcept;

View File

@ -25,12 +25,11 @@
namespace SH_COMP namespace SH_COMP
{ {
std::string MeshCompiler::filename{""};
AccessorReference MeshCompiler::accessors{ nullptr }; AccessorReference MeshCompiler::accessors{ nullptr };
BufferViewReference MeshCompiler::bufferViews{ nullptr }; BufferViewReference MeshCompiler::bufferViews{ nullptr };
BufferData MeshCompiler::buffer{ nullptr }; BufferData MeshCompiler::buffer{ nullptr };
inline void MeshCompiler::LoadFromFile(AssetPath path, ModelRef asset) noexcept inline bool MeshCompiler::LoadFromFile(AssetPath path, ModelRef asset) noexcept
{ {
ModelData model; ModelData model;
tinygltf::TinyGLTF loader; tinygltf::TinyGLTF loader;
@ -39,27 +38,37 @@ namespace SH_COMP
bool result = loader.LoadASCIIFromFile(&model, &error, &warn, path.string()); bool result = loader.LoadASCIIFromFile(&model, &error, &warn, path.string());
if (!warn.empty()) if (!warn.empty())
std::cout << "[TinyGLTF Warning] " << filename << " : " << warn << std::endl; std::cout << "[TinyGLTF Warning] " << warn;
if (!error.empty()) if (!error.empty())
std::cout << "[TinyGLTF Error] " << filename << " : " << error << std::endl; std::cout << "[TinyGLTF Error] " << error;
if (!result) if (!result)
{ {
std::cout << "TinyGLTF failed to parse: " << filename << "\n"; std::cout << "[TinyGLTF] Failed to parse\n";
std::exit(1); return false;
} }
ProcessMesh(model, asset); if (ProcessMesh(model, asset))
{
auto const hasAnims {!model.animations.empty()};
if (hasAnims)
{
ProcessRigNodes(model, asset); ProcessRigNodes(model, asset);
ProcessAnimationChannels(model, asset); ProcessAnimationChannels(model, asset);
} }
return true;
}
inline void MeshCompiler::ProcessMesh(ModelData const& data, ModelRef asset) noexcept return false;
}
inline bool MeshCompiler::ProcessMesh(ModelData const& data, ModelRef asset) noexcept
{ {
accessors = &data.accessors; accessors = &data.accessors;
bufferViews = &data.bufferViews; bufferViews = &data.bufferViews;
buffer = data.buffers[0].data.data(); buffer = data.buffers[0].data.data();
auto const hasAnims {!data.animations.empty()};
for (auto const& mesh : data.meshes) for (auto const& mesh : data.meshes)
{ {
@ -88,9 +97,12 @@ namespace SH_COMP
} }
catch (std::out_of_range e) catch (std::out_of_range e)
{ {
std::cout << "[Model Compiler] Failed to load critical data from gltf: " << filename << "\n"; std::cout << "[Model Compiler] Failed to load critical data from gltf\n";
return false;
} }
if (hasAnims)
{
try try
{ {
FetchData(primitive.attributes.at(ATT_WEIGHTS.data()), meshIn.weights); FetchData(primitive.attributes.at(ATT_WEIGHTS.data()), meshIn.weights);
@ -98,11 +110,14 @@ namespace SH_COMP
} }
catch(std::out_of_range e) catch(std::out_of_range e)
{ {
std::cout << "[Model Compiler] " << filename << ": No weights and joints found for mesh: " << mesh.name << std::endl; std::cout << "[Model Compiler] No weights and joints found for mesh: " << mesh.name << std::endl;
} }
} }
} }
return true;
}
template <typename T> template <typename T>
void MeshCompiler::FetchData(int accessorID, std::vector<T>& dst) void MeshCompiler::FetchData(int accessorID, std::vector<T>& dst)
{ {
@ -213,11 +228,16 @@ namespace SH_COMP
{ {
auto const asset = new ModelAsset(); auto const asset = new ModelAsset();
filename = path.filename().string(); if (LoadFromFile(path, *asset))
{
LoadFromFile(path, *asset);
BuildHeaders(*asset); BuildHeaders(*asset);
MeshWriter::CompileMeshBinary(path, *asset); MeshWriter::CompileMeshBinary(path, *asset);
std::cout << "[Model Compiler] Compiled file: " << path << "\n\n";
}
else
{
std::cout << "[Model Compiler] Failed to compile file: " << path << "\n\n";
}
delete asset; delete asset;
} }
@ -226,7 +246,7 @@ namespace SH_COMP
{ {
if (data.animations.empty()) if (data.animations.empty())
{ {
std::cout << "[Model Compiler] " << filename << ": Animations do not exist\n"; std::cout << "[Model Compiler] Animations do not exist\n";
return; return;
} }
@ -270,7 +290,7 @@ namespace SH_COMP
{ {
if (data.skins.empty()) if (data.skins.empty())
{ {
std::cout << "[Model Compiler] " << filename << ": Unable to load rigs without skin, aborting"; std::cout << "[Model Compiler] Skins not found for asset\n";
return; return;
} }