From cf5b8c6c279111a4dec859a466b468ed6eb69eb6 Mon Sep 17 00:00:00 2001 From: divverent Date: Wed, 23 Jul 2008 09:39:37 +0000 Subject: [PATCH] turn rev8420 "enable transparency on tga skins on mdl/md2/md3 when shader is not found" into what it actually WANTED to be (only enable the transparency if the TGA actually is transparent) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8423 d7cf8633-e32d-0410-b094-e92efae38249 --- gl_rmain.c | 11 ++++++++++- model_shared.c | 10 +++++++--- render.h | 1 + 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/gl_rmain.c b/gl_rmain.c index 2c65e85c..a1c9d4c5 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -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; diff --git a/model_shared.c b/model_shared.c index 0749523e..2df33c9c 100644 --- a/model_shared.c +++ b/model_shared.c @@ -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 diff --git a/render.h b/render.h index bc430376..c39b4032 100644 --- 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); -- 2.39.2