From f76fbc3d597c8cc20c56a3f505631251bc3b083e Mon Sep 17 00:00:00 2001 From: div0 Date: Tue, 13 Jan 2009 08:50:05 +0000 Subject: [PATCH] more stuff to this :P git-svn-id: svn://svn.icculus.org/nexuiz/trunk@5501 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/gamecommand.qc | 152 +++++++++++++++++++++---------- 1 file changed, 103 insertions(+), 49 deletions(-) diff --git a/data/qcsrc/server/gamecommand.qc b/data/qcsrc/server/gamecommand.qc index 19f569ccf..33767496b 100644 --- a/data/qcsrc/server/gamecommand.qc +++ b/data/qcsrc/server/gamecommand.qc @@ -28,20 +28,41 @@ float FullTraceFraction(vector a, vector mi, vector ma, vector b) 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,6 +86,33 @@ float RadarMapAtPoint_Block(float x, float y, float w, float h, float zmin, floa } 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"; @@ -131,6 +179,21 @@ void sharpen_init(float w) } 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 @@ void RadarMap_Think() 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,29 +250,32 @@ void RadarMap_Think() { // fill the sharpen buffer with this line sharpen_shift(self.size_x); - if(self.count & 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); - sharpen_set(x, l); - } - } - 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 + i = self.count & 24; + + switch(i) { - 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); - } + 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; } // do we have enough lines? @@ -270,17 +326,7 @@ void RadarMap_Think() 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 @@ void RadarMap(float argc) 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 @@ void RadarMap(float argc) 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 @@ void RadarMap(float argc) ++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; } } -- 2.39.2