From c35705cc5c2377b235542dee6b2748a229c4e239 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sat, 9 May 2020 18:32:16 +0200 Subject: [PATCH] fixed hybrid bitruncated ray: works after clear map --- geometry.cpp | 2 +- nonisotropic.cpp | 23 ++++++++++++++++++----- raycaster.cpp | 39 ++++++++++++++++++++------------------- 3 files changed, 39 insertions(+), 25 deletions(-) diff --git a/geometry.cpp b/geometry.cpp index 81262f12..c0f8b799 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -329,7 +329,7 @@ hpcshape int SD3, SD6, SD7, S12, S14, S21, S28, S42, S36, S84; - vector walloffsets; + vector> walloffsets; vector> symmetriesAt; diff --git a/nonisotropic.cpp b/nonisotropic.cpp index 23feedad..59ea8ce9 100644 --- a/nonisotropic.cpp +++ b/nonisotropic.cpp @@ -1277,14 +1277,13 @@ EX namespace hybrid { } } - EX vector samples; - EX int wall_offset(cell *c) { int id = hybrid::underlying == gArchimedean ? arcm::id_of(c->master) + 20 * arcm::parent_index_of(c->master) : shvid(c); - if(isize(cgi.walloffsets) <= id) cgi.walloffsets.resize(id+1, -1); - int &wo = cgi.walloffsets[id]; + if(isize(cgi.walloffsets) <= id) cgi.walloffsets.resize(id+1, {-1, nullptr}); + auto &wop = cgi.walloffsets[id]; + int &wo = wop.first; + if(!wop.second) wop.second = c; if(wo == -1) { - samples.push_back(c); cell *c1 = hybrid::get_where(c).first; wo = isize(cgi.shWall3D); int won = wo + c->type; @@ -1335,6 +1334,20 @@ EX namespace hybrid { return wo; } + auto clear_samples = addHook(hooks_clearmemory, 40, [] () { + for(auto& c: cgis) for(auto& v: c.second.walloffsets) + v.second = nullptr; + }); + + EX vector> gen_sample_list() { + if(!hybri) return {make_pair(0, centerover), make_pair(centerover->type, nullptr)}; + vector> result; + for(auto& v: cgi.walloffsets) if(v.first >= 0) result.push_back(v); + sort(result.begin(), result.end()); + result.emplace_back(isize(cgi.wallstart)-1, nullptr); + return result; + } + vector to_link; EX void will_link(cell *c) { if(pmap && ((hrmap_hybrid*) pmap)->twisted) to_link.push_back(c); } diff --git a/raycaster.cpp b/raycaster.cpp index 9bc494db..df1bd335 100644 --- a/raycaster.cpp +++ b/raycaster.cpp @@ -189,10 +189,10 @@ void enable_raycaster() { } deg = 0; - if(hybri) - for(auto c: hybrid::samples) deg = max(deg, c->type); - else - deg = centerover->type; + + auto samples = hybrid::gen_sample_list(); + for(int i=0; iuSides, centerover->type); } - vector sa = {centerover}; - if(hybri) sa = hybrid::samples; + auto sa = hybrid::gen_sample_list(); - vector ms; - for(auto c: sa) { - for(int j=0; jtype; j++) { - if(hybri) - ms.push_back(hybrid::ray_iadj(c, j)); - else - ms.push_back(currentmap->iadj(c, j)); - } + vector ms(sa.back().first, Id); + + for(auto& p: sa) { + int id = p.first; + cell *c = p.second; + if(!c) continue; + for(int j=0; jtype; j++) + ms[id+j] = hybrid::ray_iadj(c, j); } + // println(hlog, ms); + if(!sol && !nil && reflect_val) { if(BITRUNCATED) exit(1); for(int j=0; jtype; j++) { @@ -1201,11 +1202,11 @@ EX void cast() { } if(prod) { - int id = 0; - for(auto c: sa) { - ms[id+c->type-2] = Id; - ms[id+c->type-1] = Id; - id += c->type; + for(auto p: sa) { + int id =p.first; + if(id == 0) continue; + ms[id-2] = Id; + ms[id-1] = Id; } }