mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-01-13 19:00:35 +00:00
embeddings:: fixed snake chaining
This commit is contained in:
parent
a14bceb681
commit
373c0fe152
31
graph.cpp
31
graph.cpp
@ -2664,19 +2664,25 @@ EX bool applyAnimation(cell *c, shiftmatrix& V, double& footphase, int layer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
double chainAngle(cell *c, shiftmatrix& V, cell *c2, double dft, const shiftmatrix &Vwhere) {
|
double chainAngle(cell *c, shiftmatrix& V, cell *c2, double dft, const shiftmatrix &Vwhere) {
|
||||||
|
if(cgi.emb->no_spin()) return 0;
|
||||||
if(!gmatrix0.count(c2)) return dft;
|
if(!gmatrix0.count(c2)) return dft;
|
||||||
hyperpoint h = C0;
|
hyperpoint h = tile_center();
|
||||||
if(animations[LAYER_BIG].count(c2)) h = animations[LAYER_BIG][c2].wherenow * h;
|
if(animations[LAYER_BIG].count(c2)) h = animations[LAYER_BIG][c2].wherenow * h;
|
||||||
h = inverse_shift(V, Vwhere) * calc_relative_matrix(c2, c, C0) * h;
|
h = inverse_shift(V, Vwhere) * calc_relative_matrix(c2, c, C0) * h;
|
||||||
|
ld z = cgi.emb->center_z();
|
||||||
|
if(z) h = lzpush(-z) * h;
|
||||||
return atan2(h[1], h[0]);
|
return atan2(h[1], h[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// equivalent to V = V * spin(-chainAngle(c,V,c2,dft));
|
// equivalent to V = V * spin(-chainAngle(c,V,c2,dft));
|
||||||
bool chainAnimation(cell *c, cell *c2, shiftmatrix& V, const shiftmatrix &Vwhere, ld& length) {
|
bool chainAnimation(cell *c, cell *c2, shiftmatrix& V, const shiftmatrix &Vwhere, ld& length) {
|
||||||
hyperpoint h = C0;
|
if(cgi.emb->no_spin()) return false;
|
||||||
|
hyperpoint h = tile_center();
|
||||||
if(animations[LAYER_BIG].count(c2)) h = animations[LAYER_BIG][c2].wherenow * h;
|
if(animations[LAYER_BIG].count(c2)) h = animations[LAYER_BIG][c2].wherenow * h;
|
||||||
h = inverse_shift(V, Vwhere) * h;
|
h = inverse_shift(V, Vwhere) * h;
|
||||||
length = hdist0(h);
|
length = hdist(h, tile_center());
|
||||||
|
ld z = cgi.emb->center_z();
|
||||||
|
if(z) h = lzpush(-z) * h;
|
||||||
V = V * rspintox(h);
|
V = V * rspintox(h);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -2821,6 +2827,13 @@ EX bool drawMonster(const shiftmatrix& Vparam, int ct, cell *c, color_t col, col
|
|||||||
length = cellgfxdist(c, c->mondir);
|
length = cellgfxdist(c, c->mondir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
shiftmatrix Vbn = Vb;
|
||||||
|
if(cgi.emb->no_spin() && c->mondir != NODIR) {
|
||||||
|
Vbn = Vparam * currentmap->adj(c, c->mondir);
|
||||||
|
ld dummy;
|
||||||
|
applyAnimation(c->move(c->mondir), Vbn, dummy, LAYER_BIG);
|
||||||
|
}
|
||||||
|
|
||||||
if(c->monmirror) Vb = Vb * lmirror();
|
if(c->monmirror) Vb = Vb * lmirror();
|
||||||
|
|
||||||
if(mapeditor::drawUserShape(Vb, mapeditor::sgMonster, c->monst, (col << 8) + 0xFF, c))
|
if(mapeditor::drawUserShape(Vb, mapeditor::sgMonster, c->monst, (col << 8) + 0xFF, c))
|
||||||
@ -2873,8 +2886,16 @@ EX bool drawMonster(const shiftmatrix& Vparam, int ct, cell *c, color_t col, col
|
|||||||
if(doHighlight())
|
if(doHighlight())
|
||||||
poly_outline = outline;
|
poly_outline = outline;
|
||||||
shiftmatrix Vbx = Vb;
|
shiftmatrix Vbx = Vb;
|
||||||
if(WDIM == 2) Vbx = Vbx * spin(sin(TAU * i / 12) * wav / (i+.1));
|
if(cgi.emb->no_spin()) {
|
||||||
Vbx = Vbx * lxpush(length * (i) / 12.0);
|
hyperpoint h = inverse_shift(Vb, Vbn * tile_center());
|
||||||
|
h = cgi.emb->actual_to_intermediate(h);
|
||||||
|
h *= i / 12.;
|
||||||
|
Vbx = Vb * cgi.emb->intermediate_to_actual_translation(h);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(WDIM == 2) Vbx = Vbx * spin(sin(TAU * i / 12) * wav / (i+.1));
|
||||||
|
Vbx = Vbx * lxpush(length * (i) / 12.0);
|
||||||
|
}
|
||||||
// shiftmatrix Vbx2 = Vnext * xpush(length2 * i / 6.0);
|
// shiftmatrix Vbx2 = Vnext * xpush(length2 * i / 6.0);
|
||||||
// Vbx = Vbx * rspintox(inverse(Vbx) * Vbx2 * C0) * lpispin();
|
// Vbx = Vbx * rspintox(inverse(Vbx) * Vbx2 * C0) * lpispin();
|
||||||
ShadowV(Vbx, sh, PPR::GIANTSHADOW);
|
ShadowV(Vbx, sh, PPR::GIANTSHADOW);
|
||||||
|
Loading…
Reference in New Issue
Block a user