From: Rudolf Polzer <divVerent@xonotic.org>
Date: Mon, 15 Jun 2015 14:25:32 +0000 (+0200)
Subject: Support alpha textures in Quake if the name starts with '{'.
X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=refs%2Fheads%2FdivVerent%2Ffencetextures;p=xonotic%2Fdarkplaces.git

Support alpha textures in Quake if the name starts with '{'.

Note: this is actually a HLBSP feature, though:

Author: ericw on irc.anynet.org
---

diff --git a/gl_rmain.c b/gl_rmain.c
index 3d9686e0..099d0d42 100644
--- a/gl_rmain.c
+++ b/gl_rmain.c
@@ -3683,6 +3683,9 @@ skinframe_t *R_SkinFrame_LoadInternalQuake(const char *name, int textureflags, i
 		featuresmask |= palette_featureflags[skindata[i]];
 
 	skinframe->hasalpha = false;
+	// fence textures
+	if (name[0] == '{')
+		skinframe->hasalpha = true;
 	skinframe->qhascolormapping = loadpantsandshirt && (featuresmask & (PALETTEFEATURE_PANTS | PALETTEFEATURE_SHIRT));
 	skinframe->qgeneratenmap = r_shadow_bumpscale_basetexture.value > 0;
 	skinframe->qgeneratemerged = true;
@@ -3739,7 +3742,10 @@ static void R_SkinFrame_GenerateTexturesFromQPixels(skinframe_t *skinframe, qboo
 	if (skinframe->qgenerateglow)
 	{
 		skinframe->qgenerateglow = false;
-		skinframe->glow = R_LoadTexture2D(r_main_texturepool, va(vabuf, sizeof(vabuf), "%s_glow", skinframe->basename), width, height, skindata, vid.sRGB3D ? TEXTYPE_SRGB_PALETTE : TEXTYPE_PALETTE, skinframe->textureflags, -1, palette_bgra_onlyfullbrights); // glow
+		if (skinframe->hasalpha) // fence textures
+			skinframe->glow = R_LoadTexture2D(r_main_texturepool, va(vabuf, sizeof(vabuf), "%s_glow", skinframe->basename), width, height, skindata, vid.sRGB3D ? TEXTYPE_SRGB_PALETTE : TEXTYPE_PALETTE, skinframe->textureflags | TEXF_ALPHA, -1, palette_bgra_onlyfullbrights_transparent); // glow
+		else
+			skinframe->glow = R_LoadTexture2D(r_main_texturepool, va(vabuf, sizeof(vabuf), "%s_glow", skinframe->basename), width, height, skindata, vid.sRGB3D ? TEXTYPE_SRGB_PALETTE : TEXTYPE_PALETTE, skinframe->textureflags, -1, palette_bgra_onlyfullbrights); // glow
 	}
 
 	if (colormapped)
@@ -3752,7 +3758,10 @@ static void R_SkinFrame_GenerateTexturesFromQPixels(skinframe_t *skinframe, qboo
 	else
 	{
 		skinframe->qgeneratemerged = false;
-		skinframe->merged = R_LoadTexture2D(r_main_texturepool, skinframe->basename, width, height, skindata, vid.sRGB3D ? TEXTYPE_SRGB_PALETTE : TEXTYPE_PALETTE, skinframe->textureflags, -1, skinframe->glow ? palette_bgra_nofullbrights : palette_bgra_complete);
+		if (skinframe->hasalpha) // fence textures
+			skinframe->merged = R_LoadTexture2D(r_main_texturepool, skinframe->basename, width, height, skindata, vid.sRGB3D ? TEXTYPE_SRGB_PALETTE : TEXTYPE_PALETTE, skinframe->textureflags | TEXF_ALPHA, -1, skinframe->glow ? palette_bgra_nofullbrights_transparent : palette_bgra_transparent);
+		else
+			skinframe->merged = R_LoadTexture2D(r_main_texturepool, skinframe->basename, width, height, skindata, vid.sRGB3D ? TEXTYPE_SRGB_PALETTE : TEXTYPE_PALETTE, skinframe->textureflags, -1, skinframe->glow ? palette_bgra_nofullbrights : palette_bgra_complete);
 	}
 
 	if (!skinframe->qgeneratemerged && !skinframe->qgeneratebase)
diff --git a/model_brush.c b/model_brush.c
index 66cb6d0b..f96ceca4 100644
--- a/model_brush.c
+++ b/model_brush.c
@@ -1880,6 +1880,10 @@ static void Mod_Q1BSP_LoadTextures(sizebuf_t *sb)
 			if (tx->skinframes[0] && tx->skinframes[0]->hasalpha)
 				tx->basematerialflags |= MATERIALFLAG_ALPHA | MATERIALFLAG_BLENDED | MATERIALFLAG_NOSHADOW;
 		}
+		else if (tx->name[0] == '{') // fence textures
+		{
+			tx->basematerialflags |= MATERIALFLAG_ALPHATEST | MATERIALFLAG_NOSHADOW;
+		}
 		else if (!strncmp(tx->name, "mirror", 6)) // Tenebrae
 		{
 			// replace the texture with black
diff --git a/palette.c b/palette.c
index 7b6fb8d6..8df19dab 100644
--- a/palette.c
+++ b/palette.c
@@ -16,7 +16,9 @@ unsigned int palette_bgra_alpha[256];
 unsigned int palette_bgra_nocolormap[256];
 unsigned int palette_bgra_nocolormapnofullbrights[256];
 unsigned int palette_bgra_nofullbrights[256];
+unsigned int palette_bgra_nofullbrights_transparent[256];
 unsigned int palette_bgra_onlyfullbrights[256];
+unsigned int palette_bgra_onlyfullbrights_transparent[256];
 unsigned int palette_bgra_pantsaswhite[256];
 unsigned int palette_bgra_shirtaswhite[256];
 unsigned int palette_bgra_transparent[256];
@@ -133,11 +135,17 @@ static void Palette_SetupSpecialPalettes(void)
 		palette_bgra_nofullbrights[i] = palette_bgra_complete[i];
 	for (i = fullbright_start;i < fullbright_end;i++)
 		palette_bgra_nofullbrights[i] = palette_bgra_complete[0];
+	for (i = 0;i < 256;i++)
+		palette_bgra_nofullbrights_transparent[i] = palette_bgra_nofullbrights[i];
+	palette_bgra_nofullbrights_transparent[transparentcolor] = 0;
 
 	for (i = 0;i < 256;i++)
 		palette_bgra_onlyfullbrights[i] = 0;
 	for (i = fullbright_start;i < fullbright_end;i++)
 		palette_bgra_onlyfullbrights[i] = palette_bgra_complete[i];
+	for (i = 0;i < 256;i++)
+		palette_bgra_onlyfullbrights_transparent[i] = palette_bgra_onlyfullbrights[i];
+	palette_bgra_onlyfullbrights_transparent[transparentcolor] = 0;
 
 	for (i = 0;i < 256;i++)
 		palette_bgra_nocolormapnofullbrights[i] = palette_bgra_complete[i];
diff --git a/palette.h b/palette.h
index 1b2cd2e7..8658f128 100644
--- a/palette.h
+++ b/palette.h
@@ -22,7 +22,9 @@ extern unsigned int palette_bgra_alpha[256];
 extern unsigned int palette_bgra_nocolormap[256];
 extern unsigned int palette_bgra_nocolormapnofullbrights[256];
 extern unsigned int palette_bgra_nofullbrights[256];
+extern unsigned int palette_bgra_nofullbrights_transparent[256];
 extern unsigned int palette_bgra_onlyfullbrights[256];
+extern unsigned int palette_bgra_onlyfullbrights_transparent[256];
 extern unsigned int palette_bgra_pantsaswhite[256];
 extern unsigned int palette_bgra_shirtaswhite[256];
 extern unsigned int palette_bgra_transparent[256];