#include "texture.h" #include "util/util.h" #include #include GLuint Texture_Create2D( const char *path ) { GLuint ID; SDL_Surface *data = IMG_Load(path); if(data == NULL) Util_FatalError("Texture %s could not be found!\n", path); glGenTextures(1, &ID); glBindTexture(GL_TEXTURE_2D, ID); SDL_LockSurface(data); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, data->w, data->h, GL_FALSE, GL_RGBA, GL_UNSIGNED_BYTE, data->pixels); SDL_UnlockSurface(data); glGenerateMipmap(GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, -2.4); SDL_FreeSurface(data); glBindTexture(GL_TEXTURE_2D, 0); return ID; } GLuint Texture_CreateCubeMap( const char *paths[6] ) { GLuint ID; glGenTextures(1, &ID); glBindTexture(GL_TEXTURE_CUBE_MAP, ID); SDL_Surface *data; int i; for(i = 0; i < 6; i++) { data = IMG_Load(paths[i]); if(data == NULL) Util_FatalError("Texture %s could not be found!\n", paths[i]); SDL_LockSurface(data); /* All the textures sides are linearly stored so we just add "i" */ glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGBA, data->w, data->h, GL_FALSE, GL_RGBA, GL_UNSIGNED_BYTE, data->pixels); SDL_UnlockSurface(data); SDL_FreeSurface(data); } glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); return ID; } void Texture_Destroy(GLuint ID) { glDeleteTextures(1, &ID); }