Make possible and do update textures in node definitions after late texture atlas making

This commit is contained in:
Perttu Ahola 2011-11-14 22:07:42 +02:00
parent c6fd2986d4
commit 1afed48a2c
4 changed files with 26 additions and 1 deletions

View File

@ -224,6 +224,9 @@ Client::Client(
tsrc->buildMainAtlas(this);
else
infostream<<"Not building texture atlas."<<std::endl;
// Update textures
m_nodedef->updateTextures(tsrc);
// NOTE: This should be done only after getting possible dynamic
// game definitions from the server, or at least shut down and

View File

@ -164,6 +164,21 @@ public:
assert(c <= MAX_CONTENT);
return &m_content_features[c];
}
virtual void updateTextures(ITextureSource *tsrc)
{
#ifndef SERVER
infostream<<"CNodeDefManager::updateTextures(): Updating "
<<"textures in node definitions"<<std::endl;
for(u16 i=0; i<=MAX_CONTENT; i++)
{
ContentFeatures *f = &m_content_features[i];
for(u16 j=0; j<6; j++)
tsrc->updateAP(f->tiles[j].texture);
if(f->special_atlas)
tsrc->updateAP(*(f->special_atlas));
}
#endif
}
private:
ContentFeatures m_content_features[MAX_CONTENT+1];
};

View File

@ -320,6 +320,12 @@ public:
// Register node definition
virtual void set(content_t c, const ContentFeatures &def)=0;
virtual ContentFeatures* getModifiable(content_t c)=0;
/*
Update tile textures to latest return values of TextueSource.
Call after updating the texture atlas of a TextureSource.
*/
virtual void updateTextures(ITextureSource *tsrc)=0;
};
// If textures not actually available (server), tsrc can be NULL

View File

@ -138,6 +138,7 @@ public:
{return AtlasPointer(0);}
virtual video::ITexture* getTextureRaw(const std::string &name)
{return NULL;}
virtual void updateAP(AtlasPointer &ap){};
};
class IWritableTextureSource : public ITextureSource
@ -153,8 +154,8 @@ public:
{return AtlasPointer(0);}
virtual video::ITexture* getTextureRaw(const std::string &name)
{return NULL;}
virtual void updateAP(AtlasPointer &ap){};
virtual void updateAP(AtlasPointer &ap)=0;
virtual void buildMainAtlas(class IGameDef *gamedef)=0;
virtual void processQueue()=0;
};