#include #include #include #include #include "TextureCache.h" using namespace std; GLuint TextureCache::load(const char *fname) { string filename = fname; map::iterator it = m_cache.find(filename); if (it != m_cache.end()) { return it->second; } GLuint texture; SDL_Surface * temp = IMG_Load(filename.c_str()); if (!temp) { fprintf(stderr, "Failed to load image '%s'!\n", filename.c_str()); return 0; } SDL_PixelFormat fmt; fmt.palette = NULL; fmt.BitsPerPixel = 32; fmt.BytesPerPixel = 4; fmt.Rmask = 0x000000FF; fmt.Gmask = 0x0000FF00; fmt.Bmask = 0x00FF0000; fmt.Amask = 0xFF000000; fmt.Rshift = 0; fmt.Gshift = 8; fmt.Bshift = 16; fmt.Ashift = 24; SDL_Surface * texsurf = SDL_ConvertSurface(temp, &fmt, SDL_SWSURFACE); SDL_FreeSurface(temp); if (!texsurf) { fprintf(stderr, "'%s' was not converted properly!\n", filename.c_str()); return 0; } unsigned int * pixels = new unsigned int[texsurf->w * texsurf->h]; int y; unsigned int dstOffset = texsurf->w * (texsurf->h - 1); unsigned int srcOffset = 0; for (y = 0; y < texsurf->h; y++) { memcpy(pixels + dstOffset, ((unsigned int *)texsurf->pixels) + srcOffset, texsurf->w << 2); dstOffset -= texsurf->w; srcOffset += texsurf->w; } glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texsurf->w, texsurf->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); SDL_FreeSurface(texsurf); delete[] pixels; m_cache[filename] = texture; return texture; }