diff --git a/classes.cpp b/classes.cpp index 7e0baed9..d502a7c5 100644 --- a/classes.cpp +++ b/classes.cpp @@ -741,7 +741,7 @@ enum eGeometry { enum eGeometryClass { gcHyperbolic, gcEuclid, gcSphere, gcSolNIH, gcNil, gcProduct, gcSL2 }; -enum class eVariation { bitruncated, pure, goldberg, irregular, dual, untruncated, warped, unrectified, subcubes, coxeter, dual_subcubes, bch }; +enum class eVariation { bitruncated, pure, goldberg, irregular, dual, untruncated, warped, unrectified, subcubes, coxeter, dual_subcubes, bch, bch_oct }; typedef int modecode_t; diff --git a/fake.cpp b/fake.cpp index efd8a729..df1ab115 100644 --- a/fake.cpp +++ b/fake.cpp @@ -34,7 +34,7 @@ EX namespace fake { if(arcm::in() && PURE) return true; if(WDIM == 2) return false; if(among(geometry, gBitrunc3)) return false; - if(reg3::in() && !among(variation, eVariation::pure, eVariation::subcubes, eVariation::coxeter)) return false; + if(reg3::in() && !among(variation, eVariation::pure, eVariation::subcubes, eVariation::coxeter, eVariation::bch_oct)) return false; return euc::in() || reg3::in(); } diff --git a/geom-exp.cpp b/geom-exp.cpp index 28423459..4cad5e9d 100644 --- a/geom-exp.cpp +++ b/geom-exp.cpp @@ -1259,6 +1259,11 @@ int read_geom_args() { set_variation(eVariation::bch); shift(); reg3::subcube_count = argi(); } + else if(argis("-bch-oct")) { + PHASEFROM(2); + set_variation(eVariation::bch_oct); + shift(); reg3::subcube_count = argi(); + } else if(argis("-coxeter")) { PHASEFROM(2); set_variation(eVariation::coxeter); diff --git a/geometry.cpp b/geometry.cpp index d9640127..64463373 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -530,7 +530,7 @@ static const ld hcrossf7 = 0.620672, hexf7 = 0.378077, tessf7 = 1.090550, hexhex EX bool scale_used() { return (shmup::on && geometry == gNormal && BITRUNCATED) ? (cheater || autocheat) : true; } EX bool is_subcube_based(eVariation var) { - return among(var, eVariation::subcubes, eVariation::dual_subcubes, eVariation::bch); + return among(var, eVariation::subcubes, eVariation::dual_subcubes, eVariation::bch, eVariation::bch_oct); } EX bool is_reg3_variation(eVariation var) { diff --git a/graph.cpp b/graph.cpp index 3b077c89..6d925d20 100644 --- a/graph.cpp +++ b/graph.cpp @@ -3781,7 +3781,7 @@ EX int get_darkval(cell *c, int d) { const int darkval_kite[12] = {0, 2, 0, 2, 4, 4, 6, 6, 6, 6, 6, 6}; const int darkval_nil[8] = {6,6,0,3,6,6,0,3}; const int darkval_nih[11] = {0,2,0,2,4,6,6,6,6,6,6}; - if(among(variation, eVariation::dual_subcubes, eVariation::bch)) { + if(among(variation, eVariation::dual_subcubes, eVariation::bch, eVariation::bch_oct)) { int v = reg3::get_face_vertex_count(c, d); return v-3; } diff --git a/reg3.cpp b/reg3.cpp index 41a106d4..1802d61c 100644 --- a/reg3.cpp +++ b/reg3.cpp @@ -621,6 +621,49 @@ EX namespace reg3 { } } + EX void generate_bch_oct() { + if(S7 != 6) throw hr_exception("generate_bch_oct but no cubes"); + const int sub = subcube_count; + if(1) { + auto vx = abs(cgi.heptshape->faces[0][0][0]); + auto vz = abs(cgi.heptshape->faces[0][0][3]); + array co; + // vx = 1; vz = 0; + for(co[0]=-sub; co[0] sgn = {1,1,1}; + if((co[1] ^ co[0]) & 1) co1[1]++, sgn[1] = -1; + if((co[2] ^ co[0]) & 1) co1[2]++, sgn[2] = -1; + + hyperpoint ctr = Hypc; + ctr[3] = vz * sub; + + auto pt = [&] (int m, ld x0, ld x1, ld x2) { + hyperpoint res = ctr; + auto x = make_array(x0, x1, x2); + for(int i=0; i<3; i++) + res[i] = vx * (co1[i] + x[(m+i)%3] * sgn[i]); + return res; + }; + + for(int it=0; it<2; it++) { + cgi.subshapes.emplace_back(); + auto &ss = cgi.subshapes.back(); + for(int m=0; m<3; m++) { + ss.faces.push_back({pt(m,0,0,0), pt(m,1,0,0), pt(m,1,0,.5), pt(m,.5,0,1), pt(m,0,0,1)}); + ss.faces.push_back({pt(m,1,0,0), pt(m,1,0,.5), pt(m,1,.5,0) }); + } + ss.faces.push_back({pt(0,1,0,.5), pt(0,1,.5,0), pt(0,.5,1,0), pt(0,0,1,.5), pt(0,0,.5,1), pt(0,.5,0,1)}); + for(int d=0; d<3; d++) + co1[d] += sgn[d], sgn[d] *= -1; + println(hlog, ss.faces); + } + } + } + } + EX void generate_subcells() { switch(variation) { @@ -636,6 +679,10 @@ EX namespace reg3 { generate_special_subcubes(true); break; + case eVariation::bch_oct: + generate_bch_oct(); + break; + case eVariation::coxeter: generate_coxeter(coxeter_param); break;