Remove .gitignore do nothing is ignored.
[synfig.git] / synfig-core / trunk / src / modules / lyr_std / timeloop.cpp
index d7a6c57..4306c4a 100644 (file)
@@ -6,7 +6,7 @@
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
-**     Copyright (c) 2007 Chris Moore
+**     Copyright (c) 2007, 2008 Chris Moore
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -66,6 +66,8 @@ SYNFIG_LAYER_SET_CVS_ID(Layer_TimeLoop,"$Id$");
 Layer_TimeLoop::Layer_TimeLoop()
 {
        old_version=false;
+       only_for_positive_duration=false;
+       symmetrical=true;
        link_time=0;
        local_time=0;
        duration=1;
@@ -88,6 +90,8 @@ Layer_TimeLoop::set_param(const String & param, const ValueBase &value)
                IMPORT(local_time);
                IMPORT(link_time);
                IMPORT(duration);
+               IMPORT(only_for_positive_duration);
+               IMPORT(symmetrical);
        }
 
        return Layer::set_param(param,value);
@@ -99,6 +103,8 @@ Layer_TimeLoop::get_param(const String & param)const
        EXPORT(link_time);
        EXPORT(local_time);
        EXPORT(duration);
+       EXPORT(only_for_positive_duration);
+       EXPORT(symmetrical);
        EXPORT_NAME();
        EXPORT_VERSION();
 
@@ -122,6 +128,14 @@ Layer_TimeLoop::get_param_vocab()const
                .set_local_name(_("Duration"))
        );
 
+       ret.push_back(ParamDesc("only_for_positive_duration")
+               .set_local_name(_("Only For Positive Duration"))
+       );
+
+       ret.push_back(ParamDesc("symmetrical")
+               .set_local_name(_("Symmetrical"))
+       );
+
        return ret;
 }
 
@@ -155,6 +169,9 @@ Layer_TimeLoop::reset_version()
        // convert the static parameters
        local_time = start_time;
        duration = end_time - start_time;
+       only_for_positive_duration = true;
+       symmetrical = false;
+
        //! \todo layer version 0.1 acted differently before start_time was reached - possibly due to a bug
        link_time = 0;
 
@@ -190,25 +207,33 @@ Layer_TimeLoop::reset_version()
 
        connect_dynamic_param("local_time", start_time_value_node);
        connect_dynamic_param("duration",   duration_value_node);
-       connect_dynamic_param("link_time",  ValueNode_Const::create(Time(0)));
 }
 
 void
 Layer_TimeLoop::set_time(Context context, Time t)const
 {
-       if (duration == 0)
-               t = link_time;
-       else if (duration > 0)
-       {
-               t -= local_time;
-               t -= floor(t / duration) * duration;
-               t  = link_time + t;
-       }
-       else
+       Time time = t;
+
+       if (!only_for_positive_duration || duration > 0)
        {
-               t -= local_time;
-               t -= floor(t / -duration) * -duration;
-               t  = link_time - t;
+               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;
+               }
+
+               // 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);