From 89c2e6c803b4d63458f2008455ca5fe4b4bc47fc Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Tue, 10 Nov 2009 09:50:39 +0000 Subject: [PATCH] Bugfix #19835: While playing animation, Render>Dimensions>FrameRate does not change animation speed The timestep used for the playback timer now gets adjusted accordingly when the frames-per-second setting gets changed during playback (i.e. in the "animation_step" operator). This is not as ideal as only updating this when the framerate setting is changed, but using an appropriate update function for this failed miserably. --- source/blender/editors/screen/screen_ops.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 7e2c74bb8a9..5cc2039393a 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -2232,7 +2232,7 @@ static int screen_animation_step(bContext *C, wmOperator *op, wmEvent *event) ScreenAnimData *sad= wt->customdata; ScrArea *sa; int sync; - + /* sync, don't sync, or follow scene setting */ if(sad->flag & ANIMPLAY_FLAG_SYNC) sync= 1; else if(sad->flag & ANIMPLAY_FLAG_NO_SYNC) sync= 0; @@ -2288,12 +2288,12 @@ static int screen_animation_step(bContext *C, wmOperator *op, wmEvent *event) } } } - + /* since we follow drawflags, we can't send notifier but tag regions ourselves */ ED_update_for_newframe(C, 1); - + sound_update_playing(C); - + for(sa= screen->areabase.first; sa; sa= sa->next) { ARegion *ar; for(ar= sa->regionbase.first; ar; ar= ar->next) { @@ -2305,6 +2305,12 @@ static int screen_animation_step(bContext *C, wmOperator *op, wmEvent *event) } } + /* recalculate the timestep for the timer now that we've finished calculating this, + * since the frames-per-second value may have been changed + */ + // TODO: this may make evaluation a bit slower if the value doesn't change... any way to avoid this? + wt->timestep= (1.0/FPS); + //WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); return OPERATOR_FINISHED;