1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2026-01-10 13:29:02 +00:00

rogueviz:: som:: distro-based or linear level-lines; configurable width

This commit is contained in:
Zeno Rogue
2025-12-08 17:38:02 +01:00
parent 02f00d13ea
commit 113de052c7

View File

@@ -969,11 +969,14 @@ namespace levelline {
color_t color;
vector<double> values;
bool modified;
ld width;
};
vector<levelline> levellines;
bool on;
bool distro_based;
void create() {
int xlalpha = part(default_edgetype.color, 0);
@@ -983,6 +986,7 @@ namespace levelline {
lv.column = i;
lv.color = ((hrandpos() & 0xFFFFFF) << 8) | xlalpha;
lv.qty = 0;
lv.width = 1;
}
}
@@ -995,11 +999,20 @@ namespace levelline {
if(!lv.modified) continue;
lv.modified = false;
vector<double> sample;
for(int j=0; j<=1024; j++) sample.push_back(data[hrand(samples)].val[lv.column]);
int sampsize = 1 << min(lv.qty + 5, 10);
for(int j=0; j<=sampsize; j++) sample.push_back(data[hrand(samples)].val[lv.column]);
sort(sample.begin(), sample.end());
lv.values.clear();
lv.values.push_back(-1e10);
for(int j=0; j<=1024; j+=1024 >> (lv.qty)) lv.values.push_back(sample[j]);
if(!distro_based) {
int steps = 1 << (lv.qty-1);
for(int r=0; r < steps; r++) lv.values.push_back(lerp(sample[0], sample.back(), (r + .5) / steps));
}
else {
int step = sampsize >> (lv.qty);
if(step == 0) step = 1;
for(int j=0; j<=sampsize; j+=step) lv.values.push_back(sample[j]);
}
lv.values.push_back(1e10);
}
}
@@ -1028,6 +1041,7 @@ namespace levelline {
if(!n3) continue;
for(auto& l: levellines) {
dynamicval<ld> lw(vid.linewidth, vid.linewidth * l.width);
auto val1 = n1->net[l.column];
auto val2 = n2->net[l.column];
auto val3 = n3->net[l.column];
@@ -1056,7 +1070,7 @@ namespace levelline {
}
void show() {
static bool change_color = false;
static int mode = 0;
if(levellines.size() == 0) create();
cmode = sm::SIDE | sm::MAYDARK;
gamescreen();
@@ -1064,14 +1078,14 @@ namespace levelline {
int q = isize(levellines);
if(q > 20) dialog::start_list(2000, 2000, 'a');
for(auto &l : levellines) {
if(change_color) {
if(mode == 1) {
dialog::addColorItem(colnames[l.column], l.color, dialog::list_fake_key++);
dialog::add_action([&l] {
dialog::openColorDialog(l.color, NULL);
dialog::get_di().dialogflags |= sm::MAYDARK | sm::SIDE;
});
}
else {
if(mode == 0) {
dialog::addSelItem(colnames[l.column], its(l.qty), dialog::list_fake_key++);
dialog::lastItem().colorv = l.color >> 8;
dialog::add_action([&l] {
@@ -1083,11 +1097,27 @@ namespace levelline {
};
});
}
if(mode == 2) {
dialog::addSelItem(colnames[l.column], fts(l.width), dialog::list_fake_key++);
dialog::lastItem().colorv = l.color >> 8;
dialog::add_action([&l] {
dialog::editNumber(l.width, 0, 10, 0.1, 0, colnames[l.column],
XLAT("Controls the width of level lines."));
});
}
}
if(q > 20) dialog::end_list();
dialog::addBreak(100);
dialog::addItem("exit menu", '0');
dialog::addBoolItem_action("edit colors", change_color, '1');
string param[3] = { "quantity", "color", "width" };
dialog::addSelItem("edit what", param[mode], '1');
dialog::add_action([] { mode = gmod(mode+1, 3); });
dialog::addBoolItem("distribution based", distro_based, '2');
dialog::add_action([] {
distro_based = !distro_based;
for(auto& l: levellines) l.modified = true;
build();
});
dialog::display();
}