1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-06-21 15:54:07 +00:00

calc_relative_matrix now accepts hyperpoint as the direction hint

This commit is contained in:
Zeno Rogue 2018-07-16 20:02:33 +02:00
parent b0278e02c8
commit 4320119d02
4 changed files with 25 additions and 13 deletions

View File

@ -337,10 +337,10 @@ namespace conformal {
// virtualRebase(v[j], false); // virtualRebase(v[j], false);
hyperpoint prev = shmup::calc_relative_matrix(v[j-1]->base, v[j]->base, NOHINT) * hyperpoint prev = shmup::calc_relative_matrix(v[j-1]->base, v[j]->base, C0) *
v[j-1]->at * C0; v[j-1]->at * C0;
hyperpoint next = shmup::calc_relative_matrix(v[j+1]->base, v[j]->base, NOHINT) * hyperpoint next = shmup::calc_relative_matrix(v[j+1]->base, v[j]->base, C0) *
v[j+1]->at * C0; v[j+1]->at * C0;
hyperpoint hmid = mid(prev, next); hyperpoint hmid = mid(prev, next);
@ -352,7 +352,7 @@ namespace conformal {
} }
} }
hyperpoint next0 = shmup::calc_relative_matrix(v[1]->base, v[0]->base, NOHINT) * v[1]->at * C0; hyperpoint next0 = shmup::calc_relative_matrix(v[1]->base, v[0]->base, C0) * v[1]->at * C0;
v[0]->at = v[0]->at * rspintox(inverse(v[0]->at) * next0); v[0]->at = v[0]->at * rspintox(inverse(v[0]->at) * next0);
llv = ticks; llv = ticks;
@ -380,7 +380,7 @@ namespace conformal {
hyperpoint now = v[ph]->at * C0; hyperpoint now = v[ph]->at * C0;
hyperpoint next = shmup::calc_relative_matrix(v[ph+1]->base, v[ph]->base, NOHINT) * hyperpoint next = shmup::calc_relative_matrix(v[ph+1]->base, v[ph]->base, C0) *
v[ph+1]->at * C0; v[ph+1]->at * C0;
View = spin(M_PI/180 * rotation) * xpush(-(phase-ph) * hdist(now, next)) * View; View = spin(M_PI/180 * rotation) * xpush(-(phase-ph) * hdist(now, next)) * View;
@ -411,7 +411,7 @@ namespace conformal {
for(int j=0; j<siz-1; j++) { for(int j=0; j<siz-1; j++) {
hyperpoint next = hyperpoint next =
inverse(v[j]->at) * inverse(v[j]->at) *
shmup::calc_relative_matrix(v[j+1]->base, v[j]->base, NOHINT) * shmup::calc_relative_matrix(v[j+1]->base, v[j]->base, C0) *
v[j+1]->at * C0; v[j+1]->at * C0;
hyperpoint nextscr; hyperpoint nextscr;

View File

@ -706,6 +706,7 @@ namespace shmup {
void virtualRebase(cell*& base, transmatrix& at, bool tohex); void virtualRebase(cell*& base, transmatrix& at, bool tohex);
void virtualRebase(shmup::monster *m, bool tohex); void virtualRebase(shmup::monster *m, bool tohex);
transmatrix calc_relative_matrix(cell *c, cell *c1, const hyperpoint& point_hint);
transmatrix calc_relative_matrix(cell *c, cell *c1, int direction_hint); transmatrix calc_relative_matrix(cell *c, cell *c1, int direction_hint);
void fixStorage(); void fixStorage();
void addShmupHelp(string& out); void addShmupHelp(string& out);
@ -3661,4 +3662,12 @@ heptspin& operator += (heptspin& h, wstep_t);
bool anglestraight(cell *c, int d1, int d2); bool anglestraight(cell *c, int d1, int d2);
hyperpoint randomPointIn(int t);
void buildpolys();
bool compute_relamatrix(cell *src, cell *tgt, int direction_hint, transmatrix& T);
extern bool need_reset_geometry;
extern ld hexshift;
} }

View File

@ -163,7 +163,7 @@ hyperpoint where(int i, cell *base) {
auto m = vdata[i].m; auto m = vdata[i].m;
if(m->base == base) return tC0(m->at); if(m->base == base) return tC0(m->at);
else if(quotient || elliptic || torus) { else if(quotient || elliptic || torus) {
return shmup::calc_relative_matrix(m->base, base, NOHINT) * tC0(m->at); return shmup::calc_relative_matrix(m->base, base, C0) * tC0(m->at);
} }
else { else {
// notimpl(); // actually probably that's a buug // notimpl(); // actually probably that's a buug
@ -1078,7 +1078,7 @@ map<pair<cell*, cell*>, transmatrix> relmatrices;
transmatrix& memo_relative_matrix(cell *c1, cell *c2) { transmatrix& memo_relative_matrix(cell *c1, cell *c2) {
auto& p = relmatrices[make_pair(c1, c2)]; auto& p = relmatrices[make_pair(c1, c2)];
if(p[2][2] == 0) if(p[2][2] == 0)
p = shmup::calc_relative_matrix(c1, c2, NOHINT); p = shmup::calc_relative_matrix(c1, c2, C0);
return p; return p;
} }

View File

@ -3333,8 +3333,12 @@ transmatrix master_relative(cell *c, bool get_inverse) {
return pispin * Id; return pispin * Id;
} }
// target, source, direction from source to target
transmatrix calc_relative_matrix(cell *c2, cell *c1, int direction_hint) { transmatrix calc_relative_matrix(cell *c2, cell *c1, int direction_hint) {
return calc_relative_matrix(c2, c1, ddspin(c1, direction_hint) * xpush(1e-2) * C0);
}
// target, source, direction from source to target
transmatrix calc_relative_matrix(cell *c2, cell *c1, const hyperpoint& point_hint) {
if(sphere) { if(sphere) {
if(!gmatrix0.count(c2) || !gmatrix0.count(c1)) { if(!gmatrix0.count(c2) || !gmatrix0.count(c1)) {
@ -3399,20 +3403,19 @@ transmatrix calc_relative_matrix(cell *c2, cell *c1, int direction_hint) {
while(h1 != h2) { while(h1 != h2) {
if(quotient & qSMALL) { if(quotient & qSMALL) {
transmatrix T; transmatrix T;
hyperpoint hint = ddspin(c1, direction_hint) * xpush(1e-2) * C0;
ld bestdist = 1e9; ld bestdist = 1e9;
for(int d=0; d<S7; d++) if(h2->move[d]) { for(int d=0; d<S7; d++) if(h2->move[d]) {
int sp = h2->spin(d); int sp = h2->spin(d);
transmatrix S = heptmove[sp] * spin(2*M_PI*d/S7); transmatrix S = heptmove[sp] * spin(2*M_PI*d/S7);
if(h2->move[d] == h1) { if(h2->move[d] == h1) {
transmatrix T1 = gm * S * where; transmatrix T1 = gm * S * where;
auto curdist = hdist(tC0(T1), hint); auto curdist = hdist(tC0(T1), point_hint);
if(curdist < bestdist) T = T1, bestdist = curdist; if(curdist < bestdist) T = T1, bestdist = curdist;
} }
for(int e=0; e<S7; e++) if(h2->move[d]->move[e] == h1) { for(int e=0; e<S7; e++) if(h2->move[d]->move[e] == h1) {
int sp2 = h2->move[d]->spin(e); int sp2 = h2->move[d]->spin(e);
transmatrix T1 = gm * heptmove[sp2] * spin(2*M_PI*e/S7) * S * where; transmatrix T1 = gm * heptmove[sp2] * spin(2*M_PI*e/S7) * S * where;
auto curdist = hdist(tC0(T1), hint); auto curdist = hdist(tC0(T1), point_hint);
if(curdist < bestdist) T = T1, bestdist = curdist; if(curdist < bestdist) T = T1, bestdist = curdist;
} }
} }
@ -3460,13 +3463,13 @@ transmatrix &ggmatrix(cell *c) {
transmatrix& t = gmatrix[c]; transmatrix& t = gmatrix[c];
if(t[2][2] == 0) { if(t[2][2] == 0) {
if(torus && centerover.c) if(torus && centerover.c)
t = calc_relative_matrix(c, centerover.c, NOHINT); t = calc_relative_matrix(c, centerover.c, C0);
else if(euclid) { else if(euclid) {
if(!centerover.c) centerover = cwt; if(!centerover.c) centerover = cwt;
t = View * eumove(cell_to_vec(c) - cellwalker_to_vec(centerover)); t = View * eumove(cell_to_vec(c) - cellwalker_to_vec(centerover));
} }
else else
t = actualV(viewctr, cview()) * calc_relative_matrix(c, viewctr.h->c7, NOHINT); t = actualV(viewctr, cview()) * calc_relative_matrix(c, viewctr.h->c7, C0);
} }
return t; return t;
} }