mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-10-16 06:37:38 +00:00
refactored shvid_full and wall_offset as virtual functions
This commit is contained in:
@@ -1355,88 +1355,6 @@ EX namespace hybrid {
|
||||
}
|
||||
}
|
||||
|
||||
EX int wall_offset(cell *c) {
|
||||
if(GOLDBERG || INVERSE) {
|
||||
/* a bit slow... */
|
||||
cell *c1 = WDIM == 2 ? c : get_where(c).first;
|
||||
gp::draw_li = WDIM == 2 ? gp::get_local_info(c1) : PIU(gp::get_local_info(c1));
|
||||
}
|
||||
auto ugeometry = hybri ? hybrid::underlying : geometry;
|
||||
|
||||
int id;
|
||||
|
||||
#if CAP_ARCM
|
||||
if(ugeometry == gArchimedean)
|
||||
id = arcm::id_of(c->master) + 20 * arcm::parent_index_of(c->master);
|
||||
else
|
||||
#endif
|
||||
if(ugeometry == gArbitrary)
|
||||
id = arb::id_of(c->master);
|
||||
else
|
||||
if(PURE && !kite::in() && !bt::in())
|
||||
id = 0;
|
||||
else
|
||||
id = shvid(c);
|
||||
|
||||
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) {
|
||||
cell *c1 = hybri ? hybrid::get_where(c).first : c;
|
||||
wo = isize(cgi.shWall3D);
|
||||
int won = wo + c->type + (WDIM == 2 ? 2 : 0);
|
||||
if(!cgi.wallstart.empty()) cgi.wallstart.pop_back();
|
||||
cgi.reserve_wall3d(won);
|
||||
|
||||
if(prod || WDIM == 2) for(int i=0; i<c1->type; i++) {
|
||||
hyperpoint w;
|
||||
auto f = [&] {
|
||||
/* mirror image of C0 in the axis h1-h2 */
|
||||
hyperpoint h1 = get_corner_position(c1, i);
|
||||
hyperpoint h2 = get_corner_position(c1, i+1);
|
||||
transmatrix T = gpushxto0(h1);
|
||||
T = spintox(T * h2) * T;
|
||||
w = T * C0;
|
||||
w[1] = -w[1];
|
||||
w = iso_inverse(T) * w;
|
||||
};
|
||||
if(prod)
|
||||
((hrmap_hybrid*)currentmap)->in_underlying(f);
|
||||
else
|
||||
f();
|
||||
cgi.walltester[wo + i] = w;
|
||||
}
|
||||
|
||||
for(int i=0; i<c1->type; i++)
|
||||
cgi.make_wall(wo + i, {hybrid::get_corner(c1, i, 0, -1), hybrid::get_corner(c1, i, 0, +1), hybrid::get_corner(c1, i, 1, +1), hybrid::get_corner(c1, i, 1, -1)});
|
||||
|
||||
for(int a: {0,1}) {
|
||||
vector<hyperpoint> l;
|
||||
int z = a ? 1 : -1;
|
||||
hyperpoint ctr = zpush0(z * cgi.plevel/2);
|
||||
for(int i=0; i<c1->type; i++)
|
||||
if(prod || WDIM == 2)
|
||||
l.push_back(hybrid::get_corner(c1, i, 0, z));
|
||||
else {
|
||||
l.push_back(ctr);
|
||||
l.push_back(hybrid::get_corner(c1, i, 0, z));
|
||||
l.push_back(hybrid::get_corner(c1, i+1, 1, z));
|
||||
l.push_back(ctr);
|
||||
l.push_back(hybrid::get_corner(c1, i, 1, z));
|
||||
l.push_back(hybrid::get_corner(c1, i, 0, z));
|
||||
}
|
||||
if(a == 0) std::reverse(l.begin()+1, l.end());
|
||||
cgi.make_wall(won-2+a, l);
|
||||
}
|
||||
|
||||
cgi.wallstart.push_back(isize(cgi.raywall));
|
||||
cgi.compute_cornerbonus();
|
||||
cgi.extra_vertices();
|
||||
}
|
||||
return wo;
|
||||
}
|
||||
|
||||
auto clear_samples = addHook(hooks_clearmemory, 40, [] () {
|
||||
for(auto& c: cgis) for(auto& v: c.second.walloffsets)
|
||||
v.second = nullptr;
|
||||
|
Reference in New Issue
Block a user