diff --git a/classes.cpp b/classes.cpp index 13eedffa..8f2dfac3 100644 --- a/classes.cpp +++ b/classes.cpp @@ -512,8 +512,8 @@ static const flagtype qsZEBRA = qANYQ | qSMALL | qBOUNDED | qZEBRA; static const flagtype qsFIELD = qANYQ | qFIELD | qBOUNDED; static const flagtype qsDOCKS = qANYQ | qSMALL | qBOUNDED | qDOCKS; static const flagtype qsSMALLB = qSMALL | qBOUNDED; -static const flagtype qsSMALLBF = qsSMALLB | qsFIELD; -static const flagtype qsSMALLBE = qsSMALLB | qELLIPTIC; +static const flagtype qsSMALLBF = qsSMALLB | qsFIELD | qANYQ; +static const flagtype qsSMALLBE = qsSMALLB | qELLIPTIC | qANYQ; static const flagtype qsBP = qBINARY | qPENROSE; EX geometryinfo1 giEuclid2 = { gcEuclid, 2, 2, 3, {1,1, 0,0 } }; @@ -526,7 +526,7 @@ EX geometryinfo1 giSphere3 = { gcSphere, 3, 3, 4, {1,1, 1,+1} }; EX geometryinfo1 giSol = { gcSol, 3, 3, 4, {1,1, 1,0 } }; EX geometryinfo1 giNil = { gcNil, 3, 3, 4, {1,1, 1,0 } }; -EX geometryinfo1 giProduct = { /* will be filled in product::configure() */ }; +EX geometryinfo1 giProduct = { gcSL2, 3, 3, 4, {1,1, 1,0 } /* will be filled in product::configure() */ }; EX geometryinfo1 giSL2 = { gcSL2, 3, 3, 4, {1,1,-1,-1} }; /** list of available geometries */ diff --git a/geom-exp.cpp b/geom-exp.cpp index 79bcf370..b8c63675 100644 --- a/geom-exp.cpp +++ b/geom-exp.cpp @@ -402,7 +402,9 @@ vector list3d = { gCell5, gKiteDart3, gSol, gNil, gProduct, gRotSpace }; -void ge_select_tiling(const vector& lst) { +bool select_dims, select_quotient; + +void ge_select_tiling() { cmode = sm::SIDE | sm::MAYDARK; gamescreen(0); @@ -412,15 +414,20 @@ void ge_select_tiling(const vector& lst) { dialog::addInfo("3D geometries are a work in progress", 0x800000); */ char letter = 'a'; - for(eGeometry i: lst) { - bool on = geometry == i; - dynamicval cg(geometry, eGeometry(i)); + for(int i=0; i cg(geometry, g); if(archimedean && !CAP_ARCM) continue; if(cryst && !CAP_CRYSTAL) continue; if(geometry == gFieldQuotient && !CAP_FIELD) continue; + if((!!quotient) ^ select_quotient) continue; + if((WDIM == 3) ^ select_dims) continue; dialog::addBoolItem(XLAT( - (geometry == gProduct && !hybri) ? XLAT("current geometry x E") : - (geometry == gRotSpace && !hybri) ? XLAT("space of rotations in current geometry") : + (geometry == gProduct && in_2d) ? XLAT("current geometry x E") : + (geometry == gRotSpace && in_2d) ? XLAT("space of rotations in current geometry") : ginf[i].menu_displayed_name), on, letter++); dialog::lastItem().value += validclasses[land_validity(specialland).quality_level]; dialog::add_action(dual::mayboth([i] { @@ -472,6 +479,10 @@ void ge_select_tiling(const vector& lst) { })); } + dialog::addBreak(100); + dialog::addBoolItem_action(XLAT("show quotient spaces"), select_quotient, 'Q'); + dialog::addBoolItem_action(XLAT("three-dimensional"), select_dims, 'D'); + dual::add_choice(); dialog::addBack(); dialog::display(); @@ -507,7 +518,7 @@ EX void showEuclideanMenu() { dialog::init(XLAT("experiment with geometry")); dialog::addSelItem(XLAT("basic tiling"), XLAT(ginf[geometry].tiling_name), 't'); - dialog::add_action_push([] { ge_select_tiling(tilinglist); }); + dialog::add_action([] { select_quotient = quotient; select_dims = WDIM == 3; pushScreen(ge_select_tiling); }); int ts = ginf[geometry].sides; int tv = ginf[geometry].vertex; @@ -636,11 +647,11 @@ EX void showEuclideanMenu() { else dialog::addSelItem(XLAT("quotient space"), XLAT(qstring), 'q'); - dialog::add_action_push([] { ge_select_tiling(quotientlist); }); + dialog::add_action([] { select_quotient = !quotient; select_dims = WDIM == 3; pushScreen(ge_select_tiling); }); #if MAXMDIM >= 4 dialog::addSelItem(XLAT("dimension"), its(WDIM), 'd'); - dialog::add_action_push([] { ge_select_tiling(list3d); }); + dialog::add_action([] { select_quotient = quotient; select_dims = WDIM != 3; pushScreen(ge_select_tiling); }); #endif #if CAP_IRR diff --git a/nonisotropic.cpp b/nonisotropic.cpp index fa3c6139..373821cd 100644 --- a/nonisotropic.cpp +++ b/nonisotropic.cpp @@ -573,13 +573,12 @@ EX namespace hybrid { EX geometry_information *underlying_cgip; EX void configure(eGeometry g) { - if(vid.always3) { vid.always3 = false; geom3::apply_always3(); } + if(WDIM == 3) return; check_cgi(); - cgi.prepare_basics(); + cgi.require_basics(); underlying = geometry; underlying_cgip = cgip; bool sph = sphere; - geometry = g; auto keep = ginf[g].menu_displayed_name; ginf[g] = ginf[underlying]; ginf[g].menu_displayed_name = keep; diff --git a/system.cpp b/system.cpp index 090a0143..b61be7e3 100644 --- a/system.cpp +++ b/system.cpp @@ -1179,7 +1179,10 @@ EX void set_geometry(eGeometry target) { int old_DIM = GDIM; stop_game(); ors::reset(); - if(among(target, gProduct, gRotSpace)) hybrid::configure(target); + if(among(target, gProduct, gRotSpace)) { + if(vid.always3) { vid.always3 = false; geom3::apply_always3(); } + hybrid::configure(target); + } geometry = target; if(chaosmode && bounded) chaosmode = false;