mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-12-26 10:00:42 +00:00
refactored animation, and should now work in every embedded
This commit is contained in:
parent
5dcddc9365
commit
6259815f7f
56
graph.cpp
56
graph.cpp
@ -2617,30 +2617,12 @@ EX bool applyAnimation(cell *c, shiftmatrix& V, double& footphase, int layer) {
|
||||
ld aspd = td / 1000.0 * exp(vid.mspeed);
|
||||
ld R;
|
||||
again:
|
||||
|
||||
if(sl2) {
|
||||
a.wherenow = slr::translate(tC0(a.wherenow));
|
||||
hyperpoint h = tC0(iso_inverse(a.wherenow));
|
||||
hyperpoint ie = slr::get_inverse_exp(shiftless(h));
|
||||
auto R = hypot_d(3, ie);
|
||||
aspd *= (1+R+(shmup::on?1:0));
|
||||
if(R < aspd || std::isnan(R) || std::isnan(aspd) || R > 10) {
|
||||
animations[layer].erase(c);
|
||||
return false;
|
||||
}
|
||||
a.wherenow = nisot::parallel_transport(a.wherenow, tangent_length(h, aspd));
|
||||
a.footphase += a.attacking == 2 ? -aspd : aspd;
|
||||
// todo attack animation, rotate correctly
|
||||
footphase = a.footphase;
|
||||
V = V * a.wherenow;
|
||||
a.ltick = ticks;
|
||||
return true;
|
||||
}
|
||||
auto TC0 = tile_center();
|
||||
|
||||
if(among(a.attacking, 1, 3))
|
||||
R = hdist(tC0(a.attackat), tC0(a.wherenow));
|
||||
R = hdist(a.attackat * TC0, a.wherenow * TC0);
|
||||
else
|
||||
R = hdist0(tC0(a.wherenow));
|
||||
R = hdist(a.wherenow * TC0, TC0);
|
||||
aspd *= (1+R+(shmup::on?1:0));
|
||||
|
||||
if(a.attacking == 3 && aspd > R) aspd = R;
|
||||
@ -2651,22 +2633,20 @@ EX bool applyAnimation(cell *c, shiftmatrix& V, double& footphase, int layer) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
transmatrix T = inverse(a.wherenow);
|
||||
if(moved_center()) T = lzpush(-1) * T;
|
||||
|
||||
hyperpoint wnow;
|
||||
if(a.attacking == 1 || a.attacking == 3)
|
||||
wnow = tC0(z_inverse(a.wherenow) * a.attackat);
|
||||
wnow = T * a.attackat * TC0;
|
||||
else
|
||||
wnow = tC0(z_inverse(a.wherenow));
|
||||
wnow = T * TC0;
|
||||
|
||||
shift_v_towards(T, shiftless(wnow), aspd, shift_method(smaAnimation));
|
||||
if(moved_center()) T = lzpush(1) * T;
|
||||
a.wherenow = inverse(T);
|
||||
fixmatrix(a.wherenow);
|
||||
|
||||
if(gproduct) {
|
||||
auto d = product_decompose(wnow);
|
||||
ld dist = d.first / R * aspd;
|
||||
if(abs(dist) > abs(d.first)) dist = -d.first;
|
||||
a.wherenow = orthogonal_move(a.wherenow, dist);
|
||||
/* signed_sqrt to prevent precision errors */
|
||||
aspd *= signed_sqrt(R*R - d.first * d.first) / R;
|
||||
}
|
||||
a.wherenow = a.wherenow * rspintox(wnow);
|
||||
a.wherenow = a.wherenow * xpush(aspd);
|
||||
if(cgflags & qAFFINE) {
|
||||
transmatrix T = a.wherenow;
|
||||
fixmatrix_euclid(T);
|
||||
@ -2675,15 +2655,15 @@ EX bool applyAnimation(cell *c, shiftmatrix& V, double& footphase, int layer) {
|
||||
a.wherenow[i] = lerp(a.wherenow[i], Id[i], aspd / R);
|
||||
a.wherenow = T * a.wherenow;
|
||||
}
|
||||
fixmatrix(a.wherenow);
|
||||
|
||||
a.footphase += a.attacking == 2 ? -aspd : aspd;
|
||||
if(a.attacking == 3 && aspd >= R) {
|
||||
a.footphase = 0;
|
||||
hyperpoint h1 = a.wherenow * C0;
|
||||
a.wherenow = rgpushxto0(h1) * rspintox(h1);
|
||||
a.wherenow = rgpushxto0(h1) * lrspintox(h1);
|
||||
}
|
||||
footphase = a.footphase;
|
||||
V = V * a.wherenow;
|
||||
V = V * a.wherenow * lrspintox(wnow);
|
||||
if(a.mirrored) V = V * lmirror();
|
||||
if(a.attacking == 2) V = V * lpispin();
|
||||
a.ltick = ticks;
|
||||
@ -6055,8 +6035,8 @@ EX void animateAttackOrHug(const movei& m, int layer, int phase, ld ratio, ld de
|
||||
bool newanim = !animations[layer].count(m.s);
|
||||
animation& a = animations[layer][m.s];
|
||||
a.attacking = phase;
|
||||
if(phase == 3) println(hlog, "distance = ", hdist0(T * C0));
|
||||
a.attackat = lrspintox(tC0(iso_inverse(T))) * lxpush(hdist0(T*C0) * ratio + delta);
|
||||
auto TC0 = tile_center();
|
||||
a.attackat = lrspintox(iso_inverse(T) * TC0) * lxpush(hdist(TC0, T*TC0) * ratio + delta);
|
||||
if(newanim) a.wherenow = Id, a.ltick = ticks, a.footphase = 0;
|
||||
}
|
||||
|
||||
|
@ -1767,14 +1767,14 @@ EX ld xcross(ld x1, ld y1, ld x2, ld y2) { return x1 + (x2 - x1) * y1 / (y1 - y2
|
||||
#if HDR
|
||||
enum eShiftMethod { smProduct, smIsotropic, smEmbedded, smLie, smGeodesic, smESL2 };
|
||||
enum eEmbeddedShiftMethodChoice { smcNone, smcBoth, smcAuto };
|
||||
enum eShiftMethodApplication { smaManualCamera, smaAutocenter, smaObject, smaWallRadar };
|
||||
enum eShiftMethodApplication { smaManualCamera, smaAutocenter, smaObject, smaWallRadar, smaAnimation };
|
||||
#endif
|
||||
|
||||
EX eEmbeddedShiftMethodChoice embedded_shift_method_choice = smcBoth;
|
||||
|
||||
EX bool use_embedded_shift(eShiftMethodApplication sma) {
|
||||
switch(sma) {
|
||||
case smaAutocenter: return embedded_shift_method_choice != smcNone;
|
||||
case smaAutocenter: case smaAnimation: return embedded_shift_method_choice != smcNone;
|
||||
case smaManualCamera: return embedded_shift_method_choice == smcBoth;
|
||||
case smaObject: return true;
|
||||
case smaWallRadar: return among(pmodel, mdLiePerspective, mdLieOrthogonal);
|
||||
|
Loading…
Reference in New Issue
Block a user