1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-02-08 23:20:12 +00:00

reg3:: subcubes:: neater again

This commit is contained in:
Zeno Rogue 2021-07-08 20:34:49 +02:00
parent 670f315df5
commit 2a7d932703

View File

@ -320,45 +320,47 @@ EX namespace reg3 {
for(co[1]=-sub; co[1]<=sub; co[1]+=s) for(co[1]=-sub; co[1]<=sub; co[1]+=s)
for(co[2]=-sub; co[2]<=sub; co[2]+=s) for(co[2]=-sub; co[2]<=sub; co[2]+=s)
if(((co[0]^co[1]^1)&1) && ((co[0]^co[2]^1)&1)) { if(((co[0]^co[1]^1)&1) && ((co[0]^co[2]^1)&1)) {
vector<hyperpoint> dirs;
vector<int> dirlimits;
vector<transmatrix> mirrors;
hyperpoint ctr = Hypc; hyperpoint ctr = Hypc;
ctr[3] = vz * sub; ctr[3] = vz * sub;
struct direction {
hyperpoint dir;
int limit;
transmatrix mirror;
void flip() { dir = -dir; limit = 200 - limit; }
};
array<direction, 3> di;
int mi = 0; int mi = 0;
for(int i=0; i<3; i++)
if(co[i] != -sub && co[i] != +sub) {
dirs.push_back(ctangent(i, vx));
dirlimits.push_back(999);
mirrors.push_back(cpush(i, -step/2) * cmirror(i) * cpush(i, step/2));
}
for(int i=0; i<3; i++) { for(int i=0; i<3; i++) {
ctr[i] += co[i] * vx; ctr[i] += co[i] * vx;
if(co[i] == sub) { auto& dii = di[i];
mi++; if(co[i] >= 0) {
dirs.push_back(ctangent(i, vx)); dii.dir = ctangent(i, vx);
dirlimits.push_back(0); dii.limit = sub - co[i];
mirrors.push_back(cpush(i, +step/2) * cmirror(i) * cpush(i, -step/2)); dii.mirror = cpush(i, +step/2) * cmirror(i) * cpush(i, -step/2);
} }
else if(co[i] == -sub) { else {
mi++; dii.dir = ctangent(i, -vx);
dirs.push_back(ctangent(i, -vx)); dii.limit = co[i] + sub;
dirlimits.push_back(0); dii.mirror = cpush(i, -step/2) * cmirror(i) * cpush(i, +step/2);
mirrors.push_back(cpush(i, -step/2) * cmirror(i) * cpush(i, +step/2));
} }
if(dii.limit == 0) mi++;
} }
sort(di.begin(), di.end(), [] (direction& d1, direction& d2) { return d1.limit > d2.limit; });
cgi.subshapes.emplace_back(); cgi.subshapes.emplace_back();
auto &ss = cgi.subshapes.back(); auto &ss = cgi.subshapes.back();
auto pt = [&] (ld x, ld y, ld z) { auto pt = [&] (ld x, ld y, ld z) {
transmatrix M = Id; transmatrix M = Id;
if(x > dirlimits[0]) x = -x, M = mirrors[0] * M; if(x > di[0].limit) x = -x, M = di[0].mirror * M;
if(y > dirlimits[1]) y = -y, M = mirrors[1] * M; if(y > di[1].limit) y = -y, M = di[1].mirror * M;
if(z > dirlimits[2]) z = -z, M = mirrors[2] * M; if(z > di[2].limit) z = -z, M = di[2].mirror * M;
return normalize(M * (ctr + dirs[0] * x + dirs[1] * y + dirs[2] * z)); return normalize(M * (ctr + di[0].dir * x + di[1].dir * y + di[2].dir * z));
}; };
auto add_face = [&] (std::initializer_list<hyperpoint> vh) { auto add_face = [&] (std::initializer_list<hyperpoint> vh) {
@ -374,17 +376,17 @@ EX namespace reg3 {
add_face({pt(0,.5,s), pt(.5,0,s), pt(0,-.5,s), pt(-.5,0,s)}); add_face({pt(0,.5,s), pt(.5,0,s), pt(0,-.5,s), pt(-.5,0,s)});
else else
add_face({pt(-1,-1,s), pt(-1,+1,s), pt(+1,+1,s), pt(+1,-1,s)}); add_face({pt(-1,-1,s), pt(-1,+1,s), pt(+1,+1,s), pt(+1,-1,s)});
tie(dirs[0], dirs[1], dirs[2]) = make_tuple(dirs[1], dirs[2], dirs[0]); tie(di[0], di[1], di[2]) = make_tuple(di[1], di[2], di[0]);
} }
} }
if(bch) for(int u=0; u<8; u++) { if(bch) for(int u=0; u<8; u++) {
for(int j=0; j<3; j++) if((u>>j)&1) dirs[j] = -dirs[j]; for(int j=0; j<3; j++) if((u>>j)&1) di[j].flip();
add_face({pt(0,.5,1), pt(0,1,.5), pt(.5,1,0), pt(1,.5,0), pt(1,0,.5), pt(.5,0,1)}); add_face({pt(0,.5,1), pt(0,1,.5), pt(.5,1,0), pt(1,.5,0), pt(1,0,.5), pt(.5,0,1)});
for(int j=0; j<3; j++) if((u>>j)&1) dirs[j] = -dirs[j]; for(int j=0; j<3; j++) if((u>>j)&1) di[j].flip();
} }
} }
else if(mi == 1) { else if(mi == 1) {
auto& M = mirrors[2]; auto& M = di[2].mirror;
for(int s: {-1, 1}) { for(int s: {-1, 1}) {
if(bch) if(bch)
add_face({pt(0,h,s), pt(h,0,s), pt(0,-h,s), pt(-h,0,s)}); add_face({pt(0,h,s), pt(h,0,s), pt(0,-h,s), pt(-h,0,s)});
@ -395,23 +397,23 @@ EX namespace reg3 {
add_face({pt(1,0,-.5), pt(1,-.5,0), M*pt(1,0,-.5), pt(1,.5,0)}); add_face({pt(1,0,-.5), pt(1,-.5,0), M*pt(1,0,-.5), pt(1,.5,0)});
else else
add_face({pt(-1,-1,-1), pt(-1,+1,-1), pt(-1,+1,+1), pt(-1,-1,+1)}); add_face({pt(-1,-1,-1), pt(-1,+1,-1), pt(-1,+1,+1), pt(-1,-1,+1)});
tie(dirs[0], dirs[1]) = make_tuple(dirs[1], -dirs[0]); tie(di[0], di[1]) = make_tuple(di[1], di[0]); di[0].flip();
} }
} }
if(bch) for(ld s: {-1, 1}) for(int i=0; i<4; i++) { if(bch) for(ld s: {-1, 1}) for(int i=0; i<4; i++) {
add_face({pt(0,.5,s), pt(0,1,s/2), pt(.5,1,0), pt(1,.5,0), pt(1,0,s/2), pt(.5,0,s)}); add_face({pt(0,.5,s), pt(0,1,s/2), pt(.5,1,0), pt(1,.5,0), pt(1,0,s/2), pt(.5,0,s)});
tie(dirs[0], dirs[1]) = make_tuple(dirs[1], -dirs[0]); tie(di[0], di[1]) = make_tuple(di[1], di[0]); di[0].flip();
} }
} }
else { else {
transmatrix spi = mi == 2 ? mirrors[1] * mirrors[2] : mirrors[0] * mirrors[1]; transmatrix spi = mi == 2 ? di[1].mirror * di[2].mirror : di[0].mirror * di[1].mirror;
if(cgi.loop == 5) spi = spi * spi; if(cgi.loop == 5) spi = spi * spi;
vector<transmatrix> spi_power = {Id}; vector<transmatrix> spi_power = {Id};
for(int i=1; i<cgi.loop; i++) spi_power.push_back(spi_power.back() * spi); for(int i=1; i<cgi.loop; i++) spi_power.push_back(spi_power.back() * spi);
if(mi == 2) { if(mi == 2) {
for(auto P: spi_power) { for(auto P: spi_power) {
if(bch) if(bch)
add_face({P*pt(.5,0,-1), P*pt(0,-.5,-1), P*pt(-.5,0,-1), P*mirrors[1]*pt(0,-.5,-1)}); add_face({P*pt(.5,0,-1), P*pt(0,-.5,-1), P*pt(-.5,0,-1), P*pt(0,.5,-1)});
else else
add_face({P*pt(-1,-1,-1), P*pt(1,-1,-1), P*spi*pt(1,-1,-1), P*spi*pt(-1,-1,-1)}); add_face({P*pt(-1,-1,-1), P*pt(1,-1,-1), P*spi*pt(1,-1,-1), P*spi*pt(-1,-1,-1)});
} }
@ -430,8 +432,8 @@ EX namespace reg3 {
for(int j=0; j<2; j++) for(int j=0; j<2; j++)
for(auto P1: spi_power) { for(auto P1: spi_power) {
auto T = face_dirs[i]; auto T = face_dirs[i];
if(j == 0) T = T * P1 * mirrors[1] * mirrors[2]; if(j == 0) T = T * P1 * di[1].mirror * di[2].mirror;
if(j == 1) T = T * P1 * mirrors[2] * mirrors[0]; if(j == 1) T = T * P1 * di[2].mirror * di[0].mirror;
bool fnd = false; bool fnd = false;
for(auto& F: face_dirs) for(auto& F: face_dirs)
for(auto P: spi_power) for(auto P: spi_power)