From 524af211e0b634e6613f352aac0486ba11033159 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Sun, 13 Dec 2015 20:04:50 +0100 Subject: [PATCH] Made resource loading fail gracefully when a resource can't be loaded. Resources should now throw exceptions in their constuctor if the resource can't be loaded. This will result in ResourceManager::Load returning null. --- src/Engine/Core/ResourceManager.cpp | 16 +++++++++++----- src/Engine/Rendering/RawModel.cpp | 2 +- src/Engine/Rendering/RenderQueueFactory.cpp | 3 +++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/Engine/Core/ResourceManager.cpp b/src/Engine/Core/ResourceManager.cpp index 81823dbf..62a60f14 100644 --- a/src/Engine/Core/ResourceManager.cpp +++ b/src/Engine/Core/ResourceManager.cpp @@ -100,7 +100,7 @@ Resource* ResourceManager::Load(std::string resourceType, std::string resourceNa LOG_WARNING("Hot-loading resource \"%s\"", resourceName.c_str()); } - return CreateResource(resourceType, resourceName, parent); + return CreateResource(resourceType, resourceName, parent); } Resource* ResourceManager::CreateResource(std::string resourceType, std::string resourceName, Resource* parent) @@ -112,10 +112,16 @@ Resource* ResourceManager::CreateResource(std::string resourceType, std::string } // Call the factory function - Resource* resource = facIt->second(resourceName); - // Store IDs - resource->TypeID = GetTypeID(resourceType); - resource->ResourceID = GetNewResourceID(resource->TypeID); + Resource* resource; + try { + resource = facIt->second(resourceName); + // Store IDs + resource->TypeID = GetTypeID(resourceType); + resource->ResourceID = GetNewResourceID(resource->TypeID); + } catch (const std::exception& e) { + resource = nullptr; + LOG_ERROR("Failed to load resource \"%s\" of type \"%s\": %s", resourceName.c_str(), resourceType.c_str(), e.what()); + } // Cache m_ResourceCache[std::make_pair(resourceType, resourceName)] = resource; m_ResourceFromName[resourceName] = resource; diff --git a/src/Engine/Rendering/RawModel.cpp b/src/Engine/Rendering/RawModel.cpp index 962c278f..5aec7f22 100644 --- a/src/Engine/Rendering/RawModel.cpp +++ b/src/Engine/Rendering/RawModel.cpp @@ -8,7 +8,7 @@ RawModel::RawModel(std::string fileName) if (scene == nullptr) { LOG_ERROR("Failed to load model \"%s\"", fileName.c_str()); LOG_ERROR("Assimp error: %s", importer.GetErrorString()); - return; + throw std::runtime_error("Failed to open model file."); } auto m = scene->mRootNode->mTransformation; diff --git a/src/Engine/Rendering/RenderQueueFactory.cpp b/src/Engine/Rendering/RenderQueueFactory.cpp index 4b82647c..163a1f86 100644 --- a/src/Engine/Rendering/RenderQueueFactory.cpp +++ b/src/Engine/Rendering/RenderQueueFactory.cpp @@ -77,6 +77,9 @@ void RenderQueueFactory::FillModels(World* world, RenderQueue* renderQueue) } glm::vec4 color = modelC["Color"]; Model* model = ResourceManager::Load(resource); + if (model == nullptr) { + model = ResourceManager::Load("Models/Core/Error.obj"); + } for (auto texGroup : model->TextureGroups) { ModelJob job;