diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-08-21 20:28:49 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-08-21 20:28:49 +0400 |
commit | bc41c845f355c0e4fed427bfa3ab7fc5f7e96660 (patch) | |
tree | 16f3baed489ef5010e3829848d9f3e0d4b1cce47 /source/blender | |
parent | f2e7ca0de39ef3ff83feb05e6bae949e12a9fb7b (diff) |
2.5: Animation playback without sync option was slightly slower
than expected time, even when it could keep up. Changed the WM
timer logic a bit to always target the next frame time exactly,
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/windowmanager/WM_types.h | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_window.c | 6 |
2 files changed, 7 insertions, 1 deletions
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index c400b6c9b20..42ee6e926fc 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -283,6 +283,8 @@ typedef struct wmTimer { double delta; /* time since previous step in seconds */ double ltime; /* internal, last time timer was activated */ + double ntime; /* internal, next time we want to activate the timer */ + double stime; /* internal, when the timer started */ int sleep; /* internal, put timers to sleep when needed */ } wmTimer; diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index d6bde9a468c..27a1b076a28 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -26,6 +26,7 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include <math.h> #include <stdlib.h> #include <stdio.h> #include <string.h> @@ -690,12 +691,13 @@ static int wm_window_timer(const bContext *C) wmTimer *wt; for(wt= win->timers.first; wt; wt= wt->next) { if(wt->sleep==0) { - if(wt->timestep < time - wt->ltime) { + if(time > wt->ntime) { wmEvent event= *(win->eventstate); wt->delta= time - wt->ltime; wt->duration += wt->delta; wt->ltime= time; + wt->ntime= wt->stime + wt->timestep*ceil(wt->duration/wt->timestep); event.type= wt->event_type; event.custom= EVT_DATA_TIMER; @@ -790,6 +792,8 @@ wmTimer *WM_event_add_window_timer(wmWindow *win, int event_type, double timeste wt->event_type= event_type; wt->ltime= PIL_check_seconds_timer(); + wt->ntime= wt->ltime + timestep; + wt->stime= wt->ltime; wt->timestep= timestep; BLI_addtail(&win->timers, wt); |