From 4b8302b7943862921b26c9fd9f84648addf69bb8 Mon Sep 17 00:00:00 2001 From: kearwood Date: Wed, 2 Jan 2013 22:00:29 +0000 Subject: [PATCH] Implemented KRUnknown and KRUnknownManager to allow applications to use Kraken's resource management functionality for application-specific files. --HG-- extra : convert_revision : svn%3A7752d6cf-9f14-4ad2-affc-04f1e67b81a5/trunk%40203 --- KREngine/KREngine.xcodeproj/project.pbxproj | 32 ++++++++ KREngine/KREngine/Classes/KRContext.cpp | 11 ++- KREngine/KREngine/Classes/KRContext.h | 3 + KREngine/KREngine/Classes/KRUnknown.cpp | 42 +++++++++++ KREngine/KREngine/Classes/KRUnknown.h | 37 ++++++++++ .../KREngine/Classes/KRUnknownManager.cpp | 73 +++++++++++++++++++ KREngine/KREngine/Classes/KRUnknownManager.h | 42 +++++++++++ 7 files changed, 239 insertions(+), 1 deletion(-) create mode 100644 KREngine/KREngine/Classes/KRUnknown.cpp create mode 100644 KREngine/KREngine/Classes/KRUnknown.h create mode 100644 KREngine/KREngine/Classes/KRUnknownManager.cpp create mode 100644 KREngine/KREngine/Classes/KRUnknownManager.h diff --git a/KREngine/KREngine.xcodeproj/project.pbxproj b/KREngine/KREngine.xcodeproj/project.pbxproj index 83687e3..03eba62 100644 --- a/KREngine/KREngine.xcodeproj/project.pbxproj +++ b/KREngine/KREngine.xcodeproj/project.pbxproj @@ -21,6 +21,14 @@ E414BAE51435558900A668C4 /* KRInstance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E414BAE41435558800A668C4 /* KRInstance.cpp */; }; E414BAE7143557D200A668C4 /* KRScene.h in Headers */ = {isa = PBXBuildFile; fileRef = E414BAE6143557D200A668C4 /* KRScene.h */; }; E414BAE91435585A00A668C4 /* KRScene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E414BAE81435585A00A668C4 /* KRScene.cpp */; }; + E414F9A61694D977000B3D58 /* KRUnknownManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E414F9A41694D977000B3D58 /* KRUnknownManager.cpp */; }; + E414F9A71694D977000B3D58 /* KRUnknownManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E414F9A41694D977000B3D58 /* KRUnknownManager.cpp */; }; + E414F9A81694D977000B3D58 /* KRUnknownManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E414F9A51694D977000B3D58 /* KRUnknownManager.h */; }; + E414F9A91694D977000B3D58 /* KRUnknownManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E414F9A51694D977000B3D58 /* KRUnknownManager.h */; }; + E414F9AC1694DA37000B3D58 /* KRUnknown.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E414F9AA1694DA37000B3D58 /* KRUnknown.cpp */; }; + E414F9AD1694DA37000B3D58 /* KRUnknown.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E414F9AA1694DA37000B3D58 /* KRUnknown.cpp */; }; + E414F9AE1694DA37000B3D58 /* KRUnknown.h in Headers */ = {isa = PBXBuildFile; fileRef = E414F9AB1694DA37000B3D58 /* KRUnknown.h */; }; + E414F9AF1694DA37000B3D58 /* KRUnknown.h in Headers */ = {isa = PBXBuildFile; fileRef = E414F9AB1694DA37000B3D58 /* KRUnknown.h */; }; E416AA9916713749000F6786 /* KRAnimationCurveManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E416AA9816713749000F6786 /* KRAnimationCurveManager.h */; }; E416AA9A16713749000F6786 /* KRAnimationCurveManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E416AA9816713749000F6786 /* KRAnimationCurveManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; E416AA9C1671375C000F6786 /* KRAnimationCurveManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E416AA9B1671375C000F6786 /* KRAnimationCurveManager.cpp */; }; @@ -259,6 +267,10 @@ E414BAE41435558800A668C4 /* KRInstance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; name = KRInstance.cpp; path = Classes/KRInstance.cpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; E414BAE6143557D200A668C4 /* KRScene.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = KRScene.h; path = Classes/KRScene.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; E414BAE81435585A00A668C4 /* KRScene.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; name = KRScene.cpp; path = Classes/KRScene.cpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; + E414F9A41694D977000B3D58 /* KRUnknownManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = KRUnknownManager.cpp; path = Classes/KRUnknownManager.cpp; sourceTree = ""; }; + E414F9A51694D977000B3D58 /* KRUnknownManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KRUnknownManager.h; path = Classes/KRUnknownManager.h; sourceTree = ""; }; + E414F9AA1694DA37000B3D58 /* KRUnknown.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = KRUnknown.cpp; path = Classes/KRUnknown.cpp; sourceTree = ""; }; + E414F9AB1694DA37000B3D58 /* KRUnknown.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KRUnknown.h; path = Classes/KRUnknown.h; sourceTree = ""; }; E416AA9816713749000F6786 /* KRAnimationCurveManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KRAnimationCurveManager.h; path = Classes/KRAnimationCurveManager.h; sourceTree = ""; }; E416AA9B1671375C000F6786 /* KRAnimationCurveManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = KRAnimationCurveManager.cpp; path = Classes/KRAnimationCurveManager.cpp; sourceTree = ""; }; E41B841D16260C5600C7A771 /* sky_box.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = sky_box.fsh; path = Shaders/sky_box.fsh; sourceTree = ""; }; @@ -445,6 +457,17 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + E414F9A21694D949000B3D58 /* UnknownManager */ = { + isa = PBXGroup; + children = ( + E414F9A41694D977000B3D58 /* KRUnknownManager.cpp */, + E414F9A51694D977000B3D58 /* KRUnknownManager.h */, + E414F9AA1694DA37000B3D58 /* KRUnknown.cpp */, + E414F9AB1694DA37000B3D58 /* KRUnknown.h */, + ); + name = UnknownManager; + sourceTree = ""; + }; E416AA96167136FB000F6786 /* AnimationCurve */ = { isa = PBXGroup; children = ( @@ -585,6 +608,7 @@ E488399915F92BA300BD66D5 /* Managers */ = { isa = PBXGroup; children = ( + E414F9A21694D949000B3D58 /* UnknownManager */, E416AA96167136FB000F6786 /* AnimationCurve */, E428C2EF166960ED00A16EDF /* Animation */, E48839AB15F930E200BD66D5 /* Bundle */, @@ -888,6 +912,8 @@ E4C454B2167BC04C003586CD /* KRModelSphere.h in Headers */, E4C454B8167BD236003586CD /* KRHitInfo.h in Headers */, E44F38241683B23000399B5D /* KRRenderSettings.h in Headers */, + E414F9A81694D977000B3D58 /* KRUnknownManager.h in Headers */, + E414F9AE1694DA37000B3D58 /* KRUnknown.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -950,6 +976,8 @@ E4C454AD167BB8EC003586CD /* KRModelCube.h in Headers */, E4C454B3167BC04C003586CD /* KRModelSphere.h in Headers */, E44F38251683B23000399B5D /* KRRenderSettings.h in Headers */, + E414F9A91694D977000B3D58 /* KRUnknownManager.h in Headers */, + E414F9AF1694DA37000B3D58 /* KRUnknown.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1088,6 +1116,8 @@ E4C454B5167BC05C003586CD /* KRModelSphere.cpp in Sources */, E4C454BB167BD248003586CD /* KRHitInfo.cpp in Sources */, E44F38281683B24800399B5D /* KRRenderSettings.cpp in Sources */, + E414F9A61694D977000B3D58 /* KRUnknownManager.cpp in Sources */, + E414F9AC1694DA37000B3D58 /* KRUnknown.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1150,6 +1180,8 @@ E4C454B6167BC05C003586CD /* KRModelSphere.cpp in Sources */, E4C454BC167BD248003586CD /* KRHitInfo.cpp in Sources */, E44F38291683B24800399B5D /* KRRenderSettings.cpp in Sources */, + E414F9A71694D977000B3D58 /* KRUnknownManager.cpp in Sources */, + E414F9AD1694DA37000B3D58 /* KRUnknown.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/KREngine/KREngine/Classes/KRContext.cpp b/KREngine/KREngine/Classes/KRContext.cpp index 61f8c78..79df3de 100644 --- a/KREngine/KREngine/Classes/KRContext.cpp +++ b/KREngine/KREngine/Classes/KRContext.cpp @@ -35,6 +35,7 @@ KRContext::KRContext() { m_pSceneManager = new KRSceneManager(*this); m_pAnimationManager = new KRAnimationManager(*this); m_pAnimationCurveManager = new KRAnimationCurveManager(*this); + m_pUnknownManager = new KRUnknownManager(*this); m_bDetectedExtensions = false; m_current_frame = 0; m_absolute_time = 0.0f; @@ -76,6 +77,11 @@ KRContext::~KRContext() { delete m_pAnimationCurveManager; m_pAnimationCurveManager = NULL; } + + if(m_pUnknownManager) { + delete m_pUnknownManager; + m_pUnknownManager = NULL; + } // The bundles must be destroyed last, as the other objects may be using mmap'ed data from bundles if(m_pBundleManager) { @@ -108,6 +114,9 @@ KRAnimationManager *KRContext::getAnimationManager() { KRAnimationCurveManager *KRContext::getAnimationCurveManager() { return m_pAnimationCurveManager; } +KRUnknownManager *KRContext::getUnknownManager() { + return m_pUnknownManager; +} void KRContext::loadResource(const std::string &file_name, KRDataBlock *data) { std::string name = KRResource::GetFileBase(file_name); @@ -136,7 +145,7 @@ void KRContext::loadResource(const std::string &file_name, KRDataBlock *data) { } else if(extension.compare("mtl") == 0) { m_pMaterialManager->load(name.c_str(), data); } else { - fprintf(stderr, "KRContext::loadResource - Unknown resource file type: %s\n", file_name.c_str()); + m_pUnknownManager->load(name, extension, data); delete data; } diff --git a/KREngine/KREngine/Classes/KRContext.h b/KREngine/KREngine/Classes/KRContext.h index 5175dcf..e8eca21 100644 --- a/KREngine/KREngine/Classes/KRContext.h +++ b/KREngine/KREngine/Classes/KRContext.h @@ -18,6 +18,7 @@ #import "KRModelManager.h" #import "KRAnimationManager.h" #import "KRAnimationCurveManager.h" +#import "KRUnknownManager.h" class KRContext { public: @@ -47,6 +48,7 @@ public: KRModelManager *getModelManager(); KRAnimationManager *getAnimationManager(); KRAnimationCurveManager *getAnimationCurveManager(); + KRUnknownManager *getUnknownManager(); KRCamera *createCamera(int width, int height); @@ -74,6 +76,7 @@ private: KRModelManager *m_pModelManager; KRAnimationManager *m_pAnimationManager; KRAnimationCurveManager *m_pAnimationCurveManager; + KRUnknownManager *m_pUnknownManager; void detectExtensions(); bool m_bDetectedExtensions; diff --git a/KREngine/KREngine/Classes/KRUnknown.cpp b/KREngine/KREngine/Classes/KRUnknown.cpp new file mode 100644 index 0000000..79558fd --- /dev/null +++ b/KREngine/KREngine/Classes/KRUnknown.cpp @@ -0,0 +1,42 @@ +// +// KRUnknown.cpp +// KREngine +// +// Created by Kearwood Gilbert on 2013-01-02. +// Copyright (c) 2013 Kearwood Software. All rights reserved. +// + +#include "KRUnknown.h" + +KRUnknown::KRUnknown(KRContext &context, std::string name, std::string extension) : KRResource(context, name) +{ + m_pData = new KRDataBlock(); + m_extension = extension; +} + +KRUnknown::KRUnknown(KRContext &context, std::string name, std::string extension, KRDataBlock *data) : KRResource(context, name) +{ + m_pData = data; + m_extension = extension; +} + +KRUnknown::~KRUnknown() +{ + delete m_pData; +} + +std::string KRUnknown::getExtension() +{ + return m_extension; +} + +bool KRUnknown::save(KRDataBlock &data) +{ + data.append(*m_pData); + return true; +} + +KRDataBlock *KRUnknown::getData() +{ + return m_pData; +} diff --git a/KREngine/KREngine/Classes/KRUnknown.h b/KREngine/KREngine/Classes/KRUnknown.h new file mode 100644 index 0000000..e344177 --- /dev/null +++ b/KREngine/KREngine/Classes/KRUnknown.h @@ -0,0 +1,37 @@ +// +// KRUnknown.h +// KREngine +// +// Created by Kearwood Gilbert on 2013-01-02. +// Copyright (c) 2013 Kearwood Software. All rights reserved. +// + +#ifndef KRUNKNOWN_H +#define KRUNKNOWN_H + +#import "KREngine-common.h" +#import "KRContextObject.h" +#import "KRDataBlock.h" +#import "KRResource.h" +#import + +class KRUnknown : public KRResource { + +public: + KRUnknown(KRContext &context, std::string name, std::string extension); + KRUnknown(KRContext &context, std::string name, std::string extension, KRDataBlock *data); + virtual ~KRUnknown(); + + virtual std::string getExtension(); + + virtual bool save(KRDataBlock &data); + + KRDataBlock *getData(); + +private: + + std::string m_extension; + KRDataBlock *m_pData; +}; + +#endif /* defined(KRUNKNOWN_H) */ diff --git a/KREngine/KREngine/Classes/KRUnknownManager.cpp b/KREngine/KREngine/Classes/KRUnknownManager.cpp new file mode 100644 index 0000000..07bda9d --- /dev/null +++ b/KREngine/KREngine/Classes/KRUnknownManager.cpp @@ -0,0 +1,73 @@ +// +// FileManager.cpp +// KREngine +// +// Created by Kearwood Gilbert on 2013-01-02. +// Copyright (c) 2013 Kearwood Software. All rights reserved. +// + +#include "KRUnknownManager.h" + +KRUnknownManager::KRUnknownManager(KRContext &context) : KRContextObject(context) +{ + +} + +KRUnknownManager::~KRUnknownManager() +{ + for(map >::iterator extension_itr = m_unknowns.begin(); extension_itr != m_unknowns.end(); extension_itr++) { + for(map::iterator name_itr=(*extension_itr).second.begin(); name_itr != (*extension_itr).second.end(); name_itr++) { + delete (*name_itr).second; + } + } +} + +void KRUnknownManager::add(KRUnknown *unknown) +{ + std::string lower_name = unknown->getName(); + std::string lower_extension = unknown->getExtension(); + + std::transform(lower_name.begin(), lower_name.end(), lower_name.begin(), ::tolower); + std::transform(lower_extension.begin(), lower_extension.end(), lower_extension.begin(), ::tolower); + + map >::iterator extension_itr = m_unknowns.find(lower_extension); + if(extension_itr == m_unknowns.end()) { + m_unknowns[lower_name] = map(); + extension_itr = m_unknowns.find(lower_extension); + } + + map::iterator name_itr = (*extension_itr).second.find(lower_name); + if(name_itr != (*extension_itr).second.end()) { + delete (*name_itr).second; + (*name_itr).second = unknown; + } else { + (*extension_itr).second[lower_extension] = unknown; + } +} + +KRUnknown *KRUnknownManager::load(const std::string &name, const std::string &extension, KRDataBlock *data) +{ + KRUnknown *unknown = new KRUnknown(getContext(), name, extension, data); + if(unknown) add(unknown); + return unknown; +} + +KRUnknown *KRUnknownManager::get(const std::string &name, const std::string &extension) +{ + std::string lower_name = name; + std::string lower_extension = extension; + + std::transform(lower_name.begin(), lower_name.end(), lower_name.begin(), ::tolower); + std::transform(lower_extension.begin(), lower_extension.end(), lower_extension.begin(), ::tolower); + + return m_unknowns[lower_extension][lower_name]; +} + + +const map &KRUnknownManager::get(const std::string &extension) +{ + std::string lower_extension = extension; + std::transform(lower_extension.begin(), lower_extension.end(), lower_extension.begin(), ::tolower); + return m_unknowns[lower_extension]; +} + diff --git a/KREngine/KREngine/Classes/KRUnknownManager.h b/KREngine/KREngine/Classes/KRUnknownManager.h new file mode 100644 index 0000000..dc2d48a --- /dev/null +++ b/KREngine/KREngine/Classes/KRUnknownManager.h @@ -0,0 +1,42 @@ +// +// FileManager.h +// KREngine +// +// Created by Kearwood Gilbert on 2013-01-02. +// Copyright (c) 2013 Kearwood Software. All rights reserved. +// + +#ifndef KRUNKNOWN_MANAGER_H +#define KRUNKNOWN_MANAGER_H + +#import "KREngine-common.h" + +#include "KRUnknown.h" +#include "KRContextObject.h" +#include "KRDataBlock.h" + +#include +#include +#include + +using std::map; +using std::set; + +class KRUnknownManager : public KRContextObject { +public: + KRUnknownManager(KRContext &context); + virtual ~KRUnknownManager(); + + void add(KRUnknown *unknown); + + KRUnknown *load(const std::string &name, const std::string &extension, KRDataBlock *data); + KRUnknown *get(const std::string &name, const std::string &extension); + + + const map &get(const std::string &extension); + +private: + map > m_unknowns; +}; + +#endif /* defined(KRUNKNOWN_MANAGER_H) */