1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-03-01 01:10:10 +00:00

rogueviz::fundamental:: factored out compute_shape

This commit is contained in:
Zeno Rogue 2025-02-24 09:07:32 +01:00
parent 976fe48d94
commit b24ed285ac

View File

@ -22,6 +22,12 @@ color_t color1, color2;
cell *starter; cell *starter;
map<cell*, set<int>> same; map<cell*, set<int>> same;
map<cell*, shiftmatrix> gm; map<cell*, shiftmatrix> gm;
int corners;
vector<hyperpoint> abs_cornerpos;
vector<cell*> cells;
vector<cellwalker> cornerlist;
map<cellwalker, int> corner_id;
bool is_connected(cellwalker cw) { bool is_connected(cellwalker cw) {
return same[cw.at].count(cw.spin); return same[cw.at].count(cw.spin);
@ -109,16 +115,17 @@ int lq = 3, alpha = 32;
color_t *current_domain = nullptr; color_t *current_domain = nullptr;
void fundamental_marker() { cell *current_starter;
current_domain = nullptr;
if(!funmode || !quotient) return; void compute_shape() {
if(current_starter == starter) return;
current_starter = starter;
same.clear(); same.clear();
gm.clear(); gm.clear();
gm[starter] = ggmatrix(starter); gm[starter] = ggmatrix(starter);
vector<cell*> cells; cells = {starter};
cells.push_back(starter);
int tree_edges = 0; int tree_edges = 0;
int face_edges = 0; int face_edges = 0;
@ -168,10 +175,10 @@ void fundamental_marker() {
} }
if(f == face_edges) break; if(f == face_edges) break;
} }
cellwalker cw; cellwalker cw;
int corners = 0; corners = 0;
for(int k=0; k<isize(cells); k++) { for(int k=0; k<isize(cells); k++) {
cell *c = cells[k]; cell *c = cells[k];
@ -188,10 +195,8 @@ void fundamental_marker() {
if(!corners) return; if(!corners) return;
// printf("tree edges = %d, face edges = %d, corners = %d\n", tree_edges, face_edges, corners); cornerlist.clear();
corner_id.clear();
vector<cellwalker> cornerlist;
map<cellwalker, int> corner_id;
for(int ci=0; ci<corners; ci++) { for(int ci=0; ci<corners; ci++) {
corner_id[cw] = cornerlist.size(); corner_id[cw] = cornerlist.size();
@ -214,15 +219,20 @@ void fundamental_marker() {
vid.linewidth *= widthfactor; vid.linewidth *= widthfactor;
vector<shiftpoint> cornerpos; abs_cornerpos.clear();
vector<hyperpoint> abs_cornerpos;
for(auto c: cornerlist) { for(auto c: cornerlist) {
auto co = corner(c); auto co = corner(c);
cornerpos.push_back(co);
abs_cornerpos.push_back(inverse_shift(gm[starter], co)); abs_cornerpos.push_back(inverse_shift(gm[starter], co));
} }
}
void fundamental_marker() {
current_domain = nullptr;
if(!funmode || !quotient || GDIM == 3) return;
compute_shape();
if(!corners) return;
set<unsigned> buckets_used; set<unsigned> buckets_used;
for(int i=0; i<corners; i++) curvepoint_pretty(abs_cornerpos[i], abs_cornerpos[i+1], lq); for(int i=0; i<corners; i++) curvepoint_pretty(abs_cornerpos[i], abs_cornerpos[i+1], lq);
@ -251,6 +261,8 @@ void fundamental_marker() {
set<cellwalker> visited; set<cellwalker> visited;
int id = 0; int id = 0;
auto T = ggmatrix(starter);
for(int ci=0; ci<corners; ci++) { for(int ci=0; ci<corners; ci++) {
@ -261,21 +273,22 @@ void fundamental_marker() {
if(!corner_id.count(cw1)) cw1 = cw1 + wmirror - 1, mirrored = true; if(!corner_id.count(cw1)) cw1 = cw1 + wmirror - 1, mirrored = true;
if(!corner_id.count(cw1)) println(hlog, "still bad"); if(!corner_id.count(cw1)) println(hlog, "still bad");
auto ci1 = corner_id[cw1]; auto ci1 = corner_id[cw1];
auto nx = cornerlist[ci+1];
auto nx1 = cornerlist[ci1+1];
auto pv1 = cornerlist[(ci1+corners-1) % corners];
// visited.insert(next_corner[cw]); auto pcw = T * abs_cornerpos[ci];
// cellwalker cw2 = next_corner[cw]; auto pnx = T * abs_cornerpos[ci+1];
if(nx < (mirrored ? nx1 : cw1)) { auto pcw1 = T * abs_cornerpos[ci1];
auto pnx1 = T * abs_cornerpos[ci1+1];
auto pv1 = T * abs_cornerpos[(ci1+corners-1) % corners];
if(ci+1 < (mirrored ? ci1+1 : ci1)) {
int mc = (mirrored ? color1 : color2) >> 8; int mc = (mirrored ? color1 : color2) >> 8;
if(hdist(corner(cw), corner(nx)) > 1e-3) { if(hdist(pcw, pnx) > 1e-3) {
queuestr(labelpos(corner(cw), corner(nx)), label_scale/cgi.scalefactor, its(id), mc); queuestr(labelpos(pcw, pnx), label_scale/cgi.scalefactor, its(id), mc);
if(mirrored) if(mirrored)
queuestr(labelpos(corner(cw1), corner(nx1)), label_scale/cgi.scalefactor, its(id), mc); queuestr(labelpos(pcw1, pnx1), label_scale/cgi.scalefactor, its(id), mc);
else else
queuestr(labelpos(corner(pv1), corner(cw1)), label_scale/cgi.scalefactor, its(id), mc); queuestr(labelpos(pv1, pcw1), label_scale/cgi.scalefactor, its(id), mc);
id++; id++;
} }
} }
@ -346,7 +359,16 @@ void showMenu() {
void enable_fundamental() { void enable_fundamental() {
start_game(); starter = cwt.at; start_game(); starter = cwt.at;
rogueviz::rv_hook(hooks_frame, 100, fundamental_marker); rogueviz::rv_hook(hooks_frame, 100, fundamental_marker);
rogueviz::rv_hook(hooks_clearmemory, 100, [] { same.clear(); gm.clear(); bucket_color.clear(); }); rogueviz::rv_hook(hooks_clearmemory, 100, [] {
same.clear();
gm.clear();
bucket_color.clear();
current_starter = nullptr;
cornerlist.clear();
corner_id.clear();
abs_cornerpos.clear();
cells.clear();
});
rogueviz::rv_hook(hooks_o_key, 80, [] (o_funcs& v) { v.push_back(named_dialog("fundamental", showMenu)); }); rogueviz::rv_hook(hooks_o_key, 80, [] (o_funcs& v) { v.push_back(named_dialog("fundamental", showMenu)); });
current_position = Id; last_view = View; current_position = Id; last_view = View;