From cb6b0a58d8787dcb35fe2a2b797280d0752f5b85 Mon Sep 17 00:00:00 2001 From: ViktorLjung Date: Sun, 27 Apr 2014 08:07:18 +0200 Subject: [PATCH] Resource manager OBJ vs Model conflict fixed --- src/Model.cpp | 2 +- src/Model.h | 2 +- src/OBJ.cpp | 2 +- src/OBJ.h | 4 +++- src/ResourceManager.cpp | 8 ++++---- src/ResourceManager.h | 9 +++++---- src/Util/UnorderedMapPair.h | 20 ++++++++++++++++++++ 7 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 src/Util/UnorderedMapPair.h diff --git a/src/Model.cpp b/src/Model.cpp index 547e940..753ec65 100755 --- a/src/Model.cpp +++ b/src/Model.cpp @@ -1,7 +1,7 @@ #include "PrecompiledHeader.h" #include "Model.h" -Model::Model(OBJ &obj, ResourceManager* rm) +Model::Model(ResourceManager* rm, OBJ &obj) { OBJ::MaterialInfo* currentMaterial = nullptr; TextureGroup* currentTexGroup = nullptr; diff --git a/src/Model.h b/src/Model.h index 8d94a7d..dcf41d9 100755 --- a/src/Model.h +++ b/src/Model.h @@ -17,7 +17,7 @@ class Model : public Resource { public: - Model(OBJ &obj, ResourceManager* rm); + Model(ResourceManager* rm, OBJ &obj); struct TextureGroup { diff --git a/src/OBJ.cpp b/src/OBJ.cpp index a8b9f03..d8f91bf 100755 --- a/src/OBJ.cpp +++ b/src/OBJ.cpp @@ -9,7 +9,7 @@ bool OBJ::LoadFromFile(std::string filename) std::ifstream file(m_Path.string()); if (!file.is_open()) { - LOG_ERROR("Failed to open .obj \"%s\"", m_Path.string().c_str()); + LOG_ERROR("Failed to open .obj \"%s\": %s", m_Path.string().c_str(), strerror(errno)); return false; } diff --git a/src/OBJ.h b/src/OBJ.h index 2ef10e0..8ae9a32 100755 --- a/src/OBJ.h +++ b/src/OBJ.h @@ -12,7 +12,9 @@ #include #include -class OBJ +#include "ResourceManager.h" + +class OBJ : public Resource { public: struct MaterialInfo diff --git a/src/ResourceManager.cpp b/src/ResourceManager.cpp index 1361c11..b4ff9bd 100644 --- a/src/ResourceManager.cpp +++ b/src/ResourceManager.cpp @@ -16,7 +16,7 @@ Resource* ResourceManager::CreateResource(std::string resourceType, std::string resource->TypeID = GetTypeID(resourceType); resource->ResourceID = GetNewResourceID(resource->TypeID); // Cache - m_ResourceCache[resourceName] = resource; + m_ResourceCache[std::make_pair(resourceType, resourceName)] = resource; return resource; } @@ -28,7 +28,7 @@ void ResourceManager::RegisterType(std::string resourceType, std::function #include +#include "Util/UnorderedMapPair.h" #include "Factory.h" class Resource @@ -28,7 +29,7 @@ public: void Preload(std::string resourceType, std::string resourceName); // Checks if a resource is in cache - bool IsResourceLoaded(std::string resourceName); + bool IsResourceLoaded(std::string resourceType, std::string resourceName); template // Hot-loads a resource and caches it for future use @@ -40,7 +41,7 @@ public: private: std::unordered_map> m_FactoryFunctions; // type -> factory function - std::unordered_map m_ResourceCache; // name -> resource + std::unordered_map, Resource*> m_ResourceCache; // (type, name) -> resource // TODO: Getters for IDs unsigned int m_CurrentResourceTypeID; @@ -60,7 +61,7 @@ private: template T* ResourceManager::Load(std::string resourceType, std::string resourceName) { - auto it = m_ResourceCache.find(resourceName); + auto it = m_ResourceCache.find(std::make_pair(resourceType, resourceName)); if (it != m_ResourceCache.end()) return static_cast(it->second); @@ -79,7 +80,7 @@ T* ResourceManager::Load(std::string resourceType, std::string resourceName) template T* ResourceManager::Fetch(std::string resourceName) const { - auto it = m_ResourceCache.find(resourceName); + auto it = m_ResourceCache.find(std::make_pair(resourceType, resourceName)); if (it == m_ResourceCache.end()) { LOG_ERROR("Failed to fetch resource \"%s\": Resource not loaded!", resourceName.c_str()); diff --git a/src/Util/UnorderedMapPair.h b/src/Util/UnorderedMapPair.h new file mode 100644 index 0000000..68d2355 --- /dev/null +++ b/src/Util/UnorderedMapPair.h @@ -0,0 +1,20 @@ +#ifndef Util_UnorderedMapPair_h__ +#define Util_UnorderedMapPair_h__ + +#include + +namespace std +{ + template struct hash> + { + inline size_t operator()(const pair & v) const + { + size_t seed = 0; + boost::hash_combine(seed, v.first); + boost::hash_combine(seed, v.second); + return seed; + } + }; +} + +#endif // Util_UnorderedMapPair_h__ \ No newline at end of file