diff --git a/basegraph.cpp b/basegraph.cpp index 2efa605e..04c67fe0 100644 --- a/basegraph.cpp +++ b/basegraph.cpp @@ -9,6 +9,18 @@ namespace hr { #if HDR +struct radarpoint { + hyperpoint h; + char glyph; + color_t color; + color_t line; + }; + +struct radarline { + hyperpoint h1, h2; + color_t line; + }; + /** configuration of the current view */ struct display_data { /** The cell which is currently in the center. */ @@ -36,6 +48,10 @@ struct display_data { ld tanfov; flagtype next_shader_flags; + vector radarpoints; + vector radarlines; + transmatrix radar_transform; + ld eyewidth(); bool stereo_active(); bool in_anaglyph(); diff --git a/config.cpp b/config.cpp index 8155cb78..b8ab1118 100644 --- a/config.cpp +++ b/config.cpp @@ -2343,7 +2343,7 @@ EX int config3 = addHook(hooks_configfile, 100, [] { "distances.)" ); if(GDIM == 3 && pmodel == mdPerspective && !euclid) { - ld current_camera_level = hdist0(tC0(radar_transform)); + ld current_camera_level = hdist0(tC0(current_display->radar_transform)); help += "\n\n"; if(abs(current_camera_level) < 1e-6) help += XLAT( diff --git a/control.cpp b/control.cpp index 96c91cc9..08352dac 100644 --- a/control.cpp +++ b/control.cpp @@ -82,7 +82,7 @@ EX bool mouseout2() { EX movedir vectodir(hyperpoint P) { transmatrix U = unshift(ggmatrix(cwt.at)); - if(GDIM == 3 && WDIM == 2) U = radar_transform * U; + if(GDIM == 3 && WDIM == 2) U = current_display->radar_transform * U; P = direct_exp(lp_iapply(P)); diff --git a/graph.cpp b/graph.cpp index 89f589a6..67abc27b 100644 --- a/graph.cpp +++ b/graph.cpp @@ -4864,7 +4864,7 @@ EX void make_actual_view() { ld z = -asin_auto(tC0(view_inverse(T)) [2]); T = zpush(-z) * T; - radar_transform = T * U; + current_display->radar_transform = T * U; } #endif Viewbase = View; @@ -4943,8 +4943,8 @@ EX void drawthemap() { firelimit = 0; make_clipping_planes(); - radarpoints.clear(); - radarlines.clear(); + current_display->radarpoints.clear(); + current_display->radarlines.clear(); callhooks(hooks_drawmap); frameid++; @@ -5627,7 +5627,7 @@ auto graphcm = addHook(hooks_clearmemory, 0, [] () { gd->store(animations); gd->store(flashes); gd->store(fallanims); - gd->store(radar_transform); + gd->store(current_display->radar_transform); gd->store(actual_view_transform); }); diff --git a/multigame.cpp b/multigame.cpp index d4730eb3..34dfd0c2 100644 --- a/multigame.cpp +++ b/multigame.cpp @@ -74,10 +74,6 @@ void gamedata_all(gamedata& gd) { gd.store(gamerange_bonus); gd.store(targets); gd.store(patterns::rwalls); - if(GDIM == 3) { - gd.store(radarlines); - gd.store(radarpoints); - } if(GOLDBERG) gd.store(gp::param); callhooks(hooks_gamedata, &gd); } diff --git a/radar.cpp b/radar.cpp index e66fbc50..19ea1b11 100644 --- a/radar.cpp +++ b/radar.cpp @@ -1,28 +1,9 @@ #include "hyper.h" namespace hr { -#if HDR -struct radarpoint { - hyperpoint h; - char glyph; - color_t color; - color_t line; - }; - -struct radarline { - hyperpoint h1, h2; - color_t line; - }; -#endif - -EX vector radarpoints; -EX vector radarlines; - -EX transmatrix radar_transform; - #if MAXMDIM >= 4 pair makeradar(shiftpoint h) { - if(GDIM == 3 && WDIM == 2) h.h = radar_transform * h.h; + if(GDIM == 3 && WDIM == 2) h.h = current_display->radar_transform * h.h; ld d = hdist0(h); @@ -62,14 +43,14 @@ EX void addradar(const shiftmatrix& V, char ch, color_t col, color_t outline) { shiftpoint h = tC0(V); auto hp = makeradar(h); if(hp.first) - radarpoints.emplace_back(radarpoint{hp.second, ch, col, outline}); + current_display->radarpoints.emplace_back(radarpoint{hp.second, ch, col, outline}); } EX void addradar(const shiftpoint h1, const shiftpoint h2, color_t col) { auto hp1 = makeradar(h1); auto hp2 = makeradar(h2); if(hp1.first && hp2.first) - radarlines.emplace_back(radarline{hp1.second, hp2.second, col}); + current_display->radarlines.emplace_back(radarline{hp1.second, hp2.second, col}); } void celldrawer::drawcell_in_radar() { @@ -98,6 +79,7 @@ void celldrawer::radar_grid() { EX void draw_radar(bool cornermode) { #if MAXMDIM >= 4 + if(subscreens::split([=] () { calcparam(); draw_radar(false); })) return; if(dual::split([] { dual::in_subscreen([] { calcparam(); draw_radar(false); }); })) return; bool d3 = WDIM == 3; bool hyp = hyperbolic; @@ -110,10 +92,17 @@ EX void draw_radar(bool cornermode) { dynamicval gi(ginf[gEuclid].g, giEuclid2); initquickqueue(); int rad = vid.radarsize; - if(dual::state) rad /= 2; + int divby = 1; + if(dual::state) divby *= 2; + if(subscreens::in) divby *= 2; + rad /= divby; + auto& cd = current_display; - ld cx = dual::state ? (dual::currently_loaded ? vid.xres/2+rad+2 : vid.xres/2-rad-2) : cornermode ? rad+2 : vid.xres-rad-2; - ld cy = vid.yres-rad-2 - vid.fsize; + ld cx = dual::state ? (dual::currently_loaded ? vid.xres/2+rad+2 : vid.xres/2-rad-2) : + subscreens::in ? cd->xtop + cd->xsize - rad - 2 : + cornermode ? rad+2 : vid.xres-rad-2; + ld cy = subscreens::in ? cd->ytop + cd->ysize - rad - 2 - vid.fsize : + vid.yres-rad-2 - vid.fsize; auto sId = shiftless(Id); @@ -142,7 +131,7 @@ EX void draw_radar(bool cornermode) { queuecurve(sId, 0xFF8000FF, 0, PPR::ZERO); } - if(d3) for(auto& r: radarpoints) { + if(d3) for(auto& r: cd->radarpoints) { queueline(sId*atscreenpos(cx+rad * r.h[0], cy - rad * r.h[2] * si + rad * r.h[1] * co, 0)*C0, sId*atscreenpos(cx+rad*r.h[0], cy - rad*r.h[2] * si, 0)*C0, r.line, -1); } @@ -169,7 +158,7 @@ EX void draw_radar(bool cornermode) { return point3(cx + rad * h[0], cy + rad * h[1], rad * cgi.scalefactor / (vid.radarrange + cgi.scalefactor/4) * 0.8); }; - for(auto& r: radarlines) { + for(auto& r: cd->radarlines) { hyperpoint h1 = locate(r.h1); hyperpoint h2 = locate(r.h2); h1 = tC0(atscreenpos(h1[0], h1[1], 1)); @@ -180,11 +169,11 @@ EX void draw_radar(bool cornermode) { quickqueue(); glflush(); - for(auto& r: radarpoints) { + for(auto& r: cd->radarpoints) { if(d3) displaychr(int(cx + rad * r.h[0]), int(cy - rad * r.h[2] * si + rad * r.h[1] * co), 0, 8, r.glyph, r.color); else { hyperpoint h = locate(r.h); - displaychr(int(h[0]), int(h[1]), 0, int(h[2]), r.glyph, r.color); + displaychr(int(h[0]), int(h[1]), 0, int(h[2]) / divby, r.glyph, r.color); } } #endif diff --git a/sky.cpp b/sky.cpp index f4f3e0c9..419fa91c 100644 --- a/sky.cpp +++ b/sky.cpp @@ -560,7 +560,7 @@ EX void make_air() { if(1) { geometry = gSpace534; S = g.T.T; - S = radar_transform * S; + S = current_display->radar_transform * S; geometry = orig; swapmatrix(S); }