improved display in Halloween

This commit is contained in:
Zeno Rogue 2017-10-09 11:46:49 +02:00
parent 32edc68a6d
commit 0c154d6751
4 changed files with 64 additions and 3 deletions

View File

@ -1,5 +1,11 @@
double randd() { return (rand() % 1000000) / 1000000. + .0000005; }
transmatrix cellrelmatrix(cell *c, int i) {
double d =
purehepta ? tessf : c->type == 6 ? hexhexdist : crossf;
return ddspin(c, i) * xpush(d) * iddspin(c->mov[i], c->spin(i), euclid ? 0 : S42);
}
hyperpoint randomPointIn(int t) {
while(true) {
hyperpoint h = spin(2*M_PI*(randd()-.5)/t) * tC0(xpush(asinh(randd())));

View File

@ -219,6 +219,11 @@ transmatrix ddspin(cell *c, int d, int bonus) {
return getspinmatrix(hdir);
}
transmatrix iddspin(cell *c, int d, int bonus = 0) {
int hdir = displaydir(c, d) + bonus;
return getspinmatrix(-hdir);
}
void drawPlayerEffects(const transmatrix& V, cell *c, bool onplayer) {
if(!onplayer && !items[itOrbEmpathy]) return;
if(items[itOrbShield] > (shmup::on ? 0 : ORBBASE)) drawShield(V, itOrbShield);
@ -4056,21 +4061,25 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
bool w = isWarped(c);
int col = (highwall(c) || c->wall == waTower) ? wcol : fcol;
if(!chasmg) {
#define D(v) darkena(gradient(0, col, 0, v * (sphere ? spherity(V * cellrelmatrix(c,i)) : 1), 1), fd, 0xFF)
if(sha & 1) {
forCellIdEx(c2, i, c) if(chasmgraph(c2))
placeSidewallX(c, i, SIDE_LAKE, V, w, false, darkena(gradient(0, col, 0, .8, 1), fd, 0xFF));
placeSidewallX(c, i, SIDE_LAKE, V, w, false, D(.8));
}
if(sha & 2) {
forCellIdEx(c2, i, c) if(chasmgraph(c2))
placeSidewallX(c, i, SIDE_LTOB, V, w, false, darkena(gradient(0, col, 0, .7, 1), fd, 0xFF));
placeSidewallX(c, i, SIDE_LTOB, V, w, false, D(.7));
}
if(sha & 4) {
bool dbot = true;
forCellIdEx(c2, i, c) if(chasmgraph(c2) == 2) {
if(dbot) dbot = false,
warpfloor(c, mscale(V, geom3::BOTTOM), 0x080808FF, PPR_LAKEBOTTOM, isWarped(c));
placeSidewallX(c, i, SIDE_BTOI, V, w, false, darkena(gradient(0, col, 0, .6, 1), fd, 0xFF));
placeSidewallX(c, i, SIDE_BTOI, V, w, false, D(.6));
}
#undef D
}
}
// wall between lake and chasm -- no Escher here
@ -4081,6 +4090,26 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
}
}
if(chasmg == 2 && wmspatial && sphere) {
forCellIdEx(c2, i, c) if(chasmgraph(c2) == 0) {
transmatrix V2 = V * cellrelmatrix(c, i);
if(!behindsphere(V2)) continue;
bool w = isWarped(c2);
int wcol2, fcol2;
setcolors(c2, wcol2, fcol2);
int col = (highwall(c2) || c->wall == waTower) ? wcol2 : fcol2;
col = gradient(0, col, 0, spherity(V), 1);
int j = c->spin(i);
if(ticks % 500 < -250) {
V2 = V2 * ddspin(c2, j);
j = 0;
}
placeSidewall(c2, j, SIDE_LAKE, V2, w, false, darkena(gradient(0, col, 0, .8, 1), fd, 0xFF));
placeSidewall(c2, j, SIDE_LTOB, V2, w, false, darkena(gradient(0, col, 0, .7, 1), fd, 0xFF));
placeSidewall(c2, j, SIDE_BTOI, V2, w, false, darkena(gradient(0, col, 0, .6, 1), fd, 0xFF));
}
}
if(chasmg == 1 && wmspatial) {
int fd0 = fd ? fd-1 : 0;

View File

@ -1592,3 +1592,5 @@ void showMessageLog();
int getgametime();
string getgametime_s(int timespent = getgametime());
extern int stampbase;
transmatrix cellrelmatrix(cell *c, int i);

View File

@ -291,10 +291,34 @@ bool behindsphere(const hyperpoint& h) {
return false;
}
ld to01(ld a0, ld a1, ld x) {
if(x < a0) return 0;
if(x > a1) return 1;
return (x-a0) / (a1-a0);
}
ld spherity(const hyperpoint& h) {
if(!sphere) return 1;
if(vid.alpha > 1) {
return to01(1/vid.alpha, 1, -h[2]);
}
if(vid.alpha <= 1) {
return to01(-.8, 1, h[2]);
}
return 1;
}
bool behindsphere(const transmatrix& V) {
return behindsphere(tC0(V));
}
ld spherity(const transmatrix& V) {
return spherity(tC0(V));
}
bool confusingGeometry() {
return elliptic || quotient == 1 || torus;
}