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
This commit is contained in:
kearwood
2013-01-02 22:00:29 +00:00
parent 7a6f5e34ac
commit 4b8302b794
7 changed files with 239 additions and 1 deletions

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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 <map>
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) */

View File

@@ -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<std::string, map<std::string, KRUnknown *> >::iterator extension_itr = m_unknowns.begin(); extension_itr != m_unknowns.end(); extension_itr++) {
for(map<std::string, KRUnknown *>::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<std::string, map<std::string, KRUnknown *> >::iterator extension_itr = m_unknowns.find(lower_extension);
if(extension_itr == m_unknowns.end()) {
m_unknowns[lower_name] = map<std::string, KRUnknown *>();
extension_itr = m_unknowns.find(lower_extension);
}
map<std::string, KRUnknown *>::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<std::string, KRUnknown *> &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];
}

View File

@@ -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 <map>
#include <set>
#include <string>
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<std::string, KRUnknown *> &get(const std::string &extension);
private:
map<std::string, map<std::string, KRUnknown *> > m_unknowns;
};
#endif /* defined(KRUNKNOWN_MANAGER_H) */