3D:: animation for all birds; fixed a crash on Butterfly drawing

This commit is contained in:
Zeno Rogue 2019-05-16 17:08:12 +02:00
parent dc92ff2eda
commit fc7100bbf1
3 changed files with 47 additions and 22 deletions

View File

@ -682,8 +682,8 @@ void animate_bird(hpcshape& orig, hpcshape animated[30], ld body) {
}
}
}
for(int i=0; i<30; i++) shift_shape(animated[i], geom3::BIRD);
shift_shape(orig, geom3::BIRD);
// for(int i=0; i<30; i++) shift_shape(animated[i], geom3::BIRD);
// shift_shape(orig, geom3::BIRD);
}
void slimetriangle(hyperpoint a, hyperpoint b, hyperpoint c, ld rad, int lev) {
@ -978,8 +978,8 @@ void make_3d_models() {
make_revolution_cut(shGhost, 60, geom3::GHOST + g);
make_revolution_cut(shEagle, 180, -geom3::BIRD, 0.05*S);
make_revolution_cut(shHawk, 180, -geom3::BIRD, 0.05*S);
make_revolution_cut(shEagle, 180, 0, 0.05*S);
make_revolution_cut(shHawk, 180, 0, 0.05*S);
make_revolution_cut(shTinyBird, 180, 0, 0.025 * S);
make_revolution_cut(shTinyShark, 90);
@ -987,14 +987,14 @@ void make_3d_models() {
make_revolution_cut(shGargoyleWings, 180, 0, 0.05*S);
make_revolution_cut(shGargoyleBody, 180, 0, 0.05*S);
make_revolution_cut(shGadflyWing, 180, -geom3::BIRD, 0.05*S);
make_revolution_cut(shBatWings, 180, -geom3::BIRD, 0.05*S);
make_revolution_cut(shBatBody, 180, -geom3::BIRD, 0.05*S);
make_revolution_cut(shGadflyWing, 180, 0, 0.05*S);
make_revolution_cut(shBatWings, 180, 0, 0.05*S);
make_revolution_cut(shBatBody, 180, 0, 0.05*S);
make_revolution_cut(shJelly, 60);
make_revolution(shFoxTail1);
make_revolution(shFoxTail2);
make_revolution(shGadflyBody, 180, -geom3::BIRD);
make_revolution(shGadflyBody, 180, 0);
for(int i=0; i<8; i++)
make_revolution(shAsteroid[i], 360);
@ -1003,11 +1003,21 @@ void make_3d_models() {
make_revolution(shBugArmor, 180, geom3::ABODY);
make_revolution_cut(shBugAntenna, 90, geom3::ABODY);
make_revolution_cut(shButterflyBody, 180, -geom3::BIRD);
make_revolution_cut(shButterflyBody, 180, 0);
make_revolution_cut(shButterflyWing, 180, 0, 0.05*S);
finishshape();
animate_bird(shEagle, shAnimatedEagle, 0.05*S);
animate_bird(shTinyBird, shAnimatedTinyEagle, 0.05*S/2);
animate_bird(shButterflyWing, shAnimatedButterfly, 0);
animate_bird(shGadflyWing, shAnimatedGadfly, 0);
animate_bird(shHawk, shAnimatedHawk, 0.05*S);
animate_bird(shGargoyleWings, shAnimatedGargoyle, 0.05*S);
animate_bird(shGargoyleBody, shAnimatedGargoyle2, 0.05*S);
animate_bird(shBatWings, shAnimatedBat, 0.05*S);
animate_bird(shBatBody, shAnimatedBat2, 0.05*S);
disable(shWolfRearLeg);
disable(shWolfFrontLeg);
disable(shDogRearLeg);

View File

@ -1149,6 +1149,18 @@ void drawPlayer(eMonster m, cell *where, const transmatrix& V, color_t col, doub
}
}
int wingphase(int period, int phase = 0) {
ld t = fractick(period, phase);
return int(t * 30) % 30;
}
transmatrix wingmatrix(int period, int phase = 0) {
ld t = fractick(period, phase) * 2 * M_PI;
transmatrix Vwing = Id;
Vwing[1][1] = .85 + .15 * sin(t);
return Vwing;
}
void drawMimic(eMonster m, cell *where, const transmatrix& V, color_t col, double footphase) {
charstyle& cs = getcs();
@ -1475,7 +1487,7 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V1, color_t col
case moTameBomberbird: case moWindCrow: case moTameBomberbirdMoved:
case moSandBird: case moAcidBird: {
ShadowV(V, shEagle);
auto& sh = DIM == 3 ? shAnimatedEagle[((long long)(ticks) * 30 / 1000) % 30] : shEagle;
auto& sh = DIM == 3 ? shAnimatedEagle[wingphase(200)] : shEagle;
if(m == moParrot && DIM == 3)
queuepolyat(VBIRD, sh, darkena(col, 0, 0xFF), PPR::SUPERLINE);
else
@ -1485,24 +1497,26 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V1, color_t col
case moSparrowhawk: case moWestHawk: {
ShadowV(V, shHawk);
queuepoly(VBIRD, shHawk, darkena(col, 0, 0xFF));
auto& sh = DIM == 3 ? shAnimatedHawk[wingphase(200)] : shHawk;
queuepoly(VBIRD, sh, darkena(col, 0, 0xFF));
return false;
}
case moButterfly: {
transmatrix Vwing = Id;
Vwing[1][1] = .85 + .15 * sintick(100);
transmatrix Vwing = wingmatrix(100);
ShadowV(V * Vwing, shButterflyWing);
queuepoly(VBIRD * Vwing, shButterflyWing, darkena(col, 0, 0xFF));
if(DIM == 2)
queuepoly(VBIRD * Vwing, shButterflyWing, darkena(col, 0, 0xFF));
else
queuepoly(VBIRD, shAnimatedButterfly[wingphase(100)], darkena(col, 0, 0xFF));
queuepoly(VBIRD, shButterflyBody, darkena(col, 2, 0xFF));
return false;
}
case moGadfly: {
transmatrix Vwing = Id;
Vwing[1][1] = .85 + .15 * sintick(100);
transmatrix Vwing = wingmatrix(100);
ShadowV(V * Vwing, shGadflyWing);
queuepoly(VBIRD * Vwing, shGadflyWing, darkena(col, 0, 0xFF));
queuepoly(VBIRD * Vwing, DIM == 2 ? shGadflyWing : shAnimatedGadfly[wingphase(100)], darkena(col, 0, 0xFF));
queuepoly(VBIRD, shGadflyBody, darkena(col, 1, 0xFF));
queuepoly(VBIRD, shGadflyEye, darkena(col, 2, 0xFF));
queuepoly(VBIRD * Mirror, shGadflyEye, darkena(col, 2, 0xFF));
@ -1513,8 +1527,8 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V1, color_t col
// vampires have no shadow and no mirror images
if(m == moBat) ShadowV(V, shBatWings);
if(m == moBat || !inmirrorcount) {
queuepoly(VBIRD, shBatWings, darkena(0x303030, 0, 0xFF));
queuepoly(VBIRD, shBatBody, darkena(0x606060, 0, 0xFF));
queuepoly(VBIRD, DIM == 2 ? shBatWings : shAnimatedBat[wingphase(100)], darkena(0x303030, 0, 0xFF));
queuepoly(VBIRD, DIM == 2 ? shBatBody : shAnimatedBat2[wingphase(100)], darkena(0x606060, 0, 0xFF));
}
/* queuepoly(V, shBatMouth, darkena(0xC00000, 0, 0xFF));
queuepoly(V, shBatFang, darkena(0xFFC0C0, 0, 0xFF));
@ -1526,8 +1540,8 @@ bool drawMonsterType(eMonster m, cell *where, const transmatrix& V1, color_t col
case moGargoyle: {
ShadowV(V, shGargoyleWings);
queuepoly(VBIRD, shGargoyleWings, darkena(col, 0, 0xD0));
queuepoly(VBIRD, shGargoyleBody, darkena(col, 0, 0xFF));
queuepoly(VBIRD, DIM == 2 ? shGargoyleWings : shAnimatedGargoyle[wingphase(300)], darkena(col, 0, 0xD0));
queuepoly(VBIRD, DIM == 2 ? shGargoyleBody : shAnimatedGargoyle2[wingphase(300)], darkena(col, 0, 0xFF));
return false;
}

View File

@ -1748,7 +1748,8 @@ hpcshape
shPBodyOnly, shPBodyArm, shPBodyHand, shPHeadOnly,
shAnimatedEagle[30], shAnimatedTinyEagle[30],
shAnimatedEagle[30], shAnimatedTinyEagle[30], shAnimatedGadfly[30], shAnimatedHawk[30], shAnimatedButterfly[30],
shAnimatedGargoyle[30], shAnimatedGargoyle2[30], shAnimatedBat[30], shAnimatedBat2[30],
shDodeca;