mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-11-23 21:07:17 +00:00
multi:: radar works correctly in split_screen
This commit is contained in:
parent
53d5813267
commit
8489550aed
@ -9,6 +9,18 @@
|
|||||||
namespace hr {
|
namespace hr {
|
||||||
|
|
||||||
#if HDR
|
#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 */
|
/** configuration of the current view */
|
||||||
struct display_data {
|
struct display_data {
|
||||||
/** The cell which is currently in the center. */
|
/** The cell which is currently in the center. */
|
||||||
@ -36,6 +48,10 @@ struct display_data {
|
|||||||
ld tanfov;
|
ld tanfov;
|
||||||
flagtype next_shader_flags;
|
flagtype next_shader_flags;
|
||||||
|
|
||||||
|
vector<radarpoint> radarpoints;
|
||||||
|
vector<radarline> radarlines;
|
||||||
|
transmatrix radar_transform;
|
||||||
|
|
||||||
ld eyewidth();
|
ld eyewidth();
|
||||||
bool stereo_active();
|
bool stereo_active();
|
||||||
bool in_anaglyph();
|
bool in_anaglyph();
|
||||||
|
@ -2343,7 +2343,7 @@ EX int config3 = addHook(hooks_configfile, 100, [] {
|
|||||||
"distances.)"
|
"distances.)"
|
||||||
);
|
);
|
||||||
if(GDIM == 3 && pmodel == mdPerspective && !euclid) {
|
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";
|
help += "\n\n";
|
||||||
if(abs(current_camera_level) < 1e-6)
|
if(abs(current_camera_level) < 1e-6)
|
||||||
help += XLAT(
|
help += XLAT(
|
||||||
|
@ -82,7 +82,7 @@ EX bool mouseout2() {
|
|||||||
EX movedir vectodir(hyperpoint P) {
|
EX movedir vectodir(hyperpoint P) {
|
||||||
|
|
||||||
transmatrix U = unshift(ggmatrix(cwt.at));
|
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));
|
P = direct_exp(lp_iapply(P));
|
||||||
|
|
||||||
|
@ -4864,7 +4864,7 @@ EX void make_actual_view() {
|
|||||||
ld z = -asin_auto(tC0(view_inverse(T)) [2]);
|
ld z = -asin_auto(tC0(view_inverse(T)) [2]);
|
||||||
T = zpush(-z) * T;
|
T = zpush(-z) * T;
|
||||||
|
|
||||||
radar_transform = T * U;
|
current_display->radar_transform = T * U;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
Viewbase = View;
|
Viewbase = View;
|
||||||
@ -4943,8 +4943,8 @@ EX void drawthemap() {
|
|||||||
firelimit = 0;
|
firelimit = 0;
|
||||||
|
|
||||||
make_clipping_planes();
|
make_clipping_planes();
|
||||||
radarpoints.clear();
|
current_display->radarpoints.clear();
|
||||||
radarlines.clear();
|
current_display->radarlines.clear();
|
||||||
callhooks(hooks_drawmap);
|
callhooks(hooks_drawmap);
|
||||||
|
|
||||||
frameid++;
|
frameid++;
|
||||||
@ -5627,7 +5627,7 @@ auto graphcm = addHook(hooks_clearmemory, 0, [] () {
|
|||||||
gd->store(animations);
|
gd->store(animations);
|
||||||
gd->store(flashes);
|
gd->store(flashes);
|
||||||
gd->store(fallanims);
|
gd->store(fallanims);
|
||||||
gd->store(radar_transform);
|
gd->store(current_display->radar_transform);
|
||||||
gd->store(actual_view_transform);
|
gd->store(actual_view_transform);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -74,10 +74,6 @@ void gamedata_all(gamedata& gd) {
|
|||||||
gd.store(gamerange_bonus);
|
gd.store(gamerange_bonus);
|
||||||
gd.store(targets);
|
gd.store(targets);
|
||||||
gd.store(patterns::rwalls);
|
gd.store(patterns::rwalls);
|
||||||
if(GDIM == 3) {
|
|
||||||
gd.store(radarlines);
|
|
||||||
gd.store(radarpoints);
|
|
||||||
}
|
|
||||||
if(GOLDBERG) gd.store(gp::param);
|
if(GOLDBERG) gd.store(gp::param);
|
||||||
callhooks(hooks_gamedata, &gd);
|
callhooks(hooks_gamedata, &gd);
|
||||||
}
|
}
|
||||||
|
47
radar.cpp
47
radar.cpp
@ -1,28 +1,9 @@
|
|||||||
#include "hyper.h"
|
#include "hyper.h"
|
||||||
namespace hr {
|
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<radarpoint> radarpoints;
|
|
||||||
EX vector<radarline> radarlines;
|
|
||||||
|
|
||||||
EX transmatrix radar_transform;
|
|
||||||
|
|
||||||
#if MAXMDIM >= 4
|
#if MAXMDIM >= 4
|
||||||
pair<bool, hyperpoint> makeradar(shiftpoint h) {
|
pair<bool, hyperpoint> 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);
|
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);
|
shiftpoint h = tC0(V);
|
||||||
auto hp = makeradar(h);
|
auto hp = makeradar(h);
|
||||||
if(hp.first)
|
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) {
|
EX void addradar(const shiftpoint h1, const shiftpoint h2, color_t col) {
|
||||||
auto hp1 = makeradar(h1);
|
auto hp1 = makeradar(h1);
|
||||||
auto hp2 = makeradar(h2);
|
auto hp2 = makeradar(h2);
|
||||||
if(hp1.first && hp2.first)
|
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() {
|
void celldrawer::drawcell_in_radar() {
|
||||||
@ -98,6 +79,7 @@ void celldrawer::radar_grid() {
|
|||||||
|
|
||||||
EX void draw_radar(bool cornermode) {
|
EX void draw_radar(bool cornermode) {
|
||||||
#if MAXMDIM >= 4
|
#if MAXMDIM >= 4
|
||||||
|
if(subscreens::split([=] () { calcparam(); draw_radar(false); })) return;
|
||||||
if(dual::split([] { dual::in_subscreen([] { calcparam(); draw_radar(false); }); })) return;
|
if(dual::split([] { dual::in_subscreen([] { calcparam(); draw_radar(false); }); })) return;
|
||||||
bool d3 = WDIM == 3;
|
bool d3 = WDIM == 3;
|
||||||
bool hyp = hyperbolic;
|
bool hyp = hyperbolic;
|
||||||
@ -110,10 +92,17 @@ EX void draw_radar(bool cornermode) {
|
|||||||
dynamicval<geometryinfo1> gi(ginf[gEuclid].g, giEuclid2);
|
dynamicval<geometryinfo1> gi(ginf[gEuclid].g, giEuclid2);
|
||||||
initquickqueue();
|
initquickqueue();
|
||||||
int rad = vid.radarsize;
|
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 cx = dual::state ? (dual::currently_loaded ? vid.xres/2+rad+2 : vid.xres/2-rad-2) :
|
||||||
ld cy = vid.yres-rad-2 - vid.fsize;
|
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);
|
auto sId = shiftless(Id);
|
||||||
|
|
||||||
@ -142,7 +131,7 @@ EX void draw_radar(bool cornermode) {
|
|||||||
queuecurve(sId, 0xFF8000FF, 0, PPR::ZERO);
|
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);
|
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);
|
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 h1 = locate(r.h1);
|
||||||
hyperpoint h2 = locate(r.h2);
|
hyperpoint h2 = locate(r.h2);
|
||||||
h1 = tC0(atscreenpos(h1[0], h1[1], 1));
|
h1 = tC0(atscreenpos(h1[0], h1[1], 1));
|
||||||
@ -180,11 +169,11 @@ EX void draw_radar(bool cornermode) {
|
|||||||
quickqueue();
|
quickqueue();
|
||||||
glflush();
|
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);
|
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 {
|
else {
|
||||||
hyperpoint h = locate(r.h);
|
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
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user