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:
parent
976fe48d94
commit
b24ed285ac
@ -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;
|
||||||
@ -171,7 +178,7 @@ void fundamental_marker() {
|
|||||||
|
|
||||||
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);
|
||||||
@ -252,6 +262,8 @@ void fundamental_marker() {
|
|||||||
|
|
||||||
int id = 0;
|
int id = 0;
|
||||||
|
|
||||||
|
auto T = ggmatrix(starter);
|
||||||
|
|
||||||
for(int ci=0; ci<corners; ci++) {
|
for(int ci=0; ci<corners; ci++) {
|
||||||
|
|
||||||
auto cw = cornerlist[ci];
|
auto cw = cornerlist[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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user