Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2009-08-21 20:28:49 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2009-08-21 20:28:49 +0400
commitbc41c845f355c0e4fed427bfa3ab7fc5f7e96660 (patch)
tree16f3baed489ef5010e3829848d9f3e0d4b1cce47 /source/blender/windowmanager
parentf2e7ca0de39ef3ff83feb05e6bae949e12a9fb7b (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/windowmanager')
-rw-r--r--source/blender/windowmanager/WM_types.h2
-rw-r--r--source/blender/windowmanager/intern/wm_window.c6
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);