enve Introducing enve, free/libre 2D animation tool

One of my common mistakes is sticking around a new interesting project for a long time without telling more people about it. So without further ado, I’m giving you enve , a free/libre 2D animation tool by Maurycy Liebner.

The essentials

Since people pay so much attention to project names these days, let’s get it out of the system: enve means Enve is Not a Video Editor. Yes, it’s a recursive acronym, deal with it :)

Here is a quick run-down of what enve does:

  • Timeline-based animation, automatic tweening, all objects’ and filters’ properties are animatable
  • Supported objects: Bezier curve, ellipse, rectangle, text, brush strokes
  • Uses MyPaint’s brushlib as the painting engine, relies on Qt’s native graphic tablets support
  • Ships with a basic selection of blending and compositing modes for objects (Porter-Duff, as well as Screen, Overlay, Color Dodge, Color Burn etc.)
  • Supports multiple scenes per project
  • Imports image sequences, video and audio files
  • Outputs anything that FFmpeg supports
  • Has separation into core and GUI and supports pluggable path and raster effects, including GLSL fragment shaders
  • Has configurable preview resolution for better performance control, you can use presets or input anything between 0% and 999%
  • Works on Linux, can be made to run on Windows and macOS (Qt)

From the UX perspective, enve is a bit of a cross between Inkscape and Blender, which has a lot to do with Maurycy being an avid user of both, professionally. Just a few examples:

  • You can use the path editing tool to edit rectangles and ellipses.
  • When you edit a path, enve shows control points for two adjacent nodes so that you could easily tweak the shape.
  • You can use G, S, and R shortcuts for moving, scaling, and rotating respectively, and for scaling, you can press X or Y to constrain the transformation to just one axis.
  • The timeline design resembles that of Blender’s Dope Sheet, with the benefit of providing direct access to numeric values of various settings.
  • Similarly to Bender, a panel can be duplicated vertically or horizontally, so that you could e.g. have access to different areas of the timeline or the canvas.

The design

I tend to avoid the topic of architectural design of applications, but in this case, it pretty much defines the extensibility of enve. Moreover, everything that goes below in this section is a verbatim copy of what Maurycy wrote to me. He explained it nicely, there was no point in retelling it in different words.

Enve is divided into two parts: the enve core library, and the app itself. The core library contains most of the backed code. The app, on the other hand, puts parts of the core library together and is responsible for the GUI.

The core library can be used by users to create their own effects in C++. This includes effects that influence pixels (raster effects) and effects that influence shapes (path effects). All they have to do is to subclass the relevant classes from the core library, compile their effect, copy the resulting *.so file into their enve directory, and they will see their effect in enve context menu, ready to use.

The core library contains animatable properties (float, integer, color, path, etc.) you can assign to your effect with just a few lines of code. Enve handles everything from GUI to saving for all the properties and the effect itself.

There is also a special type of a raster effect called shader effect. Shader effects do not have to be compiled. All (animatable) properties for a shader effect can be defined in an XML based file. The property values will be passed by enve to a user-defined GLSL-based fragment shader that will be used when applying the effect. From the point of view of the user, shader effects are indistinguishable from precompiled C++ raster effects, but they are more suitable for simple effects, and can only be processed on GPUs.

In theory, it shouldn’t be too difficult to expand plugin capabilities far beyond effects.

Currently, continuous builds do not ship with the plugin development kit. The code changes quite rapidly, meaning the user-created pre-compiled plugins would have to be recompiled and altered quite often. The ongoing effort is to do a major code cleanup, focusing on the core library, to make it better suited for long-lasting user-created plugins.

The good, the bad, and the ugly

You probably already guessed that I’m very excited about enve. I’ve tried every animation tool on Linux there is to try. There are some extremely powerful and production-ready applications around, like OpenToonz, and Blender just keeps getting better for 2D animation.

What can I say, enve instantly clicked with me. I have a pretty good idea what I need from an animation tool (granted, not much!), and I can do it without much stress with this program.

Supporting GLSL fragment shaders for effects is just awesome. A lot of people have experience writing those, which means we can get from few effects to a ton of effects fast enough.

But I’m also well aware that the program is far from being perfect. It does have its quirks.

UX-wise, the mix of Inkscape and Blender is not a bad idea, but some things are just not obvious. I discovered the S and R shortcuts (scaling, rotating) purely by accident, and I was not clever enough to discover the G one (moving) despite the obvious Blender-like interaction. Some buttons lack tooltips, and I just don’t have enough experience to figure out what they do.

The program would also benefit from a context-sensitive toolbar for tool settings, which Maurycy is already moving towards. E.g. a recent commit adds toolbar buttons to control brush size, they are only visible when you select the brush tool.

Workflow-wise, some of the sorely missing features are easing functions (only Bezier-based interpolation available) and a working undo/redo support. Both are high on the priorities list though.

All in all, I’d say it’s difficult and, frankly, unnecessary to bitch about a program that works well for its alpha development stage, has a nice design, and makes it comparatively easy for people to get started.

Getting the latest and greatest

In the past few weeks, the project has gone far from its initial v0.0.0 release in September 2019. Continuous builds as AppImage files are available on GitHub for every successful git commit.

Windows and macOS builds aren’t even planned yet and will most likely demand an interested contributor who will stick around.

Further plans and how you can help

There is no public roadmap yet. Maurycy says:

I am yet to run out of things to do, so I do not spend much time planning.

However, if you are interested to help out, some of the ideas are to create your own effects and/or make better examples and documentation for the effects dev kit. It would be a nice starting point for someone to get familiarized with the enve code.

The origins

Since I’m clearly doing things backwards this time, let’s finish this introduction with the origins of the project.

This is what Maurycy Liebner told me:

I work as a graphics designer (mostly 3D animations). Back in 2016, I was working on a short 2D vector animation. I tried creating it with Synfig, but for some reason, I found it unusable. I am not trying to discredit Synfig, I am sure there are people who use it successfully. It simply did not feel right for me at the time._

I ended up using After Effects, which was a lackluster experience. During that time, out of frustration, I opened the Qt Creator and started a new project called AniVect. Back then I did not have any plans for it, I just wanted to write some code. I had no prior experience with graphics related programming, so I had no idea what I was getting myself into.

Don’t we all? :)