r5501 - trunk/data/qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Tue Jan 13 03:50:10 EST 2009


Author: div0
Date: 2009-01-13 03:50:05 -0500 (Tue, 13 Jan 2009)
New Revision: 5501

Modified:
   trunk/data/qcsrc/server/gamecommand.qc
Log:
more stuff to this :P


Modified: trunk/data/qcsrc/server/gamecommand.qc
===================================================================
--- trunk/data/qcsrc/server/gamecommand.qc	2009-01-13 08:26:58 UTC (rev 5500)
+++ trunk/data/qcsrc/server/gamecommand.qc	2009-01-13 08:50:05 UTC (rev 5501)
@@ -28,20 +28,41 @@
 	return white / (black + white);
 }
 
-float RadarMapAtPoint_Trace(float x, float y, float w, float h, float zmin, float zsize)
+float RadarMapAtPoint_Trace(float x, float y, float w, float h, float zmin, float zsize, float q)
 {
 	vector a, b, mi, ma;
+
+	q *= 0.125;
+
+	q = max(1, floor(0.5 + sqrt(q)));
+
 	mi = '0 0 0';
-	ma = '1 0 0' * w + '0 1 0' * h;
+	ma = '1 0 0' * (w/q) + '0 1 0' * (h/q);
 	a = '1 0 0' * x + '0 1 0' * y + '0 0 1' * zmin;
 	b = '1 0 0' * x + '0 1 0' * y + '0 0 1' * (zsize - zmin);
-	return FullTraceFraction(a, mi, ma, b);
+
+	float i, j, s;
+	vector d;
+
+	for(i = 0; i < q; ++i)
+		for(j = 0; j < q; ++j)
+		{
+			d_x = ma_x * j;
+			d_y = ma_y * i;
+			s += FullTraceFraction(a + d, mi, ma, b + d);
+		}
+
+	s /= q * q;
+	return s;
 }
 float RadarMapAtPoint_Block(float x, float y, float w, float h, float zmin, float zsize, float q)
 {
 	vector o, mi, ma;
 	float i, r;
 	vector dz;
+
+	q *= 255;
+
 	mi = '0 0 0';
 	dz = (zsize / q) * '0 0 1';
 	ma = '1 0 0' * w + '0 1 0' * h + dz;
@@ -65,7 +86,34 @@
 	}
 	return r / q; // 0 .. 1
 }
+float RadarMapAtPoint_Sample(float x, float y, float w, float h, float zmin, float zsize, float q)
+{
+	vector a, b, mi, ma;
 
+	q *= 2048;
+
+	mi = '0 0 0';
+	ma = '1 0 0' * w + '0 1 0' * h;
+	a = '1 0 0' * x + '0 1 0' * y + '0 0 1' * zmin;
+	b = '1 0 0' * w + '0 1 0' * h + '0 0 1' * zsize;
+	
+	float c, i;
+	c = 0;
+
+	for(i = 0; i < q; ++i)
+	{
+		vector v;
+		v_x = a_x + random() * b_x;
+		v_y = a_y + random() * b_y;
+		v_z = a_z + random() * b_z;
+		traceline(v, v, MOVE_WORLDONLY, world);
+		if(trace_startsolid)
+			++c;
+	}
+
+	return c / q;
+}
+
 string doublehex = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF";
 
 float RADAR_WIDTH_MAX = 2048;
@@ -131,6 +179,21 @@
 }
 
 entity radarmapper;
+void RadarMap_Next()
+{
+	if(radarmapper.count & 4)
+	{
+		localcmd("quit\n");
+	}
+	else if(radarmapper.count & 2)
+	{
+		localcmd(strcat("defer 1 \"sv_cmd radarmap --flags ", ftos(radarmapper.count), strcat(" --res ", ftos(radarmapper.size_x), " ", ftos(radarmapper.size_y), " --sharpen ", ftos(radarmapper.ltime), " --qual ", ftos(radarmapper.size_z)), "\"\n"));
+		GotoNextMap();
+	}
+	remove(radarmapper);
+	radarmapper = world;
+}
+
 // rough map entity
 //   cnt: current line
 //   size: pixel width/height
@@ -157,17 +220,7 @@
 			if(self.cnt >= 0)
 			{
 				print(self.netname, " already exists, aborting (you may want to specify --force)\n");
-				if(self.count & 4)
-				{
-					localcmd("quit\n");
-				}
-				else if(self.count & 2)
-				{
-					localcmd(strcat("defer 1 \"sv_cmd radarmap --flags ", ftos(self.count), strcat(" --res ", ftos(self.size_x), " ", ftos(self.size_y), " --sharpen ", ftos(self.ltime)), "\"\n"));
-					GotoNextMap();
-				}
-				remove(self);
-				radarmapper = world;
+				RadarMap_Next();
 				return;
 			}
 		}
@@ -197,30 +250,33 @@
 	{
 		// fill the sharpen buffer with this line
 		sharpen_shift(self.size_x);
-		if(self.count & 8)
+		i = self.count & 24;
+
+		switch(i)
 		{
-			for(x = 0; x < self.size_x; ++x)
-			{
-				l = RadarMapAtPoint_Trace(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z);
-				sharpen_set(x, l);
-			}
+			case 0:
+			default:
+				for(x = 0; x < self.size_x; ++x)
+				{
+					l = RadarMapAtPoint_Block(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z, self.size_z);
+					sharpen_set(x, l);
+				}
+				break;
+			case 8:
+				for(x = 0; x < self.size_x; ++x)
+				{
+					l = RadarMapAtPoint_Trace(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z, self.size_z);
+					sharpen_set(x, l);
+				}
+				break;
+			case 16:
+				for(x = 0; x < self.size_x; ++x)
+				{
+					l = RadarMapAtPoint_Sample(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z, self.size_z);
+					sharpen_set(x, l);
+				}
+				break;
 		}
-		else if(self.count & 16)
-		{
-			for(x = 0; x < self.size_x; ++x)
-			{
-				l = RadarMapAtPoint_Block(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z, 1023);
-				sharpen_set(x, l);
-			}
-		}
-		else
-		{
-			for(x = 0; x < self.size_x; ++x)
-			{
-				l = RadarMapAtPoint_Block(self.mins_x + x * self.maxs_x, self.mins_y + (self.size_y - self.frame) * self.maxs_y, self.maxs_x, self.maxs_y, self.mins_z, self.maxs_z, 255);
-				sharpen_set(x, l);
-			}
-		}
 
 		// do we have enough lines?
 		if(self.frame >= 2)
@@ -270,17 +326,7 @@
 		fputs(self.cnt, "};\n");
 		fclose(self.cnt);
 		print("Finished. Please edit data/", self.netname, " with an image editing application and place it in the TGA format in the gfx folder.\n");
-		if(self.count & 4)
-		{
-			localcmd("quit\n");
-		}
-		else if(self.count & 2)
-		{
-			localcmd(strcat("defer 1 \"sv_cmd radarmap --flags ", ftos(self.count), strcat(" --res ", ftos(self.size_x), " ", ftos(self.size_y), " --sharpen ", ftos(self.ltime)), "\"\n"));
-			GotoNextMap();
-		}
-		remove(self);
-		radarmapper = world;
+		RadarMap_Next();
 	}
 }
 
@@ -297,6 +343,7 @@
 	radarmapper.ltime = 1;
 	radarmapper.size_x = 512;
 	radarmapper.size_y = 512;
+	radarmapper.size_z = 1;
 
 	for(i = 1; i < argc; ++i)
 	{
@@ -315,7 +362,7 @@
 			radarmapper.count &~= 24;
 			radarmapper.count |= 8;
 		}
-		else if(argv(i) == "--hqblock")
+		else if(argv(i) == "--sample")
 		{
 			radarmapper.count &~= 24;
 			radarmapper.count |= 16;
@@ -337,10 +384,17 @@
 			++i;
 			radarmapper.size_y = stof(argv(i));
 		}
+		else if(argv(i) == "--qual") // quality multiplier
+		{
+			++i;
+			radarmapper.size_z = stof(argv(i));
+		}
 		else
 		{
 			remove(radarmapper);
-			print("Usage: sv_cmd radarmap [--force] [--loop] [--quit] [--trace | --block | --hqblock] [--sharpen N] [--res W H]\n");
+			print("Usage: sv_cmd radarmap [--force] [--loop] [--quit] [--block | --trace | --sample] [--sharpen N] [--res W H] [--qual Q]\n");
+			print("The quality factor Q is roughly proportional to the time taken.\n");
+			print("The method --trace only supports the quality factors 8, 32, 72, 128.\n");
 			return;
 		}
 	}




More information about the nexuiz-commits mailing list