diff --git a/graph.cpp b/graph.cpp index 6c0e0e43..ad4dfe24 100644 --- a/graph.cpp +++ b/graph.cpp @@ -2395,8 +2395,10 @@ int countMinesAround(cell *c) { } transmatrix applyPatterndir(cell *c, const patterns::patterninfo& si) { + if(gp::on || irr::on || binarytiling) return Id; transmatrix V = ddspin(c, si.dir, S42); - if(si.reflect) return V * Mirror; + if(si.reflect) return V * Mirror; + if(syntetic) return V * iddspin(c, 0, S42); return V; } diff --git a/pattern2.cpp b/pattern2.cpp index 57d4daf1..a6eb593c 100644 --- a/pattern2.cpp +++ b/pattern2.cpp @@ -873,17 +873,12 @@ namespace patterns { si.dir = 0; si.reflect = false; si.id = ctof(c); si.symmetries = c->type; - if(syntetic) { - si.id = synt::id_of(c->master); - return si; - } - if(binarytiling) { if(pat == PAT_SINGLETYPE) si.id = 0; si.dir = 2; return si; } - + if(pat == PAT_SINGLETYPE) { si.id = 0; si.symmetries = 1; if(sub & SPF_TWOCOL) si.id = c->type & 1; @@ -891,6 +886,17 @@ namespace patterns { return si; } + if(syntetic && pat == PAT_SIBLING) { + int id = synt::id_of(c->master); + si.id = synt::tilegroup[id]; + si.symmetries = synt::periods[si.id]; + si.dir = synt::groupoffset[id]; + if((sub & SPF_EXTRASYM) && synt::have_symmetry && synt::tilegroup[id^1] < synt::tilegroup[id]) + si.id = synt::tilegroup[id^1], + si.reflect = true; + return si; + } + if(pat == PAT_ZEBRA && stdhyperbolic) { si.id = zebra40(c); // 4 to 43 @@ -1468,7 +1474,7 @@ namespace patterns { if(stdhyperbolic || euclid) dialog::addBoolItem(XLAT("Palace Pattern"), (whichPattern == PAT_PALACE), PAT_PALACE); - if(nonbitrunc && S3 == 4) + if((nonbitrunc && S3 == 4) || (syntetic && synt::support_chessboard())) dialog::addBoolItem(XLAT("chessboard"), (whichPattern == PAT_CHESS), PAT_CHESS); if(a38 || a46 || euclid || S3 == 4 || S7 == 4) @@ -1476,6 +1482,9 @@ namespace patterns { if(sphere) dialog::addBoolItem(XLAT("siblings"), (whichPattern == PAT_SIBLING), PAT_SIBLING); + + if(syntetic) + dialog::addBoolItem(XLAT("Archimedean"), (whichPattern == PAT_SIBLING), PAT_SIBLING); if(euclid) dialog::addBoolItem(XLAT("torus pattern"), (whichPattern == PAT_FIELD), PAT_FIELD); @@ -1520,7 +1529,10 @@ namespace patterns { dialog::addBoolItem(XLAT("symmetry 0-2"), subpattern_flags & SPF_SYM02, '2'); dialog::addBoolItem(XLAT("symmetry 0-3"), subpattern_flags & SPF_SYM03, '3'); } - if(euclid && among(whichPattern, PAT_COLORING, 0)) + if(euclid && among(whichPattern, PAT_COLORING, 0) && !syntetic) + dialog::addBoolItem(XLAT("extra symmetries"), subpattern_flags & SPF_EXTRASYM, '='); + + if(syntetic && synt::have_symmetry && whichPattern == PAT_SIBLING) dialog::addBoolItem(XLAT("extra symmetries"), subpattern_flags & SPF_EXTRASYM, '='); if(whichPattern == PAT_SINGLETYPE) { diff --git a/syntetic.cpp b/syntetic.cpp index f909c1cf..53d9d9dd 100644 --- a/syntetic.cpp +++ b/syntetic.cpp @@ -4,14 +4,14 @@ namespace synt { #define SDEBUG(x) if(debug_geometry) { doindent(); x; fflush(stdout); } +static const int sfPH = 1; +static const int sfLINE = 2; + // Marek-snub vector faces = {3, 6, 6, 6}; vector adj = {1, 0, 2, 3}; vector invert = {false, false, true, false}; -vector nflags; - -static const int sfPH = 1; -static const int sfLINE = 2; +vector nflags = {sfPH | sfLINE, 0, 0, 0}; bool have_ph, have_line, have_symmetry; @@ -559,6 +559,10 @@ int support_graveyard() { 0; } +bool support_chessboard() { + return 0; + } + bool pseudohept(int id) { return flags[id] & synt::sfPH; } diff --git a/textures.cpp b/textures.cpp index f2d8b760..029c117e 100644 --- a/textures.cpp +++ b/textures.cpp @@ -266,10 +266,8 @@ int celltriangles(cell *c) { return c->type; } -#define no_patterndir (gp::on || irr::on || binarytiling) - array findTextureTriangle(cell *c, patterns::patterninfo& si, int i) { - transmatrix M = no_patterndir ? ggmatrix(c) : ggmatrix(c) * applyPatterndir(c, si); + transmatrix M = ggmatrix(c) * applyPatterndir(c, si); return make_array(M * C0, M * get_corner_position(c, i), M * get_corner_position(c, i+1)); } @@ -299,7 +297,7 @@ void mapTexture(cell *c, textureinfo& mi, patterns::patterninfo &si, const trans mi.symmetries = si.symmetries; mi.current_type = celltriangles(c); - mi.M = no_patterndir ? T : T * applyPatterndir(c, si); + mi.M = T * applyPatterndir(c, si); mi.triangles.clear(); for(int i=0; itype; i++) { @@ -351,7 +349,7 @@ bool texture_config::apply(cell *c, const transmatrix &V, int col) { set_floor(shFullFloor); qfi.tinf = &mi; - qfi.spin = no_patterndir ? Id : applyPatterndir(c, si); + qfi.spin = applyPatterndir(c, si); if(grid_color) { draw_floorshape(c, V, shFullFloor, 0, PPR_FLOOR);