From 04cb1f12047fded414522eb199296d09f452cd26 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Sun, 13 Apr 2014 00:20:51 +0200 Subject: [PATCH] Created resource manager --- src/ResourceManager.cpp | 51 +++++++++++++++ src/ResourceManager.h | 65 +++++++++++++++++++ src/Texture.cpp | 1 + src/Texture.h | 4 +- vs12/Returngeance/Returngeance.vcxproj | 2 + .../Returngeance/Returngeance.vcxproj.filters | 2 + 6 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 src/ResourceManager.cpp create mode 100644 src/ResourceManager.h diff --git a/src/ResourceManager.cpp b/src/ResourceManager.cpp new file mode 100644 index 0000000..e9a39a2 --- /dev/null +++ b/src/ResourceManager.cpp @@ -0,0 +1,51 @@ +#include "PrecompiledHeader.h" +#include "ContentManager.h" + +Resource* ContentManager::CreateResource(std::string resourceType, std::string resourceName) +{ + auto it = m_FactoryFunctions.find(resourceType); + if (it != m_FactoryFunctions.end()) + { + return it->second(resourceName); + } + else + { + return nullptr; + } +} + +void ContentManager::PreCache() +{ + LOG_INFO("Pre-caching resources..."); + for (auto pair : m_RegisteredResources) + { + std::string name = pair.first; + std::string type = pair.second; + + Resource* resource = CreateResource(type, name); + if (resource == nullptr) + { + LOG_WARNING("Failed to pre-cache %s resource \"%s\": Resource not registered!", type.c_str(), name.c_str()); + continue; + } + + unsigned int typeID = m_ResourceTypeIDs[type]; + unsigned int resourceID = m_ResourceCount[typeID]++; + resource->TypeID = typeID; + resource->ResourceID = resourceID; + m_ResourceIDs[name] = resourceID; + + m_ResourceCache[name] = resource; + } +} + +void ContentManager::RegisterResource(std::string resourceType, std::string resourceName) +{ + m_RegisteredResources[resourceName] = resourceType; + m_ResourceTypeIDs[resourceName] = m_ResourceTypeCount++; +} + +void ContentManager::RegisterType(std::string resourceType, std::function factoryFunction) +{ + m_FactoryFunctions[resourceType] = factoryFunction; +} diff --git a/src/ResourceManager.h b/src/ResourceManager.h new file mode 100644 index 0000000..ba9b386 --- /dev/null +++ b/src/ResourceManager.h @@ -0,0 +1,65 @@ +#ifndef ContentManager_h__ +#define ContentManager_h__ + +#include +#include +#include +#include + +#include "Factory.h" + +class Resource +{ +public: + unsigned int TypeID; + unsigned int ResourceID; + std::string ResourceName; + +protected: + Resource(std::string resourceName) + : ResourceName(resourceName) {} +}; + +class ResourceManager +{ +public: + // Registers the factory function of a resource type + void RegisterType(std::string resourceType, std::function factoryFunction); + + // Registers a future instance of a resource + void RegisterResource(std::string resourceType, std::string resourceName); + + // Loads all registered resources and caches them + void PreCache(); + + template + T* Fetch(std::string resourceName); + +private: + unsigned int m_ResourceTypeCount = 0; + std::unordered_map m_ResourceTypeIDs; + std::unordered_map m_ResourceCount; + std::unordered_map m_ResourceIDs; + + std::unordered_map> m_FactoryFunctions; // type -> factory function + std::unordered_map m_RegisteredResources; // name -> type + std::unordered_map m_ResourceCache; // name -> resource + + Resource* CreateResource(std::string resourceType, std::string resourceName); +}; + +template +T* ContentManager::Fetch(std::string resourceName) +{ + if (m_ResourceCache.find(resourceName) == m_ResourceCache.end()) + { + LOG_ERROR("Failed to load resource \"%s\": Resource not precached!", resourceName.c_str()); + return nullptr; + } + else + { + return static_cast(m_ResourceCache[resourceName]); + } +} + +#endif // ContentManager_h__ diff --git a/src/Texture.cpp b/src/Texture.cpp index 49256da..8390fa6 100755 --- a/src/Texture.cpp +++ b/src/Texture.cpp @@ -2,6 +2,7 @@ #include "Texture.h" Texture::Texture(std::string path) + : Resource(path) { Load(path); } diff --git a/src/Texture.h b/src/Texture.h index 0f00b58..ae3ae11 100755 --- a/src/Texture.h +++ b/src/Texture.h @@ -6,7 +6,9 @@ #include -class Texture +#include "ContentManager.h" + +class Texture : public Resource { public: Texture(std::string path); diff --git a/vs12/Returngeance/Returngeance.vcxproj b/vs12/Returngeance/Returngeance.vcxproj index 305fd09..6d4e3b3 100755 --- a/vs12/Returngeance/Returngeance.vcxproj +++ b/vs12/Returngeance/Returngeance.vcxproj @@ -97,6 +97,7 @@ + @@ -144,6 +145,7 @@ + diff --git a/vs12/Returngeance/Returngeance.vcxproj.filters b/vs12/Returngeance/Returngeance.vcxproj.filters index d24a694..35dc81f 100755 --- a/vs12/Returngeance/Returngeance.vcxproj.filters +++ b/vs12/Returngeance/Returngeance.vcxproj.filters @@ -48,6 +48,7 @@ Input\Systems + @@ -236,6 +237,7 @@ Rendering\Components +