shithub: qk1

Download patch

ref: 191f0d455fbc787c63e31bb58b649dd9d0828bea
parent: 45321b4d94499e2aa8159a498c9732eb371bdc73
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Fri Dec 29 20:02:33 EST 2023

render world "rejects" back to front with clipping disabled to fix fence/transparent surfaces play nicely with each other

--- a/r_bsp.c
+++ b/r_bsp.c
@@ -573,7 +573,7 @@
 }
 
 void
-R_RenderWorldRejects(void)
+R_RenderBlendedBrushes(void)
 {
 	model_t *clmodel;
 	nodereject_t *rej;
@@ -585,9 +585,17 @@
 	clmodel = currententity->model;
 	r_pcurrentvertbase = clmodel->vertexes;
 
-	for(rej = node_rejects; rej < node_rejects+num_node_rejects; rej++){
+	if(num_node_rejects < 1)
+		return;
+
+	/* back to front, no clipping */
+	/* FIXME(sigrid): this could still be clipped against solid world */
+	/* FIXME(sigrid): needs to be drawn sorted with non-brush entities */
+	for(rej = node_rejects+num_node_rejects-1; rej >= node_rejects; rej--){
 		surf = cl.worldmodel->surfaces + rej->node->firstsurface;
+		R_BeginEdgeFrame();
 		for(i = 0; i < rej->node->numsurfaces; i++, surf++)
 			R_RenderFace(surf, rej->clipflags);
+		R_ScanEdges();
 	}
 }
--- a/r_draw.c
+++ b/r_draw.c
@@ -418,7 +418,6 @@
 						&r_pcurrentvertbase[r_pedge->v[1]],
 						pclip);
 			r_pedge->cachededgeoffset = cacheoffset;
-
 			if (r_leftclipped)
 				makeleftedge = true;
 			if (r_rightclipped)
--- a/r_local.h
+++ b/r_local.h
@@ -82,7 +82,7 @@
 //=============================================================================
 
 void R_RenderWorld (void);
-void R_RenderWorldRejects(void);
+void R_RenderBlendedBrushes(void);
 
 //=============================================================================
 
--- a/r_main.c
+++ b/r_main.c
@@ -667,27 +667,19 @@
 	R_AliasDrawModel(&r_viewlighting);
 }
 
-/*
-================
-R_EdgeDrawing
-================
-*/
-void R_EdgeDrawing (void)
+void
+R_RenderSolidBrushes(void)
 {
 	entity_t *e;
 	int i;
 
 	R_BeginEdgeFrame();
-	if(r_drawflags & DRAW_BLEND)
-		R_RenderWorldRejects();
-	else{
-		R_RenderWorld();
-		for(i = 0; i < cl_numvisedicts; i++){
-			e = cl_visedicts[i];
-			if(e->model != nil && e->model->type == mod_brush && !R_DrawEntity(e)){
-				e->last_reject = ent_reject;
-				ent_reject = e;
-			}
+	R_RenderWorld();
+	for(i = 0; i < cl_numvisedicts; i++){
+		e = cl_visedicts[i];
+		if(e->model != nil && e->model->type == mod_brush && !R_DrawEntity(e)){
+			e->last_reject = ent_reject;
+			ent_reject = e;
 		}
 	}
 	R_ScanEdges();
@@ -711,7 +703,7 @@
 	if (!cl_entities[0].model || !cl.worldmodel)
 		fatal ("R_RenderView: NULL worldmodel");
 	ent_reject = nil;
-	R_EdgeDrawing ();
+	R_RenderSolidBrushes();
 
 	for(i = 0; i < cl_numvisedicts; i++){
 		e = cl_visedicts[i];
@@ -723,9 +715,10 @@
 
 	R_DrawViewModel ();
 	R_DrawParticles ();
+
 	r_drawflags = DRAW_BLEND;
-	R_EdgeDrawing();
-	// FIXME(sigrid): these need to be sorted and drawn back to front
+	R_RenderBlendedBrushes();
+	// FIXME(sigrid): these need to be sorted with blended brushes and *all* drawn back to front
 	if(cl_numvisedicts > 0){
 		for(i = cl_numvisedicts, e = ent_reject; e != nil && i > 0; e = e->last_reject)
 			cl_visedicts[--i] = e;