//This file is part of Photon (http://photon.sourceforge.net) //Copyright (C) 2004-2005 James Turk // // Author: // James Turk (jpt2433@rit.edu) // // Version: // $Id: TextureResourceManager.cpp,v 1.1 2005/06/13 05:38:06 cozman Exp $ #include "video/TextureResourceManager.hpp" #include "util/FileBuffer.hpp" #include #include "GL/gl.h" #include "corona.h" namespace photon { namespace video { void TextureResourceManager::setGlobalColorKey(bool enabled, ubyte red, ubyte green, ubyte blue) { colorKey_.setColor(red,green,blue,enabled?0:255); } void TextureResourceManager::getGlobalColorKey(bool &enabled, ubyte &red, ubyte &green, ubyte &blue) { enabled = (colorKey_.alpha == 0); red = colorKey_.red; green = colorKey_.green; blue = colorKey_.blue; } void TextureResourceManager::getTextureData(uint id, scalar &width, scalar &height, uint &texID) { if(id < resVec_.size()) { ++resVec_[id].refCount; width = resVec_[id].width; height = resVec_[id].height; texID = resVec_[id].texID; } } void TextureResourceManager::loadResource(TextureResource &res, const std::string& path) { corona::Image *image(0); util::FileBuffer buf(path); corona::File *file; std::vector data = buf.getData(); file = corona::CreateMemoryFile((ubyte*)&data[0],data.size()); if(!file) { throw ResourceException("corona::CreateMemoryFile failed"); } image = corona::OpenImage(file,corona::PF_R8G8B8A8); delete file; if(!image) { throw ResourceException("corona::OpenImage failed"); } res.width = image->getWidth(); res.height = image->getHeight(); std::cerr << res.width << "x" << res.height << std::endl; //size to allocate = w*h*4 = size of bitmap * bytes per pixel res.pixels = new ubyte[res.width*res.height*4]; std::memcpy(res.pixels,image->getPixels(),res.width*res.height*4); delete image; //no longer need image if(colorKey_.alpha == 0) //ck alpha == 0, means colorkey on { ubyte r,g,b; ubyte *pxl=res.pixels; for(uint i=0; i < res.width*res.height; ++i) { r = *pxl++; g = *pxl++; b = *pxl++; //set current pixel alpha = 0 if(r == colorKey_.red && g == colorKey_.green && b == colorKey_.blue) { *pxl = 0; } *pxl++; } } glGenTextures(1,&res.texID); glBindTexture(GL_TEXTURE_2D,res.texID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR); gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, res.width, res.height, GL_RGBA, GL_UNSIGNED_BYTE, res.pixels); } void TextureResourceManager::freeResource(TextureResource &res) { if(res.pixels) { delete []res.pixels; res.pixels = 0; } glDeleteTextures(1, &res.texID); } } }