/** ******************************************************************************* @file /gui/engine/TextureManager.h @brief Texture manager Odeluje nahravani a spravu textur od ostatni logiky @author Vajicek @version 0.1 ******************************************************************************/ #ifndef TEXTUREMANAGER_H #define TEXTUREMANAGER_H #include #include // #include "common/rm/rmrasti.h" #include "gui/model/ModelRep.h" namespace gui{ #define TEXFLAG_PRIORITY_HIGH 0x00000001 #define TEXFLAG_PRIORITY_NORMAL 0x00000002 #define TEXFLAG_PRIORITY_LOW 0x00000004 #define TEXFLAG_PRIORITY_NONE 0x00000008 #define TEXFLAG_PRIORITY_MASK 0x0000000F #define TEXFLAG_RMRASTER 0x00000010 #define TEXFLAG_MEMORY 0x00000020 /** Struktura pro nahrane textury. */ struct TTexture{ // int iFlag; ///< priorita, pamet/rm int tStamp; ///< timestamp int iSize; ///< velikost v bytech int iInternalFormat; ///< internal format int iFormat; ///< internal format // rm::TRaster* raster; ///< pointer do RM, platny pro iFlag==TEXFLAG_RMRASTER int bid; ///< resource manager identifikator, redundatntni == raster->id // SDL_Surface* texture_surface; ///< platny pro iFlag==TEXFLAG_MEMORY // HWTID hwtid; ///< HW klic }; ///FWD struct TTextureLoaderQuery; /** Typ pro callback funkci pro zpracovani textury. */ typedef void (*PTextureLoadHandler)(TTexture*,TTextureLoaderQuery*); /** Zadost o nahrani textury. */ struct TTextureLoaderQuery{ int iFlag; ///< Priznak. int iInternalFormat; ///< Interni format rendereru /// Funkce ktera se spusti pri nahravani textury k dodatecnymu dodefinovani parametru.. PTextureLoadHandler tl_handler; /// Co se ma nahrat. //@{ int bid; ///< platny jen pro iFlag==TEXFLAG_RMRASTER void *data; ///< platny jen pro iFlag==TEXFLAG_MEMORY int width; ///< platny jen pro iFlag==TEXFLAG_MEMORY int height; ///< platny jen pro iFlag==TEXFLAG_MEMORY SDL_PixelFormat pixelformat; ///< platny jen pro iFlag==TEXFLAG_MEMORY //@} /// Kam se ma vratit odkaz. //@{ int iHandle_c; ///< Pocet mist, kam se ma nahrat handle textury HWTID** pHandle; ///< Pole ukazatelu na handly. //@} }; /** Ukazatel na dotaz. */ typedef TTextureLoaderQuery* PTextureLoaderQuery; /** Manazer textur. */ class TTextureManager //## { private: // SDL_mutex *tm_lock; ///< Zamek pro vkladani dotazu. // int iMemLimit; ///< Maximalni povolena pamet(nepouziva) int iMemOccupied; ///< Vyuzita pamet. // std::vector vTexture; ///< Textury. // std::vector vTextureQuery; ///< Pozadavky. /** Dotaz na pozadavek podle id rasteru. @param RESID id bitmapy v rmraster @return Pozadavek. */ TTextureLoaderQuery* getQuery(int RESID); /** Dotaz na texturu podle dat. @param data K pozadavku pridruzena data. @return Pozadavek. */ TTextureLoaderQuery* getQuery(void* data); /** Uvolni pozadavek z pameti. @param tq Ukazatel na pozadavek. */ void releaseTextureQuery(TTextureLoaderQuery* tq); public: /// Operace na bufferu //@{ /** Vytvor pozadavek na nahrani textury. @param filename Jmeno souboru rasteru s texturou(hleda se v rm) @param handle Ukazatel na handle kam se ma zkopirovat pri vytvoreni textury. @param flag Priznak textury. @param internalformat Interni format textury. */ TTextureLoaderQuery* loadTextureQuery(char* filename, HWTID* handle, int flag = TEXFLAG_PRIORITY_NORMAL, int internalformat = GL_RGB ); /** Vytvor pozadavek na nahrani textury. @param bid Id rasteru s texturou(hleda se v rm) @param handle Ukazatel na handle kam se ma zkopirovat pri vytvoreni textury. @param flag Priznak textury. @param internalformat Interni format textury. */ TTextureLoaderQuery* loadTextureQuery(int bid, HWTID* handle, int flag = TEXFLAG_PRIORITY_NORMAL, int internalformat = GL_RGB ); /** Vytvor pozadavek na nahrani textury z pameti. @param data Pamet s daty textury. @param w Sirka textury. @param h Vyska textury. @param handle Ukazatel na handle kam se ma zkopirovat pri vytvoreni textury. @param flag Priznak textury. @param internalformat Interni format textury. */ TTextureLoaderQuery* loadTextureQuery(void* data, int w, int h, HWTID* handle, int flag = TEXFLAG_PRIORITY_NORMAL, int internalformat = GL_RGB ); /** Smaze forntu pozadavku. */ void resetAllQueries(); /** Najde texturu podle jmena souboru. @param filename Jmeno souboru. @return Textura, nebo NULL */ TTexture* findTexture(char* filename); /** Najde texturu podle id rasteru. @param bid Id rasteru v rmraster. @return Textura, nebo NULL */ TTexture* findTexture(int bid); /** Najde texturu podle dat. @param data pointer na data. @return Textura, nebo NULL */ TTexture* findTexture(void* data); /** Prida texturu vytvarenou z dat. @param flag @param data @param w @param h @param pf @param hwtid @return Textura. */ TTexture* addTexture(int flag, void* data, int w, int h, SDL_PixelFormat pf, HWTID hwtid); /** Prida texturu vytvarenou z resourcu. @param flag @param bid @param hwtid @return Textura. */ TTexture* addTexture(int flag, int bid, HWTID hwtid); /** Uvolni texturu z pameti. @param t Textura. @param hwtid Id textury. */ void freeTexture(TTexture* t, int hwtid); /** Vytahne z modelu materialy obsahujici texturu a vytvori pozadavek. @param m Model. @param flags Flagy. */ void prepareModel(TModel* m, int flags); /** Nahraje vsechny textury z pozadaku a nastavi handlery. */ void loadTextures(); /** Obnovi texturu okamzite bez pozadavku. @param t Textura. @return Nova textura. */ TTexture* reloadTextureNow(TTexture* t); /** Odstrani vsechny textury z pameti. */ void unloadTextures(); /** Uvolni tolik textur kolik je potreba. @param iSize Velikost, ktera se ma uvolnit. */ void freeTextureMemory(int iSize); /** Uvolni stare textury. @param tStamp Jak stare textury se maji uvolnit. */ void freeOldTextures(int tStamp); //@} /** Destruktor. */ ~TTextureManager(); /** Konstruktor. */ TTextureManager(); /// Jedina globalni instance texturemanageru. static TTextureManager* tm; /** Vytori jedinou globalni instanci tm. */ static void TextureManager_Init(); /** Odalokuje jedinou globalni instanci tm. */ static void TextureManager_Free(); }; }//namespace #endif //TEXTUREMANAGER_H /*****************************************************************************/