From a47dbc5dd57c0b135284c3a27c62a2afe3d57f73 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sun, 26 Mar 2023 00:37:08 +0100 Subject: [PATCH] fixed some crashes in embedding+arb --- aperiodic-hat.cpp | 8 ++++---- arbitrile.cpp | 21 ++++++++++++++++++--- archimedean.cpp | 2 ++ embeddings.cpp | 5 ++++- sky.cpp | 20 ++++++++++++++++---- 5 files changed, 44 insertions(+), 12 deletions(-) diff --git a/aperiodic-hat.cpp b/aperiodic-hat.cpp index 8b7e862a..df9b5edc 100644 --- a/aperiodic-hat.cpp +++ b/aperiodic-hat.cpp @@ -602,10 +602,10 @@ struct hrmap_hat : hrmap { bool emb = embedded_plane; if(emb) { - vl = cgi.emb->actual_to_base(vl); vl[2] = 1; - vr = cgi.emb->actual_to_base(vr); vr[2] = 1; - xvl = cgi.emb->actual_to_base(xvl); xvl[2] = 1; - xvr = cgi.emb->actual_to_base(xvr); xvr[2] = 1; + vl = cgi.emb->actual_to_base(vl); + vr = cgi.emb->actual_to_base(vr); + xvl = cgi.emb->actual_to_base(xvl); + xvr = cgi.emb->actual_to_base(xvr); geom3::light_flip(true); } diff --git a/arbitrile.cpp b/arbitrile.cpp index 8cec9925..942512c5 100644 --- a/arbitrile.cpp +++ b/arbitrile.cpp @@ -1393,12 +1393,22 @@ EX transmatrix get_adj(arbi_tiling& c, int t, int dl, int t1, int xdl, bool xmir hyperpoint vl = sh.vertices[dl]; hyperpoint vr = sh.vertices[dr]; + hyperpoint xvl = xsh.vertices[xdl]; + hyperpoint xvr = xsh.vertices[xdr]; + + bool emb = embedded_plane; + if(emb) { + vl = cgi.emb->actual_to_base(vl); + vr = cgi.emb->actual_to_base(vr); + xvl = cgi.emb->actual_to_base(xvl); + xvr = cgi.emb->actual_to_base(xvr); + geom3::light_flip(true); + } + hyperpoint vm = get_midedge(sh.edges[dl], vl, vr); transmatrix rm = gpushxto0(vm); - hyperpoint xvl = xsh.vertices[xdl]; - hyperpoint xvr = xsh.vertices[xdr]; hyperpoint xvm = get_midedge(xsh.edges[xdl], xvl, xvr); transmatrix xrm = gpushxto0(xvm); @@ -1428,7 +1438,12 @@ EX transmatrix get_adj(arbi_tiling& c, int t, int dl, int t1, int xdl, bool xmir println(hlog, hdist(vl, Res * xvr), " # ", hdist(vr, Res * xvl)); throw hr_exception("error in arb::get_adj"); } - + + if(emb) { + Res = cgi.emb->base_to_actual(Res); + geom3::light_flip(false); + } + return Res; } diff --git a/archimedean.cpp b/archimedean.cpp index 3ff929ee..df8161e1 100644 --- a/archimedean.cpp +++ b/archimedean.cpp @@ -1089,6 +1089,8 @@ auto hook = #if MAXMDIM >= 4 auto hooksw = addHook(hooks_swapdim, 100, [] { + if(!arcm::in()) return; + dynamicval g(geometry, gNormal); dynamicval gv(variation, eVariation::pure); dynamicval gi(cgip, find_alt_cgip()); diff --git a/embeddings.cpp b/embeddings.cpp index b5e05c03..99a656ec 100644 --- a/embeddings.cpp +++ b/embeddings.cpp @@ -618,7 +618,10 @@ struct emb_euc_in_hyp : emb_actual { hyperpoint base_to_actual(hyperpoint h) override { h[3] = h[2]; h[2] = 0; return parabolic13(h[0], h[1]) * C0; } - hyperpoint actual_to_base(hyperpoint h) override { return deparabolic13(h); } + hyperpoint actual_to_base(hyperpoint h) override { + hyperpoint h1 = deparabolic13(h); h1[2] = 1; + return h1; + } transmatrix actual_to_base(const transmatrix& T) override { hyperpoint h = deparabolic13(T * C0); return eupush(h[0], h[1]); } ld anim_center_z() override { return vid.depth; } }; diff --git a/sky.cpp b/sky.cpp index 03d6893d..811ce3c1 100644 --- a/sky.cpp +++ b/sky.cpp @@ -601,6 +601,8 @@ EX void make_air() { bool missing = false; + auto cgi1 = &cgi; + if(1) { //shot::take("airtest.png", drawqueue); dynamicval v(vid, vid); @@ -627,13 +629,18 @@ EX void make_air() { pconf.stretch = 1; pmodel = mdDisk; - auto cgi1 = &cgi; - vid.always3 = false; geom3::apply_always3(); check_cgi(); missing = !(cgi.state & 2); - swap_if_missing(missing); + cgi.prepare_basics(); + geom3::swap_direction = -1; + if(missing) { + swap(cgi.emb, cgi1->emb); + swap_if_missing(missing); + swap(cgi.emb, cgi1->emb); + } + cgi.require_shapes(); eGeometry orig = geometry; @@ -682,7 +689,12 @@ EX void make_air() { GLERR("after draw"); geom3::apply_always3(); - swap_if_missing(missing); + geom3::swap_direction = +1; + if(missing) { + swap(cgi.emb, cgi1->emb); + swap_if_missing(missing); + swap(cgi.emb, cgi1->emb); + } check_cgi(); calcparam(); GLERR("after make_air");