diff --git a/rug.cpp b/rug.cpp index 9ec9a026..eaba263d 100644 --- a/rug.cpp +++ b/rug.cpp @@ -69,6 +69,7 @@ bool computed = false; struct triangle { rugpoint *m[3]; + triangle() { m[0] = m[1] = m[2] = nullptr; } triangle(rugpoint *m1, rugpoint *m2, rugpoint *m3) { m[0] = m1; m[1] = m2; m[2] = m3; } @@ -1614,6 +1615,88 @@ EX void select() { pushScreen(rug::show); } +EX void rug_save(string fname) { + fhstream f(fname, "wb"); + if(!f.f) { + addMessage(XLAT("Failed to save rug to %1", fname)); + return; + } + f.write(f.vernum); + f.write(gwhere); + USING_NATIVE_GEOMETRY; + int N = isize(points); + f.write(N); + map ids; + for(int i=0; ivalid); + f.write(p->x1); + f.write(p->y1); + f.write(p->native); + f.write(get_id(p->glue)); + } + int M = isize(triangles); + f.write(M); + for(auto t: triangles) { + f.write(get_id(t.m[0])); + f.write(get_id(t.m[1])); + f.write(get_id(t.m[2])); + } + + int cp = isize(surface::coverage); + f.write(cp); + for(auto p: surface::coverage) f.write(p.first), f.write(p.second); + } + +EX void rug_load(string fname) { + clear_model(); + fhstream f(fname, "rb"); + if(!f.f) { + addMessage(XLAT("Failed to load rug from %1", fname)); + return; + } + f.read(f.vernum); + f.read(gwhere); + USING_NATIVE_GEOMETRY; + int N = f.get(); + println(hlog, "N = ", N); + points.resize(N); + for(int i=0; i(); + if(i == -1) p = nullptr; + else p = points[i]; + }; + for(auto p: points) { + f.read(p->valid); + f.read(p->x1); + f.read(p->y1); + f.read(p->native); + by_id(p->glue); + } + triangles.resize(f.get()); + for(auto& t: triangles) { + by_id(t.m[0]); + by_id(t.m[1]); + by_id(t.m[2]); + } + + surface::coverage.resize(f.get()); + for(auto p: surface::coverage) f.read(p.first), f.read(p.second); + good_shape = true; + } + #if CAP_COMMANDLINE int rugArgs() { using namespace arg; @@ -1639,6 +1722,18 @@ int rugArgs() { renderonce = true; } + else if(argis("-rugsave")) { + shift(); rug_save(args()); + } + + else if(argis("-rugload")) { + PHASE(3); + start_game(); + calcparam(); + rug::init(); + shift(); rug_load(args()); + } + else if(argis("-rugdist")) { shift_arg_formula(model_distance); }