diff --git a/3d-models.cpp b/3d-models.cpp index dd88cf30..fb53a2b2 100644 --- a/3d-models.cpp +++ b/3d-models.cpp @@ -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); diff --git a/graph.cpp b/graph.cpp index 6a5974b9..7e9f5ecb 100644 --- a/graph.cpp +++ b/graph.cpp @@ -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; } diff --git a/polygons.cpp b/polygons.cpp index e1f5d309..f7307c28 100644 --- a/polygons.cpp +++ b/polygons.cpp @@ -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;