Z period in product geometries

This commit is contained in:
Zeno Rogue 2019-11-13 20:48:38 +01:00
parent b0e481cc0a
commit 74a139ca3e
4 changed files with 49 additions and 9 deletions

View File

@ -748,7 +748,7 @@ EX void showEuclideanMenu() {
}
if(in_s2xe()) {
dialog::addSelItem(XLAT("precision of S2xE rings"), its(s2xe::qrings), '4');
dialog::addSelItem(XLAT("precision of S2xE rings"), its(s2xe::qrings), '5');
dialog::add_action([] {
dialog::editNumber(s2xe::qrings, 1, 256, 4, 32, XLAT("precision of S2xE rings"),
XLAT(
@ -761,9 +761,9 @@ EX void showEuclideanMenu() {
});
}
else if(hybri) {
if(hybri) {
auto r = rots::underlying_scale;
dialog::addSelItem(XLAT("view the underlying geometry"), r > 0 ? fts(r)+"x" : ONOFF(false), '4');
dialog::addSelItem(XLAT("view the underlying geometry"), r > 0 ? fts(r)+"x" : ONOFF(false), '6');
dialog::add_action([] {
dialog::editNumber(rots::underlying_scale, 0, 1, 0.05, 0.25, XLAT("view the underlying geometry"),
XLAT(
@ -780,7 +780,7 @@ EX void showEuclideanMenu() {
});
}
else if(euwrap || geometry == gFieldQuotient || cryst || archimedean || (euclid && WDIM == 3) || nil || asonov::in()) {
if(euwrap || geometry == gFieldQuotient || cryst || archimedean || (euclid && WDIM == 3) || nil || asonov::in() || prod) {
dialog::addItem(XLAT("advanced parameters"), '4');
dialog::add_action([] {
if(0);
@ -802,6 +802,20 @@ EX void showEuclideanMenu() {
else if(asonov::in())
asonov::prepare_config(),
pushScreen(asonov::show_config);
else if(prod) {
static int s;
s = product::csteps;
dialog::editNumber(s, 0, 16, 1, 0, XLAT("%1 period", "Z"),
XLAT("Set to 0 to make it non-periodic."));
dialog::bound_low(0);
dialog::reaction_final = [] {
product::csteps = s;
if(product::csteps == cgi.steps) return;
hybrid::reconfigure();
start_game();
println(hlog, "csteps = ", cgi.steps);
};
}
#endif
else if(euwrap)
prepare_torusconfig(),

View File

@ -580,7 +580,7 @@ void geometry_information::prepare_basics() {
}
plevel = vid.plevel_factor * scalefactor;
steps = 0;
steps = product::csteps;
single_step = 1;
if(hybri && !prod) {
if(hybrid::underlying == gArchimedean)
@ -925,6 +925,8 @@ EX void check_cgi() {
if(hybri) V("U", its(int(hybrid::underlying)));
if(prod) V("PL", fts(vid.plevel_factor));
if(prod) V("PS", its(product::csteps));
if(binarytiling) V("BT", fts(vid.binary_width));

View File

@ -970,9 +970,19 @@ EX namespace hybrid {
ginf[g].g.gameplay_dimension++;
ginf[g].g.graphical_dimension++;
ginf[g].tiling_name += "xZ";
if(product::csteps) ginf[g].flags |= qANYQ, ginf[g].tiling_name += its(product::csteps);
}
ginf[g].flags |= qHYBRID;
}
EX void reconfigure() {
if(!hybri) return;
stop_game();
auto g = geometry;
geometry = underlying;
configure(g);
geometry = g;
}
EX hrmap *pmap;
geometry_information *pcgip;
@ -1006,7 +1016,7 @@ EX namespace hybrid {
}
cell *getCell(cell *u, int h) {
if(cgi.steps) h = gmod(h, cgi.steps);
h = zgmod(h, cgi.steps);
cell*& c = at[make_pair(u, h)];
if(!c) { c = newCell(u->type+2, u->master); where[c] = {u, h}; }
return c;
@ -1045,7 +1055,7 @@ EX namespace hybrid {
auto cu = m->where[c].first;
auto cu1 = m->in_underlying([&] { return cu->cmove(d); });
int d1 = cu->c.spin(d);
int s = cgi.steps ? d*cgi.steps / cu->type - d1*cgi.steps / cu1->type + cgi.steps/2 : 0;
int s = (geometry == gRotSpace && cgi.steps) ? d*cgi.steps / cu->type - d1*cgi.steps / cu1->type + cgi.steps/2 : 0;
cell *c1 = get_at(cu1, m->where[c].second + s);
c->c.connect(d, c1, d1, cu->c.mirror(d));
}
@ -1153,7 +1163,7 @@ EX namespace product {
struct hrmap_product : hybrid::hrmap_hybrid {
transmatrix relative_matrix(cell *c2, cell *c1, const hyperpoint& point_hint) override {
return in_underlying([&] { return calc_relative_matrix(where[c2].first, where[c1].first, point_hint); }) * mscale(Id, cgi.plevel * (where[c2].second - where[c1].second));
return in_underlying([&] { return calc_relative_matrix(where[c2].first, where[c1].first, point_hint); }) * mscale(Id, cgi.plevel * szgmod(where[c2].second - where[c1].second, csteps));
}
void draw() override {
@ -1162,7 +1172,7 @@ EX namespace product {
}
};
EX int cwall_offset, cwall_mask, actual_view_level;
EX int cwall_offset, cwall_mask, actual_view_level, csteps;
EX void drawcell_stack(cellwalker cw, transmatrix V) {
cell *c = cw.at;
@ -1874,6 +1884,13 @@ EX namespace nisot {
asonov::set_flags();
return 0;
}
else if(argis("-prodperiod")) {
PHASEFROM(2);
if(prod) stop_game();
shift(); product::csteps = argi();
hybrid::reconfigure();
return 0;
}
return 1;
});

View File

@ -43,6 +43,13 @@ EX int gmod(int i, int j) {
EX int zgmod(int a, int b) { return b ? gmod(a, b) : a; }
EX int szgmod(int a, int b) {
if(!b) return a;
a = gmod(a, b);
if(2*a >= b) return a - b;
return a;
}
EX int gdiv(int i, int j) {
return (i - gmod(i, j)) / j;
}