mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-06-15 04:44:07 +00:00
two more Euclidean honeycombs; also split buildpolys into subfunctions
This commit is contained in:
parent
b63bcec64b
commit
cb8e34204f
@ -1774,6 +1774,8 @@ vector<geometryinfo> ginf = {
|
|||||||
{"cube", "none", "3D cube tiling", "cube", 6, 4, 0, gcEuclid, 0x30200, {{7, 5}}, eVariation::pure},
|
{"cube", "none", "3D cube tiling", "cube", 6, 4, 0, gcEuclid, 0x30200, {{7, 5}}, eVariation::pure},
|
||||||
{"120c", "none", "120-cell", "120c", 12, 4, qsSMALLB, gcSphere, 0x30400, {{SEE_ALL, SEE_ALL}}, eVariation::pure},
|
{"120c", "none", "120-cell", "120c", 12, 4, qsSMALLB, gcSphere, 0x30400, {{SEE_ALL, SEE_ALL}}, eVariation::pure},
|
||||||
{"e120c", "elliptic", "120-cell (elliptic space)", "e120c", 12, 4, qsSMALLBE, gcSphere, 0x30600, {{SEE_ALL, SEE_ALL}}, eVariation::pure},
|
{"e120c", "elliptic", "120-cell (elliptic space)", "e120c", 12, 4, qsSMALLBE, gcSphere, 0x30600, {{SEE_ALL, SEE_ALL}}, eVariation::pure},
|
||||||
|
{"rhombic","none", "rhombic dodecahedral honeycomb", "rhombic", 12, 4, 0, gcEuclid, 0x31000, {{7, 5}}, eVariation::pure},
|
||||||
|
{"bitrunc","none", "bitruncated cubic honeycomb", "bitrunc", 14, 3, 0, gcEuclid, 0x31200, {{7, 5}}, eVariation::pure},
|
||||||
};
|
};
|
||||||
|
|
||||||
// bits: 9, 10, 15, 16, (reserved for later) 17, 18
|
// bits: 9, 10, 15, 16, (reserved for later) 17, 18
|
||||||
|
@ -214,7 +214,8 @@ enum eLand { laNone, laBarrier, laCrossroads, laDesert, laIce, laCaves, laJungle
|
|||||||
enum eGeometry {
|
enum eGeometry {
|
||||||
gNormal, gEuclid, gSphere, gElliptic, gZebraQuotient, gFieldQuotient, gTorus, gOctagon, g45, g46, g47, gSmallSphere, gTinySphere, gEuclidSquare, gSmallElliptic,
|
gNormal, gEuclid, gSphere, gElliptic, gZebraQuotient, gFieldQuotient, gTorus, gOctagon, g45, g46, g47, gSmallSphere, gTinySphere, gEuclidSquare, gSmallElliptic,
|
||||||
gKleinQuartic, gBolza, gBolza2, gMinimal, gBinaryTiling, gArchimedean,
|
gKleinQuartic, gBolza, gBolza2, gMinimal, gBinaryTiling, gArchimedean,
|
||||||
gMacbeath, gBring, gSchmutzM2, gSchmutzM3, gCrystal, gOctahedron, gBinary3, gCubeTiling, gCell120, gECell120,
|
gMacbeath, gBring, gSchmutzM2, gSchmutzM3, gCrystal, gOctahedron,
|
||||||
|
gBinary3, gCubeTiling, gCell120, gECell120, gRhombic3, gBitrunc3,
|
||||||
gGUARD};
|
gGUARD};
|
||||||
|
|
||||||
enum eGeometryClass { gcHyperbolic, gcEuclid, gcSphere };
|
enum eGeometryClass { gcHyperbolic, gcEuclid, gcSphere };
|
||||||
|
@ -366,6 +366,8 @@ void initConfig() {
|
|||||||
addsaver(sightranges[gCubeTiling], "sight-cubes", 7);
|
addsaver(sightranges[gCubeTiling], "sight-cubes", 7);
|
||||||
addsaver(sightranges[gCell120], "sight-120cell", 2 * M_PI);
|
addsaver(sightranges[gCell120], "sight-120cell", 2 * M_PI);
|
||||||
addsaver(sightranges[gECell120], "sight-120cell-elliptic", M_PI);
|
addsaver(sightranges[gECell120], "sight-120cell-elliptic", M_PI);
|
||||||
|
addsaver(sightranges[gRhombic3], "sight-rhombic", 5.5);
|
||||||
|
addsaver(sightranges[gBitrunc3], "sight-bitrunc", 4.5);
|
||||||
addsaver(smooth_scrolling, "smooth-scrolling", false);
|
addsaver(smooth_scrolling, "smooth-scrolling", false);
|
||||||
addsaver(mouseaim_sensitivity, "mouseaim_sensitivity", 0.01);
|
addsaver(mouseaim_sensitivity, "mouseaim_sensitivity", 0.01);
|
||||||
|
|
||||||
|
89
euclid.cpp
89
euclid.cpp
@ -475,10 +475,47 @@ namespace euclid3 {
|
|||||||
|
|
||||||
int getcoord(coord x, int a);
|
int getcoord(coord x, int a);
|
||||||
|
|
||||||
|
vector<coord> get_shifttable() {
|
||||||
|
static const coord D0 = 1;
|
||||||
|
static const coord D1 = COORDMAX;
|
||||||
|
static const coord D2 = COORDMAX * COORDMAX;
|
||||||
|
vector<coord> shifttable;
|
||||||
|
vector<transmatrix> tmatrix;
|
||||||
|
switch(geometry) {
|
||||||
|
case gCubeTiling:
|
||||||
|
shifttable = { +D0, +D1, +D2 };
|
||||||
|
break;
|
||||||
|
|
||||||
|
case gRhombic3:
|
||||||
|
shifttable = { D0+D1, D0+D2, D1+D2, D1-D2, D0-D2, D0-D1 };
|
||||||
|
break;
|
||||||
|
|
||||||
|
case gBitrunc3:
|
||||||
|
shifttable = { 2*D0, 2*D1, 2*D2, D0+D1+D2, D0+D1-D2, D0-D1-D2, D0-D1+D2 };
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
printf("euclid3::get_shifttable() called in geometry that is not euclid3");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// reverse everything
|
||||||
|
int s = isize(shifttable);
|
||||||
|
for(int i=0; i<s; i++) shifttable.push_back(-shifttable[i]);
|
||||||
|
return shifttable;
|
||||||
|
}
|
||||||
|
|
||||||
struct hrmap_euclid3 : hrmap {
|
struct hrmap_euclid3 : hrmap {
|
||||||
|
vector<coord> shifttable;
|
||||||
|
vector<transmatrix> tmatrix;
|
||||||
map<coord, heptagon*> spacemap;
|
map<coord, heptagon*> spacemap;
|
||||||
map<heptagon*, coord> ispacemap;
|
map<heptagon*, coord> ispacemap;
|
||||||
hrmap_euclid3() {
|
hrmap_euclid3() {
|
||||||
|
shifttable = get_shifttable();
|
||||||
|
tmatrix.resize(S7);
|
||||||
|
for(int i=0; i<S7; i++) tmatrix[i] = Id;
|
||||||
|
for(int i=0; i<S7; i++) for(int j=0; j<3; j++)
|
||||||
|
tmatrix[i][j][DIM] = getcoord(shifttable[i], j);
|
||||||
getOrigin();
|
getOrigin();
|
||||||
}
|
}
|
||||||
heptagon *getOrigin() {
|
heptagon *getOrigin() {
|
||||||
@ -489,11 +526,14 @@ namespace euclid3 {
|
|||||||
if(spacemap.count(at))
|
if(spacemap.count(at))
|
||||||
return spacemap[at];
|
return spacemap[at];
|
||||||
else {
|
else {
|
||||||
auto h = tailored_alloc<heptagon> (6);
|
auto h = tailored_alloc<heptagon> (S7);
|
||||||
h->c7 = newCell(6, h);
|
h->c7 = newCell(S7, h);
|
||||||
h->distance = 0;
|
h->distance = 0;
|
||||||
h->cdata = NULL;
|
h->cdata = NULL;
|
||||||
h->zebraval = gmod(getcoord(at, 0) + getcoord(at, 1) * 2 + getcoord(at, 2) * 4, 5);
|
if(S7 != 14)
|
||||||
|
h->zebraval = gmod(getcoord(at, 0) + getcoord(at, 1) * 2 + getcoord(at, 2) * 4, 5);
|
||||||
|
else
|
||||||
|
h->zebraval = getcoord(at, 0) & 1;
|
||||||
spacemap[at] = h;
|
spacemap[at] = h;
|
||||||
ispacemap[h] = at;
|
ispacemap[h] = at;
|
||||||
return h;
|
return h;
|
||||||
@ -502,14 +542,12 @@ namespace euclid3 {
|
|||||||
|
|
||||||
heptagon *build(heptagon *parent, int d, coord at) {
|
heptagon *build(heptagon *parent, int d, coord at) {
|
||||||
auto h = get_at(at);
|
auto h = get_at(at);
|
||||||
h->c.connect((d+3)%6, parent, d, false);
|
h->c.connect((d+S7/2)%S7, parent, d, false);
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
heptagon *createStep(heptagon *parent, int d) {
|
heptagon *createStep(heptagon *parent, int d) {
|
||||||
coord at = ispacemap[parent];
|
return build(parent, d, ispacemap[parent] + shifttable[d]);
|
||||||
const coord shifttable[6] = { +1, +COORDMAX, +COORDMAX*COORDMAX, -1, -COORDMAX, -COORDMAX*COORDMAX };
|
|
||||||
return build(parent, d, at + shifttable[d]);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -541,27 +579,30 @@ namespace euclid3 {
|
|||||||
|
|
||||||
int dist_alt(cell *c) {
|
int dist_alt(cell *c) {
|
||||||
coord co = cubemap()->ispacemap[c->master];
|
coord co = cubemap()->ispacemap[c->master];
|
||||||
return getcoord(co, 2);
|
if(S7 == 6) return getcoord(co, 2);
|
||||||
|
else if(S7 == 12) return (getcoord(co, 0) + getcoord(co, 1) + getcoord(co, 2)) / 2;
|
||||||
|
else return getcoord(co, 2)/2;
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw() {
|
void draw() {
|
||||||
dq::visited.clear();
|
dq::visited.clear();
|
||||||
dq::enqueue(viewctr.at, cview());
|
dq::enqueue(viewctr.at, cview());
|
||||||
|
auto cm = cubemap();
|
||||||
|
|
||||||
while(!dq::drawqueue.empty()) {
|
while(!dq::drawqueue.empty()) {
|
||||||
auto& p = dq::drawqueue.front();
|
auto& p = dq::drawqueue.front();
|
||||||
heptagon *h = get<0>(p);
|
heptagon *h = get<0>(p);
|
||||||
transmatrix V = get<1>(p);
|
transmatrix V = get<1>(p);
|
||||||
dynamicval<ld> b(band_shift, get<2>(p));
|
dynamicval<ld> b(band_shift, get<2>(p));
|
||||||
bandfixer bf(V);
|
bandfixer bf(V);
|
||||||
dq::drawqueue.pop();
|
dq::drawqueue.pop();
|
||||||
|
|
||||||
cell *c = h->c7;
|
cell *c = h->c7;
|
||||||
if(!do_draw(c, V)) continue;
|
if(!do_draw(c, V)) continue;
|
||||||
drawcell(c, V, 0, false);
|
drawcell(c, V, 0, false);
|
||||||
|
|
||||||
for(int i=0; i<6; i++)
|
for(int i=0; i<S7; i++)
|
||||||
dq::enqueue(h->move(i), V * cpush(i%3, (i>=3) ? -1 : 1));
|
dq::enqueue(h->move(i), V * cm->tmatrix[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -574,7 +615,29 @@ namespace euclid3 {
|
|||||||
int celldistance(cell *c1, cell *c2) {
|
int celldistance(cell *c1, cell *c2) {
|
||||||
auto cm = cubemap();
|
auto cm = cubemap();
|
||||||
coord a = cm->ispacemap[c1->master] - cm->ispacemap[c2->master];
|
coord a = cm->ispacemap[c1->master] - cm->ispacemap[c2->master];
|
||||||
return abs(getcoord(a, 0)) + abs(getcoord(a, 1)) + abs(getcoord(a, 2));
|
if(S7 == 6)
|
||||||
|
return abs(getcoord(a, 0)) + abs(getcoord(a, 1)) + abs(getcoord(a, 2));
|
||||||
|
else {
|
||||||
|
vector<int> ar = { getcoord(a,0), getcoord(a,1), getcoord(a,2) };
|
||||||
|
for(int i=0; i<3; i++) ar[i] = abs(ar[i]);
|
||||||
|
sort(ar.begin(), ar.end());
|
||||||
|
int dist = 0;
|
||||||
|
if(S7 == 12) {
|
||||||
|
int d = ar[1] - ar[0]; ar[1] -= d; ar[2] -= d;
|
||||||
|
dist += d;
|
||||||
|
int m = min((ar[2] - ar[0]) / 2, ar[0]);
|
||||||
|
dist += 2 * d;
|
||||||
|
ar[0] -= m; ar[1] -= m; ar[2] -= m;
|
||||||
|
if(ar[0])
|
||||||
|
dist += (ar[0] + ar[1] + ar[2]) / 2;
|
||||||
|
else
|
||||||
|
dist += ar[2];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dist = ar[0] + (ar[1] - ar[0]) / 2 + (ar[2] - ar[0]) / 2;
|
||||||
|
}
|
||||||
|
return dist;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -383,7 +383,7 @@ vector<eGeometry> quotientlist = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
vector<eGeometry> list3d = {
|
vector<eGeometry> list3d = {
|
||||||
gBinary3, gCubeTiling, gCell120, gECell120
|
gBinary3, gCubeTiling, gRhombic3, gBitrunc3, gCell120, gECell120
|
||||||
};
|
};
|
||||||
|
|
||||||
void ge_select_tiling(const vector<eGeometry>& lst) {
|
void ge_select_tiling(const vector<eGeometry>& lst) {
|
||||||
|
@ -3842,9 +3842,13 @@ bool isWall3(cell *c, color_t& wcol) {
|
|||||||
int get_darkval(int d) {
|
int get_darkval(int d) {
|
||||||
const int darkval_h[9] = {0,2,2,0,6,6,8,8,0};
|
const int darkval_h[9] = {0,2,2,0,6,6,8,8,0};
|
||||||
const int darkval_s[12] = {0,1,2,3,4,5,0,1,2,3,4,5};
|
const int darkval_s[12] = {0,1,2,3,4,5,0,1,2,3,4,5};
|
||||||
const int darkval_e[6] = {0,4,6,0,4,6};
|
const int darkval_e6[6] = {0,4,6,0,4,6};
|
||||||
|
const int darkval_e12[12] = {0,4,6,0,4,6,0,4,6,0,4,6};
|
||||||
|
const int darkval_e14[14] = {0,0,0,4,6,4,6,0,0,0,6,4,6,4};
|
||||||
if(sphere) return darkval_s[d];
|
if(sphere) return darkval_s[d];
|
||||||
if(euclid) return darkval_e[d];
|
if(euclid && S7 == 6) return darkval_e6[d];
|
||||||
|
if(euclid && S7 == 12) return darkval_e12[d];
|
||||||
|
if(euclid && S7 == 14) return darkval_e14[d];
|
||||||
return darkval_h[d];
|
return darkval_h[d];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
hyper.h
2
hyper.h
@ -185,7 +185,7 @@ typedef complex<ld> cld;
|
|||||||
#if MAXMDIM == 3
|
#if MAXMDIM == 3
|
||||||
#define DIM 2
|
#define DIM 2
|
||||||
#else
|
#else
|
||||||
#define DIM ((geometry == gBinary3 || geometry == gCubeTiling || geometry == gCell120 || geometry == gECell120) ? 3 : 2)
|
#define DIM ((geometry >= gBinary3) ? 3 : 2)
|
||||||
#endif
|
#endif
|
||||||
#define MDIM (DIM+1)
|
#define MDIM (DIM+1)
|
||||||
|
|
||||||
|
326
polygons.cpp
326
polygons.cpp
@ -1945,85 +1945,7 @@ ld dlow_table[SIDEPARS], dhi_table[SIDEPARS];
|
|||||||
|
|
||||||
#define SHADMUL (S3==4 ? 1.05 : 1.3)
|
#define SHADMUL (S3==4 ? 1.05 : 1.3)
|
||||||
|
|
||||||
#if CAP_BT && MAXMDIM >= 4
|
void make_sidewalls() {
|
||||||
void make_wall(hpcshape& sh, int x0, int y0, int z0, int x1, int y1, int z1, int x2, int y2, int z2, int flags) {
|
|
||||||
hyperpoint h0 = point3(x0,y0,z0);
|
|
||||||
hyperpoint h1 = point3(x1,y1,z1);
|
|
||||||
hyperpoint h2 = point3(x2,y2,z2);
|
|
||||||
using namespace hyperpoint_vec;
|
|
||||||
hyperpoint h3 = h1 + h2 - h0;
|
|
||||||
bshape(sh, PPR::WALL);
|
|
||||||
ld yy = log(2) / 2;
|
|
||||||
const int STEP=10;
|
|
||||||
auto at = [&] (hyperpoint h) {
|
|
||||||
hyperpoint res = binary::parabolic3(h[0], h[1]) * xpush0(yy*h[2]);
|
|
||||||
hpcpush(res);
|
|
||||||
};
|
|
||||||
if(flags == 2) {
|
|
||||||
last->flags |= POLY_TRIANGLES;
|
|
||||||
for(int y=0; y<STEP; y++)
|
|
||||||
for(int x=0; x<STEP; x++) {
|
|
||||||
int x1 = x + 1;
|
|
||||||
int y1 = y + 1;
|
|
||||||
at((h0 * (STEP-x -y ) + h1 * x + h2 * y ) / STEP);
|
|
||||||
at((h0 * (STEP-x1-y ) + h1 * x1 + h2 * y ) / STEP);
|
|
||||||
at((h0 * (STEP-x -y1) + h1 * x + h2 * y1) / STEP);
|
|
||||||
at((h0 * (STEP-x1-y ) + h1 * x1 + h2 * y ) / STEP);
|
|
||||||
at((h0 * (STEP-x -y1) + h1 * x + h2 * y1) / STEP);
|
|
||||||
at((h0 * (STEP-x1-y1) + h1 * x1 + h2 * y1) / STEP);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
int STP2 = ((flags == 1) ? 2 : 1) * STEP;
|
|
||||||
for(int t=0; t<STP2; t++) at((h0 * (STP2-t) + h1 * t) / STP2);
|
|
||||||
for(int t=0; t<STEP; t++) at((h1 * (STEP-t) + h3 * t) / STEP);
|
|
||||||
for(int t=0; t<STEP; t++) at((h3 * (STEP-t) + h2 * t) / STEP);
|
|
||||||
for(int t=0; t<STEP; t++) at((h2 * (STEP-t) + h0 * t) / STEP);
|
|
||||||
at(h0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void buildpolys() {
|
|
||||||
|
|
||||||
symmetriesAt.clear();
|
|
||||||
allshapes.clear();
|
|
||||||
geom3::compute();
|
|
||||||
#if CAP_GP
|
|
||||||
gp::clear_plainshapes();
|
|
||||||
#endif
|
|
||||||
DEBB(DF_INIT, (debugfile,"buildpolys\n"));
|
|
||||||
|
|
||||||
if(DIM == 3) {
|
|
||||||
if(sphere) SD3 = 3, SD7 = 5;
|
|
||||||
else SD3 = SD7 = 4;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
SD3 = S3;
|
|
||||||
SD7 = S7;
|
|
||||||
}
|
|
||||||
SD6 = SD3 * 2;
|
|
||||||
S42 = SD7 * SD6;
|
|
||||||
S12 = SD6 * 2;
|
|
||||||
S14 = SD7 * 2;
|
|
||||||
S21 = SD7 * SD3;
|
|
||||||
S28 = SD7 * 4;
|
|
||||||
S36 = SD6 * 6;
|
|
||||||
S84 = S42 * 2;
|
|
||||||
|
|
||||||
// printf("crossf = %f euclid = %d sphere = %d\n", float(crossf), euclid, sphere);
|
|
||||||
hpc.clear();
|
|
||||||
|
|
||||||
bshape(shMovestar, PPR::MOVESTAR);
|
|
||||||
for(int i=0; i<=8; i++) {
|
|
||||||
hpcpush(xspinpush0(M_PI * i/4, crossf));
|
|
||||||
if(i != 8) hpcpush(xspinpush0(M_PI * i/4 + M_PI/8, crossf/4));
|
|
||||||
}
|
|
||||||
|
|
||||||
// procedural floors
|
|
||||||
|
|
||||||
int td = ((!BITRUNCATED || euclid) && !(S7&1)) ? S42+S6 : 0;
|
|
||||||
|
|
||||||
// sidewall parameters for the 3D mode
|
// sidewall parameters for the 3D mode
|
||||||
for(int k=0; k<SIDEPARS; k++) {
|
for(int k=0; k<SIDEPARS; k++) {
|
||||||
double dlow=1, dhi=1;
|
double dlow=1, dhi=1;
|
||||||
@ -2041,8 +1963,18 @@ void buildpolys() {
|
|||||||
bshape(shSemiFloorSide[k], PPR::LAKEWALL);
|
bshape(shSemiFloorSide[k], PPR::LAKEWALL);
|
||||||
for(int t=0; t<=3; t+=3) hpcpush(ddi(S7 + (3+t)*S14, floorrad0) * C0);
|
for(int t=0; t<=3; t+=3) hpcpush(ddi(S7 + (3+t)*S14, floorrad0) * C0);
|
||||||
chasmifyPoly(dlow, dhi, k);
|
chasmifyPoly(dlow, dhi, k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void procedural_shapes() {
|
||||||
|
bshape(shMovestar, PPR::MOVESTAR);
|
||||||
|
for(int i=0; i<=8; i++) {
|
||||||
|
hpcpush(xspinpush0(M_PI * i/4, crossf));
|
||||||
|
if(i != 8) hpcpush(xspinpush0(M_PI * i/4 + M_PI/8, crossf/4));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// procedural floors
|
||||||
|
|
||||||
bshape(shBarrel, PPR::FLOOR);
|
bshape(shBarrel, PPR::FLOOR);
|
||||||
for(int t=0; t<=S84; t+=2) hpcpush(ddi(t, floorrad1*.5) * C0);
|
for(int t=0; t<=S84; t+=2) hpcpush(ddi(t, floorrad1*.5) * C0);
|
||||||
|
|
||||||
@ -2128,6 +2060,7 @@ void buildpolys() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bshape(shWall[1], PPR::WALL);
|
bshape(shWall[1], PPR::WALL);
|
||||||
|
int td = ((!BITRUNCATED || euclid) && !(S7&1)) ? S42+S6 : 0;
|
||||||
if(S7 == 6 || S7 == 4) {
|
if(S7 == 6 || S7 == 4) {
|
||||||
for(int t=0; t<=S6; t++) {
|
for(int t=0; t<=S6; t++) {
|
||||||
hpcpush(ddi(S7 + t*S14, floorrad1) * C0);
|
hpcpush(ddi(S7 + t*S14, floorrad1) * C0);
|
||||||
@ -2364,8 +2297,144 @@ void buildpolys() {
|
|||||||
hpc.push_back(hpc[last->s]);
|
hpc.push_back(hpc[last->s]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// hand-drawn shapes
|
bshape(shSwitchDisk, PPR::FLOOR); for(int i=0; i<=S84; i+=S3) hpcpush(ddi(i, .06) * C0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if CAP_BT && MAXMDIM >= 4
|
||||||
|
void make_wall(hpcshape& sh, int x0, int y0, int z0, int x1, int y1, int z1, int x2, int y2, int z2, int flags) {
|
||||||
|
hyperpoint h0 = point3(x0,y0,z0);
|
||||||
|
hyperpoint h1 = point3(x1,y1,z1);
|
||||||
|
hyperpoint h2 = point3(x2,y2,z2);
|
||||||
|
using namespace hyperpoint_vec;
|
||||||
|
hyperpoint h3 = h1 + h2 - h0;
|
||||||
|
bshape(sh, PPR::WALL);
|
||||||
|
ld yy = log(2) / 2;
|
||||||
|
const int STEP=10;
|
||||||
|
auto at = [&] (hyperpoint h) {
|
||||||
|
hyperpoint res = binary::parabolic3(h[0], h[1]) * xpush0(yy*h[2]);
|
||||||
|
hpcpush(res);
|
||||||
|
};
|
||||||
|
if(flags == 2) {
|
||||||
|
last->flags |= POLY_TRIANGLES;
|
||||||
|
for(int y=0; y<STEP; y++)
|
||||||
|
for(int x=0; x<STEP; x++) {
|
||||||
|
int x1 = x + 1;
|
||||||
|
int y1 = y + 1;
|
||||||
|
at((h0 * (STEP-x -y ) + h1 * x + h2 * y ) / STEP);
|
||||||
|
at((h0 * (STEP-x1-y ) + h1 * x1 + h2 * y ) / STEP);
|
||||||
|
at((h0 * (STEP-x -y1) + h1 * x + h2 * y1) / STEP);
|
||||||
|
at((h0 * (STEP-x1-y ) + h1 * x1 + h2 * y ) / STEP);
|
||||||
|
at((h0 * (STEP-x -y1) + h1 * x + h2 * y1) / STEP);
|
||||||
|
at((h0 * (STEP-x1-y1) + h1 * x1 + h2 * y1) / STEP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int STP2 = ((flags == 1) ? 2 : 1) * STEP;
|
||||||
|
for(int t=0; t<STP2; t++) at((h0 * (STP2-t) + h1 * t) / STP2);
|
||||||
|
for(int t=0; t<STEP; t++) at((h1 * (STEP-t) + h3 * t) / STEP);
|
||||||
|
for(int t=0; t<STEP; t++) at((h3 * (STEP-t) + h2 * t) / STEP);
|
||||||
|
for(int t=0; t<STEP; t++) at((h2 * (STEP-t) + h0 * t) / STEP);
|
||||||
|
at(h0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void create_wall3d() {
|
||||||
|
shWall3D.resize(S7);
|
||||||
|
if(DIM == 3 && binarytiling) {
|
||||||
|
make_wall(shWall3D[0], 0,0,-1, -1,0,-1, 0,-1,-1, 2);
|
||||||
|
make_wall(shWall3D[1], 0,0,-1, +1,0,-1, 0,-1,-1, 2);
|
||||||
|
make_wall(shWall3D[2], 0,0,-1, -1,0,-1, 0,+1,-1, 2);
|
||||||
|
make_wall(shWall3D[3], 0,0,-1, +1,0,-1, 0,+1,-1, 2);
|
||||||
|
make_wall(shWall3D[4], -1,-1,-1, -1,1,-1, -1,-1,+1, 1);
|
||||||
|
make_wall(shWall3D[5], +1,-1,-1, +1,1,-1, +1,-1,+1, 1);
|
||||||
|
make_wall(shWall3D[6], -1,-1,-1, 1,-1,-1, -1,-1,+1, 1);
|
||||||
|
make_wall(shWall3D[7], -1,+1,-1, 1,+1,-1, -1,+1,+1, 1);
|
||||||
|
make_wall(shWall3D[8], 1,1,+1, -1,1,+1, 1,-1,+1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(DIM == 3 && euclid && S7 == 6) {
|
||||||
|
for(int w=0; w<6; w++) {
|
||||||
|
bshape(shWall3D[w], PPR::WALL);
|
||||||
|
for(int a=0; a<=4; a++) {
|
||||||
|
int t[3];
|
||||||
|
t[0] = (w>=3) ? -1 : 1;
|
||||||
|
t[1] = among(a, 0, 3, 4) ? -1 : 1;
|
||||||
|
t[2] = among(a, 2, 3) ? -1 : 1;
|
||||||
|
int x = w%3;
|
||||||
|
int y = (x+2)%3;
|
||||||
|
int z = (y+2)%3;
|
||||||
|
hpcpush(hpxy3(t[x]/2., t[y]/2., t[z]/2.));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(DIM == 3 && euclid && S7 == 12) {
|
||||||
|
using namespace hyperpoint_vec;
|
||||||
|
auto v = euclid3::get_shifttable();
|
||||||
|
for(int w=0; w<12; w++) {
|
||||||
|
vector<int> valid;
|
||||||
|
for(int c=0; c<3; c++) if(euclid3::getcoord(v[w], c)) valid.push_back(c);
|
||||||
|
int third = 3 - valid[1] - valid[0];
|
||||||
|
bshape(shWall3D[w], PPR::WALL);
|
||||||
|
hyperpoint v0 = cpush0(valid[0], euclid3::getcoord(v[w], valid[0]) > 0 ? 1 : -1);
|
||||||
|
hyperpoint v1 = cpush0(valid[1], euclid3::getcoord(v[w], valid[1]) > 0 ? 1 : -1);
|
||||||
|
hpcpush(v0);
|
||||||
|
hpcpush(v0/2 + v1/2 + cpush0(third, .5) - C0);
|
||||||
|
hpcpush(v1);
|
||||||
|
hpcpush(v0/2 + v1/2 + cpush0(third, -.5) - C0);
|
||||||
|
hpcpush(v0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(DIM == 3 && euclid && S7 == 14) {
|
||||||
|
using namespace hyperpoint_vec;
|
||||||
|
auto v = euclid3::get_shifttable();
|
||||||
|
for(int w=0; w<14; w++) {
|
||||||
|
bshape(shWall3D[w], PPR::WALL);
|
||||||
|
if(w%7 < 3) {
|
||||||
|
int z = w>=7?-1:1;
|
||||||
|
hpcpush(cpush0(w%7, z) + cpush0((w%7+1)%3, 1/2.) - C0);
|
||||||
|
hpcpush(cpush0(w%7, z) + cpush0((w%7+2)%3, 1/2.) - C0);
|
||||||
|
hpcpush(cpush0(w%7, z) + cpush0((w%7+1)%3,-1/2.) - C0);
|
||||||
|
hpcpush(cpush0(w%7, z) + cpush0((w%7+2)%3,-1/2.) - C0);
|
||||||
|
hpcpush(cpush0(w%7, z) + cpush0((w%7+1)%3, 1/2.) - C0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ld x = euclid3::getcoord(v[w], 0), y = euclid3::getcoord(v[w], 1), z = euclid3::getcoord(v[w], 2);
|
||||||
|
hpcpush(hpxy3(x, y/2, 0));
|
||||||
|
hpcpush(hpxy3(x/2, y, 0));
|
||||||
|
hpcpush(hpxy3(0, y, z/2));
|
||||||
|
hpcpush(hpxy3(0, y/2, z));
|
||||||
|
hpcpush(hpxy3(x/2, 0, z));
|
||||||
|
hpcpush(hpxy3(x, 0, z/2));
|
||||||
|
hpcpush(hpxy3(x, y/2, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(DIM == 3 && sphere) {
|
||||||
|
sphere3::gen600();
|
||||||
|
for(int w=0; w<12; w++) {
|
||||||
|
bshape(shWall3D[w], PPR::WALL);
|
||||||
|
for(int a=0; a<=5; a++)
|
||||||
|
hpcpush(sphere3::dodefaces[w*5+a%5]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(DIM == 3) {
|
||||||
|
shMiniWall3D.resize(isize(shWall3D));
|
||||||
|
for(int i=0; i<isize(shWall3D); i++) {
|
||||||
|
bshape(shMiniWall3D[i], PPR::WALL);
|
||||||
|
for(int a=shWall3D[i].s; a < shWall3D[i].e; a++)
|
||||||
|
hpcpush(mid(C0, hpc[a]));
|
||||||
|
if(shWall3D[i].flags & POLY_TRIANGLES)
|
||||||
|
last->flags |= POLY_TRIANGLES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void configure_floorshapes() {
|
||||||
if(0);
|
if(0);
|
||||||
#if CAP_ARCM
|
#if CAP_ARCM
|
||||||
else if(archimedean)
|
else if(archimedean)
|
||||||
@ -2418,7 +2487,50 @@ void buildpolys() {
|
|||||||
shMFloor3.prio = PPR::FLOOR_DRAGON;
|
shMFloor3.prio = PPR::FLOOR_DRAGON;
|
||||||
shMFloor4.prio = PPR::FLOOR_DRAGON;
|
shMFloor4.prio = PPR::FLOOR_DRAGON;
|
||||||
for(int i=0; i<3; i++) shRedRockFloor[i].scale = .9 - .1 * i;
|
for(int i=0; i<3; i++) shRedRockFloor[i].scale = .9 - .1 * i;
|
||||||
generate_floorshapes();
|
generate_floorshapes();
|
||||||
|
}
|
||||||
|
|
||||||
|
void buildpolys() {
|
||||||
|
|
||||||
|
symmetriesAt.clear();
|
||||||
|
allshapes.clear();
|
||||||
|
geom3::compute();
|
||||||
|
#if CAP_GP
|
||||||
|
gp::clear_plainshapes();
|
||||||
|
#endif
|
||||||
|
DEBB(DF_INIT, (debugfile,"buildpolys\n"));
|
||||||
|
|
||||||
|
if(DIM == 3) {
|
||||||
|
if(sphere) SD3 = 3, SD7 = 5;
|
||||||
|
else SD3 = SD7 = 4;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SD3 = S3;
|
||||||
|
SD7 = S7;
|
||||||
|
}
|
||||||
|
SD6 = SD3 * 2;
|
||||||
|
S42 = SD7 * SD6;
|
||||||
|
S12 = SD6 * 2;
|
||||||
|
S14 = SD7 * 2;
|
||||||
|
S21 = SD7 * SD3;
|
||||||
|
S28 = SD7 * 4;
|
||||||
|
S36 = SD6 * 6;
|
||||||
|
S84 = S42 * 2;
|
||||||
|
|
||||||
|
// printf("crossf = %f euclid = %d sphere = %d\n", float(crossf), euclid, sphere);
|
||||||
|
hpc.clear();
|
||||||
|
|
||||||
|
make_sidewalls();
|
||||||
|
|
||||||
|
procedural_shapes();
|
||||||
|
|
||||||
|
#if MAXMDIM >= 4
|
||||||
|
create_wall3d();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
configure_floorshapes();
|
||||||
|
|
||||||
|
// hand-drawn shapes
|
||||||
|
|
||||||
bshape(shHalfFloor[0], PPR::FLOOR, scalefactor, 329);
|
bshape(shHalfFloor[0], PPR::FLOOR, scalefactor, 329);
|
||||||
bshape(shHalfFloor[1], PPR::FLOOR, scalefactor, 327);
|
bshape(shHalfFloor[1], PPR::FLOOR, scalefactor, 327);
|
||||||
@ -2449,8 +2561,6 @@ void buildpolys() {
|
|||||||
bshape(shSemiFeatherFloor[0], PPR::FLOOR, scalefactor, 48);
|
bshape(shSemiFeatherFloor[0], PPR::FLOOR, scalefactor, 48);
|
||||||
bshape(shSemiFeatherFloor[1], PPR::FLOOR, scalefactor, 49);
|
bshape(shSemiFeatherFloor[1], PPR::FLOOR, scalefactor, 49);
|
||||||
|
|
||||||
bshape(shSwitchDisk, PPR::FLOOR); for(int i=0; i<=S84; i+=S3) hpcpush(ddi(i, .06) * C0);
|
|
||||||
|
|
||||||
bshape(shZebra[0], PPR::FLOOR, scalefactor, 162);
|
bshape(shZebra[0], PPR::FLOOR, scalefactor, 162);
|
||||||
bshape(shZebra[1], PPR::FLOOR, scalefactor, 163);
|
bshape(shZebra[1], PPR::FLOOR, scalefactor, 163);
|
||||||
bshape(shZebra[2], PPR::FLOOR, scalefactor, 164);
|
bshape(shZebra[2], PPR::FLOOR, scalefactor, 164);
|
||||||
@ -2521,56 +2631,6 @@ void buildpolys() {
|
|||||||
bshape(shDragonNostril, PPR::ONTENTACLE_EYES, scalefactor, 241);
|
bshape(shDragonNostril, PPR::ONTENTACLE_EYES, scalefactor, 241);
|
||||||
bshape(shDragonHead, PPR::ONTENTACLE, scalefactor, 242);
|
bshape(shDragonHead, PPR::ONTENTACLE, scalefactor, 242);
|
||||||
|
|
||||||
if(DIM == 3 && binarytiling) {
|
|
||||||
shWall3D.resize(9);
|
|
||||||
make_wall(shWall3D[0], 0,0,-1, -1,0,-1, 0,-1,-1, 2);
|
|
||||||
make_wall(shWall3D[1], 0,0,-1, +1,0,-1, 0,-1,-1, 2);
|
|
||||||
make_wall(shWall3D[2], 0,0,-1, -1,0,-1, 0,+1,-1, 2);
|
|
||||||
make_wall(shWall3D[3], 0,0,-1, +1,0,-1, 0,+1,-1, 2);
|
|
||||||
make_wall(shWall3D[4], -1,-1,-1, -1,1,-1, -1,-1,+1, 1);
|
|
||||||
make_wall(shWall3D[5], +1,-1,-1, +1,1,-1, +1,-1,+1, 1);
|
|
||||||
make_wall(shWall3D[6], -1,-1,-1, 1,-1,-1, -1,-1,+1, 1);
|
|
||||||
make_wall(shWall3D[7], -1,+1,-1, 1,+1,-1, -1,+1,+1, 1);
|
|
||||||
make_wall(shWall3D[8], 1,1,+1, -1,1,+1, 1,-1,+1, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(DIM == 3 && euclid) {
|
|
||||||
shWall3D.resize(6);
|
|
||||||
for(int w=0; w<6; w++) {
|
|
||||||
bshape(shWall3D[w], PPR::WALL);
|
|
||||||
for(int a=0; a<=4; a++) {
|
|
||||||
int t[3];
|
|
||||||
t[0] = (w>=3) ? -1 : 1;
|
|
||||||
t[1] = among(a, 0, 3, 4) ? -1 : 1;
|
|
||||||
t[2] = among(a, 2, 3) ? -1 : 1;
|
|
||||||
int x = w%3;
|
|
||||||
int y = (x+2)%3;
|
|
||||||
int z = (y+2)%3;
|
|
||||||
hpcpush(hpxy3(t[x]/2., t[y]/2., t[z]/2.));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(DIM == 3 && sphere) {
|
|
||||||
shWall3D.resize(12);
|
|
||||||
for(int w=0; w<12; w++) {
|
|
||||||
bshape(shWall3D[w], PPR::WALL);
|
|
||||||
for(int a=0; a<=5; a++)
|
|
||||||
hpcpush(sphere3::dodefaces[w*5+a%5]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(DIM == 3) {
|
|
||||||
shMiniWall3D.resize(isize(shWall3D));
|
|
||||||
for(int i=0; i<isize(shWall3D); i++) {
|
|
||||||
bshape(shMiniWall3D[i], PPR::WALL);
|
|
||||||
for(int a=shWall3D[i].s; a < shWall3D[i].e; a++)
|
|
||||||
hpcpush(mid(C0, hpc[a]));
|
|
||||||
if(shWall3D[i].flags & POLY_TRIANGLES)
|
|
||||||
last->flags |= POLY_TRIANGLES;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ld krsc = 1;
|
ld krsc = 1;
|
||||||
if(sphere) krsc *= 1.4;
|
if(sphere) krsc *= 1.4;
|
||||||
if(S7 ==8) krsc *= 1.3;
|
if(S7 ==8) krsc *= 1.3;
|
||||||
|
@ -1194,7 +1194,7 @@ void set_geometry(eGeometry target) {
|
|||||||
if(DUAL && geometry != gArchimedean)
|
if(DUAL && geometry != gArchimedean)
|
||||||
variation = ginf[geometry].default_variation;
|
variation = ginf[geometry].default_variation;
|
||||||
#if CAP_BT
|
#if CAP_BT
|
||||||
if(among(geometry, gBinaryTiling, gBinary3, gCubeTiling, gCell120, gECell120)) variation = eVariation::pure;
|
if(geometry == gBinaryTiling || DIM == 3) variation = eVariation::pure;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
need_reset_geometry = true;
|
need_reset_geometry = true;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user