summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--visualizer.c15
-rw-r--r--visualizer.h3
2 files changed, 18 insertions, 0 deletions
diff --git a/visualizer.c b/visualizer.c
index 219d44cd3c..2ec6e34f58 100644
--- a/visualizer.c
+++ b/visualizer.c
@@ -178,6 +178,21 @@ static bool update_keyframe_animation(keyframe_animation_t* animation, visualize
return true;
}
+void run_next_keyframe(keyframe_animation_t* animation, visualizer_state_t* state) {
+ int next_frame = animation->current_frame + 1;
+ if (next_frame == animation->num_frames) {
+ next_frame = 0;
+ }
+ keyframe_animation_t temp_animation = *animation;
+ temp_animation.current_frame = next_frame;
+ temp_animation.time_left_in_frame = animation->frame_lengths[next_frame];
+ temp_animation.first_update_of_frame = true;
+ temp_animation.last_update_of_frame = false;
+ temp_animation.need_update = false;
+ visualizer_state_t temp_state = *state;
+ (*temp_animation.frame_functions[next_frame])(&temp_animation, &temp_state);
+}
+
bool keyframe_no_operation(keyframe_animation_t* animation, visualizer_state_t* state) {
(void)animation;
(void)state;
diff --git a/visualizer.h b/visualizer.h
index 82d7a71d37..5375e0130f 100644
--- a/visualizer.h
+++ b/visualizer.h
@@ -106,6 +106,9 @@ extern GDisplay* LED_DISPLAY;
void start_keyframe_animation(keyframe_animation_t* animation);
void stop_keyframe_animation(keyframe_animation_t* animation);
+// This runs the next keyframe, but does not update the animation state
+// Useful for crossfades for example
+void run_next_keyframe(keyframe_animation_t* animation, visualizer_state_t* state);
// Some predefined keyframe functions that can be used by the user code
// Does nothing, useful for adding delays