From 2e3087baa41148e86e1f7f181a2a625d22172792 Mon Sep 17 00:00:00 2001 From: div0 Date: Tue, 13 Jan 2009 08:26:58 +0000 Subject: [PATCH] new options for radarmap: --block (default, old style), --trace (using traceline_inverted), --hqblock --trace looks darker, as it uses the ACTUAL height of floors, and does not check block wise --hqblock takes 4 times as long as --block, and should look almost the same normally git-svn-id: svn://svn.icculus.org/nexuiz/trunk@5500 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/gamecommand.qc | 165 ++++++++++++++++++++----------- 1 file changed, 108 insertions(+), 57 deletions(-) diff --git a/data/qcsrc/server/gamecommand.qc b/data/qcsrc/server/gamecommand.qc index 62d8bf1c0..19f569ccf 100644 --- a/data/qcsrc/server/gamecommand.qc +++ b/data/qcsrc/server/gamecommand.qc @@ -1,49 +1,49 @@ string GotoMap(string m); -#if 0 -// TODO make this algorithm work (no idea why it is failing), it would be much faster float FullTraceFraction(vector a, vector mi, vector ma, vector b) { vector c; - float d; + float white, black; if(a_z > b_z) return 0; - tracebox(a, mi, ma, b, MOVE_WORLDONLY, world); - if(trace_startsolid) + + white = 0; + black = 0; + + c = a; + + while(vlen(c - b) > 1) { - // a leaves solid, then hits trace_endpos - // where does a leave solid? + tracebox(c, mi, ma, b, MOVE_WORLDONLY, world); + if(!trace_startsolid) + { + black += trace_endpos_z - c_z; + c = trace_endpos; + } + tracebox_inverted(c, mi, ma, b, MOVE_WORLDONLY, world); + white += trace_endpos_z - c_z; c = trace_endpos; - tracebox(c, mi, ma, a, MOVE_WORLDONLY, world); - // a to trace_endpos is solid - // trace_endpos to c is not solid - d = trace_endpos_z - a_z; - return FullTraceFraction(c + '0 0 1', mi, ma, b) + d; - } - else - { - // a hits trace_endpos - return FullTraceFraction(trace_endpos + '0 0 1', mi, ma, b); } + + return white / (black + white); } -float RadarMapAtPoint(float x, float y, float w, float h) +float RadarMapAtPoint_Trace(float x, float y, float w, float h, float zmin, float zsize) { vector a, b, mi, ma; 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' * world.mins_z; - b = '1 0 0' * x + '0 1 0' * y + '0 0 1' * world.maxs_z; - return floor(FullTraceFraction(a, mi, ma, b) / (world.maxs_z - world.mins_z) * 255); + 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); } -#else -float RadarMapAtPoint(float x, float y, float w, float h, float zmin, float zsize) +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; mi = '0 0 0'; - dz = (zsize / 256) * '0 0 1'; + dz = (zsize / q) * '0 0 1'; ma = '1 0 0' * w + '0 1 0' * h + dz; o = '1 0 0' * x + '0 1 0' * y + '0 0 1' * zmin; @@ -57,38 +57,37 @@ float RadarMapAtPoint(float x, float y, float w, float h, float zmin, float zsiz return 0; r = 0; - for(i = 0; i < 255; ++i) + for(i = 0; i < q; ++i) { tracebox(o + dz * i, mi, ma, o + dz * i, MOVE_WORLDONLY, world); if(trace_startsolid) ++r; } - return r / 255.0; // 0 .. 1 + return r / q; // 0 .. 1 } -#endif string doublehex = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF"; -float RADAR_WIDTH = 512; -float RADAR_HEIGHT = 512; -float sharpen_buffer[RADAR_WIDTH * 3]; +float RADAR_WIDTH_MAX = 2048; +float RADAR_HEIGHT_MAX = 2048; +float sharpen_buffer[RADAR_WIDTH_MAX * 3]; void sharpen_set(float x, float v) { - sharpen_buffer[x + 2 * RADAR_WIDTH] = v; + sharpen_buffer[x + 2 * RADAR_WIDTH_MAX] = v; } float sharpen_getpixel(float x, float y) { if(x < 0) return 0; - if(x >= RADAR_WIDTH) + if(x >= RADAR_WIDTH_MAX) return 0; if(y < 0) return 0; if(y > 2) return 0; - return sharpen_buffer[x + y * RADAR_WIDTH]; + return sharpen_buffer[x + y * RADAR_WIDTH_MAX]; } float sharpen_get(float x, float a) @@ -109,22 +108,26 @@ float sharpen_get(float x, float a) return bound(0, sum * a, 1); } -void sharpen_shift() +void sharpen_shift(float w) { float i; - for(i = 0; i < RADAR_WIDTH; ++i) + for(i = 0; i < w; ++i) { - sharpen_buffer[i] = sharpen_buffer[i + RADAR_WIDTH]; - sharpen_buffer[i + RADAR_WIDTH] = sharpen_buffer[i + 2 * RADAR_WIDTH]; - sharpen_buffer[i + 2 * RADAR_WIDTH] = 0; + sharpen_buffer[i] = sharpen_buffer[i + RADAR_WIDTH_MAX]; + sharpen_buffer[i + RADAR_WIDTH_MAX] = sharpen_buffer[i + 2 * RADAR_WIDTH_MAX]; + sharpen_buffer[i + 2 * RADAR_WIDTH_MAX] = 0; } } -void sharpen_init() +void sharpen_init(float w) { float i; - for(i = 0; i < 3 * RADAR_WIDTH; ++i) + for(i = 0; i < w; ++i) + { sharpen_buffer[i] = 0; + sharpen_buffer[i + RADAR_WIDTH_MAX] = 0; + sharpen_buffer[i + 2 * RADAR_WIDTH_MAX] = 0; + } } entity radarmapper; @@ -142,8 +145,6 @@ void RadarMap_Think() { // initialize get_mi_min_max_texcoords(1); - self.size_x = RADAR_WIDTH; - self.size_y = RADAR_HEIGHT; self.mins = mi_picmin; self.maxs_x = (mi_picmax_x - mi_picmin_x) / self.size_x; self.maxs_y = (mi_picmax_y - mi_picmin_y) / self.size_y; @@ -162,10 +163,7 @@ void RadarMap_Think() } else if(self.count & 2) { - if(self.count & 1) - localcmd(strcat("defer 1 \"sv_cmd radarmap --force --loop", ftos(self.ltime), "\"\n")); - else - localcmd(strcat("defer 1 \"sv_cmd radarmap --loop ", ftos(self.ltime), "\"\n")); + 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); @@ -193,16 +191,35 @@ void RadarMap_Think() } self.frame += 1; self.nextthink = time; - sharpen_init(); + sharpen_init(self.size_x); } else if(self.frame <= self.size_y) { // fill the sharpen buffer with this line - sharpen_shift(); - for(x = 0; x < self.size_x; ++x) + sharpen_shift(self.size_x); + if(self.count & 8) { - l = RadarMapAtPoint(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); + 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 + { + 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? @@ -227,7 +244,7 @@ void RadarMap_Think() // is this the last line? then write back the missing line if(self.frame == self.size_y) { - sharpen_shift(); + sharpen_shift(self.size_x); // write a pixel line fputs(self.cnt, "\""); for(x = 0; x < self.size_x; ++x) @@ -259,10 +276,7 @@ void RadarMap_Think() } else if(self.count & 2) { - if(self.count & 1) - localcmd(strcat("defer 1 \"sv_cmd radarmap --force --loop", ftos(self.ltime), "\"\n")); - else - localcmd(strcat("defer 1 \"sv_cmd radarmap --loop ", ftos(self.ltime), "\"\n")); + 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); @@ -281,6 +295,8 @@ void RadarMap(float argc) radarmapper.nextthink = time; radarmapper.count = 0; radarmapper.ltime = 1; + radarmapper.size_x = 512; + radarmapper.size_y = 512; for(i = 1; i < argc; ++i) { @@ -290,8 +306,43 @@ void RadarMap(float argc) radarmapper.count |= 2; else if(argv(i) == "--quit") radarmapper.count |= 4; - else + else if(argv(i) == "--block") + { + radarmapper.count &~= 24; + } + else if(argv(i) == "--trace") + { + radarmapper.count &~= 24; + radarmapper.count |= 8; + } + else if(argv(i) == "--hqblock") + { + radarmapper.count &~= 24; + radarmapper.count |= 16; + } + else if(argv(i) == "--flags") // for the recursive call + { + ++i; + radarmapper.count = stof(argv(i)); + } + else if(argv(i) == "--sharpen") // for the recursive call + { + ++i; radarmapper.ltime = stof(argv(i)); + } + else if(argv(i) == "--res") // resolution + { + ++i; + radarmapper.size_x = stof(argv(i)); + ++i; + radarmapper.size_y = stof(argv(i)); + } + else + { + remove(radarmapper); + print("Usage: sv_cmd radarmap [--force] [--loop] [--quit] [--trace | --block | --hqblock] [--sharpen N] [--res W H]\n"); + return; + } } } -- 2.39.2