]> git.jsancho.org Git - lugaru.git/commitdiff
adding missing source files
authorCôme BERNIGAUD <come.bernigaud@gmail.com>
Wed, 18 May 2011 13:44:44 +0000 (15:44 +0200)
committerCôme BERNIGAUD <come.bernigaud@gmail.com>
Wed, 18 May 2011 13:44:44 +0000 (15:44 +0200)
Source/Texture.cpp [new file with mode: 0644]
Source/Texture.h [new file with mode: 0644]

diff --git a/Source/Texture.cpp b/Source/Texture.cpp
new file mode 100644 (file)
index 0000000..37d4073
--- /dev/null
@@ -0,0 +1,92 @@
+#include "gamegl.h"
+#include "Texture.h"
+#include "TGALoader.h"
+
+using namespace std;
+
+map<string,Texture> Texture::textures;
+
+extern TGAImageRec texture;
+extern bool trilinear;
+
+void Texture::load()  {
+       GLuint type;
+
+       LOGFUNC;
+
+       LOG(std::string("Loading texture...") + fileName);
+
+       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 );
+       
+       skinsize=texture.sizeX;
+       
+       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<nb;i++) {
+                       if((i+1)%4||type==GL_RGB) {
+                               array[tempnum]=texture.data[i];
+                               tempnum++;
+                       }
+               }
+               arraySize=tempnum;
+
+               gluBuild2DMipmaps( GL_TEXTURE_2D, type, texture.sizeX, texture.sizeY, GL_RGB, GL_UNSIGNED_BYTE, array );
+       } else {
+               gluBuild2DMipmaps( GL_TEXTURE_2D, type, texture.sizeX, texture.sizeY, type, GL_UNSIGNED_BYTE, texture.data );
+       }
+}
+
+GLuint Texture::Load(const string& fileName, bool mipmap, bool hasalpha) {
+       map<string,Texture>::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();
+       }
+}
+
+GLuint Texture::Load(const string& fileName, bool mipmap, bool hasalpha, GLubyte* array, int* skinsize) {
+       map<string,Texture>::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;i<textures[fileName].arraySize;i++) {
+                       array[i] = textures[fileName].array[i];
+               }
+               return textures[fileName].getId();
+       } else {
+               *skinsize = it->second.skinsize;
+               for(int i=0;i<it->second.arraySize;i++) {
+                       array[i] = it->second.array[i];
+               }
+               return it->second.getId();
+       }
+}
+
diff --git a/Source/Texture.h b/Source/Texture.h
new file mode 100644 (file)
index 0000000..4424cee
--- /dev/null
@@ -0,0 +1,39 @@
+#include <map>
+#include <string>
+
+//keeps track of which textures are loaded
+//TODO: delete them properly
+class Texture {
+       private:
+               static std::map<std::string,Texture> textures;
+       
+               bool isSkin;
+               std::string fileName;
+               GLuint id;
+               bool mipmap;
+               bool hasalpha;
+               GLubyte* array;
+               int arraySize;
+               int skinsize;
+
+               void load();
+
+       public:
+               Texture():
+                       isSkin(false), skinsize(0), arraySize(0),
+                       fileName(""), id(0), mipmap(false), hasalpha(false), array(NULL) { }
+               ~Texture() {
+                       free(array);
+               }
+               Texture (const std::string& _fileName, bool _mipmap, bool _hasalpha):
+                       isSkin(false), skinsize(0), arraySize(0), array(NULL),
+                       fileName(_fileName), id(0), mipmap(_mipmap), hasalpha(_hasalpha) { }
+               Texture (const std::string& _fileName, bool _mipmap, bool _hasalpha, bool _isSkin):
+                       isSkin(_isSkin), skinsize(0), arraySize(0), array(NULL),
+                       fileName(_fileName), id(0), mipmap(_mipmap), hasalpha(_hasalpha) { }
+               GLuint getId() const { return id; }
+               
+               static GLuint Load(const std::string& fileName, bool mipmap, bool hasalpha);
+               static GLuint Load(const std::string& fileName, bool mipmap, bool hasalpha, GLubyte* array, int* skinsize);
+};
+