shithub: qk1

Download patch

ref: 5ffec98ac5535fce363a48640ff3f1c1e7f42f5a
parent: 48d333cfbbf7349058787093c08d9c52b8df1aeb
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Tue Oct 31 08:12:13 EDT 2023

.alpha: part 4 - draw water-like surfaces in non-VISed maps when r_*alpha is set to 1

--- a/d_edge.c
+++ b/d_edge.c
@@ -185,7 +185,7 @@
 			if (!s->spans)
 				continue;
 
-			if((surfdrawflags(s) | entdrawflags(s->entity)) ^ r_drawflags)
+			if((surfdrawflags(s->flags) | entdrawflags(s->entity)) ^ r_drawflags)
 				continue;
 			alpha = 255;
 			if(enthasalpha(s->entity) && s->entity->alpha != 255)
--- a/d_scan.c
+++ b/d_scan.c
@@ -79,7 +79,7 @@
 	{
 		sturb = ((r_turb_s + r_turb_turb[(r_turb_t>>16)&(CYCLE-1)])>>16)&63;
 		tturb = ((r_turb_t + r_turb_turb[(r_turb_s>>16)&(CYCLE-1)])>>16)&63;
-		if (*r_turb_z <= (izi >> 16))
+		if (*r_turb_z <= (izi >> 16) || (r_drawflags & DRAW_BLEND) == 0)
 			*r_turb_pdest = blendalpha(*(r_turb_pbase + (tturb<<6) + sturb), *r_turb_pdest, alpha);
 		r_turb_s += r_turb_sstep;
 		r_turb_t += r_turb_tstep;
--- a/model.c
+++ b/model.c
@@ -1174,7 +1174,7 @@
 		mod->nummodelsurfaces = bm->numfaces;
 		mod->blend = false;
 		for(j = bm->firstface; j < bm->firstface+bm->numfaces; j++){
-			if(surfdrawflags(&loadmodel->surfaces[j]) & DRAW_BLEND){
+			if(loadmodel->surfaces[j].flags & SURF_TRANS){
 				mod->blend = true;
 				break;
 			}
--- a/r_alias.c
+++ b/r_alias.c
@@ -397,11 +397,11 @@
 	int		temp;
 	float	lightcos, *plightnormal;
 
-	av->fv[0] = DotProduct(pverts->v, aliastransform[0]) +
+	av->fv[0] = DotProduct_(pverts->v, aliastransform[0]) +
 			aliastransform[0][3];
-	av->fv[1] = DotProduct(pverts->v, aliastransform[1]) +
+	av->fv[1] = DotProduct_(pverts->v, aliastransform[1]) +
 			aliastransform[1][3];
-	av->fv[2] = DotProduct(pverts->v, aliastransform[2]) +
+	av->fv[2] = DotProduct_(pverts->v, aliastransform[2]) +
 			aliastransform[2][3];
 
 	fv->v[2] = pstverts->s;
@@ -444,7 +444,7 @@
 	for (i=0 ; i<r_anumverts ; i++, fv++, pverts++, pstverts++)
 	{
 	// transform and project
-		zi = 1.0 / (DotProduct(pverts->v, aliastransform[2]) +
+		zi = 1.0 / (DotProduct_(pverts->v, aliastransform[2]) +
 				aliastransform[2][3]);
 
 	// x, y, and z are scaled down by 1/2**31 in the transform, so 1/z is
@@ -452,9 +452,9 @@
 	// projection
 		fv->v[5] = zi;
 
-		fv->v[0] = ((DotProduct(pverts->v, aliastransform[0]) +
+		fv->v[0] = ((DotProduct_(pverts->v, aliastransform[0]) +
 				aliastransform[0][3]) * zi) + aliasxcenter;
-		fv->v[1] = ((DotProduct(pverts->v, aliastransform[1]) +
+		fv->v[1] = ((DotProduct_(pverts->v, aliastransform[1]) +
 				aliastransform[1][3]) * zi) + aliasycenter;
 
 		fv->v[2] = pstverts->s;
--- a/r_draw.c
+++ b/r_draw.c
@@ -50,6 +50,18 @@
 qboolean	r_lastvertvalid;
 
 
+int
+surfdrawflags(int flags)
+{
+	if(flags & SURF_TRANS){
+		if((flags & SURF_TELE) != 0 || alphafor(flags) >= 1.0f)
+			if((flags & SURF_FENCE) == 0)
+				return 0;
+		return DRAW_BLEND;
+	}
+	return 0;
+}
+
 /*
 ================
 R_EmitEdge
@@ -370,7 +382,7 @@
 	medge_t		*pedges, tedge;
 	clipplane_t	*pclip;
 
-	if(surfdrawflags(fa) ^ r_drawflags)
+	if(surfdrawflags(fa->flags) ^ r_drawflags)
 		return;
 
 // skip out if no more surfs
--- a/r_local.h
+++ b/r_local.h
@@ -6,7 +6,7 @@
 	DRAW_BLEND = 1<<0,
 };
 
-#define surfdrawflags(s) (((s)->flags & SURF_TRANS) ? DRAW_BLEND : 0)
+int surfdrawflags(int flags);
 #define enthasalpha(e) ((e) && !defalpha((e)->alpha))
 #define entdrawflags(e) (((e) && (!defalpha((e)->alpha) || ((e)->model && (e)->model != cl.worldmodel && (e)->model->blend))) ? DRAW_BLEND : 0)