1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-12-24 17:10:36 +00:00

shift-awareness in rogueviz

This commit is contained in:
Zeno Rogue 2020-07-29 23:34:00 +02:00
parent e99251e70c
commit 9d0a252d14
18 changed files with 109 additions and 105 deletions

View File

@ -197,8 +197,8 @@ void bantar_note(cell *c) {
using bantar_config = pair<cell*, cell*>; using bantar_config = pair<cell*, cell*>;
tuple<ld,bool,ld> quality(bantar_config cp) { tuple<ld,bool,ld> quality(bantar_config cp) {
hyperpoint h1 = tC0(ggmatrix(cp.first)); shiftpoint h1 = tC0(ggmatrix(cp.first));
hyperpoint h2 = tC0(ggmatrix(cp.second)); shiftpoint h2 = tC0(ggmatrix(cp.second));
return make_tuple(hdist0(h1) * hdist0(h2), h2[1] > 0, abs(h2[0] / h2[1])); return make_tuple(hdist0(h1) * hdist0(h2), h2[1] > 0, abs(h2[0] / h2[1]));
} }

View File

@ -73,7 +73,7 @@ namespace flocking {
char shape = 'b'; char shape = 'b';
vector<tuple<hyperpoint, hyperpoint, color_t> > lines; vector<tuple<shiftpoint, shiftpoint, color_t> > lines;
// parameters of each boid // parameters of each boid
// m->base: the cell it is currently on // m->base: the cell it is currently on
@ -103,7 +103,7 @@ namespace flocking {
for(int i=0; i<isize(cl.lst); i++) { for(int i=0; i<isize(cl.lst); i++) {
cell *c2 = cl.lst[i]; cell *c2 = cl.lst[i];
transmatrix T = calc_relative_matrix(c2, c1, C0); transmatrix T = calc_relative_matrix(c2, c1, C0);
if(hypot_d(WDIM, inverse_exp(tC0(T))) <= check_range) { if(hypot_d(WDIM, inverse_exp(shiftless(tC0(T)))) <= check_range) {
relmatrices[c1][c2] = T; relmatrices[c1][c2] = T;
forCellEx(c3, c2) cl.add(c3); forCellEx(c3, c2) cl.add(c3);
} }
@ -115,8 +115,8 @@ namespace flocking {
vertexdata& vd = vdata[i]; vertexdata& vd = vdata[i];
// set initial base and at to random cell and random position there // set initial base and at to random cell and random position there
createViz(i, v[hrand(isize(v))], Id); createViz(i, v[hrand(isize(v))], Id);
rotate_object(vd.m->pat, vd.m->ori, random_spin()); rotate_object(vd.m->pat.T, vd.m->ori, random_spin());
apply_parallel_transport(vd.m->pat, vd.m->ori, xtangent(hrand(100) / 200.)); apply_parallel_transport(vd.m->pat.T, vd.m->ori, xtangent(hrand(100) / 200.));
vd.name = its(i+1); vd.name = its(i+1);
vd.cp = dftcolor; vd.cp = dftcolor;
@ -198,7 +198,7 @@ namespace flocking {
// at2 is like m2->at but relative to m->at // at2 is like m2->at but relative to m->at
// m2's position relative to m (tC0 means *(0,0,1)) // m2's position relative to m (tC0 means *(0,0,1))
hyperpoint ac = inverse_exp(tC0(at2)); hyperpoint ac = inverse_exp(shiftless(tC0(at2)));
if(use_rot) ac = Rot * ac; if(use_rot) ac = Rot * ac;
// distance and azimuth to m2 // distance and azimuth to m2
@ -288,8 +288,8 @@ namespace flocking {
if(follow == 1) { if(follow == 1) {
gmatrix.clear(); gmatrix.clear();
vdata[0].m->pat = View * calc_relative_matrix(vdata[0].m->base, centerover, C0) * vdata[0].m->at; vdata[0].m->pat = shiftless(View * calc_relative_matrix(vdata[0].m->base, centerover, C0) * vdata[0].m->at);
View = inverse(vdata[0].m->pat) * View; View = inverse(vdata[0].m->pat.T) * View;
if(prod) { if(prod) {
NLP = inverse(vdata[0].m->ori); NLP = inverse(vdata[0].m->ori);
@ -318,7 +318,7 @@ namespace flocking {
ld lev = 0; ld lev = 0;
for(int i=0; i<N; i++) if(gmatrix.count(vdata[i].m->base)) { for(int i=0; i<N; i++) if(gmatrix.count(vdata[i].m->base)) {
vdata[i].m->pat = gmatrix[vdata[i].m->base] * vdata[i].m->at; vdata[i].m->pat = gmatrix[vdata[i].m->base] * vdata[i].m->at;
auto h1 = tC0(vdata[i].m->pat); auto h1 = unshift(tC0(vdata[i].m->pat));
cnt++; cnt++;
if(prod) { if(prod) {
auto d1 = product_decompose(h1); auto d1 = product_decompose(h1);

View File

@ -14,13 +14,13 @@ int fullnet_id;
void drawExtra() { void drawExtra() {
if(vizid == &fullnet_id) { if(vizid == &fullnet_id) {
for(map<cell*, transmatrix>::iterator it = gmatrix.begin(); it != gmatrix.end(); it++) { for(map<cell*, shiftmatrix>::iterator it = gmatrix.begin(); it != gmatrix.end(); it++) {
cell *c = it->first; cell *c = it->first;
c->wall = waChasm; c->wall = waChasm;
} }
int index = 0; int index = 0;
for(map<cell*, transmatrix>::iterator it = gmatrix.begin(); it != gmatrix.end(); it++) { for(map<cell*, shiftmatrix>::iterator it = gmatrix.begin(); it != gmatrix.end(); it++) {
cell *c = it->first; cell *c = it->first;
bool draw = true; bool draw = true;
for(int i=0; i<isize(named); i++) if(named[i] == c) draw = false; for(int i=0; i<isize(named); i++) if(named[i] == c) draw = false;

View File

@ -47,19 +47,19 @@ hyperpoint find_point(ld t) {
hyperpoint gcurvestart = err; hyperpoint gcurvestart = err;
void xcurvepoint(hyperpoint h) { void xcurvepoint(hyperpoint h) {
curvepoint(cwtV * h); curvepoint(h);
if(iserror(gcurvestart)) if(iserror(gcurvestart))
gcurvestart = h; gcurvestart = h;
else if(sphere && intval(gcurvestart, h) > .1) { else if(sphere && intval(gcurvestart, h) > .1) {
queuecurve(graphcolor, 0, PPR::LINE); queuecurve(cwtV, graphcolor, 0, PPR::LINE);
curvepoint(cwtV * h); curvepoint(h);
gcurvestart = h; gcurvestart = h;
} }
} }
void finish() { void finish() {
if(!iserror(gcurvestart)) { if(!iserror(gcurvestart)) {
queuecurve(graphcolor, 0, PPR::LINE); queuecurve(cwtV, graphcolor, 0, PPR::LINE);
gcurvestart = err; gcurvestart = err;
} }
} }

View File

@ -10,7 +10,7 @@ namespace fundamental {
color_t color1, color2; color_t color1, color2;
map<cell*, int> same; map<cell*, int> same;
map<cell*, transmatrix> gm; map<cell*, shiftmatrix> gm;
bool is_connected(cellwalker cw) { bool is_connected(cellwalker cw) {
return same[cw.at] & (1<<cw.spin); return same[cw.at] & (1<<cw.spin);
@ -28,8 +28,8 @@ void be_connected(cellwalker cw) {
int funmode = 0; int funmode = 0;
hyperpoint corner(cellwalker cw) { shiftpoint corner(cellwalker cw) {
transmatrix T = gm[cw.at]; shiftmatrix T = gm[cw.at];
if(funmode == 2) { if(funmode == 2) {
while(cw.at->type != S7) { while(cw.at->type != S7) {
cw++; cw++;
@ -47,10 +47,10 @@ transmatrix rel(cellwalker cw) {
ld label_dist = .3; ld label_dist = .3;
transmatrix labelpos(hyperpoint h1, hyperpoint h2) { shiftmatrix labelpos(shiftpoint h1, shiftpoint h2) {
hyperpoint h = mid(h1, h2); shiftpoint h = mid(h1, h2);
transmatrix T = rgpushxto0(h); shiftmatrix T = rgpushxto0(h);
hyperpoint hx = inverse(T) * h2; hyperpoint hx = inverse_shift(T, h2);
ld alpha = atan2(-hx[1], hx[0]); ld alpha = atan2(-hx[1], hx[0]);
return T * xspinpush(alpha + M_PI/2, label_dist); return T * xspinpush(alpha + M_PI/2, label_dist);
} }
@ -136,7 +136,7 @@ void fundamental_marker() {
prev_corner[cw] = cw0; prev_corner[cw] = cw0;
} }
vector<transmatrix> nearm; vector<pair<shiftmatrix, shiftmatrix>> nearm;
for(int ci=0; ci<corners; ci++) { for(int ci=0; ci<corners; ci++) {
for(int u=0; u<1; u++) { for(int u=0; u<1; u++) {
@ -145,9 +145,9 @@ void fundamental_marker() {
printf("[%d %d %d] ", is_connected(cw), is_connected(cw+1), is_connected(cw+wstep-1)); printf("[%d %d %d] ", is_connected(cw), is_connected(cw+1), is_connected(cw+wstep-1));
printf("[%d %d %d] ", is_connected(cw1), is_connected(cw1+1), is_connected(cw1+wstep-1)); printf("[%d %d %d] ", is_connected(cw1), is_connected(cw1+1), is_connected(cw1+wstep-1));
printf("%d %d;\n", !!next_corner.count(cw1), !!next_corner.count(cw1+wmirror-1)); */ printf("%d %d;\n", !!next_corner.count(cw1), !!next_corner.count(cw1+wmirror-1)); */
transmatrix T_here = gm[cw.at] * rel(cw+u); shiftmatrix T_here = gm[cw.at] * rel(cw+u);
transmatrix T_there = gm[cw1.at]; shiftmatrix T_there = gm[cw1.at];
nearm.push_back(T_here * inverse(T_there)); nearm.emplace_back(T_here, T_there);
} }
cw = next_corner[cw]; cw = next_corner[cw];
} }
@ -156,18 +156,18 @@ void fundamental_marker() {
for(int ci=0; ci<corners; ci++) { for(int ci=0; ci<corners; ci++) {
hyperpoint h = corner(cw); shiftpoint h = corner(cw);
cw = next_corner[cw]; cw = next_corner[cw];
hyperpoint h2 = corner(cw); shiftpoint h2 = corner(cw);
for(auto& T: nearm) queueline(T * h, T * h2, color1, 3); for(auto& n: nearm) queueline(n.first * inverse_shift(n.second, h), n.first * inverse_shift(n.second, h2), color1, 3);
} }
for(int ci=0; ci<corners; ci++) { for(int ci=0; ci<corners; ci++) {
hyperpoint h = corner(cw); shiftpoint h = corner(cw);
cw = next_corner[cw]; cw = next_corner[cw];
hyperpoint h2 = corner(cw); shiftpoint h2 = corner(cw);
queueline(h, h2, color2, 3); queueline(h, h2, color2, 3);
} }
@ -179,7 +179,7 @@ void fundamental_marker() {
if(!is_connected(cw0)) continue; if(!is_connected(cw0)) continue;
int v = 0; int v = 0;
for(auto& n: nearm) { for(auto& n: nearm) {
queueline(n * gm[cw0.at] * xspinpush0(v, .05), n * gm[cw0.cpeek()] * xspinpush0(v, .05), 0xFF8000FF, 0); queueline(n.first * inverse_shift(n.second, gm[cw0.at]) * xspinpush0(v, .05), n.first * inverse_shift(n.second, gm[cw0.cpeek()]) * xspinpush0(v, .05), 0xFF8000FF, 0);
v++; v++;
} }
queueline(gm[cw0.at] * C0, gm[cw0.cpeek()] * C0, 0xFF0000FF, 0); queueline(gm[cw0.at] * C0, gm[cw0.cpeek()] * C0, 0xFF0000FF, 0);

View File

@ -214,7 +214,7 @@ void reset() {
ir = nullptr; ir = nullptr;
} }
bool draw_ptriangle(cell *c, const transmatrix& V) { bool draw_ptriangle(cell *c, const shiftmatrix& V) {
if(!on) return false; if(!on) return false;

View File

@ -280,7 +280,7 @@ void analyze() {
coloring(); coloring();
} }
bool coloring_3d(cell *c, const transmatrix& V) { bool coloring_3d(cell *c, const shiftmatrix& V) {
if(WDIM == 3 && vizid == &kohonen_id) if(WDIM == 3 && vizid == &kohonen_id)
queuepoly(face_the_player(V), cgi.shRing, darkena(c->landparam_color, 0, 0xFF)); queuepoly(face_the_player(V), cgi.shRing, darkena(c->landparam_color, 0, 0xFF));
return false; return false;
@ -813,7 +813,7 @@ namespace levelline {
if(!on) return; if(!on) return;
for(auto& g: gmatrix) { for(auto& g: gmatrix) {
cell *c1 = g.first; cell *c1 = g.first;
transmatrix T = g.second; shiftmatrix T = g.second;
neuron *n1 = getNeuron(c1); neuron *n1 = getNeuron(c1);
if(!n1) continue; if(!n1) continue;
for(int i=0; i<c1->type; i++) { for(int i=0; i<c1->type; i++) {

View File

@ -61,7 +61,7 @@ void curveline(hyperpoint a, hyperpoint b, int lev) {
curvepoint(b); curvepoint(b);
} }
bool magic_markers(cell *c, const transmatrix& V) { bool magic_markers(cell *c, const shiftmatrix& V) {
if(vizid != (void*) &magic) return false; if(vizid != (void*) &magic) return false;
timerghost = false; timerghost = false;
if(c->landparam == back) { if(c->landparam == back) {
@ -73,15 +73,15 @@ bool magic_markers(cell *c, const transmatrix& V) {
for(int i=0; i<S7; i++) { for(int i=0; i<S7; i++) {
cell *c2 = c->move(i); cell *c2 = c->move(i);
if(c2->landparam != back) { if(c2->landparam != back) {
hyperpoint h1 = V * get_corner_position(c, i, 3/.9); hyperpoint h1 = get_corner_position(c, i, 3/.9);
hyperpoint h2 = V * get_corner_position(c, i+1, 3/.9); hyperpoint h2 = get_corner_position(c, i+1, 3/.9);
curvepoint(h1); curvepoint(h1);
curveline(h1, h2, 3); curveline(h1, h2, 3);
hyperpoint h3 = V * get_corner_position(c, i, 3/.7); hyperpoint h3 = get_corner_position(c, i, 3/.7);
hyperpoint h4 = V * get_corner_position(c, i+1, 3/.7); hyperpoint h4 = get_corner_position(c, i+1, 3/.7);
curvepoint(h4); curvepoint(h4);
curveline(h4, h3, 3); curveline(h4, h3, 3);
queuecurve(0xFF, (c2->landparam << 8) | 0xFF, PPR::LINE); queuecurve(V, 0xFF, (c2->landparam << 8) | 0xFF, PPR::LINE);
} }
} }
} }

View File

@ -25,6 +25,10 @@ string rfname;
enum class ptype : char { outside, inside, inside_left_up, inside_left_down, top, bottom, left_inf, right_inf, marked }; enum class ptype : char { outside, inside, inside_left_up, inside_left_down, top, bottom, left_inf, right_inf, marked };
dqi_line& queueline1(const hyperpoint& H1, const hyperpoint& H2, color_t col, int prf = 0, PPR prio = PPR::LINE) {
return queueline(shiftless(H1), shiftless(H2), col, prf, prio);
}
void add_border(vector<string>& v, int cy) { void add_border(vector<string>& v, int cy) {
int Y = isize(v), X = isize(v[0]); int Y = isize(v), X = isize(v[0]);
char nx = '6'; char nx = '6';
@ -656,7 +660,7 @@ void draw_ncee() {
curvepoint(hpxy(xpos+scax, map_ypos+sca2)); curvepoint(hpxy(xpos+scax, map_ypos+sca2));
nctinf2.tvertices.push_back(glhr::makevertex(0.5+maxx, 1, 0)); nctinf2.tvertices.push_back(glhr::makevertex(0.5+maxx, 1, 0));
} }
auto& q = queuecurve(0, show_mgrid ? 0x404040FF : 0xFFFFFFFF, PPR::LINE); auto& q = queuecurve(shiftless(Id), 0, show_mgrid ? 0x404040FF : 0xFFFFFFFF, PPR::LINE);
q.tinf = &nctinf2; q.tinf = &nctinf2;
q.flags |= POLY_TRIANGLES; q.flags |= POLY_TRIANGLES;
q.offset_texture = 0; q.offset_texture = 0;
@ -678,7 +682,7 @@ void draw_ncee() {
bool ineq = bool ineq =
in_visualization && fmap[y][x] == '1'; in_visualization && fmap[y][x] == '1';
#endif #endif
queuecurve(0, queuecurve(shiftless(Id), 0,
#if CAP_NCONF #if CAP_NCONF
(ineq && nconf::pts[y][x].state == 1) ? 0xFF8000FF : (ineq && nconf::pts[y][x].state == 1) ? 0xFF8000FF :
(ineq && nconf::pts[y][x].state == 2) ? 0x00FF00FF : (ineq && nconf::pts[y][x].state == 2) ? 0x00FF00FF :
@ -691,7 +695,7 @@ void draw_ncee() {
curvepoint(h(x,y+1)); curvepoint(h(x,y+1));
curvepoint(h(x+1,y+1)); curvepoint(h(x+1,y+1));
curvepoint(h(x+1,y)); curvepoint(h(x+1,y));
queuecurve(0, queuecurve(shiftless(Id), 0,
typecols[fmap[y][x] - '0'], PPR::LINE); typecols[fmap[y][x] - '0'], PPR::LINE);
} }
@ -727,7 +731,7 @@ void draw_ncee() {
} }
} }
auto& q = queuecurve(0, (show_mgrid && show_mapping) ? 0x404040FF : 0xFFFFFFFF, PPR::LINE); auto& q = queuecurve(shiftless(Id), 0, (show_mgrid && show_mapping) ? 0x404040FF : 0xFFFFFFFF, PPR::LINE);
q.tinf = &nctinf; q.tinf = &nctinf;
q.flags |= POLY_TRIANGLES; q.flags |= POLY_TRIANGLES;
q.offset_texture = 0; q.offset_texture = 0;
@ -736,7 +740,7 @@ void draw_ncee() {
pair<int, int> mpt = {(mousex - xc - cd->xcenter - x0) / siz, (mousey - yc - cd->ycenter - y0) / siz}; pair<int, int> mpt = {(mousex - xc - cd->xcenter - x0) / siz, (mousey - yc - cd->ycenter - y0) / siz};
queueline(h(0,0), h(0,-1), 0x1010101); queueline1(h(0,0), h(0,-1), 0x1010101);
const color_t gridcol = 0xFFFFFFFF; const color_t gridcol = 0xFFFFFFFF;
if(inHighQual) ; if(inHighQual) ;
@ -748,14 +752,14 @@ void draw_ncee() {
if(y < Y-2 && fmap[y][x] > '0' && fmap[y+1][x] > '0') { if(y < Y-2 && fmap[y][x] > '0' && fmap[y+1][x] > '0') {
color_t col = (make_pair(x,y) == mpt || make_pair(x,y+1) == mpt) ? 0xFFFF00FF : gridcol; color_t col = (make_pair(x,y) == mpt || make_pair(x,y+1) == mpt) ? 0xFFFF00FF : gridcol;
dynamicval<ld> lw(vid.linewidth, vid.linewidth * (col == 0xFFFF00FF ? 4 : 1)); dynamicval<ld> lw(vid.linewidth, vid.linewidth * (col == 0xFFFF00FF ? 4 : 1));
queueline(hc(x, y), hc(x, y+1), col, 0, PPR::CIRCLE); queueline1(hc(x, y), hc(x, y+1), col, 0, PPR::CIRCLE);
queueline(vmap[y][x], vmap[y+1][x], col, 0, PPR::CIRCLE); queueline1(vmap[y][x], vmap[y+1][x], col, 0, PPR::CIRCLE);
} }
if(x < X-2 && fmap[y][x] > '0' && fmap[y][x+1] > '0') { if(x < X-2 && fmap[y][x] > '0' && fmap[y][x+1] > '0') {
color_t col = (make_pair(x,y) == mpt || make_pair(x+1,y) == mpt) ? 0xFFFF00FF : gridcol; color_t col = (make_pair(x,y) == mpt || make_pair(x+1,y) == mpt) ? 0xFFFF00FF : gridcol;
dynamicval<ld> lw(vid.linewidth, vid.linewidth * (col == 0xFFFF00FF ? 4 : 1)); dynamicval<ld> lw(vid.linewidth, vid.linewidth * (col == 0xFFFF00FF ? 4 : 1));
queueline(hc(x, y), hc(x+1, y), col, 0, PPR::CIRCLE); queueline1(hc(x, y), hc(x+1, y), col, 0, PPR::CIRCLE);
queueline(vmap[y][x], vmap[y][x+1], col, 0, PPR::CIRCLE); queueline1(vmap[y][x], vmap[y][x+1], col, 0, PPR::CIRCLE);
} }
} }
} }
@ -774,17 +778,17 @@ void draw_ncee() {
else if(fmap[y][x] == '4' || fmap[y][x] == '5') else if(fmap[y][x] == '4' || fmap[y][x] == '5')
col = 0xFFFF00FF; col = 0xFFFF00FF;
} }
queueline(h(x,y), h(x,y+1), col); queueline1(h(x,y), h(x,y+1), col);
queueline(h(x,y), h(x+1,y), col); queueline1(h(x,y), h(x+1,y), col);
queueline(h(x+1,y), h(x+1,y+1), col); queueline1(h(x+1,y), h(x+1,y+1), col);
queueline(h(x,y+1), h(x+1,y+1), col); queueline1(h(x,y+1), h(x+1,y+1), col);
vid.linewidth /= 3; vid.linewidth /= 3;
} }
for(int x=0; x<=X; x++) queueline(h(x,0), h(x,Y), 0x80808080); for(int x=0; x<=X; x++) queueline1(h(x,0), h(x,Y), 0x80808080);
for(int y=0; y<=Y; y++) queueline(h(0,y), h(X,y), 0x80808080); for(int y=0; y<=Y; y++) queueline1(h(0,y), h(X,y), 0x80808080);
queueline(h(0,0), h(0,-1), 0x1010101); queueline1(h(0,0), h(0,-1), 0x1010101);
quickqueue(); quickqueue();
glflush(); glflush();

View File

@ -33,7 +33,7 @@ hyperpoint xts0;
array<hyperpoint, 3> mts; array<hyperpoint, 3> mts;
rug::rugpoint *pt(hyperpoint h, hyperpoint c, int id) { rug::rugpoint *pt(hyperpoint h, hyperpoint c, int id) {
auto r = rug::addRugpoint(C0, -1); auto r = rug::addRugpoint(shiftless(C0), -1);
r->native = h; r->native = h;
r->x1 = (1 + c[0]) / 16 + (id/8) / 8.; r->x1 = (1 + c[0]) / 16 + (id/8) / 8.;
r->y1 = (1 + c[1]) / 16 + (id%8) / 8.; r->y1 = (1 + c[1]) / 16 + (id%8) / 8.;
@ -132,7 +132,7 @@ void run_snub(int v, int w) {
drawthemap(); drawthemap();
if(euclid || sphere) for(cell *c: currentmap->allcells()) if(euclid || sphere) for(cell *c: currentmap->allcells())
gmatrix[c] = arcm::archimedean_gmatrix[c->master].second; gmatrix[c] = shiftless(arcm::archimedean_gmatrix[c->master].second);
cellwalker cw(currentmap->gamestart(), 0); cellwalker cw(currentmap->gamestart(), 0);
p0 = cw.at; p0 = cw.at;
@ -142,11 +142,11 @@ void run_snub(int v, int w) {
// p1 = (cw + wstep + 1 + wstep -1 + wstep).at; // p1 = (cw + wstep + 1 + wstep -1 + wstep).at;
cc = (cw - 1 + wstep - 1 + wstep).at; cc = (cw - 1 + wstep - 1 + wstep).at;
transmatrix rel = inverse(gmatrix[p0]); transmatrix rel = inverse(gmatrix[p0].T);
ts[0] = rel * gmatrix[t0] * ddspin(t0, (cw - 1 + wstep).spin); ts[0] = rel * gmatrix[t0].T * ddspin(t0, (cw - 1 + wstep).spin);
ts[1] = rel * gmatrix[t1]; ts[1] = rel * gmatrix[t1].T;
ts[2] = rel * gmatrix[t2] * ddspin(t2, (cw + wstep + 1 + wstep - 1).spin); ts[2] = rel * gmatrix[t2].T * ddspin(t2, (cw + wstep + 1 + wstep - 1).spin);
matrix2 = ts[2] * inverse(ts[0]); matrix2 = ts[2] * inverse(ts[0]);
@ -156,7 +156,7 @@ void run_snub(int v, int w) {
for(cell *c: currentmap->allcells()) { for(cell *c: currentmap->allcells()) {
int id = arcm::id_of(c->master); int id = arcm::id_of(c->master);
if(among(id, 0, 1)) for(int d=0; d<v; d++) { if(among(id, 0, 1)) for(int d=0; d<v; d++) {
transmatrix T = rel * ggmatrix(c) * spin(2*M_PI*d/v); transmatrix T = rel * ggmatrix(c).T * spin(2*M_PI*d/v);
array<hyperpoint,3> hts; array<hyperpoint,3> hts;
for(int i=0; i<3; i++) for(int i=0; i<3; i++)
hts[i] = T * ts[i] * C0; hts[i] = T * ts[i] * C0;
@ -179,7 +179,7 @@ void run_snub(int v, int w) {
println(hlog, "original ", xts0); println(hlog, "original ", xts0);
cor = rel * gmatrix[cc] * C0; cor = rel * gmatrix[cc].T * C0;
rug::reopen(); rug::reopen();
for(auto p: rug::points) p->valid = true; for(auto p: rug::points) p->valid = true;

View File

@ -104,7 +104,7 @@ void set_cell(cell *c) {
bool qtm_on; bool qtm_on;
bool may_set_cell(cell *c, const transmatrix& T) { bool may_set_cell(cell *c, const shiftmatrix& T) {
if(qtm_on) set_cell(c); if(qtm_on) set_cell(c);
return false; return false;
} }

View File

@ -103,7 +103,7 @@ struct hrmap_rewrite : hrmap_hyperbolic {
}; };
bool labeller(cell* c, const transmatrix& V) { bool labeller(cell* c, const shiftmatrix& V) {
auto m = dynamic_cast<hrmap_rewrite*> (currentmap); auto m = dynamic_cast<hrmap_rewrite*> (currentmap);
if(m) { if(m) {
string s = m->asg[c->master].second; string s = m->asg[c->master].second;

View File

@ -203,7 +203,7 @@ hyperpoint where(int i, cell *base) {
} }
else { else {
// notimpl(); // actually probably that's a buug // notimpl(); // actually probably that's a buug
return inverse(ggmatrix(currentmap->gamestart())) * (ggmatrix(m->base) * tC0(m->at)); return inverse_shift(ggmatrix(currentmap->gamestart()), ggmatrix(m->base) * tC0(m->at));
} }
} }
@ -486,7 +486,7 @@ color_t darken_a(color_t c) {
#define SVG_LINK(x) #define SVG_LINK(x)
#endif #endif
void queuedisk(const transmatrix& V, const colorpair& cp, bool legend, const string* info, int i) { void queuedisk(const shiftmatrix& V, const colorpair& cp, bool legend, const string* info, int i) {
if(legend && (int) cp.color1 == (int) 0x000000FF && backcolor == 0) if(legend && (int) cp.color1 == (int) 0x000000FF && backcolor == 0)
poly_outline = 0x606060FF; poly_outline = 0x606060FF;
else else
@ -494,14 +494,14 @@ void queuedisk(const transmatrix& V, const colorpair& cp, bool legend, const str
if(cp.img) { if(cp.img) {
for(hyperpoint h: cp.img->vertices) for(hyperpoint h: cp.img->vertices)
curvepoint(V * h); curvepoint(h);
auto& qc = queuecurve(0, 0xFFFFFFFF, PPR::MONSTER_HEAD); auto& qc = queuecurve(V, 0, 0xFFFFFFFF, PPR::MONSTER_HEAD);
qc.tinf = &cp.img->tinf; qc.tinf = &cp.img->tinf;
qc.flags |= POLY_TRIANGLES; qc.flags |= POLY_TRIANGLES;
return; return;
} }
transmatrix V1; shiftmatrix V1;
auto& sh = auto& sh =
vertex_shape == 2 ? cgi.shHeptaMarker : vertex_shape == 2 ? cgi.shHeptaMarker :
@ -557,7 +557,7 @@ transmatrix& memo_relative_matrix(cell *c1, cell *c2) {
return p; return p;
} }
void queue_prec(const transmatrix& V, edgeinfo*& ei, color_t col) { void queue_prec(const shiftmatrix& V, edgeinfo*& ei, color_t col) {
if(!fat_edges) if(!fat_edges)
queuetable(V, ei->prec, isize(ei->prec), col, 0, PPR::STRUCT0); queuetable(V, ei->prec, isize(ei->prec), col, 0, PPR::STRUCT0);
#if MAXMDIM >= 4 #if MAXMDIM >= 4
@ -571,7 +571,7 @@ void queue_prec(const transmatrix& V, edgeinfo*& ei, color_t col) {
#endif #endif
} }
bool drawVertex(const transmatrix &V, cell *c, shmup::monster *m) { bool drawVertex(const shiftmatrix &V, cell *c, shmup::monster *m) {
if(m->dead) return true; if(m->dead) return true;
if(m->type != moRogueviz) return false; if(m->type != moRogueviz) return false;
int i = m->pid; int i = m->pid;
@ -627,18 +627,18 @@ bool drawVertex(const transmatrix &V, cell *c, shmup::monster *m) {
alpha >>= darken; alpha >>= darken;
transmatrix gm1 = shiftmatrix gm1 =
(multidraw || elliptic) ? V * memo_relative_matrix(vd1.m->base, c) : (multidraw || elliptic) ? V * memo_relative_matrix(vd1.m->base, c) :
ggmatrix(vd1.m->base); ggmatrix(vd1.m->base);
transmatrix gm2 = shiftmatrix gm2 =
(multidraw || elliptic) ? V * memo_relative_matrix(vd2.m->base, c) : (multidraw || elliptic) ? V * memo_relative_matrix(vd2.m->base, c) :
ggmatrix(vd2.m->base); ggmatrix(vd2.m->base);
hyperpoint h1 = gm1 * vd1.m->at * C0; shiftpoint h1 = gm1 * vd1.m->at * C0;
hyperpoint h2 = gm2 * vd2.m->at * C0; shiftpoint h2 = gm2 * vd2.m->at * C0;
if(elliptic && intval(h1, h2) > intval(h1, centralsym * h2)) if(elliptic && hdist(h1, h2) > hdist(h1.h, centralsym * h2.h))
h2 = centralsym * h2; h2.h = centralsym * h2.h;
if(multidraw) { if(multidraw) {
int code = int(h1[0]) + int(h1[1]) * 12789117 + int(h2[0]) * 126081253 + int(h2[1]) * 126891531; int code = int(h1[0]) + int(h1[1]) * 12789117 + int(h2[0]) * 126081253 + int(h2[1]) * 126891531;
@ -677,14 +677,14 @@ bool drawVertex(const transmatrix &V, cell *c, shmup::monster *m) {
ei->orig = center; // cwt.at; ei->orig = center; // cwt.at;
ei->prec.clear(); ei->prec.clear();
transmatrix T = inverse(ggmatrix(ei->orig)); shiftmatrix T = ggmatrix(ei->orig);
if(callhandlers(false, hooks_alt_edges, ei, true)) ; if(callhandlers(false, hooks_alt_edges, ei, true)) ;
else if(fat_edges) { else if(fat_edges) {
ei->tinf.tvertices.clear(); ei->tinf.tvertices.clear();
transmatrix T1 = inverse(gm1 * vd1.m->at); shiftmatrix T1 = gm1 * vd1.m->at;
hyperpoint goal = T1 * h2; hyperpoint goal = inverse_shift(T1, h2);
transmatrix S = T * gm1 * vd1.m->at * rspintox(goal); transmatrix S = inverse_shift(T, gm1) * vd1.m->at * rspintox(goal);
ld d = hdist0(goal); ld d = hdist0(goal);
for(int a=0; a<360; a+=30) { for(int a=0; a<360; a+=30) {
auto store = [&] (ld a, ld b) { auto store = [&] (ld a, ld b) {
@ -700,10 +700,10 @@ bool drawVertex(const transmatrix &V, cell *c, shmup::monster *m) {
} }
} }
else else
storeline(ei->prec, T*h1, T*h2); storeline(ei->prec, inverse_shift(T, h1), inverse_shift(T, h2));
} }
queue_prec(multidraw ? V : ggmatrix(ei->orig), ei, col); queue_prec(multidraw ? V : ggmatrix(ei->orig), ei, col);
if(elliptic) queue_prec(centralsym * ggmatrix(ei->orig), ei, col); if(elliptic) queue_prec(ggmatrix(ei->orig) * centralsym, ei, col);
} }
} }
/* /*
@ -719,12 +719,12 @@ bool drawVertex(const transmatrix &V, cell *c, shmup::monster *m) {
bool doshow = true; bool doshow = true;
if((vizflags & RV_COMPRESS_LABELS) && i > 0 && !vd.virt) { if((vizflags & RV_COMPRESS_LABELS) && i > 0 && !vd.virt) {
vertexdata& vdp = vdata[vd.data]; vertexdata& vdp = vdata[vd.data];
hyperpoint h2 = ggmatrix(vdp.m->base) * vdp.m->at * C0; shiftpoint h2 = ggmatrix(vdp.m->base) * vdp.m->at * C0;
if(hdist(h2, V * m->at * C0) < 0.1) doshow = false; if(hdist(h2, V * m->at * C0) < 0.1) doshow = false;
} }
hyperpoint h = tC0(V * m->at); shiftpoint h = tC0(V * m->at);
transmatrix V2 = GDIM == 3 ? V * m->at : rgpushxto0(h) * ypush(PURE ? .3 : .2); // todo-variation shiftmatrix V2 = GDIM == 3 ? V * m->at : rgpushxto0(h) * ypush(PURE ? .3 : .2); // todo-variation
if(doshow && !behindsphere(V2)) { if(doshow && !behindsphere(V2)) {
auto info = vd.info; auto info = vd.info;
if(info) queueaction(PPR::MONSTER_HEAD, [info] () { SVG_LINK(*info); }); if(info) queueaction(PPR::MONSTER_HEAD, [info] () { SVG_LINK(*info); });
@ -755,7 +755,7 @@ bool rogueviz_hud() {
int legit = qet + isize(legend); int legit = qet + isize(legend);
if(legit == 0) return true; if(legit == 0) return true;
initquickqueue(); initquickqueue();
int rad = current_display->radius/10; int rad = current_display->radius/10;
@ -783,8 +783,8 @@ bool rogueviz_hud() {
transmatrix V = atscreenpos(x, y, current_display->radius/8); transmatrix V = atscreenpos(x, y, current_display->radius/8);
poly_outline = t->color | 0xFF; poly_outline = t->color | 0xFF;
queuepolyat(V, cgi.shTriangle, 0, PPR::MONSTER_HEAD); queuepolyat(shiftless(V), cgi.shTriangle, 0, PPR::MONSTER_HEAD);
poly_outline = OUTLINE_DEFAULT; poly_outline = OUTLINE_DEFAULT;
queuestr(int(x-rad), int(y), 0, rad*(svg::in?5:3)/4, t->name, legend_color, 0, 16); queuestr(int(x-rad), int(y), 0, rad*(svg::in?5:3)/4, t->name, legend_color, 0, 16);
} }
@ -1053,7 +1053,7 @@ void search_marker() {
auto& vd = vdata[search_for]; auto& vd = vdata[search_for];
auto& m = vd.m; auto& m = vd.m;
if(!m) return; if(!m) return;
hyperpoint H = ggmatrix(m->base) * tC0(m->at); shiftpoint H = ggmatrix(m->base) * tC0(m->at);
queuestr(H, 2*vid.fsize, "X", 0x10101 * int(128 + 100 * sin(ticks / 150.))); queuestr(H, 2*vid.fsize, "X", 0x10101 * int(128 + 100 * sin(ticks / 150.)));
addauraspecial(H, iinf[itOrbYendor].color, 0); addauraspecial(H, iinf[itOrbYendor].color, 0);
} }

View File

@ -179,7 +179,7 @@ function<void(presmode)> roguevizslide_action(char c, const T& t, const U& act)
extern string fname; extern string fname;
colorpair perturb(colorpair cp); colorpair perturb(colorpair cp);
void queuedisk(const transmatrix& V, const colorpair& cp, bool legend, const string* info, int i); void queuedisk(const shiftmatrix& V, const colorpair& cp, bool legend, const string* info, int i);
} }

View File

@ -102,7 +102,7 @@ transmatrix random_snow_matrix(cell *c) {
} }
} }
bool draw_snow(cell *c, const transmatrix& V) { bool draw_snow(cell *c, const shiftmatrix& V) {
if(!matrices_at.count(c)) { if(!matrices_at.count(c)) {
auto& v = matrices_at[c]; auto& v = matrices_at[c];

View File

@ -29,7 +29,7 @@ hyperpoint spcoord(hyperpoint h) {
} }
rug::rugpoint *pt(hyperpoint h, hyperpoint c) { rug::rugpoint *pt(hyperpoint h, hyperpoint c) {
auto r = rug::addRugpoint(C0, -1); auto r = rug::addRugpoint(shiftless(C0), -1);
r->native = spcoord(h); r->native = spcoord(h);
r->x1 = c[0]; r->x1 = c[0];
r->y1 = c[1]; r->y1 = c[1];

View File

@ -59,7 +59,7 @@ vector<int> inext, inext2;
vector<int> fibs = {1, 2}; vector<int> fibs = {1, 2};
bool sunflower_cell(cell *c, transmatrix V) { bool sunflower_cell(cell *c, shiftmatrix V) {
if(!on) return false; if(!on) return false;
density = zdensity / 100; density = zdensity / 100;
@ -106,7 +106,7 @@ bool sunflower_cell(cell *c, transmatrix V) {
} }
if(c == cwt.at) { if(c == cwt.at) {
for(int i=0; i<iqty; i++) ps[i] = V * p(i); for(int i=0; i<iqty; i++) ps[i] = p(i);
for(int i=0; i<iqty; i++) { for(int i=0; i<iqty; i++) {
ld ba = 99; ld ba = 99;
@ -129,16 +129,16 @@ bool sunflower_cell(cell *c, transmatrix V) {
curvepoint(ps[inext[i]]); curvepoint(ps[inext[i]]);
curvepoint(ps[inext2[i]]); curvepoint(ps[inext2[i]]);
// queuecurve(0xFFFFFFFF, 0x00C000FF, PPR::LINE); // queuecurve(0xFFFFFFFF, 0x00C000FF, PPR::LINE);
queuecurve(0x000000FF, 0xC04000FF, PPR::LINE); queuecurve(shiftless(Id), 0x000000FF, 0xC04000FF, PPR::LINE);
} }
else { else {
curvepoint(ps[i]); curvepoint(ps[i]);
curvepoint(ps[inext[i]]); curvepoint(ps[inext[i]]);
curvepoint(ps[inext[i] + inext2[i] - i]); curvepoint(ps[inext[i] + inext2[i] - i]);
curvepoint(ps[inext2[i]]); curvepoint(ps[inext2[i]]);
queuecurve(0x000000FF, 0xFFD500FF, PPR::LINE); queuecurve(V,0x000000FF, 0xFFD500FF, PPR::LINE);
} }
if(nodes) queuepolyat(rgpushxto0(ps[i]), cgi.shSnowball, 0xFF, PPR::SUPERLINE); if(nodes) queuepolyat(V * rgpushxto0(ps[i]), cgi.shSnowball, 0xFF, PPR::SUPERLINE);
} }
} }
return true; return true;

View File

@ -119,9 +119,9 @@ struct trianglemaker {
// println(hlog, "uds = ", uds); // println(hlog, "uds = ", uds);
for(int a=0; a<3; a++) println(hlog, sqhypot_d(3, inverse_exp(start + ds[a] * ca))); for(int a=0; a<3; a++) println(hlog, sqhypot_d(3, inverse_exp(shiftless(start + ds[a] * ca))));
for(int a=0; a<3; a++) println(hlog, sqhypot_d(3, inverse_exp(uds[a]))); for(int a=0; a<3; a++) println(hlog, sqhypot_d(3, inverse_exp(shiftless(uds[a]))));
// compute cube vertices // compute cube vertices
@ -473,7 +473,7 @@ void growthrate() {
color_t tcolors[3] = { 0xFF0000FF, 0x00FF00FF, 0x0000FFFF }; color_t tcolors[3] = { 0xFF0000FF, 0x00FF00FF, 0x0000FFFF };
bool draw_ptriangle(cell *c, const transmatrix& V) { bool draw_ptriangle(cell *c, const shiftmatrix& V) {
if(!on) return false; if(!on) return false;