Motivation and goal
I enjoy helping others and creating user-friendly tools. That’s why I chose to specialize in tools. I like working with people, both other programmers and those from other fields.
At first, I didn’t know what kind of tool to build. So I asked my project group what they needed. I wanted to make something useful.
I decided to create an animation state editor. I wasn’t very familiar with animations, but our animators really needed one. The other ideas were too small for a full specialization project.
This project let me collaborate closely with others and build something they truly needed.

Features
First of I wanted the animators to be able to simply drag a mesh into the editor, and then add animations for that mesh by dragging those in as well. This would automatically create the necessary nodes, allowing them to start tweaking the settings. These settings would include, for example, which animations are linked, how quickly they blend, and so on.
The plan was also to enable visualization of joints and bones on the skeletal mesh, so that animators could select a specific joint and apply blending only from that joint outward.
Once the animators were finished, all changes would be saved to a JSON file, which could then be imported into the game.
It turned out that our animation blending was worse than I had initially thought, so I spent a significant amount of time learning, not just about animations in general, but specifically about blending. I then applied that knowledge to improve the blending in our engine. This process took up a large portion of the already tight time frame we had for our specialization.
The Start
We already had the ImGui Node Editor integrated into our engine, thanks to the visual scripting system. However, since I had never used the Node Editor directly before, I started by familiarizing myself with it.
It turned out that our ImGui library was missing some functions that I wanted to simplify the layout process. After adding those, I began working on the interface for the animation editor.
I started by creating nodes that could be linked together an "infinite" number of times. I followed Unity's approach and added Entry, Exit, and "Any State" nodes, which are automatically created when the program starts.


Save, load & play
To enable saving, I linked the save file to the skeleton mesh. I added the classic "Ctrl+S" save command and also made it automatically save when you exit the program.
Loading was straightforward — it checks whether the dropped mesh has an associated JSON file and loads it if available.
Loading was straightforward — it checks whether the dropped mesh has an associated JSON file and loads it if available.
I added a "Play Selected" button that plays the selected animation, or, if a link is selected, plays the blending of the linked animations. A slider with blend time allows the user to adjust how fast the two animations should blend.
I included a playback rate slider. Users can slow down animations to closely observe how blending happens. This helps with debugging and fine-tuning transitions.
Quality of life features
I added functionality to allow a redirect node to be placed, for example when links between nodes pass through other nodes. This makes it easier to see which nodes are connected.
Using the same "create node" functionality, I also added a comment box that sits behind all other elements. Its purpose is to group together nodes that the user feels belong together. This way, they can be moved as a group without altering their individual positions.


Conditions
I added a setting to choose whether an animation should loop. This is important for controlling how animations behave.
I set up conditions using booleans and floats. This allows the user to define exactly when an animation should blend into another. Each condition can be customized based on gameplay or character state. These values are also prepared for use with additive blending and blendspaces, making it easier to layer animations or smoothly transition between them. The system is designed to be flexible, so it can support both simple and advanced animation logic as needed.
I set up conditions using booleans and floats. This allows the user to define exactly when an animation should blend into another. Each condition can be customized based on gameplay or character state. These values are also prepared for use with additive blending and blendspaces, making it easier to layer animations or smoothly transition between them. The system is designed to be flexible, so it can support both simple and advanced animation logic as needed.
I added a feature that shows relevant information when the user hovers over an animation in the list. It displays details like blend speed, animation index, and more.
Conclusions:
The first mistake I made was focusing on the quality of the animations too early. I should have finished the tool first to ensure it was functioning properly. Then, the rest of the team and I could have iterated on the animations until we were satisfied with the quality.
I also should have managed my time more efficiently. However, since my ADD diagnosis is relatively recent, I’m still adjusting my medication. I ended up wasting a lot of time struggling to get started. Fortunately, I chose to develop a tool for the animators on my team. Helping others, or the team as a whole, is one of the most effective ways for me to stay motivated and productive.
Future Improvements:
- Add a content browser to my editor. It will check for relevant animations and add them to the browser automatically. This will help users find what they need faster and work more efficiently. The goal is to simplify the workflow and save time.
- Change how the links are displayed. It's hard to see which animation links to what, especially when two animations link to each other. The current layout creates confusion. Clearer visuals or separation would help user get a better overview.