hyperrogue/rogueviz/cvl.cpp

113 lines
3.1 KiB
C++

// Copyright (C) 2018 Zeno and Tehora Rogue, see 'hyper.cpp' for details
// this is a plugin which generates branched tilings for newconformist
// https://github.com/zenorogue/newconformist (see the option '-cvl')
#include "../hyper.h"
namespace hr {
#if CAP_SHOT
struct location {
transmatrix lView;
cell *lco;
};
struct lineinfo {
vector<location> locs;
int plus_matrices;
int minus_matrices;
};
map<int, lineinfo> lines;
location loc_multiply(location orig, transmatrix T) {
dynamicval<transmatrix> dv(View, orig.lView);
dynamicval<cell*> dc(centerover, orig.lco);
View = inverse(T) * View;
for(int a=0; a<10; a++) optimizeview();
return location{View, centerover};
}
bool show_map = false;
void cvl_marker() {
if(show_map) for(auto& l: lines) {
int id = 0;
for(auto& loc: l.second.locs) {
if(gmatrix.count(loc.lco)) {
shiftmatrix T = gmatrix[loc.lco] * inverse(loc.lView);
queuepoly(T, cgi.shAsymmetric, 0xFF00FFFF);
queuestr(T, 1.0, its(l.first)+"/"+its(id), 0xFFFFFF);
}
id++;
}
}
}
int readArgs() {
using namespace arg;
if(0) ;
else if(argis("-cvlbuild")) {
PHASEFROM(3);
start_game();
shift();
fhstream f(argcs(), "rt");
if(!f.f) { shift(); printf("failed to open file\n"); return 0; }
int id;
lineinfo l0;
scan(f, id, l0.plus_matrices, l0.minus_matrices);
l0.locs.push_back(location{View, centerover});
for(int i=1; i<l0.plus_matrices; i++)
l0.locs.push_back(loc_multiply(l0.locs.back(), xpush(1)));
lines[id] = std::move(l0);
while(true) {
scan(f, id);
println(hlog, "id=", id, ".");
if(id < 0) break;
auto& l1 = lines[id];
int step;
scan(f, id, step);
transmatrix T;
for(int a=0; a<9; a++) scan(f, T[0][a]);
scan(f, l1.plus_matrices, l1.minus_matrices);
auto old = lines[id].locs[step];
println(hlog, "FROM ", old.lView, old.lco, " id=", id, " step=", step);
l1.locs.push_back(loc_multiply(old, T));
println(hlog, "TO ", l1.locs.back().lView, l1.locs.back().lco, "; creating ", l1.plus_matrices);
for(int i=1; i<l1.plus_matrices; i++)
l1.locs.push_back(loc_multiply(l1.locs.back(), xpush(1)));
println(hlog, "LAST ", l1.locs.back().lView, l1.locs.back().lco);
}
}
else if(argis("-cvllist")) {
for(auto& l: lines)
for(auto& loc: l.second.locs) {
println(hlog, l.first, ". ", loc.lco, " (dist=", celldist(loc.lco), "), View = ", loc.lView);
}
}
else if(argis("-cvlmap")) {
show_map = !show_map;
}
else if(argis("-cvldraw")) {
shift(); string s = args();
for(auto& p: lines) {
int i = 0;
for(auto& loc: p.second.locs) {
dynamicval<transmatrix> dv(View, loc.lView);
dynamicval<cell*> dc(centerover, loc.lco);
shot::take(hr::format(s.c_str(), p.first, i++));
}
}
}
else return 1;
return 0;
}
auto magichook = addHook(hooks_args, 100, readArgs) + addHook(hooks_frame, 100, cvl_marker);
#endif
}