1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-11-23 21:07:17 +00:00

Asteroids in 3D

This commit is contained in:
Zeno Rogue 2019-03-30 20:06:35 +01:00
parent 6d87b282c3
commit 55492e229b
4 changed files with 15 additions and 4 deletions

View File

@ -665,7 +665,7 @@ color_t kind_outline(eItem it) {
return OUTLINE_OTHER;
}
transmatrix face_the_player(transmatrix V) {
transmatrix face_the_player(const transmatrix V) {
if(DIM == 2) return V;
return rgpushxto0(tC0(V));
}
@ -5465,7 +5465,7 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
queuechr(V, 1, ch, darkenedby(asciicol, darken), 2);
}
if(vid.grid) {
if(vid.grid || (DIM == 3 && c->land == laAsteroids)) {
dynamicval<ld> lw(vid.linewidth, vid.linewidth);
vid.linewidth *= scalefactor;

View File

@ -2022,6 +2022,9 @@ extern bool ivoryz;
#define SHADOW_SL 0x18
#define SHADOW_MON 0x30
transmatrix face_the_player(const transmatrix V);
hyperpoint makeradar(transmatrix V);
bool drawMonsterType(eMonster m, cell *where, const transmatrix& V, color_t col, double footphase);
void drawPlayerEffects(const transmatrix& V, cell *c, bool onPlayer);

View File

@ -2318,6 +2318,7 @@ void procedural_shapes() {
for(int i=0; i<8; i++) {
asteroid_size[i] = scalefactor * 0.1 * pow(2, (i-1) * 1. / DIM);
if(DIM == 3) asteroid_size[i] *= 4;
bshape(shAsteroid[i], PPR::PARTICLE);
for(int t=0; t<12; t++)
hpcpush(xspinpush0(M_PI * t / 6, asteroid_size[i] * (1 - randd() * .2)));

View File

@ -1847,6 +1847,7 @@ void movePlayer(monster *m, int delta) {
if(igo) { go = false; break; }
ld r = hypot_d(DIM, avg_inertia);
nat = nat * rspintox(avg_inertia) * xpush(r * delta) * spintox(avg_inertia);
if(DIM == 3) nat = nat * cspin(0, 2, playerturn[cpid]) * cspin(1, 2, playerturny[cpid]);
}
else if(DIM == 3) {
nat = nat1 * cpush(0, playerstrafe[cpid]) * cpush(2, playergo[cpid]) * cspin(0, 2, playerturn[cpid]) * cspin(1, 2, playerturny[cpid]);
@ -3690,9 +3691,15 @@ bool drawMonster(const transmatrix& V, cell *c, const transmatrix*& Vboat, trans
break;
}
case moAsteroid: {
transmatrix t = view * spin(curtime / 500.0);
queuepoly(mmscale(t, 1.15), shAsteroid[m->hitpoints & 7], (minf[m->type].color << 8) | 0xFF);
if(DIM == 3) radarpoints.emplace_back(radarpoint{makeradar(view), '*', 0xFFFFFF, 0xC0C0C0FF});
transmatrix t = view;
if(DIM == 3) t = face_the_player(t);
t = t * spin(curtime / 500.0);
ShadowV(t, shAsteroid[m->hitpoints & 7]);
if(DIM == 2) t = mmscale(t, 1.15);
color_t col = DIM == 3 ? 0xFFFFFF : minf[m->type].color;
col <<= 8;
queuepoly(t, shAsteroid[m->hitpoints & 7], col | 0xFF);
break;
}