X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Ftexture.cpp;h=1d2ece8074410ded753c621f4c4dd43418e2694d;hp=581ec705690d556320bc412577a7ad8e5f4d0adb;hb=a993091fbb8fdb76a1d02be9de59529c14b59cf0;hpb=08e19bc2b4eba572bc7699378cf55cd8772ac67e diff --git a/source/texture.cpp b/source/texture.cpp index 581ec705..1d2ece80 100644 --- a/source/texture.cpp +++ b/source/texture.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -49,9 +50,17 @@ void operator>>(const LexicalConverter &c, TextureWrap &tw) } +int Texture::swizzle_orders[] = +{ + GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, + GL_RED, GL_RED, GL_RED, GL_ONE, + GL_RED, GL_RED, GL_RED, GL_GREEN +}; + Texture::Texture(GLenum t, ResourceManager *m): id(0), target(t), + ifmt(RGB), min_filter(NEAREST_MIPMAP_LINEAR), mag_filter(LINEAR), wrap_s(REPEAT), @@ -84,6 +93,41 @@ DataType Texture::get_alloc_type(PixelFormat fmt) return (get_base_pixelformat(fmt)==DEPTH_COMPONENT ? UNSIGNED_SHORT : UNSIGNED_BYTE); } +void Texture::set_internal_format(PixelFormat fmt) +{ + if(!get_component_size(fmt) && OES_required_internalformat) + fmt = get_default_sized_pixelformat(fmt); + + FormatSwizzle swiz = NO_SWIZZLE; + if(ARB_texture_rg && ARB_texture_swizzle) + { + if(fmt==LUMINANCE8 || fmt==SLUMINANCE8) + { + fmt = R8; + swiz = R_TO_LUMINANCE; + } + else if(fmt==LUMINANCE8_ALPHA8 || fmt==SLUMINANCE8_ALPHA8) + { + fmt = RG8; + swiz = RG_TO_LUMINANCE_ALPHA; + } + } + + require_pixelformat(fmt); + ifmt = fmt; + swizzle = swiz; + if(swizzle) + update_parameter(FORMAT_SWIZZLE); +} + +PixelFormat Texture::get_upload_format(PixelFormat fmt) const +{ + if(fmt==LUMINANCE || fmt==LUMINANCE_ALPHA) + return get_base_pixelformat(ifmt); + else + return fmt; +} + void Texture::update_parameter(int mask) const { if(!ARB_direct_state_access && TexUnit::current().get_texture()!=this) @@ -116,6 +160,23 @@ void Texture::update_parameter(int mask) const set_parameter_i(GL_TEXTURE_COMPARE_MODE, (compare ? GL_COMPARE_R_TO_TEXTURE : GL_NONE)); if(mask&COMPARE_FUNC) set_parameter_i(GL_TEXTURE_COMPARE_FUNC, cmp_func); + if(mask&FORMAT_SWIZZLE) + { + if(get_gl_api()==OPENGL_ES2) + { + set_parameter_i(GL_TEXTURE_SWIZZLE_R, swizzle_orders[swizzle*4]); + set_parameter_i(GL_TEXTURE_SWIZZLE_G, swizzle_orders[swizzle*4+1]); + set_parameter_i(GL_TEXTURE_SWIZZLE_B, swizzle_orders[swizzle*4+2]); + set_parameter_i(GL_TEXTURE_SWIZZLE_A, swizzle_orders[swizzle*4+3]); + } + else + { + if(ARB_direct_state_access) + glTextureParameteriv(id, GL_TEXTURE_SWIZZLE_RGBA, swizzle_orders+swizzle*4); + else + glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle_orders+swizzle*4); + } + } } void Texture::set_parameter_i(GLenum param, int value) const @@ -189,6 +250,11 @@ void Texture::set_wrap_r(TextureWrap w) update_parameter(WRAP_R); } +bool Texture::can_generate_mipmap() +{ + return (EXT_framebuffer_object || SGIS_generate_mipmap); +} + void Texture::set_generate_mipmap(bool gm) { if(gm && !EXT_framebuffer_object)