From 57e666a043794f7703a02efd2cb2c49f923c3922 Mon Sep 17 00:00:00 2001 From: divverent Date: Fri, 6 Aug 2010 18:48:30 +0000 Subject: [PATCH] cvar: r_texture_dds_load_dxt1_noalpha; if set, DXT1 alpha detection is disabled, and DXT1 is assumed to have no alpha. Rationale is that ATI Compressonator sometimes picks the alpha'd compression mode [a, (a+b)/2, b, transparent] and then never uses the transparent color value 3, as it sometimes can yield better results than the non-alpha'd compression mode [a, (2a+b)/3, (a+2b)/3, b], and this throws off alpha detection on loading git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@10375 d7cf8633-e32d-0410-b094-e92efae38249 ::stable-branch::merge=2f606f773eb3e95ac0b58cbafc1c7782fc48796c --- gl_textures.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/gl_textures.c b/gl_textures.c index cbf5da9f..7bf782e3 100644 --- a/gl_textures.c +++ b/gl_textures.c @@ -27,6 +27,7 @@ cvar_t gl_texturecompression_sky = {CVAR_SAVE, "gl_texturecompression_sky", "0", cvar_t gl_texturecompression_lightcubemaps = {CVAR_SAVE, "gl_texturecompression_lightcubemaps", "1", "whether to compress light cubemaps (spotlights and other light projection images)"}; cvar_t gl_texturecompression_reflectmask = {CVAR_SAVE, "gl_texturecompression_reflectmask", "1", "whether to compress reflection cubemap masks (mask of which areas of the texture should reflect the generic shiny cubemap)"}; cvar_t gl_nopartialtextureupdates = {CVAR_SAVE, "gl_nopartialtextureupdates", "1", "use alternate path for dynamic lightmap updates that avoids a possibly slow code path in the driver"}; +cvar_t r_texture_dds_load_dxt1_noalpha = {0, "r_texture_dds_load_dxt1_noalpha", "0", "if set, alpha detection on DXT1 is turned off, and DXT1 textures are assumed to never have alpha"}; qboolean gl_filter_force = false; int gl_filter_min = GL_LINEAR_MIPMAP_LINEAR; @@ -589,6 +590,7 @@ void R_Textures_Init (void) Cvar_RegisterVariable (&gl_texturecompression_lightcubemaps); Cvar_RegisterVariable (&gl_texturecompression_reflectmask); Cvar_RegisterVariable (&gl_nopartialtextureupdates); + Cvar_RegisterVariable (&r_texture_dds_load_dxt1_noalpha); R_RegisterModule("R_Textures", r_textures_start, r_textures_shutdown, r_textures_newmap, NULL, NULL); } @@ -1289,13 +1291,20 @@ rtexture_t *R_LoadTextureDDSFile(rtexturepool_t *rtexturepool, const char *filen Con_Printf("^1%s: invalid DXT1 DDS image\n", filename); return NULL; } - for (i = 0;i < size;i += bytesperblock) - if (ddspixels[i+0] + ddspixels[i+1] * 256 <= ddspixels[i+2] + ddspixels[i+3] * 256) - break; - if (i < size) - textype = TEXTYPE_DXT1A; - else + if(r_texture_dds_load_dxt1_noalpha.integer) + { flags &= ~TEXF_ALPHA; + } + else + { + for (i = 0;i < size;i += bytesperblock) + if (ddspixels[i+0] + ddspixels[i+1] * 256 <= ddspixels[i+2] + ddspixels[i+3] * 256) + break; + if (i < size) + textype = TEXTYPE_DXT1A; + else + flags &= ~TEXF_ALPHA; + } } else if (!memcmp(dds+84, "DXT3", 4)) { -- 2.39.2