diff --git a/rogueviz/smoothcam.cpp b/rogueviz/smoothcam.cpp
index f1703d96..e4ebf3e5 100644
--- a/rogueviz/smoothcam.cpp
+++ b/rogueviz/smoothcam.cpp
@@ -28,6 +28,7 @@ struct animation {
vector frames;
};
+vector smoothcam_params;
}
}
@@ -57,10 +58,12 @@ namespace hr {
void hwrite(hstream& hs, const rogueviz::smoothcam::frame& frame) {
hwrite(hs, frame.title, frame.where, frame.sView, frame.V, frame.ori, frame.front_distance, frame.up_distance, frame.interval);
+ for(auto pa: rogueviz::smoothcam::smoothcam_params) { hwrite(hs, frame.params.at(pa)); }
}
void hread(hstream& hs, rogueviz::smoothcam::frame& frame) {
hread(hs, frame.title, frame.where, frame.sView, frame.V, frame.ori, frame.front_distance, frame.up_distance, frame.interval);
+ for(auto pa: rogueviz::smoothcam::smoothcam_params) { hread(hs, frame.params[pa]); }
}
}
@@ -177,6 +180,20 @@ transmatrix try_harder_relative_matrix(cell *at, cell *from) {
return U;
}
+frame new_frame() {
+ frame f;
+ f.title = gentitle();
+ f.where = centerover;
+ f.sView = View;
+ f.V = current_position;
+ f.ori = ortho_inverse(NLP);
+ f.front_distance = 1;
+ f.up_distance = 1;
+ f.interval = 0;
+ for(auto p: smoothcam_params) f.params[p] = real(params[p]->get_cld());
+ return f;
+ };
+
void edit_segment(int aid) {
cmode = sm::PANNING;
gamescreen();
@@ -233,6 +250,12 @@ void edit_step(animation& anim, int id) {
dialog::add_action([&f] {
dialog::editNumber(f.up_distance, -5, 5, .1, 1, "up distance", "");
});
+
+ char key = '1';
+ for(auto pa: smoothcam_params) {
+ dialog::addSelItem(pa, fts(f.params[pa]), key++);
+ }
+
dialog::addItem("delete", 'd');
dialog::add_action([&anim, id] {
anim.frames.erase(anim.frames.begin()+id);
@@ -289,7 +312,7 @@ void edit_step(animation& anim, int id) {
if(&anim == current_segment) {
dialog::addItem("insert the current position before this", 'j');
dialog::add_action([&anim, id] {
- anim.frames.insert(anim.frames.begin() + id, frame{gentitle(), centerover, View, current_position, ortho_inverse(NLP), 1, 1, 0});
+ anim.frames.insert(anim.frames.begin() + id, new_frame());
popScreen();
});
}
@@ -391,7 +414,7 @@ void show() {
if(current_segment) {
dialog::addItem("create a new position", 'a');
dialog::add_action([] {
- current_segment->frames.push_back(frame{gentitle(), centerover, View, current_position, ortho_inverse(NLP), 1, 1, 0});
+ current_segment->frames.push_back(new_frame());
});
}
@@ -545,6 +568,13 @@ void handle_animation(ld t) {
transmatrix V = View;
+ for(auto pa: smoothcam_params) {
+ vector values;
+ for(auto& f: anim.frames) values.push_back(f.params[pa]);
+ ld val = interpolate(values, times, t);
+ params[pa]->set_cld(val);
+ }
+
if(embedded_plane && embedded_shift_method_choice != smcNone) {
hyperpoint interm = C03;
@@ -691,6 +721,9 @@ auto hooks = arg::add3("-smoothcam", enable_and_show)
animate_on = true;
last_time = HUGE_VAL;
})
+ + arg::add3("-smoothcam-param", [] {
+ arg::shift(); smoothcam_params.push_back( arg::args() );
+ })
+ arg::add3("-smoothcam-anim-on", [] {
animate_on = true;
last_time = HUGE_VAL;