mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-09-27 21:58:13 +00:00
3d:: boats are drawn
This commit is contained in:
parent
d6422d5def
commit
adaed6be7c
75
graph.cpp
75
graph.cpp
@ -3883,6 +3883,47 @@ int get_darkval(int d) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void drawBoat(cell *c, const transmatrix* Vboat, transmatrix& Vboat0, transmatrix& V) {
|
||||||
|
double footphase;
|
||||||
|
if(c == cwt.at && playermoved && vid.sspeed > -5 && vid.yshift == 0) return;
|
||||||
|
bool magical = items[itOrbWater] && (isPlayerOn(c) || (isFriendly(c) && items[itOrbEmpathy]));
|
||||||
|
int outcol = magical ? watercolor(0) : 0xC06000FF;
|
||||||
|
int incol = magical ? 0x0060C0FF : 0x804000FF;
|
||||||
|
bool nospin = false;
|
||||||
|
|
||||||
|
if(DIM == 3) {
|
||||||
|
Vboat0 = V;
|
||||||
|
nospin = c->wall == waBoat && applyAnimation(c, Vboat0, footphase, LAYER_BOAT);
|
||||||
|
if(!nospin) Vboat0 = rgpushxto0(tC0(V));
|
||||||
|
else Vboat0 = cspin(0, 2, M_PI) * Vboat0;
|
||||||
|
queuepolyat(mscale(Vboat0, scalefactor/2), shBoatOuter, outcol, PPR::BOATLEV2);
|
||||||
|
queuepolyat(mscale(Vboat0, scalefactor/2-0.01), shBoatInner, incol, PPR::BOATLEV2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vboat = &(Vboat0 = *Vboat);
|
||||||
|
if(wmspatial && c->wall == waBoat) {
|
||||||
|
nospin = c->wall == waBoat && applyAnimation(c, Vboat0, footphase, LAYER_BOAT);
|
||||||
|
if(!nospin) Vboat0 = Vboat0 * ddspin(c, c->mondir, M_PI);
|
||||||
|
queuepolyat(Vboat0, shBoatOuter, outcol, PPR::BOATLEV);
|
||||||
|
Vboat = &(Vboat0 = V);
|
||||||
|
}
|
||||||
|
if(c->wall == waBoat) {
|
||||||
|
nospin = applyAnimation(c, Vboat0, footphase, LAYER_BOAT);
|
||||||
|
}
|
||||||
|
if(!nospin)
|
||||||
|
Vboat0 = Vboat0 * ddspin(c, c->mondir, M_PI);
|
||||||
|
else {
|
||||||
|
transmatrix Vx;
|
||||||
|
if(applyAnimation(c, Vx, footphase, LAYER_SMALL))
|
||||||
|
animations[LAYER_SMALL][c].footphase = 0;
|
||||||
|
}
|
||||||
|
if(wmspatial)
|
||||||
|
queuepolyat(mscale(Vboat0, (geom3::LAKE+1)/2), shBoatOuter, outcol, PPR::BOATLEV2);
|
||||||
|
queuepoly(Vboat0, shBoatOuter, outcol);
|
||||||
|
queuepoly(Vboat0, shBoatInner, incol);
|
||||||
|
}
|
||||||
|
|
||||||
void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
|
void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
|
||||||
|
|
||||||
cells_drawn++;
|
cells_drawn++;
|
||||||
@ -4733,6 +4774,7 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
|
|||||||
for(int a=0; a<c->type; a++)
|
for(int a=0; a<c->type; a++)
|
||||||
if(c->move(a) && !isWaterWall3(c->move(a)))
|
if(c->move(a) && !isWaterWall3(c->move(a)))
|
||||||
queuepolyat(V, shWall3D[a], wcol_alpha - d * get_darkval(a), PPR::TRANSPARENT).subprio = celldistance(c, viewctr.at->c7) + celldistance(c->move(a), viewctr.at->c7);
|
queuepolyat(V, shWall3D[a], wcol_alpha - d * get_darkval(a), PPR::TRANSPARENT).subprio = celldistance(c, viewctr.at->c7) + celldistance(c->move(a), viewctr.at->c7);
|
||||||
|
if(c->wall == waBoat) drawBoat(c, &V, V, V);
|
||||||
}
|
}
|
||||||
else if(isFire(c)) {
|
else if(isFire(c)) {
|
||||||
int r = ticks - lastt;
|
int r = ticks - lastt;
|
||||||
@ -4747,6 +4789,8 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
|
|||||||
queuepoly(rgpushxto0(tC0(V)), shMineMark[0], darkena(minecolors[mines], 0, 0xFF));
|
queuepoly(rgpushxto0(tC0(V)), shMineMark[0], darkena(minecolors[mines], 0, 0xFF));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if(c->wall == waStrandedBoat) drawBoat(c, &V, V, V);
|
||||||
|
|
||||||
else if(winf[c->wall].glyph == '.') ;
|
else if(winf[c->wall].glyph == '.') ;
|
||||||
|
|
||||||
else
|
else
|
||||||
@ -4817,36 +4861,9 @@ void drawcell(cell *c, transmatrix V, int spinv, bool mirrored) {
|
|||||||
drawTerraWarrior(V, randterra ? (c->landparam & 7) : (5 - (c->landparam & 7)), 7, 0);
|
drawTerraWarrior(V, randterra ? (c->landparam & 7) : (5 - (c->landparam & 7)), 7, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case waBoat: case waStrandedBoat: {
|
case waBoat: case waStrandedBoat:
|
||||||
double footphase;
|
drawBoat(c, Vboat, Vboat0, V);
|
||||||
bool magical = items[itOrbWater] && (isPlayerOn(c) || (isFriendly(c) && items[itOrbEmpathy]));
|
|
||||||
int outcol = magical ? watercolor(0) : 0xC06000FF;
|
|
||||||
int incol = magical ? 0x0060C0FF : 0x804000FF;
|
|
||||||
bool nospin = false;
|
|
||||||
|
|
||||||
Vboat = &(Vboat0 = *Vboat);
|
|
||||||
if(wmspatial && c->wall == waBoat) {
|
|
||||||
nospin = c->wall == waBoat && applyAnimation(c, Vboat0, footphase, LAYER_BOAT);
|
|
||||||
if(!nospin) Vboat0 = Vboat0 * ddspin(c, c->mondir, M_PI);
|
|
||||||
queuepolyat(Vboat0, shBoatOuter, outcol, PPR::BOATLEV);
|
|
||||||
Vboat = &(Vboat0 = V);
|
|
||||||
}
|
|
||||||
if(c->wall == waBoat) {
|
|
||||||
nospin = applyAnimation(c, Vboat0, footphase, LAYER_BOAT);
|
|
||||||
}
|
|
||||||
if(!nospin)
|
|
||||||
Vboat0 = Vboat0 * ddspin(c, c->mondir, M_PI);
|
|
||||||
else {
|
|
||||||
transmatrix Vx;
|
|
||||||
if(applyAnimation(c, Vx, footphase, LAYER_SMALL))
|
|
||||||
animations[LAYER_SMALL][c].footphase = 0;
|
|
||||||
}
|
|
||||||
if(wmspatial)
|
|
||||||
queuepolyat(mscale(Vboat0, (geom3::LAKE+1)/2), shBoatOuter, outcol, PPR::BOATLEV2);
|
|
||||||
queuepoly(Vboat0, shBoatOuter, outcol);
|
|
||||||
queuepoly(Vboat0, shBoatInner, incol);
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case waBigStatue: {
|
case waBigStatue: {
|
||||||
transmatrix V2 = V;
|
transmatrix V2 = V;
|
||||||
|
21
shmup.cpp
21
shmup.cpp
@ -3432,14 +3432,21 @@ bool drawMonster(const transmatrix& V, cell *c, const transmatrix*& Vboat, trans
|
|||||||
|
|
||||||
if(m->inBoat) {
|
if(m->inBoat) {
|
||||||
view = m->pat;
|
view = m->pat;
|
||||||
Vboat = &(Vboat0 = view);
|
Vboat = &Vboat0;
|
||||||
if(m->type == moPlayer && items[itOrbWater]) {
|
if(DIM == 2) Vboat0 = view;
|
||||||
queuepoly(m->pat, shBoatOuter, watercolor(0));
|
if(DIM == 3) Vboat0 = view * spin(-M_PI/2);
|
||||||
queuepoly(m->pat, shBoatInner, 0x0060C0FF);
|
|
||||||
|
bool magic = m->type == moPlayer && items[itOrbWater];
|
||||||
|
color_t outcolor = magic ? watercolor(0) : 0xC06000FF;
|
||||||
|
color_t incolor = magic ? 0x0060C0FF : 0x804000FF;
|
||||||
|
|
||||||
|
if(DIM == 2) {
|
||||||
|
queuepoly(Vboat0, shBoatOuter, outcolor);
|
||||||
|
queuepoly(Vboat0, shBoatInner, incolor);
|
||||||
}
|
}
|
||||||
else {
|
if(DIM == 3) {
|
||||||
queuepoly(m->pat, shBoatOuter, 0xC06000FF);
|
queuepoly(mscale(Vboat0, scalefactor/2), shBoatOuter, outcolor);
|
||||||
queuepoly(m->pat, shBoatInner, 0x804000FF);
|
queuepoly(mscale(Vboat0, scalefactor/2-0.01), shBoatInner, incolor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user