diff options
Diffstat (limited to 'src/tile.h')
-rw-r--r-- | src/tile.h | 143 |
1 files changed, 20 insertions, 123 deletions
diff --git a/src/tile.h b/src/tile.h index da23615c3..ac4e790b4 100644 --- a/src/tile.h +++ b/src/tile.h @@ -25,6 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "utility.h" #include <string> +class IGameDef; + /* tile.{h,cpp}: Texture handling stuff. */ @@ -120,8 +122,9 @@ struct SourceAtlasPointer }; /* - Implementation (to be used as a no-op on the server) + TextureSource creates and caches textures. */ + class ITextureSource { public: @@ -137,133 +140,27 @@ public: {return NULL;} }; -/* - Creates and caches textures. -*/ -class TextureSource : public ITextureSource +class IWritableTextureSource : public ITextureSource { public: - TextureSource(IrrlichtDevice *device); - ~TextureSource(); - - /* - Processes queued texture requests from other threads. - - Shall be called from the main thread. - */ - void processQueue(); - - /* - Example case: - Now, assume a texture with the id 1 exists, and has the name - "stone.png^mineral1". - Then a random thread calls getTextureId for a texture called - "stone.png^mineral1^crack0". - ...Now, WTF should happen? Well: - - getTextureId strips off stuff recursively from the end until - the remaining part is found, or nothing is left when - something is stripped out - - But it is slow to search for textures by names and modify them - like that? - - ContentFeatures is made to contain ids for the basic plain - textures - - Crack textures can be slow by themselves, but the framework - must be fast. - - Example case #2: - - Assume a texture with the id 1 exists, and has the name - "stone.png^mineral1" and is specified as a part of some atlas. - - Now MapBlock::getNodeTile() stumbles upon a node which uses - texture id 1, and finds out that NODEMOD_CRACK must be applied - with progression=0 - - It finds out the name of the texture with getTextureName(1), - appends "^crack0" to it and gets a new texture id with - getTextureId("stone.png^mineral1^crack0") - - */ - - /* - Gets a texture id from cache or - - if main thread, from getTextureIdDirect - - if other thread, adds to request queue and waits for main thread - */ - u32 getTextureId(const std::string &name); - - /* - Example names: - "stone.png" - "stone.png^crack2" - "stone.png^blit:mineral_coal.png" - "stone.png^blit:mineral_coal.png^crack1" - - - If texture specified by name is found from cache, return the - cached id. - - Otherwise generate the texture, add to cache and return id. - Recursion is used to find out the largest found part of the - texture and continue based on it. - - The id 0 points to a NULL texture. It is returned in case of error. - */ - u32 getTextureIdDirect(const std::string &name); - - /* - Finds out the name of a cached texture. - */ - std::string getTextureName(u32 id); - - /* - If texture specified by the name pointed by the id doesn't - exist, create it, then return the cached texture. - - Can be called from any thread. If called from some other thread - and not found in cache, the call is queued to the main thread - for processing. - */ - AtlasPointer getTexture(u32 id); - - AtlasPointer getTexture(const std::string &name) - { - return getTexture(getTextureId(name)); - } - - // Gets a separate texture - video::ITexture* getTextureRaw(const std::string &name) - { - AtlasPointer ap = getTexture(name); - return ap.atlas; - } - -private: - /* - Build the main texture atlas which contains most of the - textures. - - This is called by the constructor. - */ - void buildMainAtlas(); - - // The id of the thread that is allowed to use irrlicht directly - threadid_t m_main_thread; - // The irrlicht device - IrrlichtDevice *m_device; - - // A texture id is index in this array. - // The first position contains a NULL texture. - core::array<SourceAtlasPointer> m_atlaspointer_cache; - // Maps a texture name to an index in the former. - core::map<std::string, u32> m_name_to_id; - // The two former containers are behind this mutex - JMutex m_atlaspointer_cache_mutex; - - // Main texture atlas. This is filled at startup and is then not touched. - video::IImage *m_main_atlas_image; - video::ITexture *m_main_atlas_texture; + IWritableTextureSource(){} + virtual ~IWritableTextureSource(){} + virtual u32 getTextureId(const std::string &name){return 0;} + virtual u32 getTextureIdDirect(const std::string &name){return 0;} + virtual std::string getTextureName(u32 id){return "";} + virtual AtlasPointer getTexture(u32 id){return AtlasPointer(0);} + virtual AtlasPointer getTexture(const std::string &name) + {return AtlasPointer(0);} + virtual video::ITexture* getTextureRaw(const std::string &name) + {return NULL;} - // Queued texture fetches (to be processed by the main thread) - RequestQueue<std::string, u32, u8, u8> m_get_texture_queue; + virtual void updateAP(AtlasPointer &ap)=0; + virtual void buildMainAtlas(class IGameDef *gamedef)=0; + virtual void processQueue()=0; }; +IWritableTextureSource* createTextureSource(IrrlichtDevice *device); + enum MaterialType{ MATERIAL_ALPHA_NONE, MATERIAL_ALPHA_VERTEX, |