mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-07-04 18:52:51 +00:00
arb:: sliders
This commit is contained in:
parent
c8ce9c9826
commit
b55503dc9f
@ -30,6 +30,14 @@ struct shape {
|
|||||||
int repeat_value;
|
int repeat_value;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct slider {
|
||||||
|
string name;
|
||||||
|
ld zero;
|
||||||
|
ld current;
|
||||||
|
ld min;
|
||||||
|
ld max;
|
||||||
|
};
|
||||||
|
|
||||||
struct arbi_tiling {
|
struct arbi_tiling {
|
||||||
|
|
||||||
int order;
|
int order;
|
||||||
@ -39,6 +47,8 @@ struct arbi_tiling {
|
|||||||
string name;
|
string name;
|
||||||
string comment;
|
string comment;
|
||||||
|
|
||||||
|
vector<slider> sliders;
|
||||||
|
|
||||||
ld cscale;
|
ld cscale;
|
||||||
string filename;
|
string filename;
|
||||||
|
|
||||||
@ -51,6 +61,13 @@ struct arbi_tiling {
|
|||||||
|
|
||||||
EX arbi_tiling current;
|
EX arbi_tiling current;
|
||||||
|
|
||||||
|
EX bool using_slided;
|
||||||
|
|
||||||
|
EX arbi_tiling slided;
|
||||||
|
|
||||||
|
EX arbi_tiling& current_or_slided() {
|
||||||
|
return using_slided ? slided : current;
|
||||||
|
}
|
||||||
|
|
||||||
/** id of vertex in the arbitrary tiling */
|
/** id of vertex in the arbitrary tiling */
|
||||||
|
|
||||||
@ -160,10 +177,10 @@ template<class T> void verify_index(int index, const T& v, exp_parser& ep) { if(
|
|||||||
|
|
||||||
string unnamed = "unnamed";
|
string unnamed = "unnamed";
|
||||||
|
|
||||||
EX void load_tile(exp_parser& ep, bool unit) {
|
EX void load_tile(exp_parser& ep, arbi_tiling& c, bool unit) {
|
||||||
current.shapes.emplace_back();
|
c.shapes.emplace_back();
|
||||||
auto& cc = current.shapes.back();
|
auto& cc = c.shapes.back();
|
||||||
cc.id = isize(current.shapes) - 1;
|
cc.id = isize(c.shapes) - 1;
|
||||||
cc.flags = 0;
|
cc.flags = 0;
|
||||||
cc.repeat_value = 1;
|
cc.repeat_value = 1;
|
||||||
while(ep.next() != ')') {
|
while(ep.next() != ')') {
|
||||||
@ -195,7 +212,7 @@ EX void load_tile(exp_parser& ep, bool unit) {
|
|||||||
cc.stretch_shear.resize(cc.size(), make_pair(1, 0));
|
cc.stretch_shear.resize(cc.size(), make_pair(1, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
EX void load(const string& fname) {
|
EX void load(const string& fname, bool after_sliding IS(false)) {
|
||||||
fhstream f(fname, "rt");
|
fhstream f(fname, "rt");
|
||||||
string s;
|
string s;
|
||||||
while(true) {
|
while(true) {
|
||||||
@ -203,9 +220,10 @@ EX void load(const string& fname) {
|
|||||||
if(c < 0) break;
|
if(c < 0) break;
|
||||||
s += c;
|
s += c;
|
||||||
}
|
}
|
||||||
auto& c = current;
|
auto& c = after_sliding ? slided : current;
|
||||||
c.order++;
|
c.order++;
|
||||||
c.shapes.clear();
|
c.shapes.clear();
|
||||||
|
c.sliders.clear();
|
||||||
c.name = unnamed;
|
c.name = unnamed;
|
||||||
c.comment = "";
|
c.comment = "";
|
||||||
c.filename = fname;
|
c.filename = fname;
|
||||||
@ -278,15 +296,31 @@ EX void load(const string& fname) {
|
|||||||
addflag(arcm::sfPH);
|
addflag(arcm::sfPH);
|
||||||
c.have_ph = true;
|
c.have_ph = true;
|
||||||
}
|
}
|
||||||
|
else if(ep.eat("slider(")) {
|
||||||
|
slider sl;
|
||||||
|
sl.name = ep.next_token();
|
||||||
|
ep.force_eat(",");
|
||||||
|
sl.current = sl.zero = ep.rparse();
|
||||||
|
ep.force_eat(",");
|
||||||
|
sl.min = ep.rparse();
|
||||||
|
ep.force_eat(",");
|
||||||
|
sl.max = ep.rparse();
|
||||||
|
ep.force_eat(")");
|
||||||
|
c.sliders.push_back(sl);
|
||||||
|
if(after_sliding)
|
||||||
|
ep.extra_params[sl.name] = current.sliders[isize(c.sliders)-1].current;
|
||||||
|
else
|
||||||
|
ep.extra_params[sl.name] = sl.zero;
|
||||||
|
}
|
||||||
else if(ep.eat("let(")) {
|
else if(ep.eat("let(")) {
|
||||||
string tok = ep.next_token();
|
string tok = ep.next_token();
|
||||||
ep.force_eat("=");
|
ep.force_eat("=");
|
||||||
ep.extra_params[tok] =ep.parsepar();
|
ep.extra_params[tok] =ep.parsepar();
|
||||||
if(debugflags & DF_GEOM)
|
if(debugflags & DF_GEOM)
|
||||||
println(hlog, "let ", tok, " = ", real(ep.extra_params[tok]));
|
println(hlog, "let ", tok, " = ", ep.extra_params[tok]);
|
||||||
}
|
}
|
||||||
else if(ep.eat("unittile(")) load_tile(ep, true);
|
else if(ep.eat("unittile(")) load_tile(ep, c, true);
|
||||||
else if(ep.eat("tile(")) load_tile(ep, false);
|
else if(ep.eat("tile(")) load_tile(ep, c, false);
|
||||||
else if(ep.eat("affine_limit(")) {
|
else if(ep.eat("affine_limit(")) {
|
||||||
affine_limit = ep.iparse();
|
affine_limit = ep.iparse();
|
||||||
ep.force_eat(")");
|
ep.force_eat(")");
|
||||||
@ -413,6 +447,7 @@ EX void load(const string& fname) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(!after_sliding) slided = current;
|
||||||
}
|
}
|
||||||
|
|
||||||
arbi_tiling debugged;
|
arbi_tiling debugged;
|
||||||
@ -623,11 +658,12 @@ struct hrmap_arbi : hrmap {
|
|||||||
void verify() override { }
|
void verify() override { }
|
||||||
|
|
||||||
transmatrix adj(heptagon *h, int dl) override {
|
transmatrix adj(heptagon *h, int dl) override {
|
||||||
return get_adj(current, id_of(h), dl, h->c.move(dl) ? h->c.spin(dl) : -1);
|
return get_adj(current_or_slided(), id_of(h), dl, h->c.move(dl) ? h->c.spin(dl) : -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
heptagon *create_step(heptagon *h, int d) override {
|
heptagon *create_step(heptagon *h, int d) override {
|
||||||
|
|
||||||
|
dynamicval<bool> sl(using_slided, false);
|
||||||
int t = id_of(h);
|
int t = id_of(h);
|
||||||
|
|
||||||
auto& sh = current.shapes[t];
|
auto& sh = current.shapes[t];
|
||||||
@ -800,6 +836,42 @@ EX void run(string fname) {
|
|||||||
start_game();
|
start_game();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string slider_error;
|
||||||
|
|
||||||
|
EX void sliders_changed() {
|
||||||
|
try {
|
||||||
|
load(current.filename, true);
|
||||||
|
using_slided = true;
|
||||||
|
slider_error = "OK";
|
||||||
|
texture::config.remap();
|
||||||
|
}
|
||||||
|
catch(hr_parse_exception& ex) {
|
||||||
|
using_slided = false;
|
||||||
|
slider_error = ex.s;
|
||||||
|
}
|
||||||
|
catch(hr_polygon_error& poly) {
|
||||||
|
using_slided = false;
|
||||||
|
slider_error = poly.generate_error();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EX void set_sliders() {
|
||||||
|
cmode = sm::SIDE | sm::MAYDARK;
|
||||||
|
gamescreen(1);
|
||||||
|
dialog::init(XLAT("tessellation sliders"));
|
||||||
|
char ch = 'A';
|
||||||
|
for(auto& sl: current.sliders) {
|
||||||
|
dialog::addSelItem(sl.name, fts(sl.current), ch++);
|
||||||
|
dialog::add_action([&] {
|
||||||
|
dialog::editNumber(sl.current, sl.min, sl.max, 1, sl.zero, sl.name, sl.name);
|
||||||
|
dialog::reaction = sliders_changed;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
dialog::addInfo(slider_error);
|
||||||
|
dialog::addBack();
|
||||||
|
dialog::display();
|
||||||
|
}
|
||||||
|
|
||||||
#if CAP_COMMANDLINE
|
#if CAP_COMMANDLINE
|
||||||
int readArgs() {
|
int readArgs() {
|
||||||
using namespace arg;
|
using namespace arg;
|
||||||
|
@ -769,6 +769,11 @@ EX void showEuclideanMenu() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(arb::in() && !arb::current.sliders.empty()) {
|
||||||
|
dialog::addItem(XLAT("tessellation sliders"), '4');
|
||||||
|
dialog::add_action_push(arb::set_sliders);
|
||||||
|
}
|
||||||
|
|
||||||
#if CAP_IRR
|
#if CAP_IRR
|
||||||
if(hyperbolic && IRREGULAR) {
|
if(hyperbolic && IRREGULAR) {
|
||||||
nom = isize(irr::cells);
|
nom = isize(irr::cells);
|
||||||
|
@ -636,7 +636,7 @@ void geometry_information::prepare_basics() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(arb::in()) {
|
if(arb::in()) {
|
||||||
auto& csc = arb::current.cscale;
|
auto csc = arb::current_or_slided().cscale;
|
||||||
scalefactor = csc;
|
scalefactor = csc;
|
||||||
hcrossf = crossf = orbsize = hcrossf7 * csc;
|
hcrossf = crossf = orbsize = hcrossf7 * csc;
|
||||||
hexf = rhexf = hexvdist = csc * .5;
|
hexf = rhexf = hexvdist = csc * .5;
|
||||||
@ -996,6 +996,11 @@ EX string cgi_string() {
|
|||||||
V("GEO", its(int(geometry)));
|
V("GEO", its(int(geometry)));
|
||||||
V("VAR", its(int(variation)));
|
V("VAR", its(int(variation)));
|
||||||
|
|
||||||
|
if(arb::in() && arb::using_slided) {
|
||||||
|
for(auto& sl: arb::current.sliders)
|
||||||
|
V("AS", fts(sl.current));
|
||||||
|
}
|
||||||
|
|
||||||
if(fake::in()) {
|
if(fake::in()) {
|
||||||
if(hyperbolic) V("H", fts(fake::around));
|
if(hyperbolic) V("H", fts(fake::around));
|
||||||
if(euclid) V("E", fts(fake::around));
|
if(euclid) V("E", fts(fake::around));
|
||||||
|
@ -535,7 +535,7 @@ EX hyperpoint get_corner_position(cell *c, int cid, ld cf IS(3)) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if(arb::in()) {
|
if(arb::in()) {
|
||||||
auto& sh = arb::current.shapes[arb::id_of(c->master)];
|
auto& sh = arb::current_or_slided().shapes[arb::id_of(c->master)];
|
||||||
return normalize(C0 + (sh.vertices[gmod(cid, c->type)] - C0) * 3 / cf);
|
return normalize(C0 + (sh.vertices[gmod(cid, c->type)] - C0) * 3 / cf);
|
||||||
}
|
}
|
||||||
if(PURE) {
|
if(PURE) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user