diff options
-rw-r--r-- | source/gl_images.c | 70 | ||||
-rw-r--r-- | source/gl_local.h | 2 | ||||
-rw-r--r-- | source/gl_surf.c | 1 |
3 files changed, 44 insertions, 29 deletions
diff --git a/source/gl_images.c b/source/gl_images.c index 5daabd1..a7cb028 100644 --- a/source/gl_images.c +++ b/source/gl_images.c @@ -557,6 +557,34 @@ static void GL_MipMap( byte *in, int width, int height ) { } } +static inline qboolean is_a_wall( void ) { + if( upload_image->type != it_wall ) { + return qfalse; // not a wall texture + } + if( !upload_texinfo ) { + return qtrue; // don't know what type of surface it is + } + if( upload_texinfo->c.flags & (SURF_SKY|SURF_WARP) ) { + return qfalse; // don't desaturate or invert sky and liquid surfaces + } + return qtrue; +} + +static inline qboolean is_alpha( byte *data, int width, int height ) { + int i, c; + byte *scan; + + c = width * height; + scan = data + 3; + for( i = 0; i < c; i++, scan += 4 ) { + if( *scan != 255 ) { + return qtrue; + } + } + + return qfalse; +} + /* =============== GL_Upload32 @@ -565,8 +593,6 @@ GL_Upload32 static qboolean GL_Upload32( byte *data, int width, int height, qboolean mipmap ) { byte *scaled; int scaled_width, scaled_height; - int i, c; - byte *scan; int comp; qboolean isalpha; @@ -574,11 +600,12 @@ static qboolean GL_Upload32( byte *data, int width, int height, qboolean mipmap scaled_height = Q_CeilPowerOfTwo( height ); if( mipmap ) { - if( gl_round_down->integer && scaled_width > width ) - scaled_width >>= 1; - - if( gl_round_down->integer && scaled_height > height ) - scaled_height >>= 1; + if( gl_round_down->integer ) { + if( scaled_width > width ) + scaled_width >>= 1; + if( scaled_height > height ) + scaled_height >>= 1; + } // let people sample down the world textures for speed scaled_width >>= gl_picmip->integer; @@ -587,7 +614,7 @@ static qboolean GL_Upload32( byte *data, int width, int height, qboolean mipmap // don't ever bother with >256 textures while( scaled_width > gl_static.maxTextureSize || - scaled_height > gl_static.maxTextureSize ) + scaled_height > gl_static.maxTextureSize ) { scaled_width >>= 1; scaled_height >>= 1; @@ -605,11 +632,7 @@ static qboolean GL_Upload32( byte *data, int width, int height, qboolean mipmap // set saturation and lightscale before mipmap comp = gl_tex_solid_format; - if( upload_image->type == it_wall && - gl_saturation->value != 1 && - ( !upload_texinfo || - !( upload_texinfo->c.flags & (SURF_SKY|SURF_WARP) ) ) ) - { + if( is_a_wall() && gl_saturation->value != 1 ) { GL_Saturation( data, width, height ); if( gl_saturation->value == 0 ) { comp = GL_LUMINANCE; @@ -622,28 +645,18 @@ static qboolean GL_Upload32( byte *data, int width, int height, qboolean mipmap GL_LightScaleTexture( data, width, height, mipmap ); } - if( upload_image->type == it_wall && - gl_invert->integer && - ( !upload_texinfo || - !( upload_texinfo->c.flags & (SURF_SKY|SURF_WARP) ) ) ) - { + if( is_a_wall() && gl_invert->integer ) { GL_InvertTexture( data, width, height ); } // scan the texture for any non-255 alpha - c = width * height; - scan = data + 3; - isalpha = qfalse; - for( i = 0; i < c; i++, scan += 4 ) { - if( *scan != 255 ) { - isalpha = qtrue; - comp = gl_tex_alpha_format; - break; - } + isalpha = is_alpha( data, width, height ); + if( isalpha ) { + comp = gl_tex_alpha_format; } if( scaled_width == width && scaled_height == height ) { - /* optimized case, do not reallocate */ + // optimized case, do not reallocate scaled = data; } else { scaled = FS_AllocTempMem( scaled_width * scaled_height * 4 ); @@ -651,7 +664,6 @@ static qboolean GL_Upload32( byte *data, int width, int height, qboolean mipmap scaled_width, scaled_height ); } - qglTexImage2D( GL_TEXTURE_2D, 0, comp, scaled_width, scaled_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, scaled ); diff --git a/source/gl_local.h b/source/gl_local.h index 1eeee72..09b5a64 100644 --- a/source/gl_local.h +++ b/source/gl_local.h @@ -264,6 +264,8 @@ extern float gl_filter_anisotropy; extern int gl_tex_alpha_format; extern int gl_tex_solid_format; +extern mtexinfo_t *upload_texinfo; + void Scrap_Upload( void ); void GL_InitImages( void ); diff --git a/source/gl_surf.c b/source/gl_surf.c index 945c3fe..d121847 100644 --- a/source/gl_surf.c +++ b/source/gl_surf.c @@ -347,6 +347,7 @@ void GL_LoadWorld( const char *name ) { // register all texinfo for( i = 0, info = bsp->texinfo; i < bsp->numtexinfo; i++, info++ ) { Q_concat( buffer, sizeof( buffer ), "textures/", info->name, ".wal", NULL ); + upload_texinfo = info; image = IMG_Find( buffer, it_wall ); info->image = image ? image : r_notexture; } |