Time Loop Layer
About Time Loop Layers
The Time Loop layer can be used to repeat an animation over and over. It loops a section of the layers below and within the same canvas over and over.
See also the Time Loop ValueNode conversion, which can be used to loop the value of a single parameter, rather than an entire layer or group of layers.
[Note: the Time Loop layer used to have parameters 'start time' and 'end time'. Documentation for that old version of the layer is available.
Parameters of Time Loop Layers
The parameters of the time loop layers are:
|Only For Positive Duration||
- Link Time (time) - start time of cycled material/child layers.
- Local Time (time) - start time of loop.
- Duration (time) - number of seconds or frames that are looped in the child layer.
- Only For Positive Duration (bool) - If checked and Duration is zero or negative, then the time loop layer is effectively disabled, and acts as if it wasn't there.
-If not checked and the Duration is zero, the Time Loop layer freezes the animation of the children layers at the value of "Link Time".
- Symmetrical (bool) - If not checked, and the current time is less than 'local time', then 'duration' is taken off the resulting time. This is to provide compatibility with version 0.1 of the time loop layer.
These parameters, like any other in Synfig can be animated, so that they change over time. This can be confusing, so make sure you aren't in Animate Edit Mode when working with the Time Loop layer, unless you know what you're doing!
The Time Loop layer repeatedly loops through the 'Duration' seconds of its child layers, from 'Link Time' to 'Link Time' + 'Duration'. 'Local Time' is used to line up the offset of the time looping. When the Time Loop layer is asked to set its time to 'Local Time', it sets the time in its child layers to be 'Link Time', ie. the start of the loop.
To break a loop and continue animating you basically need to do two things; break the loop with a waypoint and copy the animation keyframe to your position in the timeline.
- Find out which frame in the child layers that corresponds to the frame in the time loop layer where you want to break the loop.
Goto this frame in the child layer and add a keyframe here. Then goto the frame where you want to break the loop and duplicate the keyframe.
- Set the first time loop Duration waypoint to Constant and check Only For Positive Duration. Then at the breaking frame set Duration to 0.
- Continue animating the child layer(s) which are not looped anymore.
For example, suppose:
- Link Time is 5s
- Duration is 3s
- Local Time' is 4s
And suppose that the Time Loop layer is applied over an existing animation. The 'Link Time' and 'Duration' specify that the section from 5s to 8s in the children layers will be looped. The 'Local Time' specifies that this loop will be at the beginning at 4s. (And so also therefore at 1s, 7s, 10s, etc).
This is how the mapping actually works:
|real time||child time
(symmetrical = true)
(symmetrical = false)
|4||5||5 (local time = 4; link time = 5)|
|7||5||5 (duration = 3, so loop repeats after 3 seconds)|
Specifying a huge number for the Duration parameter effectively turns the Time Loop layer into a Time Shift layer. The Link Time and Local Time parameters controls which time in the children lines up with which time in the Time Loop layer, giving the amount of the timeshift, with both positive and negative differences working as expected.
Download and examine this example file: Time-loop-demo-0.2.sifz
It's a 10 second animation, and shows 2 circles. The top one moves linearly from the left to the right. Its position is marked by static text digits 0 through 10.
The other circle is an identical copy of the first one, with the same waypoints, but it's inside an Group layer. The parameters are:
- Link Time: 5s
- Duration: 1.5s
- Local Time: 2s
- Symmetrical: true
So as time=2s, the top circle is at position 2 (local time) and the bottom circle is at position 5 (link time):
The loop is 1.5s long, so the bottom circle is also at position 5 every 1.5 seconds before and after this point in time, for example at t=3.5s and at t=8s:
The following two images show the positions at t=0s and t=3s. The loop starts at t=2s, so it's also at the start at t=0.5s. So at t=0s it's half a second before finishing the previous loop. And at t=3s the same is true, but 2 loops later on: