From 42dc7b41f67f943ff8b5423e342f908a880962b7 Mon Sep 17 00:00:00 2001 From: TheNumbat <mjslater@andrew.cmu.edu> Date: Sat, 24 Apr 2021 12:21:11 -0700 Subject: [PATCH] add undo bundle/don't move blank keyframes --- src/gui/animate.cpp | 46 ++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/src/gui/animate.cpp b/src/gui/animate.cpp index efe2462..3497cd1 100644 --- a/src/gui/animate.cpp +++ b/src/gui/animate.cpp @@ -410,6 +410,24 @@ void Animate::timeline(Manager& manager, Undo& undo, Scene& scene, Scene_Maybe o ImGui::Text("Keyframe:"); ImGui::SameLine(); + auto all_keys = [](Scene_Item& item) { + Anim_Pose animation = item.animation(); + std::set<float> keys = animation.splines.keys(); + if(item.is<Scene_Light>()) { + std::set<float> more_keys = item.get<Scene_Light>().lanim.splines.keys(); + keys.insert(more_keys.begin(), more_keys.end()); + } + if(item.is<Scene_Object>()) { + std::set<float> more_keys = item.get<Scene_Object>().armature.keys(); + keys.insert(more_keys.begin(), more_keys.end()); + } + if(item.is<Scene_Particles>()) { + std::set<float> more_keys = item.get<Scene_Particles>().panim.splines.keys(); + keys.insert(more_keys.begin(), more_keys.end()); + } + return keys; + }; + auto set_item = [&, this](Scene_Item& item) { if(item.is<Scene_Object>()) { undo.anim_object(item.id(), (float)current_frame); @@ -474,30 +492,34 @@ void Animate::timeline(Manager& manager, Undo& undo, Scene& scene, Scene_Maybe o ImGui::SameLine(); if(ImGui::Button("Move Left") && current_frame > 0) { - if(camera_selected) { + if(camera_selected && anim_camera.splines.has((float)current_frame)) { undo.anim_clear_camera(anim_camera, (float)current_frame); current_frame--; undo.anim_camera(anim_camera, (float)current_frame, ui_camera.get()); camera_spline(); - } else if(select) { + undo.bundle_last(2); + } else if(select && all_keys(*select).count((float)current_frame)) { clear_item(*select); current_frame--; set_item(*select); + undo.bundle_last(2); } frame_changed = true; } ImGui::SameLine(); if(ImGui::Button("Move Right") && current_frame < max_frame-1) { - if(camera_selected) { + if(camera_selected && anim_camera.splines.has((float)current_frame)) { undo.anim_clear_camera(anim_camera, (float)current_frame); current_frame++; undo.anim_camera(anim_camera, (float)current_frame, ui_camera.get()); camera_spline(); - } else if(select) { + undo.bundle_last(2); + } else if(select && all_keys(*select).count((float)current_frame)) { clear_item(*select); current_frame++; set_item(*select); + undo.bundle_last(2); } frame_changed = true; } @@ -590,21 +612,7 @@ void Animate::timeline(Manager& manager, Undo& undo, Scene& scene, Scene_Maybe o ImGui::PushID(item.id()); - Anim_Pose animation = item.animation(); - std::set<float> keys = animation.splines.keys(); - if(item.is<Scene_Light>()) { - std::set<float> more_keys = item.get<Scene_Light>().lanim.splines.keys(); - keys.insert(more_keys.begin(), more_keys.end()); - } - if(item.is<Scene_Object>()) { - std::set<float> more_keys = item.get<Scene_Object>().armature.keys(); - keys.insert(more_keys.begin(), more_keys.end()); - } - if(item.is<Scene_Particles>()) { - std::set<float> more_keys = item.get<Scene_Particles>().panim.splines.keys(); - keys.insert(more_keys.begin(), more_keys.end()); - } - + auto keys = all_keys(item); for(float f : keys) { int frame = (int)std::round(f); if(frame >= 0 && frame < max_frame) frames[frame] = true; -- GitLab