shithub: qk1

Download patch

ref: 612fcd2a36544c584e9933ccdcc04407edaa3485
parent: 9c1b473ae274c097e81c1dff285e089edafddc5c
author: Sigrid Solveig Haflínudóttir <[email protected]>
date: Sun Dec 31 11:50:08 EST 2023

sky: make it work with whichever sizes; replace absent sky with notexture

--- a/d_local.h
+++ b/d_local.h
@@ -1,9 +1,6 @@
 // d_local.h:  private rasterization driver defs
 
 enum {
-	R_SKY_SMASK = 0x007F0000,
-	R_SKY_TMASK	= 0x007F0000,
-
 	DS_SPAN_LIST_END = -128,
 
 	SURFCACHE_SIZE_AT_320X200 = 600*1024,
@@ -22,6 +19,14 @@
 	float sdivzorigin, tdivzorigin, ziorigin;
 }dvars_t;
 
+typedef struct {
+	pixel_t *source[2];
+	int w, h;
+	int smask, tmask;
+	int tshift;
+	float speed, time;
+}skyvars_t;
+
 typedef struct surfcache_s
 {
 	struct surfcache_s	*next;
@@ -51,6 +56,7 @@
 extern surfcache_t	*d_initial_rover;
 
 extern dvars_t dvars;
+extern skyvars_t skyvars;
 
 void D_DrawSpans16 (espan_t *pspans, bool blend, byte alpha);
 void D_DrawZSpans (espan_t *pspans);
--- a/d_sky.c
+++ b/d_sky.c
@@ -3,7 +3,7 @@
 #define SKY_SPAN_SHIFT	5
 #define SKY_SPAN_MAX	(1 << SKY_SPAN_SHIFT)
 
-extern int skyw, skyh;
+skyvars_t skyvars;
 
 /*
 =================
@@ -24,10 +24,10 @@
 	end[2] *= 3;
 	VectorNormalize(end);
 
-	s[0] = (int)((skydist + 4*(skyw-1)*end[0]) * 0x10000);
-	t[0] = (int)((skydist + 4*(skyh-1)*end[1]) * 0x10000);
-	s[1] = (int)((skydist*2.0 + 4*(skyw-1)*end[0]) * 0x10000);
-	t[1] = (int)((skydist*2.0 + 4*(skyh-1)*end[1]) * 0x10000);
+	s[0] = (int)((skydist + 4*(skyvars.w-1)*end[0]) * 0x10000);
+	t[0] = (int)((skydist + 4*(skyvars.h-1)*end[1]) * 0x10000);
+	s[1] = (int)((skydist*2.0 + 4*(skyvars.w-1)*end[0]) * 0x10000);
+	t[1] = (int)((skydist*2.0 + 4*(skyvars.h-1)*end[1]) * 0x10000);
 }
 
 
@@ -43,16 +43,16 @@
 	fixed16_t s[2], t[2], snext[2], tnext[2], sstep[2], tstep[2];
 	float skydist;
 
-	if(r_skysource[0] == nil || r_skysource[1] == nil)
+	if(skyvars.source[0] == nil || skyvars.source[1] == nil)
 		return;
 
 	sstep[0] = sstep[1] = 0;	// keep compiler happy
 	tstep[0] = tstep[1] = 0;	// ditto
-	skydist = skytime*skyspeed;	// TODO: add D_SetupFrame & set this there
+	skydist = skyvars.time*skyvars.speed;	// TODO: add D_SetupFrame & set this there
 
 	do
 	{
-		pdest = dvars.viewbuffer + pspan->v*dvars.width + pspan->u;
+		pdest = dvars.viewbuffer + (dvars.width * pspan->v) + pspan->u;
 		count = pspan->count;
 
 		// calculate the initial s & t
@@ -102,13 +102,11 @@
 
 			do
 			{
-				m = r_skysource[1][((t[1] & R_SKY_TMASK) >> 9) +
-						((s[1] & R_SKY_SMASK) >> 16)];
-				if((m & 0xffffff) == 0)
-					*pdest = r_skysource[0][((t[0] & R_SKY_TMASK) >> 9) +
-							((s[0] & R_SKY_SMASK) >> 16)];
-				else
+				m = skyvars.source[1][((t[1] & skyvars.tmask) >> skyvars.tshift) + ((s[1] & skyvars.smask) >> 16)];
+				if(opaque(m))
 					*pdest = m;
+				else
+					*pdest = skyvars.source[0][((t[0] & skyvars.tmask) >> skyvars.tshift) + ((s[0] & skyvars.smask) >> 16)];
 				pdest++;
 				s[0] += sstep[0];
 				t[0] += tstep[0];
--- a/plan9/platform.h
+++ b/plan9/platform.h
@@ -43,3 +43,5 @@
 
 static double ln2c;
 #define exp2(x) (exp((x) * (ln2c ? ln2c : (ln2c = log(2.0)))))
+
+int qctz(unsigned);
--- a/r_sky.c
+++ b/r_sky.c
@@ -3,14 +3,16 @@
 static int iskyspeed = 8;
 static int iskyspeed2 = 2;
 static float skyspeed2;
-
-float skyspeed, skytime;
-
-pixel_t *r_skysource[2];
-
 static int r_skymade;
-int skyw, skyh;
 
+static void
+skyrecalc(void)
+{
+	skyvars.smask = (skyvars.w - 1)<<16;
+	skyvars.tmask = (skyvars.h - 1)<<16;
+	skyvars.tshift = 16 - qctz(skyvars.w);
+}
+
 /*
 =============
 R_InitSky
@@ -19,34 +21,29 @@
 void R_InitSky (texture_t *mt)
 {
 	int x, y, w, n;
-	pixel_t *src;
+	pixel_t *src, p;
 
 	if(mt == nil){
-		r_skysource[0] = r_skysource[1] = nil;
-		return;
-	}
-
-	src = mt->pixels + mt->offsets[0];
-	w = mt->width;
-	skyh = mt->height;
-	if(w == skyh){ // probably without a mask?
-		skyw = w;
-		n = skyw*skyh;
-		r_skysource[0] = Hunk_Alloc(n*sizeof(pixel_t));
-		r_skysource[1] = r_skysource[0];
-		memmove(r_skysource[0], src, n*sizeof(pixel_t));
-		return;
-	}
-	skyw = w/2;
-	n = skyw*skyh;
-	r_skysource[0] = Hunk_Alloc(n*sizeof(pixel_t)*2);
-	r_skysource[1] = r_skysource[0] + n;
-	for(y=0 ; y<skyh; y++){
-		for(x=0 ; x<skyw; x++){
-			r_skysource[0][y*skyw + x] = src[y*w + skyw + x];
-			r_skysource[1][y*skyw + x] = src[y*w + x];
+		skyvars.w = r_notexture_mip->width;
+		skyvars.h = r_notexture_mip->height;
+		skyvars.source[0] = skyvars.source[1] = r_notexture_mip->pixels;
+	}else{
+		src = mt->pixels + mt->offsets[0];
+		w = mt->width;
+		skyvars.h = mt->height;
+		skyvars.w = w/2;
+		n = skyvars.w*skyvars.h;
+		skyvars.source[0] = Hunk_Alloc(n*sizeof(pixel_t)*2);
+		skyvars.source[1] = skyvars.source[0] + n;
+		for(y=0 ; y<skyvars.h; y++){
+			for(x=0 ; x<skyvars.w; x++){
+				skyvars.source[0][y*skyvars.w + x] = src[y*w + skyvars.w + x];
+				if((p = src[y*w + x]) & 0xffffff)
+					skyvars.source[1][y*skyvars.w + x] = p;
+			}
 		}
 	}
+	skyrecalc();
 }
 
 /*
@@ -59,15 +56,15 @@
 	int		g, s1, s2;
 	float	temp;
 
-	skyspeed = iskyspeed;
+	skyvars.speed = iskyspeed;
 	skyspeed2 = iskyspeed2;
 
 	g = GreatestCommonDivisor (iskyspeed, iskyspeed2);
 	s1 = iskyspeed / g;
 	s2 = iskyspeed2 / g;
-	temp = skyh * s1 * s2;
+	temp = skyvars.h * s1 * s2;
 
-	skytime = cl.time - ((int)(cl.time / temp) * temp);
+	skyvars.time = cl.time - ((int)(cl.time / temp) * temp);
 
 	r_skymade = 0;
 }
--- a/sys_plan9.c
+++ b/sys_plan9.c
@@ -8,6 +8,19 @@
 static const char *disabled[32];
 static int ndisabled;
 
+int
+qctz(unsigned x)
+{
+	unsigned r;
+
+	if(x == 0)
+		r = 32;
+	else
+		for(r = 0; (x & 1) == 0; x >>= 1, r++);
+
+	return r;
+}
+
 bool
 isdisabled(char *s)
 {
--- a/unix/platform.h
+++ b/unix/platform.h
@@ -42,6 +42,8 @@
 #define setmalloctag(p, t) do{USED(p); USED(t);}while(0)
 #define setrealloctag(p, t) do{USED(p); USED(t);}while(0)
 
+#define qctz(x) __builtin_ctz(x)
+
 #ifndef BYTE_ORDER
 #define LITTLE_ENDIAN __LITTLE_ENDIAN
 #define BIG_ENDIAN __BIG_ENDIAN