]> de.git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
turn rev8420 "enable transparency on tga skins on mdl/md2/md3 when shader is not...
authordivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Wed, 23 Jul 2008 09:39:37 +0000 (09:39 +0000)
committerdivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Wed, 23 Jul 2008 09:39:37 +0000 (09:39 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8423 d7cf8633-e32d-0410-b094-e92efae38249

gl_rmain.c
model_shared.c
render.h

index 2c65e85cc20b0feb2d7f489448c81eb80f2e891b..a1c9d4c552034bd5fe880b273c59dede60d292aa 100644 (file)
@@ -1862,7 +1862,7 @@ skinframe_t *R_SkinFrame_Find(const char *name, int textureflags, int comparewid
        return item;
 }
 
-skinframe_t *R_SkinFrame_LoadExternal(const char *name, int textureflags, qboolean complain)
+skinframe_t *R_SkinFrame_LoadExternal_CheckAlpha(const char *name, int textureflags, qboolean complain, qboolean *has_alpha)
 {
        // FIXME: it should be possible to disable loading various layers using
        // cvars, to prevent wasted loading time and memory usage if the user does
@@ -1879,6 +1879,8 @@ skinframe_t *R_SkinFrame_LoadExternal(const char *name, int textureflags, qboole
        int basepixels_height;
        skinframe_t *skinframe;
 
+       *has_alpha = false;
+
        if (cls.state == ca_dedicated)
                return NULL;
 
@@ -1921,6 +1923,7 @@ skinframe_t *R_SkinFrame_LoadExternal(const char *name, int textureflags, qboole
                if (j < basepixels_width * basepixels_height * 4)
                {
                        // has transparent pixels
+                       *has_alpha = true;
                        pixels = (unsigned char *)Mem_Alloc(tempmempool, image_width * image_height * 4);
                        for (j = 0;j < image_width * image_height * 4;j += 4)
                        {
@@ -1973,6 +1976,12 @@ skinframe_t *R_SkinFrame_LoadExternal(const char *name, int textureflags, qboole
        return skinframe;
 }
 
+skinframe_t *R_SkinFrame_LoadExternal(const char *name, int textureflags, qboolean complain)
+{
+       qboolean has_alpha;
+       return R_SkinFrame_LoadExternal_CheckAlpha(name, textureflags, complain, &has_alpha);
+}
+
 static rtexture_t *R_SkinFrame_TextureForSkinLayer(const unsigned char *in, int width, int height, const char *name, const unsigned int *palette, int textureflags, qboolean force)
 {
        int i;
index 0749523e481b45d70d53dda7ab6d11e3a4699fbe..2df33c9c14ad44bb69f35977300521807eeaa273 100644 (file)
@@ -1865,12 +1865,16 @@ nothing                GL_ZERO GL_ONE
                        texture->basematerialflags |= MATERIALFLAG_SKY | MATERIALFLAG_NOSHADOW;
                else
                        texture->basematerialflags |= MATERIALFLAG_WALL;
-               if (defaulttexflags & TEXF_ALPHA)
-                       texture->basematerialflags |= MATERIALFLAG_ALPHA | MATERIALFLAG_BLENDED | MATERIALFLAG_NOSHADOW;
                texture->numskinframes = 1;
                if (fallback)
                {
-                       if (!(texture->skinframes[0] = R_SkinFrame_LoadExternal(texture->name, defaulttexflags, false)))
+                       qboolean has_alpha;
+                       if ((texture->skinframes[0] = R_SkinFrame_LoadExternal_CheckAlpha(texture->name, defaulttexflags, false, &has_alpha)))
+                       {
+                               if(has_alpha && (defaulttexflags & TEXF_ALPHA))
+                                       texture->basematerialflags |= MATERIALFLAG_ALPHA | MATERIALFLAG_BLENDED | MATERIALFLAG_NOSHADOW;
+                       }
+                       else
                                success = false;
                }
                else
index bc43037674e04463fd97535c9a9ce2b9923164d7..c39b4032901dd277c6a7e0518338a58a9e77b1d9 100644 (file)
--- a/render.h
+++ b/render.h
@@ -140,6 +140,7 @@ void R_SkinFrame_Purge(void);
 skinframe_t *R_SkinFrame_FindNextByName( skinframe_t *last, const char *name );
 skinframe_t *R_SkinFrame_Find(const char *name, int textureflags, int comparewidth, int compareheight, int comparecrc, qboolean add);
 skinframe_t *R_SkinFrame_LoadExternal(const char *name, int textureflags, qboolean complain);
+skinframe_t *R_SkinFrame_LoadExternal_CheckAlpha(const char *name, int textureflags, qboolean complain, qboolean *has_alpha);
 skinframe_t *R_SkinFrame_LoadInternalBGRA(const char *name, int textureflags, const unsigned char *skindata, int width, int height);
 skinframe_t *R_SkinFrame_LoadInternalQuake(const char *name, int textureflags, int loadpantsandshirt, int loadglowtexture, const unsigned char *skindata, int width, int height);
 skinframe_t *R_SkinFrame_LoadMissing(void);