WHEN USING % values for time or position, use ="value%" formula - as sheets will translate 75% to .75, 100% to 1, etc.
[blockchildindex] - this is useful when the same block, shape or mesh name is used many times, by default it's 'all',
0 is the start (first), empty = 'all' (not 0)
The outer most block controls the animation length, all internal blocks will repeat. So for a 30s animation, the root block should have at least one frame with a time of 30s.
The application generates a first frame here, and the last frame is 30s as specified by the time.
Clone Previous Frame
The example below shows the use of the cp operator for time. Also times by default are in ms, but 20s = 20000, m also works for minutes.
The cp (clone previous) operator clones the previous frame and sets the time (in this case 1 ms before). This creates an instant
transition without coding the duplicate frame (it's just save you the time of entering 2 frames instead of one).
Relative + and ++ operators
The + prefix operator adds the value to the first frame value to determine the current frame value.
The ++ operator adds the value to the previous frame.
The example at the left shows 2000 starting time, the 2nd frame has an absolute time (3.5s). The third
frame adds 2500 to the first frame time to get 4500 - and the last frame adds 500 to the previous frame for 5000.
* operator (parent time offset)
The * operator will find the first user created frame from the parent block and add it's time to this frame. This is used to move an entire
block in time, for example a bouncing ball as a block can be started at 5s or 10s, and all animations underneath can the be
timed with relative operators so the same block can be moved in both position/scale/rotation and time.
% operator (time only)
The length of the animation is determined by the frames on the root block. Any frames related to child blocks can have
a time based as a % of animation length as a whole.
3 easing functions are provided, ease in (ei), ease out (eo) and ease in and out (eio). You can use these by specifying on the first frame using a colon;
i.e. 0s:eio 1000:ei
Last Frame and First Frame generation
If you enter a time in the first raw frame, the system will automatically generate a frame at time 0. This freezes the object in place until this time.
If you append lf to the last frame, a last frame will be generated with a time equal to the last frame of the root animation. This way if you
move an object and want it to stay for the rest of the animation, add lf to it's time, i.e. 10slf or 5500lf.
if no [parent], then name is used to look up a block, and only a block (such as a scene, or ::scene:: is valid), and attaches "default" frames to blocks (which are overridden by blockchild frames IF provided)
or if on the ::scene:: block, they are the only frames