tl;dr - here’s a feature proposition (in the process of implementing) on some kind of multiple timelines for the purpose of decoupling “characters with poses” and animations using them.
I am a perfectionist and thus i want to have as much non-destructive editing as possible. I want not only to be able to create poses and reuse them by copying around, but rather reference them and be able to edit them afterwards. I also want to have poses and actual animated sequence separated from each other (well, otherwise it is nearly impossible to achieve previously mentioned goals anyway).
In search how to do it, i stumbled upon wiki.synfig.org/Doc:Reuse_Animations . That, along with sif(z) import feature, seemed to be the closest thing to what i want, but even though it allows to reference objects from one file in another, it stores all animations in the imported file. It also relies on copying waypoints. I searched some more, but couldn’t find any useful info. At some point i considered “Free time”, but while it can simplify reusing sequences, it still requires all needed sequences to be present in character file.
In the end, i checked out file format and came to conclusion that there is simply no way to achieve what i wanted. So i decided to implement it myself.
Ideal solution to this problem would be adding proper multiple timelines to each object - one or more for template/character file and one per “episode”.
This solution, however, seems to be quite hard to implement. It requires changing a lot of core code dealing with time, waypoints, valuenodes, linking and saving/loading. So i decided that with my little knowledge of Synfig code base i won’t be able to make it soon (if at all).
Working hacky solution
So after a bit of thinking i came up with alternative, less fancy, but much easier to implement solution. Instead of adding real timelines, it fakes them. Here’s how it works:
- time patch layer is a kind of group layer that has additional “time patch” parameter (it has “time” type)
- if “time patch” parameter is animated, its waypoints are used to create “transient” waypoints on its children
- waypoints are created by copying existing waypoints at the time of “time patch” parameter value
So basically, it lets you reference poses by their time offset instead of copying and modifying original file/canvas.
Here’s a little demonstrational video (you can also download it here if you don’t see subtitles in browser) and a short animation made with this feature (btw, couldn’t find a way to embed video here - is that possible?)
As you can see, it already kinda works. There are still issues, such as lack of recursive waypoint creation (the reason why i used only rectangles for demo ^_^), instability, little ui support and some part of timeline being reserved for poses (this can be fixed with some time offsetting, perhaps).
However, the biggest issue is that this method may turn out to be not flexible enough. Suppose you have a character which has several body poses and several facial expressions. With current time patching implementation you’ll have to import them separately and manually assemble in each file that uses character. Maybe that won’t be a very big issue - i haven’t actually tried making a proper character that way - but it concerns me.
So i returned to the idea of proper timeline separation. Here are some thoughts on what needs to be implemented for that:
- ValueNode_AnimatedInterface should have references to multiple waypoint lists and be able to switch between them
- Waypoints should be able to share the same value node (perhaps possible already?)
- saving and loading should be handled properly - this seems to be one of the hardest problems to me; perhaps, each object (valuenode or layer?) should have unique id associated to it and importing file should store the additional timeline marked with that uid.
- finally, user interface should be made (though it should be possible to use this feature without additional ui, but it’s unlikely many will do so )
Woah, that looks like a lot of text already. I should probably finish here.
Any comments are welcome, but what i would like to hear most is ideas on how to implement multiple timelines or how to make time patching approach more usable.