mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-11-23 21:07:17 +00:00
on-demand building of plainshapes
This commit is contained in:
parent
abe16f6bd3
commit
1c07230f88
@ -481,6 +481,8 @@ namespace gp {
|
|||||||
if(base_distlimit > 30)
|
if(base_distlimit > 30)
|
||||||
base_distlimit = 30;
|
base_distlimit = 30;
|
||||||
prepare_matrices();
|
prepare_matrices();
|
||||||
|
if(debug_geometry)
|
||||||
|
printf("scale = " LDF "\n", scale);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
scale = 1;
|
scale = 1;
|
||||||
|
@ -3218,11 +3218,11 @@ void placeSidewall(cell *c, int i, int sidepar, const transmatrix& V, bool warp,
|
|||||||
|
|
||||||
flagtype f = qfi.shape->flags;
|
flagtype f = qfi.shape->flags;
|
||||||
|
|
||||||
if(gp::on && !mirr) {
|
if((f & POLY_GP) && !mirr) {
|
||||||
if(f & POLY_FULL)
|
if(f & POLY_FULL)
|
||||||
queuepolyat(V, shFullFloorSideGP[sidepar][DRAW_INDICES][i], col, prio);
|
queuepolyat(V, gp::get_plainshape().shFullFloorSide[sidepar][i], col, prio);
|
||||||
if(f & POLY_PLAIN)
|
if(f & POLY_PLAIN)
|
||||||
queuepolyat(V, shFloorSideGP[sidepar][DRAW_INDICES][i], col, prio);
|
queuepolyat(V, gp::get_plainshape().shFloorSide[sidepar][i], col, prio);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
10
hyper.h
10
hyper.h
@ -3349,3 +3349,13 @@ namespace fieldpattern {
|
|||||||
bool incompatible(eLand l1, eLand l2);
|
bool incompatible(eLand l1, eLand l2);
|
||||||
eOrbLandRelation getOLR(eItem it, eLand l);
|
eOrbLandRelation getOLR(eItem it, eLand l);
|
||||||
|
|
||||||
|
struct plainshape;
|
||||||
|
void clear_plainshape(plainshape& gsh);
|
||||||
|
void build_plainshape(plainshape& gsh, gp::local_info& li);
|
||||||
|
|
||||||
|
namespace gp {
|
||||||
|
void clear_plainshapes();
|
||||||
|
plainshape& get_plainshape();
|
||||||
|
}
|
||||||
|
|
||||||
|
extern bool debug_geometry;
|
||||||
|
136
polygons.cpp
136
polygons.cpp
@ -28,7 +28,8 @@ static const int POLY_PLAIN = 256;
|
|||||||
static const int POLY_FULL = 512;
|
static const int POLY_FULL = 512;
|
||||||
// floor shapes which have their shadows, or can use shFloorShadow
|
// floor shapes which have their shadows, or can use shFloorShadow
|
||||||
static const int POLY_HASSHADOW = 1024;
|
static const int POLY_HASSHADOW = 1024;
|
||||||
|
// Goldberg shapes
|
||||||
|
static const int POLY_GP = 2048;
|
||||||
|
|
||||||
vector<hyperpoint> hpc;
|
vector<hyperpoint> hpc;
|
||||||
|
|
||||||
@ -122,6 +123,15 @@ void initPolyForGL() {
|
|||||||
|
|
||||||
glhr::store_in_buffer(ourshape);
|
glhr::store_in_buffer(ourshape);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void extra_vertices() {
|
||||||
|
while(size(ourshape) < size(hpc))
|
||||||
|
ourshape.push_back(glhr::pointtogl(hpc[size(ourshape)]));
|
||||||
|
glhr::store_in_buffer(ourshape);
|
||||||
|
glhr::current_vertices = NULL;
|
||||||
|
prehpc = size(hpc);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CAP_POLY
|
#if CAP_POLY
|
||||||
@ -1053,6 +1063,11 @@ void drawqueue() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct plainshape {
|
||||||
|
bool active;
|
||||||
|
hpcshape shFloor, shFullFloor, shFloorSide[SIDEPARS][8], shFullFloorSide[SIDEPARS][8];
|
||||||
|
};
|
||||||
|
|
||||||
hpcshape
|
hpcshape
|
||||||
shFloorSide[SIDEPARS][2], shSemiFloorSide[SIDEPARS], shTriheptaSide[SIDEPARS][2],
|
shFloorSide[SIDEPARS][2], shSemiFloorSide[SIDEPARS], shTriheptaSide[SIDEPARS][2],
|
||||||
shTriheptaSideGP[SIDEPARS][2],
|
shTriheptaSideGP[SIDEPARS][2],
|
||||||
@ -1158,13 +1173,8 @@ hpcshape
|
|||||||
|
|
||||||
shAsymmetric,
|
shAsymmetric,
|
||||||
|
|
||||||
shDodeca,
|
shDodeca;
|
||||||
|
|
||||||
shFullFloorGP[32][32][6],
|
|
||||||
shFullFloorSideGP[SIDEPARS][32][32][6][8],
|
|
||||||
shFloorGP[32][32][6],
|
|
||||||
shFloorSideGP[SIDEPARS][32][32][6][8];
|
|
||||||
|
|
||||||
ld tentacle_length;
|
ld tentacle_length;
|
||||||
|
|
||||||
#define USERLAYERS 32
|
#define USERLAYERS 32
|
||||||
@ -1368,10 +1378,13 @@ template<class... T> ld grot(bool geometry, ld factor, T... t) {
|
|||||||
else return grot(t...);
|
else return grot(t...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ld dlow_table[SIDEPARS], dhi_table[SIDEPARS];
|
||||||
|
|
||||||
void buildpolys() {
|
void buildpolys() {
|
||||||
|
|
||||||
symmetriesAt.clear();
|
symmetriesAt.clear();
|
||||||
geom3::compute();
|
geom3::compute();
|
||||||
|
gp::clear_plainshapes();
|
||||||
DEBB(DF_INIT, (debugfile,"buildpolys\n"));
|
DEBB(DF_INIT, (debugfile,"buildpolys\n"));
|
||||||
|
|
||||||
// printf("crossf = %f euclid = %d sphere = %d\n", float(crossf), euclid, sphere);
|
// printf("crossf = %f euclid = %d sphere = %d\n", float(crossf), euclid, sphere);
|
||||||
@ -1490,25 +1503,6 @@ void buildpolys() {
|
|||||||
last->flags |= POLY_HASWALLS | POLY_FULL | POLY_HASSHADOW;
|
last->flags |= POLY_HASWALLS | POLY_FULL | POLY_HASSHADOW;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(gp::on) {
|
|
||||||
for(int x=-16; x<16; x++)
|
|
||||||
for(int y=-16; y<16; y++)
|
|
||||||
for(int d=0; d<6; d++) {
|
|
||||||
bshape(shFullFloorGP[x&31][y&31][d], PPR_FLOOR);
|
|
||||||
int cor = (x||y) ? 6 : S7;
|
|
||||||
|
|
||||||
gp::local_info li; li.last_dir = (x||y) ? 0 : -1; li.relative = gp::loc(x, y); li.total_dir = d;
|
|
||||||
for(int j=0; j<=cor; j++)
|
|
||||||
hpcpush(get_corner_position(li, j));
|
|
||||||
last->flags |= POLY_HASWALLS | POLY_FULL;
|
|
||||||
|
|
||||||
bshape(shFloorGP[x&31][y&31][d], PPR_FLOOR);
|
|
||||||
for(int j=0; j<=cor; j++)
|
|
||||||
hpcpush(get_corner_position(li, j, 3.3));
|
|
||||||
last->flags |= POLY_HASWALLS | POLY_PLAIN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool strict = false;
|
bool strict = false;
|
||||||
|
|
||||||
if(a4 && nonbitrunc) fac94 *= 1.1;
|
if(a4 && nonbitrunc) fac94 *= 1.1;
|
||||||
@ -1560,6 +1554,8 @@ void buildpolys() {
|
|||||||
else if(k==SIDE_BTOI) dlow = geom3::INFDEEP, dhi = geom3::BOTTOM;
|
else if(k==SIDE_BTOI) dlow = geom3::INFDEEP, dhi = geom3::BOTTOM;
|
||||||
else if(k==SIDE_WTS3) dlow = geom3::SLEV[3], dhi = geom3::WALL;
|
else if(k==SIDE_WTS3) dlow = geom3::SLEV[3], dhi = geom3::WALL;
|
||||||
else dlow = geom3::SLEV[k-SIDE_SLEV], dhi = geom3::SLEV[k-SIDE_SLEV+1];
|
else dlow = geom3::SLEV[k-SIDE_SLEV], dhi = geom3::SLEV[k-SIDE_SLEV+1];
|
||||||
|
dlow_table[k] = dlow;
|
||||||
|
dhi_table[k] = dhi;
|
||||||
|
|
||||||
validsidepar[k] = (dlow > 0 && dhi > 0) || (dlow < 0 && dhi < 0);
|
validsidepar[k] = (dlow > 0 && dhi > 0) || (dlow < 0 && dhi < 0);
|
||||||
|
|
||||||
@ -1609,28 +1605,7 @@ void buildpolys() {
|
|||||||
|
|
||||||
bshape(shBigTriSide[k][0], PPR_LAKEWALL);
|
bshape(shBigTriSide[k][0], PPR_LAKEWALL);
|
||||||
for(int t=0; t<=1; t++) hpcpush(ddi(t*S28-S14, triangleside) * C0);
|
for(int t=0; t<=1; t++) hpcpush(ddi(t*S28-S14, triangleside) * C0);
|
||||||
chasmifyPoly(dlow, dhi, k);
|
chasmifyPoly(dlow, dhi, k);
|
||||||
|
|
||||||
if(gp::on) {
|
|
||||||
for(int x=-16; x<16; x++)
|
|
||||||
for(int y=-16; y<16; y++)
|
|
||||||
for(int d=0; d<6; d++) {
|
|
||||||
int cor = (x||y) ? 6 : S7;
|
|
||||||
gp::local_info li; li.last_dir = (x||y) ? 0 : -1; li.relative = gp::loc(x, y); li.total_dir = d;
|
|
||||||
for(int c=0; c<cor; c++) {
|
|
||||||
bshape(shFullFloorSideGP[k][x&31][y&31][d][c], PPR_FLOOR);
|
|
||||||
hpcpush(get_corner_position(li, c));
|
|
||||||
hpcpush(get_corner_position(li, c+1));
|
|
||||||
chasmifyPoly(dlow, dhi, k);
|
|
||||||
|
|
||||||
bshape(shFloorSideGP[k][x&31][y&31][d][c], PPR_FLOOR);
|
|
||||||
hpcpush(get_corner_position(li, c, 3.3));
|
|
||||||
hpcpush(get_corner_position(li, c+1, 3.3));
|
|
||||||
chasmifyPoly(dlow, dhi, k);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int d=0; d<2; d++) {
|
for(int d=0; d<2; d++) {
|
||||||
@ -2591,8 +2566,8 @@ const hpcshape& getSeabed(const hpcshape& c) {
|
|||||||
if(&c == &shCaveFloor[3]) return shCaveSeabed[3];
|
if(&c == &shCaveFloor[3]) return shCaveSeabed[3];
|
||||||
if(&c == &shFloor[0]) return shFullFloor[0];
|
if(&c == &shFloor[0]) return shFullFloor[0];
|
||||||
if(&c == &shFloor[1]) return shFullFloor[1];
|
if(&c == &shFloor[1]) return shFullFloor[1];
|
||||||
if(&c >= &shFloorGP[0][0][0] && &c <= &shFloorGP[32][0][0])
|
if(c.flags & POLY_GP) if(c.flags & POLY_PLAIN)
|
||||||
return *(&c - &shFloorGP[0][0][0] + &shFullFloorGP[0][0][0]);
|
return gp::get_plainshape().shFullFloor;
|
||||||
if(nonbitrunc || euclid || sphere) return c;
|
if(nonbitrunc || euclid || sphere) return c;
|
||||||
if(&c == &shCaveFloor[0]) return shCaveSeabed[0];
|
if(&c == &shCaveFloor[0]) return shCaveSeabed[0];
|
||||||
if(&c == &shCaveFloor[1]) return shCaveSeabed[1];
|
if(&c == &shCaveFloor[1]) return shCaveSeabed[1];
|
||||||
@ -3676,6 +3651,62 @@ NEWSHAPE, 384, 1, 2, 0.146470,0.021791, 0.134179,0.071381, 0.089857,0.116839, 0.
|
|||||||
NEWSHAPE
|
NEWSHAPE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
namespace gp {
|
||||||
|
plainshape psh[32][32][8];
|
||||||
|
extern gp::local_info draw_li;
|
||||||
|
|
||||||
|
void clear_plainshapes() {
|
||||||
|
for(int i=0; i<32; i++)
|
||||||
|
for(int j=0; j<32; j++)
|
||||||
|
for(int k=0; k<8; k++)
|
||||||
|
clear_plainshape(psh[i][j][k]);
|
||||||
|
}
|
||||||
|
|
||||||
|
plainshape& get_plainshape() {
|
||||||
|
auto& pshape = psh[draw_li.relative.first&31][draw_li.relative.second&31][fix6(draw_li.total_dir)];
|
||||||
|
if(!pshape.active) build_plainshape(pshape, draw_li);
|
||||||
|
return pshape;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear_plainshape(plainshape& gsh) {
|
||||||
|
gsh.active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void build_plainshape(plainshape& gsh, gp::local_info& li) {
|
||||||
|
|
||||||
|
gsh.active = true;
|
||||||
|
bshape(gsh.shFullFloor, PPR_FLOOR);
|
||||||
|
bool master = !(li.relative.first||li.relative.second);
|
||||||
|
int cor = master ? S7 : 6;
|
||||||
|
printf("generating plainshape %d,%d,%d (%d)\n", li.relative.first, li.relative.second, li.total_dir, cor);
|
||||||
|
if(master) li.last_dir = -1;
|
||||||
|
|
||||||
|
for(int j=0; j<=cor; j++)
|
||||||
|
hpcpush(get_corner_position(li, j));
|
||||||
|
last->flags |= POLY_HASWALLS | POLY_FULL | POLY_GP;
|
||||||
|
|
||||||
|
bshape(gsh.shFloor, PPR_FLOOR);
|
||||||
|
for(int j=0; j<=cor; j++)
|
||||||
|
hpcpush(get_corner_position(li, j, 3.3));
|
||||||
|
last->flags |= POLY_HASWALLS | POLY_PLAIN | POLY_GP;
|
||||||
|
|
||||||
|
for(int k=0; k<SIDEPARS; k++)
|
||||||
|
for(int c=0; c<cor; c++) {
|
||||||
|
bshape(gsh.shFullFloorSide[k][c], PPR_FLOOR);
|
||||||
|
hpcpush(get_corner_position(li, c));
|
||||||
|
hpcpush(get_corner_position(li, c+1));
|
||||||
|
chasmifyPoly(dlow_table[k], dhi_table[k], k);
|
||||||
|
|
||||||
|
bshape(gsh.shFloorSide[k][c], PPR_FLOOR);
|
||||||
|
hpcpush(get_corner_position(li, c, 3.3));
|
||||||
|
hpcpush(get_corner_position(li, c+1, 3.3));
|
||||||
|
chasmifyPoly(dlow_table[k], dhi_table[k], k);
|
||||||
|
}
|
||||||
|
|
||||||
|
extra_vertices();
|
||||||
|
}
|
||||||
|
|
||||||
/* floors */
|
/* floors */
|
||||||
|
|
||||||
// need eswap
|
// need eswap
|
||||||
@ -3703,9 +3734,8 @@ NEWSHAPE
|
|||||||
#define ECT3 ((euclid&&!a4)?3:xct6)
|
#define ECT3 ((euclid&&!a4)?3:xct6)
|
||||||
|
|
||||||
// no eswap
|
// no eswap
|
||||||
#define PLAINFLOOR (gp::on ? shFloorGP[DRAW_INDICES] : shFloor[ct6])
|
#define PLAINFLOOR (gp::on ? gp::get_plainshape().shFloor : shFloor[ct6])
|
||||||
#define DRAW_INDICES gp::draw_li.relative.first&31][gp::draw_li.relative.second&31][fix6(gp::draw_li.total_dir)
|
#define FULLFLOOR (gp::on ? gp::get_plainshape().shFullFloor : shFullFloor[ct6])
|
||||||
#define FULLFLOOR (gp::on ? shFullFloorGP[DRAW_INDICES] : shFullFloor[ct6])
|
|
||||||
#define CAVEFLOOR shCaveFloor[ECT3]
|
#define CAVEFLOOR shCaveFloor[ECT3]
|
||||||
#define OVERFLOOR shOverFloor[euclid&&a4&&nonbitrunc?2:ECT]
|
#define OVERFLOOR shOverFloor[euclid&&a4&&nonbitrunc?2:ECT]
|
||||||
#define CLOUDFLOOR shCloudFloor[ECT]
|
#define CLOUDFLOOR shCloudFloor[ECT]
|
||||||
|
Loading…
Reference in New Issue
Block a user