From 00b8953a05534ec5400a114ee6de70251e6d123c Mon Sep 17 00:00:00 2001 From: Alexey Yakovenko Date: Wed, 13 Feb 2008 22:18:24 +0200 Subject: [PATCH] scenemanager is stl-free fixed uninitialized var in parmMgr --- core/code/system/f_baseobject.cpp | 3 +- core/code/system/f_baseobject.h | 10 +- core/code/system/f_engine.cpp | 1 - core/code/system/f_parmmgr.cpp | 1 + core/code/system/f_resourcemgr.cpp | 410 +++++++++++++++++++++++++++++----- core/code/system/f_resourcemgr.h | 46 ++-- core/code/system/f_resourcetable.h | 133 ++++++----- core/code/video/f_texture.h | 1 - core/code/video/gl/f_glrenderer.cpp | 1 - core/code/video/sdl/f_sdlrenderer.cpp | 1 - tools/test/test.cpp | 2 + 11 files changed, 480 insertions(+), 129 deletions(-) diff --git a/core/code/system/f_baseobject.cpp b/core/code/system/f_baseobject.cpp index 4d3fc4e..e82497f 100644 --- a/core/code/system/f_baseobject.cpp +++ b/core/code/system/f_baseobject.cpp @@ -87,9 +87,10 @@ namespace fe { if (!mpObjects) mpObjects = new std::map< int, baseObject* >; + mpResHashNext = NULL; mRefc = 0; mId = ++mLastId; - (*mpObjects)[ mId ] = this; + (*mpObjects)[ mId ] = this; mbValid = true; mUsedRefc = -1; } diff --git a/core/code/system/f_baseobject.h b/core/code/system/f_baseobject.h index f2eed03..e5a4be7 100644 --- a/core/code/system/f_baseobject.h +++ b/core/code/system/f_baseobject.h @@ -36,10 +36,10 @@ namespace fe { */ class FE_API baseObject { - friend class leakManager; + friend class leakManager; + friend class resourceMgr; protected: - /** * internal counter used to assign IDs to newly created objects */ @@ -137,6 +137,12 @@ namespace fe { * @param type type-id of an object we're testing against */ virtual bool isTypeOf (int type) const; + protected: + /** + * next hash value for resourceMgr + */ + baseObject *mpResHashNext; + }; diff --git a/core/code/system/f_engine.cpp b/core/code/system/f_engine.cpp index 668d986..0100b1d 100644 --- a/core/code/system/f_engine.cpp +++ b/core/code/system/f_engine.cpp @@ -47,7 +47,6 @@ #include "f_logger.h" #include "f_scenemanager.h" #include "f_keybinder.h" -#include "f_resourcetable.h" #include "f_script.h" #include "entitymanager.h" #include "entclasses.h" diff --git a/core/code/system/f_parmmgr.cpp b/core/code/system/f_parmmgr.cpp index 1f48aee..384f074 100644 --- a/core/code/system/f_parmmgr.cpp +++ b/core/code/system/f_parmmgr.cpp @@ -75,6 +75,7 @@ namespace fe smartPtr i; for (int k = 0; k < PARMS_HASHSIZE; k++) mParmHash[k] = -1; + mNumParms = 0; i = new parmTime; regParm ("time", i); diff --git a/core/code/system/f_resourcemgr.cpp b/core/code/system/f_resourcemgr.cpp index f213d06..a29a057 100644 --- a/core/code/system/f_resourcemgr.cpp +++ b/core/code/system/f_resourcemgr.cpp @@ -35,6 +35,7 @@ #include "f_resourcemgr.h" #include "f_error.h" #include "f_engine.h" +#include "f_util.h" namespace fe { @@ -42,90 +43,293 @@ namespace fe resourceMgr::resourceMgr (void) { setName ("resource mgr"); + memset (mResourceHash, 0, sizeof (mResourceHash)); + mNumResources = 0; } resourceMgr::~resourceMgr (void) { + if (mNumResources) { + baseObject **lst = new baseObject*[mNumResources]; + int i = 0; + for (int h = 0; h < RES_HASHSIZE; h++) { + baseObject *o = mResourceHash[h]; + while (o) { + lst[i++] = o; + o = o->mpResHashNext; + } + } + while (i>0) { + lst[--i]->release (); + } + delete[] lst; + } } - resource *resourceMgr::getTextureMgr (void) - { - return &mTextureMgr; - } - resource *resourceMgr::getMaterialMgr (void) +// baseObject* resourceMgr::create (const char *name) +// { +// baseObject *o = getResource (name); +// if (!o) +// { +// o = new baseObject (name); +// if (!o->isValid ()) +// { +// o->release (); +// return NULL; +// } +// addResource (name, o); +// } +// return o; +// } +// +// baseObject* resourceMgr::create (charParser &parser) +// { +// parser.getToken (); +// cStr name = parser.token (); +// baseObject *o = getResource (name); +// if (o) +// { +// fprintf (stderr, "WARNING: object with name %s is already defined\n", name.c_str ()); +// return o; +// } +// baseObject *obj = new baseObject (parser, name); +// if (!obj->isValid ()) +// { +// o->release (); +// return NULL; +// } +// addResource (name, obj); +// return obj; +// } + + void resourceMgr::destroy (const char *name) { - return &mMaterialMgr; + removeResource (name); } - - resource *resourceMgr::getFontFTMgr (void) + + void resourceMgr::flushUnused (void) { - return &mFontMgr; + if (mNumResources) { + baseObject **lst = new baseObject*[mNumResources]; + int i = 0; + for (int h = 0; h < RES_HASHSIZE; h++) { + baseObject *o = mResourceHash[h]; + while (o) { + lst[i++] = o; + o = o->mpResHashNext; + } + } + i--; + while (i>=0) { + if (!lst[i]->isUsed ()) + lst[i]->release (); // this SHOULD remove it from resource manager + } + delete[] lst; + } } - - resource *resourceMgr::getModelMgr (void) + + baseObject* resourceMgr::getResource (const char *name) { - return &mModelMgr; + int h = hashValue (name, RES_HASHSIZE); + baseObject* o = mResourceHash[h]; + while (o) { + if (!strcmp (o->name(), name)) + return o; + o = o->mpResHashNext; + } + return NULL; } - resource *resourceMgr::getAnimationMgr (void) + int resourceMgr::getCount (void) const { - return &mAnimationMgr; + return mNumResources; } - - resource *resourceMgr::getCGShaderMgr (void) + + void resourceMgr::addResource (const char *name, baseObject *r) { -#if HAVE_LIBCG - return &mCGShaderMgr; -#else - return NULL; -#endif + int h = hashValue (name, RES_HASHSIZE); + r->mpResHashNext = mResourceHash[h]; + mResourceHash[h] = r; + r->addRef (); + mNumResources++; } - - resource *resourceMgr::getPS14ShaderMgr (void) + + void resourceMgr::removeResource (const char *name) { - return &mPS14ShaderMgr; + int h = hashValue (name, RES_HASHSIZE); + baseObject* o = mResourceHash[h]; + baseObject* prev = NULL; + while (o) { + if (!strcmp (o->name(), name)) { + if (prev) { + prev->mpResHashNext = o->mpResHashNext; + } + else { + mResourceHash[h] = o->mpResHashNext; + } + o->release (); + return; + } + prev = o; + o = o->mpResHashNext; + } + sys_printf ("WARNING: cannot delete '%s' - no such resource\n", name); } - resource *resourceMgr::getEffectMgr (void) - { - return &mEffectMgr; - } +// resource *resourceMgr::getTextureMgr (void) +// { +// return &mTextureMgr; +// } +// +// resource *resourceMgr::getMaterialMgr (void) +// { +// return &mMaterialMgr; +// } +// +// resource *resourceMgr::getFontFTMgr (void) +// { +// return &mFontMgr; +// } +// +// resource *resourceMgr::getModelMgr (void) +// { +// return &mModelMgr; +// } +// +// resource *resourceMgr::getAnimationMgr (void) +// { +// return &mAnimationMgr; +// } +// +// resource *resourceMgr::getCGShaderMgr (void) +// { +//#if HAVE_LIBCG +// return &mCGShaderMgr; +//#else +// return NULL; +//#endif +// } +// +// resource *resourceMgr::getPS14ShaderMgr (void) +// { +// return &mPS14ShaderMgr; +// } +// +// resource *resourceMgr::getEffectMgr (void) +// { +// return &mEffectMgr; +// } + + const char tex_notfound[] = "textures/common/notfound.png"; texture* resourceMgr::createTexture (const char *name) { - texture *t = mTextureMgr.create (name); - if (!t) - return mTextureMgr.create ("textures/common/notfound.png"); + baseObject *o = getResource (name); + if (o) + return checked_cast(o); + texture *t = new texture (name); + if (!t->isValid ()) + { + t->release (); + if (!strcmp (name, tex_notfound)) + return createTexture (tex_notfound); + sys_error ("createTexture: failed to load default texture\n"); + } + addResource (name, t); return t; } texture* resourceMgr::createTexture (charParser &parser) { - texture *t = mTextureMgr.create (parser); - if (!t) - return mTextureMgr.create ("textures/common/notfound.png"); + parser.getToken (); + cStr name = parser.token (); + baseObject *o = getResource (name); + if (o) + { + sys_printf ("WARNING: object with name %s is already defined\n", name.c_str ()); + return checked_cast(o); + } + texture *t = new texture (parser, name); + if (!t->isValid ()) + { + t->release (); + if (!strcmp (name, tex_notfound)) + return createTexture (tex_notfound); + sys_error ("createTexture: failed to load default texture\n"); + } + addResource (name, t); return t; } material* resourceMgr::createMaterial (const char *name) { - return mMaterialMgr.create (name); + baseObject *o = getResource (name); + if (o) + return checked_cast(o); + material *t = new material (name); + if (!t->isValid ()) + { + t->release (); + sys_error ("createMaterial failed for %s\n", name); + } + addResource (name, t); + return t; } material* resourceMgr::createMaterial (charParser &parser) { - return mMaterialMgr.create (parser); + parser.getToken (); + cStr name = parser.token (); + baseObject *o = getResource (name); + if (o) + { + sys_printf ("WARNING: object with name %s is already defined\n", name.c_str ()); + return checked_cast(o); + } + material *t = new material (parser, name); + if (!t->isValid ()) + { + t->release (); + sys_error ("createMaterial failed for %s\n", name.c_str ()); + } + addResource (name, t); + return t; } fontFT* resourceMgr::createFontFT (const char *name) { - return mFontMgr.create (name); + baseObject *o = getResource (name); + if (o) + return checked_cast(o); + fontFT *t = new fontFT (name); + if (!t->isValid ()) + { + t->release (); + sys_error ("createFontFT failed for %s\n", name); + } + addResource (name, t); + return t; } fontFT* resourceMgr::createFontFT (charParser &parser) { - return mFontMgr.create (parser); + parser.getToken (); + cStr name = parser.token (); + baseObject *o = getResource (name); + if (o) + { + sys_printf ("WARNING: object with name %s is already defined\n", name.c_str ()); + return checked_cast(o); + } + fontFT *t = new fontFT (parser, name); + if (!t->isValid ()) + { + t->release (); + sys_error ("createFontFT failed for %s\n", name.c_str ()); + } + addResource (name, t); + return t; } static void loadModelFromFile (file *f, int majorver, int minorver, sceneObject *node, modelMtlList &mtls) @@ -241,14 +445,16 @@ namespace fe sceneObject* resourceMgr::createModel (const char *name, animContainer *anim) { // model is created specially, cause we need instancing - sceneObject *obj = mModelMgr.getResource (name); - if (!obj) - { + baseObject *o = getResource (name); + sceneObject *obj = NULL; + if (o) + obj = checked_cast(o); + else { // load template obj = loadModelFromFile (name); -// model *mdl = new model (); -// obj = mdl->load (name); - mModelMgr.addResource (name, obj); + if (!obj) + sys_error ("createModel failed on %s", name); + addResource (name, obj); } // create from template @@ -265,42 +471,142 @@ namespace fe animation* resourceMgr::createAnimation (const char *name) { - return mAnimationMgr.create (name); + baseObject *o = getResource (name); + if (o) + return checked_cast(o); + animation *t = new animation (name); + if (!t->isValid ()) + { + t->release (); + sys_error ("createAnimation failed for %s\n", name); + } + addResource (name, t); + return t; } animation* resourceMgr::createAnimation (charParser &parser) { - return mAnimationMgr.create (parser); + parser.getToken (); + cStr name = parser.token (); + baseObject *o = getResource (name); + if (o) + { + sys_printf ("WARNING: object with name %s is already defined\n", name.c_str ()); + return checked_cast(o); + } + animation *t = new animation (parser, name); + if (!t->isValid ()) + { + t->release (); + sys_error ("createAnimation failed for %s\n", name.c_str ()); + } + addResource (name, t); + return t; } #ifdef HAVE_LIBCG cgShader* resourceMgr::createCGShader (const char *name) { - return mCGShaderMgr.create (name); + baseObject *o = getResource (name); + if (o) + return checked_cast(o); + cgShader *t = new cgShader (name); + if (!t->isValid ()) + { + t->release (); + sys_error ("createCGShader failed for %s\n", name); + } + addResource (name, t); + return t; } cgShader* resourceMgr::createCGShader (charParser &parser) { - return mCGShaderMgr.create (parser); + parser.getToken (); + cStr name = parser.token (); + baseObject *o = getResource (name); + if (o) + { + sys_printf ("WARNING: object with name %s is already defined\n", name.c_str ()); + return checked_cast(o); + } + cgShader *t = new cgShader (parser, name); + if (!t->isValid ()) + { + t->release (); + sys_error ("createCGShader failed for %s\n", name.c_str ()); + } + addResource (name, t); + return t; } #endif ps14Shader* resourceMgr::createPS14Shader (const char *name) { - return mPS14ShaderMgr.create (name); + baseObject *o = getResource (name); + if (o) + return checked_cast(o); + ps14Shader *t = new ps14Shader (name); + if (!t->isValid ()) + { + t->release (); + sys_error ("createPS14Shader failed for %s\n", name); + } + addResource (name, t); + return t; } ps14Shader* resourceMgr::createPS14Shader (charParser &parser) { - return mPS14ShaderMgr.create (parser); + parser.getToken (); + cStr name = parser.token (); + baseObject *o = getResource (name); + if (o) + { + sys_printf ("WARNING: object with name %s is already defined\n", name.c_str ()); + return checked_cast(o); + } + ps14Shader *t = new ps14Shader (parser, name); + if (!t->isValid ()) + { + t->release (); + sys_error ("createPS14Shader failed for %s\n", name.c_str ()); + } + addResource (name, t); + return t; } effect* resourceMgr::createEffect (const char *name) { - return mEffectMgr.create (name); + baseObject *o = getResource (name); + if (o) + return checked_cast(o); + effect *t = new effect (name); + if (!t->isValid ()) + { + t->release (); + sys_error ("createEffect failed for %s\n", name); + } + addResource (name, t); + return t; } effect* resourceMgr::createEffect (charParser &parser) { - return mEffectMgr.create (parser); + parser.getToken (); + cStr name = parser.token (); + baseObject *o = getResource (name); + if (o) + { + sys_printf ("WARNING: object with name %s is already defined\n", name.c_str ()); + return checked_cast(o); + } + effect *t = new effect (parser, name); + if (!t->isValid ()) + { + t->release (); + sys_error ("createEffect failed for %s\n", name.c_str ()); + } + addResource (name, t); + return t; } } diff --git a/core/code/system/f_resourcemgr.h b/core/code/system/f_resourcemgr.h index 7d9a2ee..7f86259 100644 --- a/core/code/system/f_resourcemgr.h +++ b/core/code/system/f_resourcemgr.h @@ -26,7 +26,6 @@ #include "f_baseobject.h" #include "f_parser.h" #include "f_helpers.h" -#include "f_resourcetable.h" namespace fe { @@ -42,30 +41,43 @@ namespace fe class sceneObject; class animContainer; + const int RES_HASHSIZE = 256; + class resourceMgr : public baseObject { private: - resource mTextureMgr; - resource mMaterialMgr; - resource mFontMgr; - resource mModelMgr; - resource mAnimationMgr; - resource mCGShaderMgr; - resource mPS14ShaderMgr; - resource mEffectMgr; + baseObject* mResourceHash[RES_HASHSIZE]; + int mNumResources; + baseObject *create (const char *name); + baseObject* create (charParser &parser); + void destroy (const char *name); + void flushUnused (void); + baseObject* getResource (const char *name); + int getCount (void) const; + void addResource (const char *name, baseObject *r); + void removeResource (const char *name); + +// resource mTextureMgr; +// resource mMaterialMgr; +// resource mFontMgr; +// resource mModelMgr; +// resource mAnimationMgr; +// resource mCGShaderMgr; +// resource mPS14ShaderMgr; +// resource mEffectMgr; public: resourceMgr (void); ~resourceMgr (void); - resource *getTextureMgr (void); - resource *getMaterialMgr (void); - resource *getFontFTMgr (void); - resource *getModelMgr (void); - resource *getAnimationMgr (void); - resource *getCGShaderMgr (void); - resource *getPS14ShaderMgr (void); - resource *getEffectMgr (void); +// resource *getTextureMgr (void); +// resource *getMaterialMgr (void); +// resource *getFontFTMgr (void); +// resource *getModelMgr (void); +// resource *getAnimationMgr (void); +// resource *getCGShaderMgr (void); +// resource *getPS14ShaderMgr (void); +// resource *getEffectMgr (void); texture* createTexture (const char *name); texture* createTexture (charParser &parser); diff --git a/core/code/system/f_resourcetable.h b/core/code/system/f_resourcetable.h index 940ebad..80fa17f 100644 --- a/core/code/system/f_resourcetable.h +++ b/core/code/system/f_resourcetable.h @@ -20,6 +20,7 @@ waker@users.sourceforge.net */ +#if 0 #ifndef __F_RESOURCETABLE_H #define __F_RESOURCETABLE_H @@ -28,38 +29,44 @@ #include "f_baseobject.h" #include "f_resourcemgr.h" #include "f_error.h" -#include -#include +#include "f_util.h" namespace fe { + const int RES_HASHSIZE = 256; - template class resource + template class resource { private: - // FIXME: do it without stl.. some hashtable or whatever - typedef std::map resourceMap; - resourceMap mResourceList; + T* mResourceHash[RES_HASHSIZE]; + int mNumResources; public: resource (void) // this will be the owner of all created objects { + memset (mResourceHash, 0, sizeof (mResourceHash)); } ~resource (void) { - typename resourceMap::iterator it; - std::vector lst; - for (it = mResourceList.begin (); it != mResourceList.end (); it++) - { - lst.push_back ((baseObject*)(*it).second); + if (mNumResources) { + T **lst = new T*[mNumResources]; + int i = 0; + for (int h = 0; h < RES_HASHSIZE; h++) { + T *o = mResourceHash[h]; + while (o) { + lst[i++] = o; + o = checked_cast(o->mpResHashNext); + } + } + while (i>0) { + lst[--i]->release (); + } + delete[] lst; } - size_t sz = lst.size (); - for (size_t i = 0; i < sz; i++) - lst[i]->release (); } T* create (const char *name) @@ -105,69 +112,89 @@ namespace fe void flushUnused (void) { - typename resourceMap::iterator it; - std::vector lst; - for (it = mResourceList.begin (); it != mResourceList.end (); it++) - lst.push_back ( (*it).second); - size_t sz = lst.size (); - for (size_t i = 0; i < sz; i++) - { - if (!lst[i]->isUsed ()) - lst[i]->release (); // this SHOULD remove it from resource manager + if (mNumResources) { + T **lst = new T*[mNumResources]; + int i = 0; + for (int h = 0; h < RES_HASHSIZE; h++) { + T *o = mResourceHash[h]; + while (o) { + lst[i++] = o; + o = checked_cast(o->mpResHashNext); + } + } + i--; + while (i>=0) { + if (!lst[i]->isUsed ()) + lst[i]->release (); // this SHOULD remove it from resource manager + } + delete[] lst; } } T* getResource (const char *name) { - typename resourceMap::iterator it; - it = mResourceList.find (name); - if (it != mResourceList.end ()) - return (*it).second; + int h = hashValue (name, RES_HASHSIZE); + T* o = mResourceHash[h]; + while (o) { + if (!strcmp (o->name(), name)) + return o; + o = checked_cast(o->mpResHashNext); + } return NULL; } int getCount (void) const { - return (int)mResourceList.size (); + return mNumResources; } - T* getObject (int idx) const - { - typename resourceMap::const_iterator it; - int i = 0; - for (it = mResourceList.begin (); it != mResourceList.end (); it++, i++) - { - if (i == idx) - { - return (*it).second; - } - } - return NULL; - } +// T* getObject (int idx) const +// { +// typename resourceMap::const_iterator it; +// int i = 0; +// for (it = mResourceList.begin (); it != mResourceList.end (); it++, i++) +// { +// if (i == idx) +// { +// return (*it).second; +// } +// } +// return NULL; +// } void addResource (const char *name, T *r) { - mResourceList[name] = r; + int h = hashValue (name, RES_HASHSIZE); + r->mpResHashNext = mResourceHash[h]; + mResourceHash[h] = r; r->addRef (); + mNumResources++; } void removeResource (const char *name) { - typename resourceMap::iterator it; - it = mResourceList.find (name); - if (it != mResourceList.end ()) - { - (*it).second->release (); - mResourceList.erase (it); - } - else - { - fprintf (stderr, "WARNING: cannot delete '%s' - no such resource\n", name); + int h = hashValue (name, RES_HASHSIZE); + T* o = mResourceHash[h]; + T* prev = NULL; + while (o) { + if (!strcmp (o->name(), name)) { + if (prev) { + prev->mpResHashNext = checked_cast(o->mpResHashNext); + } + else { + mResourceHash[h] = checked_cast(o->mpResHashNext); + } + o->release (); + return; + } + prev = o; + o = checked_cast(o->mpResHashNext); } + sys_printf ("WARNING: cannot delete '%s' - no such resource\n", name); } }; } #endif // __F_RESOURCETABLE_H - +#endif diff --git a/core/code/video/f_texture.h b/core/code/video/f_texture.h index 8aabd20..dc0462d 100644 --- a/core/code/video/f_texture.h +++ b/core/code/video/f_texture.h @@ -34,7 +34,6 @@ namespace fe class texture : public baseTexture { - friend class textureData; private: diff --git a/core/code/video/gl/f_glrenderer.cpp b/core/code/video/gl/f_glrenderer.cpp index c8725fb..66e6b68 100644 --- a/core/code/video/gl/f_glrenderer.cpp +++ b/core/code/video/gl/f_glrenderer.cpp @@ -27,7 +27,6 @@ #include "f_engine.h" #include "f_console.h" #include "f_resourcemgr.h" -#include "f_resourcetable.h" #include "f_ps14shader.h" #if HAVE_LIBCG diff --git a/core/code/video/sdl/f_sdlrenderer.cpp b/core/code/video/sdl/f_sdlrenderer.cpp index 0043e6b..8f32d77 100644 --- a/core/code/video/sdl/f_sdlrenderer.cpp +++ b/core/code/video/sdl/f_sdlrenderer.cpp @@ -38,7 +38,6 @@ #include "f_resourcemgr.h" #include #include "f_resourcemgr.h" -#include "f_resourcetable.h" #include #include diff --git a/tools/test/test.cpp b/tools/test/test.cpp index b059552..5af5282 100644 --- a/tools/test/test.cpp +++ b/tools/test/test.cpp @@ -57,6 +57,8 @@ #include #include +#include + using namespace fe; class TestApp : public application -- 2.11.4.GIT