summary refs log tree commit diff
path: root/src/Textures.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Textures.cpp')
-rw-r--r--src/Textures.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/Textures.cpp b/src/Textures.cpp
new file mode 100644
index 0000000..0f829dc
--- /dev/null
+++ b/src/Textures.cpp
@@ -0,0 +1,73 @@
+/*
+(c) 2008 Victor "ErV" Eremin, Voronezh, Russia.
+mailto: ErV2005@rambler.ru, erv@box.vsi.ru
+for non-ncommercial use only
+*/
+#include "Textures.h"
+#include <GL/glu.h>
+#include <SDL/SDL_image.h>
+#include <stdio.h>
+
+GLuint loadTexture(const char* filename_, GLenum minFilter, GLenum magFilter, bool mipmaps){
+	char filename[1024];
+	strcpy(filename, filename_+1);
+	while(true){
+		char *c = strchr(filename, ':');
+		if (!c) break;
+		*c = '/';
+	}
+	GLuint tex = 0;
+	glGenTextures(1, &tex);
+	glBindTexture(GL_TEXTURE_2D, tex);
+	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
+
+	SDL_Surface *surface = IMG_Load(filename);
+	if (!surface){
+		fprintf(stderr, "couldn't load file %s!\n", filename);
+		return 0;
+	}
+
+	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+	GLenum format = GL_RGBA;
+	int numColors = surface->format->BytesPerPixel;
+	if (surface){
+		switch (numColors){
+			case (4):{
+				if (surface->format->Rmask == 0x000000ff)
+                        format = GL_RGBA;
+                else
+                        format = GL_BGRA;
+				break;
+			};
+			case (3):{
+				if (surface->format->Rmask == 0x000000ff)
+                        format = GL_RGB;
+                else
+                        format = GL_BGR;
+			};
+		};
+		
+		//well, our textures are upside down. Fixing it here.
+		Uint32 bytesPerRow = surface->format->BytesPerPixel*surface->w;
+		char * buf = new char[bytesPerRow];
+		char* p = (char*)surface->pixels;
+		for (Uint32 i = 0; i < surface->h/2; i++){
+			Uint32 offset1 = i*bytesPerRow;
+			Uint32 offset2 = (surface->h - i - 1)*bytesPerRow;
+			memcpy(buf, &p[offset1], bytesPerRow);
+			memcpy(&p[offset1], &p[offset2], bytesPerRow);
+			memcpy(&p[offset2], buf, bytesPerRow);
+		}
+		delete[] buf;
+		
+		glTexImage2D(GL_TEXTURE_2D, 0, numColors, surface->w, surface->h, 0, format, GL_UNSIGNED_BYTE, surface->pixels);
+		if (mipmaps)
+		    gluBuild2DMipmaps(GL_TEXTURE_2D, format,  surface->w, surface->h, format, GL_UNSIGNED_BYTE, surface->pixels);
+	}
+	
+	delete surface;
+	return tex;
+}
+