mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-01-27 01:14:52 +00:00
animated 3D birds
This commit is contained in:
parent
7ed3ee6098
commit
8b0c0f58c4
@ -621,6 +621,29 @@ void disable(hpcshape& sh) {
|
|||||||
sh.s = sh.e = 0;
|
sh.s = sh.e = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clone_shape(hpcshape& sh, hpcshape& target) {
|
||||||
|
target = sh;
|
||||||
|
target.s = isize(hpc);
|
||||||
|
for(int i=sh.s; i<sh.e; i++) hpc.push_back(hpc[i]);
|
||||||
|
target.e = isize(hpc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void animate_bird(hpcshape& orig, hpcshape animated[30], ld body) {
|
||||||
|
for(int i=0; i<30; i++) {
|
||||||
|
auto& tgt = animated[i];
|
||||||
|
clone_shape(orig, tgt);
|
||||||
|
ld alpha = sin(12 * degree * i) * 30 * degree;
|
||||||
|
for(int i=tgt.s; i<tgt.e; i++) {
|
||||||
|
if(abs(hpc[i][1]) > body) {
|
||||||
|
ld off = hpc[i][1] > 0 ? body : -body;
|
||||||
|
hpc[i][2] += abs(hpc[i][1] - off) * sin(alpha);
|
||||||
|
hpc[i][1] = off + (hpc[i][1] - off) * cos(alpha);
|
||||||
|
hpc[i] = normalize(hpc[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void make_3d_models() {
|
void make_3d_models() {
|
||||||
if(DIM == 2) return;
|
if(DIM == 2) return;
|
||||||
shcenter = C0;
|
shcenter = C0;
|
||||||
@ -777,6 +800,9 @@ void make_3d_models() {
|
|||||||
shift_shape(shEyes, (-3.3) * S / -20);
|
shift_shape(shEyes, (-3.3) * S / -20);
|
||||||
for(int i=shEyes.s; i<shEyes.e; i++) hpc[i] = cspin(0, 2, M_PI/2) * hpc[i];
|
for(int i=shEyes.s; i<shEyes.e; i++) hpc[i] = cspin(0, 2, M_PI/2) * hpc[i];
|
||||||
|
|
||||||
|
animate_bird(shEagle, shAnimatedEagle, 0.05*S);
|
||||||
|
animate_bird(shTinyBird, shAnimatedTinyEagle, 0.05*S/2);
|
||||||
|
|
||||||
disable(shWolfRearLeg);
|
disable(shWolfRearLeg);
|
||||||
disable(shWolfFrontLeg);
|
disable(shWolfFrontLeg);
|
||||||
disable(shDogRearLeg);
|
disable(shDogRearLeg);
|
||||||
|
@ -1379,13 +1379,15 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V1, color_t col
|
|||||||
|
|
||||||
case moEagle: case moParrot: case moBomberbird: case moAlbatross:
|
case moEagle: case moParrot: case moBomberbird: case moAlbatross:
|
||||||
case moTameBomberbird: case moWindCrow: case moTameBomberbirdMoved:
|
case moTameBomberbird: case moWindCrow: case moTameBomberbirdMoved:
|
||||||
case moSandBird: case moAcidBird:
|
case moSandBird: case moAcidBird: {
|
||||||
ShadowV(V, shEagle);
|
ShadowV(V, shEagle);
|
||||||
|
auto& sh = DIM == 3 ? shAnimatedEagle[((long long)(ticks) * 30 / 1000) % 30] : shEagle;
|
||||||
if(m == moParrot && DIM == 3)
|
if(m == moParrot && DIM == 3)
|
||||||
queuepolyat(VBIRD, shEagle, darkena(col, 0, 0xFF), PPR::SUPERLINE);
|
queuepolyat(VBIRD, sh, darkena(col, 0, 0xFF), PPR::SUPERLINE);
|
||||||
else
|
else
|
||||||
queuepoly(VBIRD, shEagle, darkena(col, 0, 0xFF));
|
queuepoly(VBIRD, sh, darkena(col, 0, 0xFF));
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
case moSparrowhawk: case moWestHawk: {
|
case moSparrowhawk: case moWestHawk: {
|
||||||
ShadowV(V, shHawk);
|
ShadowV(V, shHawk);
|
||||||
|
@ -1716,6 +1716,8 @@ hpcshape
|
|||||||
|
|
||||||
shPBodyOnly, shPBodyArm, shPBodyHand, shPHeadOnly,
|
shPBodyOnly, shPBodyArm, shPBodyHand, shPHeadOnly,
|
||||||
|
|
||||||
|
shAnimatedEagle[30], shAnimatedTinyEagle[30],
|
||||||
|
|
||||||
shDodeca;
|
shDodeca;
|
||||||
|
|
||||||
vector<hpcshape> shPlainWall3D, shWireframe3D, shWall3D, shMiniWall3D;
|
vector<hpcshape> shPlainWall3D, shWireframe3D, shWall3D, shMiniWall3D;
|
||||||
|
12
rogueviz.cpp
12
rogueviz.cpp
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
#include "rogueviz.h"
|
#include "rogueviz.h"
|
||||||
|
|
||||||
namespace hr { extern hpcshape shEagle, shMiniGhost, shGhost, shShark; }
|
namespace hr { extern hpcshape shEagle, shMiniGhost, shGhost, shShark, shAnimatedEagle[30], shAnimatedTinyEagle[30]; }
|
||||||
|
|
||||||
namespace rogueviz {
|
namespace rogueviz {
|
||||||
|
|
||||||
@ -1107,7 +1107,7 @@ color_t darken_a(color_t c) {
|
|||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
void queuedisk(const transmatrix& V, const colorpair& cp, bool legend, const string* info) {
|
void queuedisk(const transmatrix& V, const colorpair& cp, bool legend, const string* info, int i) {
|
||||||
if(legend && (int) cp.color1 == (int) 0x000000FF && backcolor == 0)
|
if(legend && (int) cp.color1 == (int) 0x000000FF && backcolor == 0)
|
||||||
poly_outline = 0x606060FF;
|
poly_outline = 0x606060FF;
|
||||||
else
|
else
|
||||||
@ -1146,10 +1146,10 @@ void queuedisk(const transmatrix& V, const colorpair& cp, bool legend, const str
|
|||||||
case 's': queuepoly(V1, shDiskS, darken_a(cp.color2)); return;
|
case 's': queuepoly(V1, shDiskS, darken_a(cp.color2)); return;
|
||||||
case 'q': queuepoly(V1, shDiskSq, darken_a(cp.color2)); return;
|
case 'q': queuepoly(V1, shDiskSq, darken_a(cp.color2)); return;
|
||||||
case 'm': queuepoly(V1, shDiskM, darken_a(cp.color2)); return;
|
case 'm': queuepoly(V1, shDiskM, darken_a(cp.color2)); return;
|
||||||
case 'b': queuepoly(V1, shTinyBird, darken_a(cp.color2)); return;
|
case 'b': queuepoly(V1, DIM == 3 ? shAnimatedTinyEagle[((long long)(ticks) * 30 / 1000+i) % 30] : shTinyBird, darken_a(cp.color2)); return;
|
||||||
case 'f': queuepoly(V1, shTinyShark, darken_a(cp.color2)); return;
|
case 'f': queuepoly(V1, shTinyShark, darken_a(cp.color2)); return;
|
||||||
case 'g': queuepoly(V1, shMiniGhost, darken_a(cp.color2)); return;
|
case 'g': queuepoly(V1, shMiniGhost, darken_a(cp.color2)); return;
|
||||||
case 'B': queuepoly(V1, shEagle, darken_a(cp.color2)); return;
|
case 'B': queuepoly(V1, DIM == 3 ? shAnimatedEagle[((long long)(ticks) * 30 / 1000+i) % 30] : shEagle, darken_a(cp.color2)); return;
|
||||||
case 'F': queuepoly(V1, shShark, darken_a(cp.color2)); return;
|
case 'F': queuepoly(V1, shShark, darken_a(cp.color2)); return;
|
||||||
case 'G': queuepoly(V1, shGhost, darken_a(cp.color2)); return;
|
case 'G': queuepoly(V1, shGhost, darken_a(cp.color2)); return;
|
||||||
}
|
}
|
||||||
@ -1315,7 +1315,7 @@ bool drawVertex(const transmatrix &V, cell *c, shmup::monster *m) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!vd.virt) {
|
if(!vd.virt) {
|
||||||
queuedisk(V * m->at, ghilite ? colorpair(0xFF0000FF) : vd.cp, false, vd.info);
|
queuedisk(V * m->at, ghilite ? colorpair(0xFF0000FF) : vd.cp, false, vd.info, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1430,7 +1430,7 @@ bool rogueviz_hud() {
|
|||||||
transmatrix V = atscreenpos(x, y, current_display->radius/4);
|
transmatrix V = atscreenpos(x, y, current_display->radius/4);
|
||||||
|
|
||||||
poly_outline = OUTLINE_NONE;
|
poly_outline = OUTLINE_NONE;
|
||||||
queuedisk(V, vd.cp, true, NULL);
|
queuedisk(V, vd.cp, true, NULL, i);
|
||||||
poly_outline = OUTLINE_DEFAULT;
|
poly_outline = OUTLINE_DEFAULT;
|
||||||
queuestr(int(x-rad), int(y), 0, rad*(svg::in?5:3)/4, vd.name, forecolor, 0, 16);
|
queuestr(int(x-rad), int(y), 0, rad*(svg::in?5:3)/4, vd.name, forecolor, 0, 16);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user