Add the ability for client to check if image exists
authorPerttu Ahola <celeron55@gmail.com>
Fri, 30 Nov 2012 20:19:50 +0000 (22:19 +0200)
committerPerttu Ahola <celeron55@gmail.com>
Fri, 30 Nov 2012 20:19:54 +0000 (22:19 +0200)
src/tile.cpp
src/tile.h

index f7f1779ca51f619d9d987de00b3fab200d085c22..7cad1b83692399392cacbf6ede423d0c543fc014 100644 (file)
@@ -372,6 +372,18 @@ public:
        // Update new texture pointer and texture coordinates to an
        // AtlasPointer based on it's texture id
        void updateAP(AtlasPointer &ap);
+       bool isKnownSourceImage(const std::string &name)
+       {
+               bool is_known = false;
+               bool cache_found = m_source_image_existence.get(name, &is_known);
+               if(cache_found)
+                       return is_known;
+               // Not found in cache; find out if a local file exists
+               is_known = (getTexturePath(name) != "");
+               m_source_image_existence.set(name, is_known);
+               return is_known;
+       }
 
        // Processes queued texture requests from other threads.
        // Shall be called from the main thread.
@@ -400,6 +412,9 @@ private:
        // This should be only accessed from the main thread
        SourceImageCache m_sourcecache;
 
+       // Thread-safe cache of what source images are known (true = known)
+       MutexedMap<std::string, bool> m_source_image_existence;
+
        // A texture id is index in this array.
        // The first position contains a NULL texture.
        core::array<SourceAtlasPointer> m_atlaspointer_cache;
@@ -781,6 +796,7 @@ void TextureSource::insertSourceImage(const std::string &name, video::IImage *im
        assert(get_current_thread_id() == m_main_thread);
        
        m_sourcecache.insert(name, img, true, m_device->getVideoDriver());
+       m_source_image_existence.set(name, true);
 }
        
 void TextureSource::rebuildImagesAndTextures()
index ae986e797ebdc38ce8113a8f149ae244c38805a6..12c40c833e72e5f0456fb450eecb48a7dbad3409 100644 (file)
@@ -131,6 +131,7 @@ public:
        virtual IrrlichtDevice* getDevice()
                {return NULL;}
        virtual void updateAP(AtlasPointer &ap){};
+       virtual bool isKnownSourceImage(const std::string &name)=0;
 };
 
 class IWritableTextureSource : public ITextureSource
@@ -149,6 +150,7 @@ public:
        virtual IrrlichtDevice* getDevice()
                {return NULL;}
        virtual void updateAP(AtlasPointer &ap){};
+       virtual bool isKnownSourceImage(const std::string &name)=0;
 
        virtual void processQueue()=0;
        virtual void insertSourceImage(const std::string &name, video::IImage *img)=0;