shithub: qk1

Download patch

ref: e7f55e32736cd1360a7135fda5a7ca4d97c45520
parent: 7f9c4b6c2d5017d10b370b4e55691b5a2631eb75
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Fri Jan 5 19:43:03 EST 2024

rearrange and clean up surf_t fields

--- a/d_edge.c
+++ b/d_edge.c
@@ -121,7 +121,7 @@
 		dvars.zistepv = s->d_zistepv;
 		dvars.ziorigin = s->d_ziorigin;
 
-		if(s->insubmodel){
+		if(insubmodel(s)){
 			currententity = s->entity;
 			VectorSubtract(r_origin, currententity->origin, local_modelorg);
 			TransformVector(local_modelorg, transformed_modelorg);
@@ -148,7 +148,7 @@
 			);
 		}
 
-		if(s->insubmodel){
+		if(insubmodel(s)){
 			currententity = cl_entities;
 			VectorCopy(world_transformed_modelorg, transformed_modelorg);
 			VectorCopy(base_vpn, vpn);
--- a/model.h
+++ b/model.h
@@ -74,7 +74,10 @@
 	SURF_LAVA = 1<<10,
 	SURF_SLIME = 1<<11,
 	SURF_TELE = 1<<12,
+	SURF_IN_SUBMODEL = 1<<31, /* makes surf->flags negative */
 };
+
+#define insubmodel(s) ((s)->flags < 0)
 
 // !!! if this is changed, it must be changed in asm_draw.h too !!!
 typedef struct
--- a/r_bsp.c
+++ b/r_bsp.c
@@ -3,7 +3,7 @@
 //
 // current entity info
 //
-bool		insubmodel;
+
 entity_t		*currententity;
 vec3_t			modelorg, base_modelorg;
 								// modelorg is the viewpoint reletive to
--- a/r_draw.c
+++ b/r_draw.c
@@ -389,7 +389,7 @@
 			r_pedge = &pedges[lindex];
 
 			// if the edge is cached, we can just reuse the edge
-			if (!insubmodel)
+			if (currententity == cl_entities)
 			{
 				if (r_pedge->cachededgeoffset & FULLY_CLIPPED_CACHED)
 				{
@@ -429,7 +429,7 @@
 			lindex = -lindex;
 			r_pedge = &pedges[lindex];
 			// if the edge is cached, we can just reuse the edge
-			if (!insubmodel)
+			if (currententity == cl_entities)
 			{
 				if (r_pedge->cachededgeoffset & FULLY_CLIPPED_CACHED)
 				{
@@ -494,8 +494,7 @@
 
 	surface_p->data = (void *)fa;
 	surface_p->nearzi = r_nearzi;
-	surface_p->flags = fa->flags;
-	surface_p->insubmodel = insubmodel;
+	surface_p->flags = fa->flags | (currententity == cl_entities ? 0 : SURF_IN_SUBMODEL);
 	surface_p->spanstate = 0;
 	surface_p->entity = currententity;
 	surface_p->key = r_currentkey++;
@@ -608,8 +607,7 @@
 
 	surface_p->data = (void *)psurf;
 	surface_p->nearzi = r_nearzi;
-	surface_p->flags = psurf->flags;
-	surface_p->insubmodel = true;
+	surface_p->flags = psurf->flags | SURF_IN_SUBMODEL;
 	surface_p->spanstate = 0;
 	surface_p->entity = currententity;
 	surface_p->key = r_currentbkey;
--- a/r_edge.c
+++ b/r_edge.c
@@ -293,7 +293,7 @@
 
 			// if it's two surfaces on the same plane, the one that's already
 			// active is in front, so keep going unless it's a bmodel
-			if (surf->insubmodel && (surf->key == surf2->key))
+			if (insubmodel(surf) && (surf->key == surf2->key))
 			{
 				// must be two bmodels in the same leaf; sort on 1/z
 				fu = (float)(edge->u - 0xFFFFF) * (1.0 / 0x100000);
@@ -330,7 +330,7 @@
 			{
 				// if it's two surfaces on the same plane, the one that's already
 				// active is in front, so keep going unless it's a bmodel
-				if (!surf->insubmodel)
+				if (!insubmodel(surf))
 					goto continue_search;
 
 				// must be two bmodels in the same leaf; sort on 1/z
--- a/r_local.h
+++ b/r_local.h
@@ -104,11 +104,6 @@
 void R_ResetFog(void);
 void R_InitFog(void);
 
-//
-// current entity info
-//
-extern	bool		insubmodel;
-
 void R_DrawSprite (void);
 int R_RenderFace (msurface_t *fa, int clipflags);
 void R_RenderBmodelFace (bedge_t *pedges, msurface_t *psurf);
--- a/r_main.c
+++ b/r_main.c
@@ -521,7 +521,6 @@
 		break;
 
 	case mod_brush:
-		insubmodel = true;
 		r_dlightframecount = r_framecount;
 		clmodel = e->model;
 
--- a/r_shared.h
+++ b/r_shared.h
@@ -61,27 +61,22 @@
 	struct espan_s	*pnext;
 } espan_t;
 
-// FIXME: compress, make a union if that will help
-// insubmodel is only 1, flags is fewer than 32, spanstate could be a byte
 typedef struct surf_s
 {
-	struct surf_s	*next;			// active surface stack in r_edge.c
-	struct surf_s	*prev;			// used in r_edge.c for active surf stack
-	struct espan_s	*spans;			// pointer to linked list of spans to draw
 	int			key;				// sorting key (BSP order)
+	int			flags;
 	int			last_u;				// set during tracing
-	int			spanstate;			// 0 = not in span
+	byte		spanstate;			// 0 = not in span
 									// 1 = in span
 									// -1 = in inverted span (end before
 									//  start)
-	int			flags;				// currentface flags
-	void		*data;				// associated data like msurface_t
-	entity_t	*entity;
 	float		nearzi;				// nearest 1/z on surface, for mipmapping
-	bool	insubmodel;
 	float		d_ziorigin, d_zistepu, d_zistepv;
-
-	int			pad[2];				// to 64 bytes
+	struct surf_s	*next;			// active surface stack in r_edge.c
+	struct surf_s	*prev;			// used in r_edge.c for active surf stack
+	struct espan_s	*spans;			// pointer to linked list of spans to draw
+	void		*data;				// associated data like msurface_t
+	entity_t	*entity;
 } surf_t;
 
 extern int r_numallocatedbasespans;