nuclear@2: #include "texture.h" nuclear@2: #include "opengl.h" nuclear@2: nuclear@2: Texture::Texture() nuclear@2: { nuclear@2: tex = 0; nuclear@2: type = GL_TEXTURE_2D; nuclear@2: } nuclear@2: nuclear@2: Texture::~Texture() nuclear@2: { nuclear@2: destroy(); nuclear@2: } nuclear@2: nuclear@7: int Texture::get_width() const nuclear@7: { nuclear@7: return img.get_width(); nuclear@7: } nuclear@7: nuclear@7: int Texture::get_height() const nuclear@7: { nuclear@7: return img.get_height(); nuclear@7: } nuclear@7: nuclear@2: void Texture::create2d(int xsz, int ysz) nuclear@2: { nuclear@2: destroy(); nuclear@2: nuclear@2: type = GL_TEXTURE_2D; nuclear@2: img.create(xsz, ysz); nuclear@2: nuclear@2: if(!tex) { nuclear@2: glGenTextures(1, &tex); nuclear@2: } nuclear@2: glBindTexture(type, tex); nuclear@2: glTexParameteri(type, GL_TEXTURE_MIN_FILTER, GL_LINEAR); nuclear@2: glTexParameteri(type, GL_TEXTURE_MAG_FILTER, GL_LINEAR); nuclear@2: glTexImage2D(type, 0, GL_RGBA, xsz, ysz, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); nuclear@2: } nuclear@2: nuclear@2: void Texture::destroy() nuclear@2: { nuclear@2: if(tex) { nuclear@2: glDeleteTextures(1, &tex); nuclear@2: } nuclear@2: } nuclear@2: nuclear@2: void Texture::set_image(const Image &img) nuclear@2: { nuclear@2: this->img = img; nuclear@2: create2d(img.get_width(), img.get_height()); nuclear@2: nuclear@2: glTexSubImage2D(type, 0, 0, 0, img.get_width(), img.get_height(), nuclear@2: GL_RGBA, GL_UNSIGNED_BYTE, img.get_pixels()); nuclear@2: } nuclear@2: nuclear@2: Image &Texture::get_image() nuclear@2: { nuclear@2: return img; nuclear@2: } nuclear@2: nuclear@2: const Image &Texture::get_image() const nuclear@2: { nuclear@2: return img; nuclear@2: } nuclear@2: nuclear@13: unsigned int Texture::get_type() const nuclear@13: { nuclear@13: return type; nuclear@13: } nuclear@13: nuclear@2: unsigned int Texture::get_texture_id() const nuclear@2: { nuclear@2: return tex; nuclear@2: } nuclear@2: nuclear@2: bool Texture::load(const char *fname) nuclear@2: { nuclear@2: Image image; nuclear@2: if(!image.load(fname)) { nuclear@2: return false; nuclear@2: } nuclear@2: set_image(image); nuclear@2: return true; nuclear@2: } nuclear@6: nuclear@13: void bind_texture(const Texture *tex, int tunit) nuclear@13: { nuclear@13: static unsigned int cur_tex_type[8] = { nuclear@13: GL_TEXTURE_2D, GL_TEXTURE_2D, GL_TEXTURE_2D, GL_TEXTURE_2D, nuclear@13: GL_TEXTURE_2D, GL_TEXTURE_2D, GL_TEXTURE_2D, GL_TEXTURE_2D nuclear@13: }; nuclear@13: nuclear@13: glActiveTextureARB(GL_TEXTURE0_ARB + tunit); nuclear@13: if(tex) { nuclear@13: glBindTexture(tex->get_type(), tex->get_texture_id()); nuclear@13: glEnable(tex->get_type()); nuclear@13: } else { nuclear@13: glDisable(cur_tex_type[tunit]); nuclear@13: } nuclear@13: glActiveTextureARB(GL_TEXTURE0_ARB); nuclear@13: nuclear@13: cur_tex_type[tunit] = tex->get_type(); nuclear@13: } nuclear@13: nuclear@13: nuclear@6: unsigned int next_pow2(unsigned int x) nuclear@6: { nuclear@6: x -= 1; nuclear@6: x |= x >> 1; nuclear@6: x |= x >> 2; nuclear@6: x |= x >> 4; nuclear@6: x |= x >> 8; nuclear@6: x |= x >> 16; nuclear@6: return x + 1; nuclear@6: }