General code and functionality improvements. Moved more code out of the
OpenGL backend for portability. Implemented audio transitions.
Implemented basic transition animation curve settings.
Improves stability and cache reliability.
Earlier iterations were prone to skipping necessary signals (usually
leading to some sort of assert fail), particularly when track
optimizations were used. Those optimizations have been moved to the
viewer node so there's a higher degree of control over which signals
get optimized and in which ways.
While good in theory, a WYSIWYG rich text editor for large video frames
was unwieldy (and in many cases unhelpful). Instead the titler will
show plain text/HTML tags so the user can still write rich text but
without the unwieldy UI.
For a true WYSIWYG experience, we would probably need to write a true
graphical editor (a la Premiere's titler), but that's a later goal.
This titler will be sufficient in a good majority of cases and there
are plenty of dedicated graphics packages if more complex titling is
required for the timebeing.
I think there was an earlier commit with a similar name but turns out
I'd only done foundational work in that commit and never actually
properly set it up. Of course once I did, there were several issues that
needed fixing to make it work correctly, but now it works as expected.
Heavily optimizes larger projects by allowing cache jobs to only copy
what has changed.
Ensures their thread gets changed along with the viewer. The project
gets loaded/created in a background thread so the GUI can remain
responsive, and is then moved to the main thread for intended event
handling. However if the caches aren't parented, the hierarchy breaks
and the caches remain in a thread whose event loop is quickly destroyed.
Now that they're parented, events can be properly queued on them once
again.
Queuing the destructor caused a potential desync in the node graph that
disconnected blocks after they were reconnected elsewhere. Destroying
immediately keeps this logic synchronized.
Since auto-cache events start and stop fairly frequently (and are somewhat
heavy to create/destroy), we can save a lot of cycles over time by sharing
the same backend between them all.
Default TimeBasedWidget behavior is to jump to the playhead, but we want
the CurveView to zoom fit on open instead. So we set the input after the
timestamp to make this behavior possible.
* Implements "auto-fit" setting for curve view and sets it on open.
* Improves scroll zooming on all TimelineViewBase derivatives.
* Improves code sharing for better maintenance.