#include "texture_opengl.h" TextureOpenGL::TextureOpenGL(Pixelmap *image,SamplerState samp,unsigned int flags): Texture(image,samp,flags) { if (!is_valid) return; InitTex(); } static GLenum samp_mode[]= { GL_LINEAR, GL_NEAREST, GL_LINEAR_MIPMAP_LINEAR }; static GLenum wrap_mode[]= { GL_REPEAT, GL_CLAMP, GL_CLAMP_TO_EDGE }; static GLenum gl_store_format[]= { GL_RGBA4, GL_RGBA4, GL_RGB5, GL_RGB5, GL_LUMINANCE, GL_ALPHA }; static GLenum gl_data_format[]= { GL_RGBA, GL_BGRA, GL_RGB, GL_BGR, GL_LUMINANCE, GL_ALPHA }; // this is where we really initialize the texture for use void TextureOpenGL::InitTex() { if (!(is_pow2(image->Width())&&is_pow2(image->Height()))) { if (!GLEE_ARB_texture_non_power_of_two) { is_valid=false; return; } } textarget=GL_TEXTURE_2D; glGenTextures(1,&texid); glEnable(GL_TEXTURE_2D); glBindTexture(textarget,texid); glTexParameteri(textarget,GL_TEXTURE_WRAP_S,wrap_mode[samp.wraps]); glTexParameteri(textarget,GL_TEXTURE_WRAP_T,wrap_mode[samp.wrapt]); glTexParameteri(textarget,GL_TEXTURE_MAG_FILTER,samp_mode[samp.magmode]); glTexParameteri(textarget,GL_TEXTURE_MIN_FILTER,samp_mode[samp.minmode]); glTexImage2D(GL_TEXTURE_2D,0,gl_store_format[image->Format()], image->Width(),image->Height(), 0,gl_data_format[image->Format()],GL_UNSIGNED_BYTE, image->PixPtr()); if (samp.minmode==RAVEN_MIPMAP_SAMPLE) glTexParameteri(textarget,GL_GENERATE_MIPMAP,GL_TRUE); glTexParameteri(textarget,GL_TEXTURE_MIN_FILTER,samp_mode[samp.minmode]); if (samp.aniso&&GLEE_EXT_texture_filter_anisotropic) glTexParameteri(textarget,GL_TEXTURE_MAX_ANISOTROPY_EXT,samp.aniso); } TextureOpenGL::~TextureOpenGL() { glDeleteTextures(1,&texid); } void *TextureOpenGL::GetID() { return (void *)texid; } void TextureOpenGL::Bind(int stage) { glActiveTextureARB(GL_TEXTURE0+stage); glBindTexture(textarget,texid); glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV,GL_COMBINE_RGB,GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV,GL_SRC1_RGB,GL_PREVIOUS); glTexEnvi(GL_TEXTURE_ENV,GL_SRC2_RGB,GL_TEXTURE); glTexEnvi(GL_TEXTURE_ENV,GL_COMBINE_ALPHA,GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV,GL_SRC1_ALPHA,GL_PREVIOUS); glTexEnvi(GL_TEXTURE_ENV,GL_SRC2_ALPHA,GL_TEXTURE); }