diff --git a/src/application.cpp b/src/application.cpp index c34a33d..62323e9 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -5,6 +5,9 @@ #include "dataManager.h" #include "drawingPass.h" +#include +#include + #include #include #include @@ -97,6 +100,7 @@ namespace poncaplot { b->set_callback([&] { auto path = file_dialog( {{"png", "PNG image"}}, true); + if (path.empty()) return; std::cout << "Save file to: " << path << std::endl; size_t factor = 2; @@ -105,6 +109,31 @@ namespace poncaplot { write_image(tex_width*factor, tex_height*factor, texture, path); delete [] (texture); }); + b = new Button(tools, "Save sequence (scale)"); + b->set_callback([&] { + auto path = file_dialog( + {{"", "basename"}}, true); + if (path.empty()) return; + std::cout << "Save sequence to: " << path << std::endl; + + size_t factor = 2; + float *texture = new float[factor * tex_width * tex_height * 4]; + auto prev = scaleSlider->value(); + int start {int(scaleSlider->range().first)}; + int end {int(scaleSlider->range().second)}; + int length = end-start; + for (int i = 0; i < length; ++i) + { + scaleSlider->callback()(float(start+i)); + std::ostringstream oss; + oss << path << std::setfill('0') << std::setw(4) << i << ".png"; + renderPassesInternal(factor, texture); + write_image(tex_width*factor, tex_height*factor, texture, oss.str()); + } + scaleSlider->set_value(prev); + scaleSlider->callback()(prev); + delete [] (texture); + }); } window = new Window(this, "Fitting Controls"); @@ -176,10 +205,10 @@ namespace poncaplot { renderPasses(); }); new nanogui::Label(genericFitWidget, "Scale"); - auto slider = new Slider(genericFitWidget); - slider->set_value(passPlaneFit->params.m_scale); // init with plane, but sync with current. - slider->set_range({10, 750}); - slider->set_callback([&](float value) { + scaleSlider = new Slider(genericFitWidget); + scaleSlider->set_value(passPlaneFit->params.m_scale); // init with plane, but sync with current. + scaleSlider->set_range({10, 750}); + scaleSlider->set_callback([&](float value) { passPlaneFit->params.m_scale = value; passSphereFit->params.m_scale = value; passOrientedSphereFit->params.m_scale = value; diff --git a/src/application.h b/src/application.h index f9de727..48ab09f 100644 --- a/src/application.h +++ b/src/application.h @@ -55,6 +55,7 @@ namespace poncaplot { *pass3Widget, *pass4Widget; nanogui::IntBox *pointIdSelector{nullptr}; + nanogui::Slider *scaleSlider{nullptr}; BaseFitField *passPlaneFit, *passSphereFit, *passOrientedSphereFit, *passUnorientedSphereFit, *passOnePlaneFit, *passOneSphereFit, *passOneOrientedSphereFit,