Author: Carlos Lopez <genet...@gmail.com>
Date:   Fri Nov 11 20:04:36 2011 +0100

Fix bug in Time Loop Layer. Patch ID: 3414729 by Ray Frederikson

---

 synfig-core/src/modules/lyr_std/timeloop.cpp |   41 +++++++++++++++++---------
 1 files changed, 27 insertions(+), 14 deletions(-)

diff --git a/synfig-core/src/modules/lyr_std/timeloop.cpp 
b/synfig-core/src/modules/lyr_std/timeloop.cpp
index bdab6ea..b66798c 100644
--- a/synfig-core/src/modules/lyr_std/timeloop.cpp
+++ b/synfig-core/src/modules/lyr_std/timeloop.cpp
@@ -42,6 +42,7 @@
 #include <synfig/paramdesc.h>
 #include <synfig/renddesc.h>
 #include <synfig/value.h>
+#include <synfig/canvas.h>
 
 #endif
 
@@ -221,29 +222,41 @@ void
 Layer_TimeLoop::set_time(Context context, Time t)const
 {
        Time time = t;
-
+       float document_fps=get_canvas()->rend_desc().get_frame_rate();
        if (!only_for_positive_duration || duration > 0)
        {
                if (duration == 0)
                        t = link_time;
-               else if (duration > 0)
-               {
-                       t -= local_time;
-                       t -= floor(t / duration) * duration;
-                       t  = link_time + t;
-               }
-               else
-               {
-                       t -= local_time;
-                       t -= floor(t / -duration) * -duration;
-                       t  = link_time - t;
+               else {
+                       float t_frames = round(t*document_fps);
+                       float duration_frames = round(duration*document_fps);
+                       if (duration > 0)
+                       {
+                               t -= local_time;
+                               // Simple formula looks like this:
+                               // t -= floor(t / duration) * duration;
+                               // but we should make all calculations in 
frames to avoid round errors
+                               t_frames -= floor(t_frames / duration_frames) * 
duration_frames;
+                               // converting back to seconds:
+                               t = t_frames / document_fps;
+                               t = link_time + t;
+                       }
+                       else
+                       {
+                               t -= local_time;
+                               // Simple formula looks like this:
+                               // t -= floor(t / -duration) * -duration;
+                               // but we should make all calculations in 
frames to avoid round errors
+                               t_frames -= floor(t_frames / -duration_frames) 
* -duration_frames;
+                               // converting back to seconds:
+                               t = t_frames / document_fps;
+                               t = link_time - t;
+                       }
                }
-
                // for compatibility with v0.1 layers; before local_time is 
reached, take a step back
                if (!symmetrical && time < local_time)
                        t -= duration;
        }
-
        context.set_time(t);
 }
 


------------------------------------------------------------------------------
RSA(R) Conference 2012
Save $700 by Nov 18
Register now
http://p.sf.net/sfu/rsa-sfdev2dev1
_______________________________________________
Synfig-devl mailing list
Synfig-devl@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/synfig-devl

Reply via email to