]> git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
cvar: r_texture_dds_load_dxt1_noalpha; if set, DXT1 alpha detection is disabled,...
authordivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Fri, 6 Aug 2010 18:48:30 +0000 (18:48 +0000)
committerRudolf Polzer <divverent@alientrap.org>
Fri, 6 Aug 2010 18:47:10 +0000 (20:47 +0200)
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

index cbf5da9f2b35a38c5cfef88a15809dcb60239606..7bf782e325395e74e1e4ef03634d4c7f6824aa0c 100644 (file)
@@ -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))
        {