X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FTexture.cpp;h=ef20536da7b37f7268607d0a52ba0e44df69569e;hb=b17ec650f79ea8efbfda00ae93bd82434fcea686;hp=92c69d5c93c82472c92511c4cfa754884e610efb;hpb=46cff1de1e828cb8c04a5dc5377bc07baae57858;p=lugaru.git diff --git a/Source/Texture.cpp b/Source/Texture.cpp index 92c69d5..ef20536 100644 --- a/Source/Texture.cpp +++ b/Source/Texture.cpp @@ -4,95 +4,151 @@ using namespace std; -map Texture::textures; - extern TGAImageRec texture; extern bool trilinear; -Texture::~Texture() { - free(array); - if(id) - glDeleteTextures(1,&id); -} -void Texture::load() { - GLuint type; +class TextureRes { +private: + static vector list; - LOGFUNC; + GLuint id; + string filename; + bool hasMipmap; + bool hasAlpha; + bool isSkin; + int skinsize; + GLubyte* data; + int datalen; + GLubyte* skindata; - LOG(std::string("Loading texture...") + fileName); + void load(); - unsigned char fileNamep[256]; - CopyCStringToPascal(ConvertFileName(fileName.c_str()), fileNamep); - //Load Image - upload_image( fileNamep ,hasalpha); - - //Alpha channel? - if ( texture.bpp == 24 ) - type = GL_RGB; - else - type = GL_RGBA; - - glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); - - if(!id) - glGenTextures( 1, &id ); - glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); - - glBindTexture( GL_TEXTURE_2D, id); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - if(mipmap) - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (trilinear?GL_LINEAR_MIPMAP_LINEAR:GL_LINEAR_MIPMAP_NEAREST) ); - else - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); +public: + TextureRes(const string& filename, bool hasMipmap, bool hasAlpha); + TextureRes(const string& filename, bool hasMipmap, GLubyte* array, int* skinsize); + ~TextureRes(); + void bind(); + + static void reloadAll(); +}; + + +vector TextureRes::list; + +void TextureRes::load(){ + //load image into 'texture' global var + if(!skindata){ + unsigned char filenamep[256]; + CopyCStringToPascal(ConvertFileName(filename.c_str()),filenamep); + upload_image(filenamep,hasAlpha); + } skinsize=texture.sizeX; + GLuint type=GL_RGBA; + if(texture.bpp==24) + type=GL_RGB; + + glPixelStorei(GL_UNPACK_ALIGNMENT,1); + + glDeleteTextures(1,&id); + glGenTextures(1,&id); + glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); + + glBindTexture(GL_TEXTURE_2D, id); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); + if(hasMipmap){ + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,(trilinear?GL_LINEAR_MIPMAP_LINEAR:GL_LINEAR_MIPMAP_NEAREST)); + glTexParameteri(GL_TEXTURE_2D,GL_GENERATE_MIPMAP,GL_TRUE); + }else{ + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); + } - if(isSkin) { - int tempnum=0; - int nb = (texture.sizeY*texture.sizeX*(texture.bpp/8)); - array = (GLubyte*)malloc(nb*sizeof(GLubyte)); - for(int i=0;i::iterator it = textures.find(fileName); - if(it==textures.end()) { - textures.insert(make_pair(fileName,Texture(fileName,mipmap,hasalpha))); - textures[fileName].load(); - return textures[fileName].getId(); - } else { - return it->second.getId(); - } +void TextureRes::bind(){ + glBindTexture(GL_TEXTURE_2D,id); } -GLuint Texture::Load(const string& fileName, bool mipmap, bool hasalpha, GLubyte* array, int* skinsize) { - map::iterator it = textures.find(fileName); - if(it==textures.end()) { - textures.insert(make_pair(fileName,Texture(fileName,mipmap,hasalpha,true))); - textures[fileName].load(); - *skinsize = textures[fileName].skinsize; - for(int i=0;isecond.skinsize; - for(int i=0;isecond.arraySize;i++) { - array[i] = it->second.array[i]; - } - return it->second.getId(); - } +TextureRes::TextureRes(const string& _filename, bool _hasMipmap, bool _hasAlpha): + id(0),filename(_filename),hasMipmap(_hasMipmap),hasAlpha(_hasAlpha),isSkin(false), + skinsize(0),data(NULL),datalen(0),skindata(NULL) { + load(); + list.push_back(this); +} + +TextureRes::TextureRes(const string& _filename, bool _hasMipmap, GLubyte* array, int* skinsizep): + id(0),filename(_filename),hasMipmap(_hasMipmap),hasAlpha(false),isSkin(true), + skinsize(0),data(NULL),datalen(0),skindata(NULL) { + load(); + *skinsizep=skinsize; + for(int i=0;i::iterator it=list.begin();it!=list.end();it++) + if(*it==this){ + list.erase(it); + break; + } +} + +void TextureRes::reloadAll(){ + for(vector::iterator it=list.begin();it!=list.end();it++){ + (*it)->id=0; + (*it)->load(); + } +} + + + + +void Texture::load(const string& filename, bool hasMipmap, bool hasAlpha){ + destroy(); + tex=new TextureRes(filename,hasMipmap,hasAlpha); +} + +void Texture::load(const string& filename, bool hasMipmap, GLubyte* array, int* skinsizep){ + destroy(); + tex=new TextureRes(filename,hasMipmap,array,skinsizep); +} + +void Texture::destroy(){ + if(tex){ + delete tex; + tex=NULL; + } +} + +void Texture::bind(){ + if(tex) + tex->bind(); + else + glBindTexture(GL_TEXTURE_2D,0); +} + +void Texture::reloadAll(){ + TextureRes::reloadAll(); }