From 46c356ebc507a3b90b38979a46313b877b84cea3 Mon Sep 17 00:00:00 2001 From: Kearwood Date: Wed, 22 Jul 2020 17:11:27 -0700 Subject: [PATCH] Implemented KrMapResource --- kraken/KRContext.cpp | 50 ++++++++++++++++++++++++++++++++++++------ kraken/KRContext.h | 5 ++++- kraken/KRResource.cpp | 6 +++-- kraken/public/kraken.h | 2 ++ 4 files changed, 53 insertions(+), 10 deletions(-) diff --git a/kraken/KRContext.cpp b/kraken/KRContext.cpp index 8ee0b4d..9614c8f 100755 --- a/kraken/KRContext.cpp +++ b/kraken/KRContext.cpp @@ -419,14 +419,24 @@ KrResult KRContext::mapResource(const KrMapResourceInfo* mapResourceInfo) return KR_ERROR_OUT_OF_BOUNDS; } -/* - KRResource* resource = loadResource(loadResourceInfo->pResourcePath, data); - m_resourceMap[loadResourceInfo->resourceHandle] = resource; - return KR_SUCCESS; -*/ + std::string lowerName = mapResourceInfo->pResourceName; + std::transform(lowerName.begin(), lowerName.end(), + lowerName.begin(), ::tolower); - // TODO - Need to implement mapping logic - return KR_ERROR_NOT_IMPLEMENTED; + KRResource* resource = nullptr; + + std::pair::iterator, unordered_multimap::iterator> range = m_resources.equal_range(lowerName); + for (unordered_multimap::iterator itr_match = range.first; itr_match != range.second; itr_match++) { + if (resource != nullptr) { + return KR_ERROR_AMBIGUOUS_MATCH; + } + resource = itr_match->second; + } + if (resource == nullptr) { + return KR_ERROR_NOT_FOUND; + } + m_resourceMap[mapResourceInfo->resourceHandle] = resource; + return KR_SUCCESS; } KrResult KRContext::unmapResource(const KrUnmapResourceInfo* unmapResourceInfo) @@ -435,6 +445,8 @@ KrResult KRContext::unmapResource(const KrUnmapResourceInfo* unmapResourceInfo) return KR_ERROR_OUT_OF_BOUNDS; } m_resourceMap[unmapResourceInfo->resourceHandle] = nullptr; + // TODO - Delete objects after lass dereference + return KR_SUCCESS; } KrResult KRContext::createScene(const KrCreateSceneInfo* createSceneInfo) @@ -753,3 +765,27 @@ KrResult KRContext::updateNode(const KrUpdateNodeInfo* pUpdateNodeInfo) { return KR_ERROR_NOT_IMPLEMENTED; } + +void KRContext::addResource(KRResource* resource, const std::string& name) +{ + std::string lowerName = name; + std::transform(lowerName.begin(), lowerName.end(), + lowerName.begin(), ::tolower); + + m_resources.insert(std::pair(lowerName, resource)); +} + +void KRContext::removeResource(KRResource* resource) +{ + std::string lowerName = resource->getName(); + std::transform(lowerName.begin(), lowerName.end(), + lowerName.begin(), ::tolower); + + std::pair::iterator, unordered_multimap::iterator> range = m_resources.equal_range(lowerName); + for (unordered_multimap::iterator itr_match = range.first; itr_match != range.second; itr_match++) { + if (itr_match->second == resource) { + m_resources.erase(itr_match); + return; + } + } +} diff --git a/kraken/KRContext.h b/kraken/KRContext.h index bca388e..7cc0582 100755 --- a/kraken/KRContext.h +++ b/kraken/KRContext.h @@ -126,7 +126,8 @@ public: #if TARGET_OS_MAC static void attachToView(void *view); #endif - + void addResource(KRResource* resource, const std::string& name); + void removeResource(KRResource* resource); private: KRBundleManager *m_pBundleManager; KRSceneManager *m_pSceneManager; @@ -167,6 +168,8 @@ private: void createDeviceContexts(); void destroyDeviceContexts(); + + unordered_multimap m_resources; }; #endif diff --git a/kraken/KRResource.cpp b/kraken/KRResource.cpp index d4143da..d2dad91 100755 --- a/kraken/KRResource.cpp +++ b/kraken/KRResource.cpp @@ -9,12 +9,14 @@ #include "KREngine-common.h" #include "KRResource.h" #include "KRBundle.h" +#include "KRContext.h" KRResource::KRResource(KRContext &context, std::string name) : KRContextObject(context) { m_name = name; + context.addResource(this, name); } KRResource::~KRResource() { - + m_pContext->removeResource(this); } std::string KRResource::getName() @@ -71,7 +73,7 @@ bool KRResource::save(const std::string& path) } KrResult KRResource::moveToBundle(KRBundle* bundle) -{ +{ KRDataBlock* data = bundle->append(*this); if (data == nullptr) { return KR_ERROR_UNEXPECTED; diff --git a/kraken/public/kraken.h b/kraken/public/kraken.h index d9143b8..ddc13ef 100644 --- a/kraken/public/kraken.h +++ b/kraken/public/kraken.h @@ -43,6 +43,8 @@ typedef enum { KR_ERROR_OUT_OF_BOUNDS = 3, KR_ERROR_NOT_MAPPED = 4, KR_ERROR_INCORRECT_TYPE = 5, + KR_ERROR_NOT_FOUND = 6, + KR_ERROR_AMBIGUOUS_MATCH = 7, KR_ERROR_UNEXPECTED = 0x10000000, KR_RESULT_MAX_ENUM = 0x7FFFFFFF } KrResult;