The Machinery Beta — May 2021 (version 2021.5)

Here at Our Machinery, we’re pretty excited about the flexibility of The Machinery. It offers options in customizing both the engine and the tooling to create unique game experiences as well as to build custom tools and general applications. This month, as usual, we’ve got a bunch of new features for you to explore.

If you are already running The Machinery, this new release should pop up in your Downloads tab. Otherwise, get it from our beta download page and have a look at this quick introduction video. If you find bugs in this release or have requests for specific features, post them to our issue tracker. For more general discussions, hit us up on GitHub discussions or Discord.

Key highlights in this release are:

As always, we also have a number of smaller updates.

Animation Constraints

We’ve added a Constraint Component to The Machinery. This component can be used to modify animations by repositioning nodes and entities in various ways. For example, a Fabrik IK chain can be used to make a character reach for a certain target.

Using a Fabrik IK chain constraint to position the character’s finger at a specific target position.

Using a Fabrik IK chain constraint to position the character’s finger at a specific target position.

As another example, you can a Verlet chain to run a local physics simulation for the constrained nodes. This can be used to simulate things such as hair braids, clothing items, gear attachments, broken limbs, etc.

Using a Verlet physics constraint to simulate a broken right arm.

Simulating a broken right arm using Verlet physics.

Animation constraints can be connected to the state machine, so that they are enabled only for certain animation states. They can also be scripted using our visual scripted language.

Screen Space Ambient Occlusion

We’ve added a screen space ambient occlusion (SSAO) component implementing“Ground Truth Ambient Occlusion” adapted for The Machinery.

SSAO component visualization.

SSAO component visualization.

The implementation is based on the slides from Practical Real-Time Strategies for Accurate Indirect Occlusion presented at Siggraph 2016.

Entity Context Update Ordering

You can now control the update order of engines and systems in the entity context, using the before_me and after_me fields of tm_engine_system_common_i. These fields can be used to define engines and systems that must be scheduled before or after the system you are registering.

Note that these fields only control scheduling, not parallelism. I.e., you are just saying that the other system should start before you start, not that it needs to finish before you start. Parallelism is controlled, as before, by what components a system reads or writes. There is also an exclusive flag that you can use for components or systems that need exclusive access to the computer when they run.

We’ve added GraphViz visualization support to the system too, so that you can quickly inspect when different systems get scheduled, what runs in parallel and where the synchronization points are. This is what it looks like with The Machinery’s default setup:

Default update order for The Machinery.

Default update order for The Machinery.

The nodes with gray backgrounds are marked as exclusive. As you can see from the picture above, most of the engines run serially because they are all either reading or writing the Transform component, which means they can’t be scheduled simultaneously. Note that this doesn’t mean that we’re running serially, because there is still parallelization within each engine.


  • tm_sprintf_api adds support for printing and logging custom types.
  • tm_os_file_io_api now uses an explicit valid flag in returned structs instead of is_valid() callback functions.
  • tm_os_system_api now has an execute_in_background() function for executing non-blocking processes.
  • A new string type for ranged strings tm_str_t has been added. tm_path_api now uses this to split paths in a more performant and user friendly way.
  • The new __ZIG__ macro can be defined to make headers more compatible with Zig’s @cInclude. This makes it easier to extend The Machinery with plugins written in Zig.
  • We now use the built-in static_assert macro where available.
  • The TM_INHERITS() macro is now used to mark inheritance in structs.
  • Fix for a crash when the size of the asset database exceeds 4GB.


  • Fix for Add Component button in Properties view not working. [#552]
  • Fix for error when selecting the Scale tool in the Scene tab. [#553]
  • It is now possible to copy the value of a subobject and paste its values onto another subobject, if the type matches.
  • It is now possible to jump between subobject items using the tab key and toggle their expanded state using space or enter.
  • Tabs can now be pinned and unpinned by hovering them and pressing F4.
  • There is now a setting for opting out of Google Analytics tracking.
  • The Properties window will now autoscroll when tabbing between control. [#376]
  • You can now use the freeflight camera in the Simulation tab when simulation is paused.
  • You can now compress multiple animations by using multi-select in the Asset Browser.
  • You can now re-import multiple DCC assets by using multi-select in the Asset Browser.
  • You can now create .clips from multiple animations by using multi-select in the Asset Browser.


  • VS2017 support has been removed. We now require either VS2019 or clang.


  • The encode-c-string utility has been removed and been replaced with a webpage encode_c_string.html that live encodes and decodes C strings.
  • Fixed various small bugs and added new supported syntaxes in the Shader Language Extension.


  • Hot-reloading of DLLs is now more stable.


  • When changing the prototype of a graph, we now try to copy over any input values by matching on name and type. This is done using a new aspect called TM_TT_PROP_ASPECT__PROPERTIES__REPROTOTYPE_CALLBACK which lets you define a callback to be run after a prototype change happens.
  • Clicking a node that is overlapped by another one now brings that node to the front.
  • World positions are now available in the INIT graph event. [#486]
  • Graphs no longer get marked as dirty when navigating between parents and subgraphs. [#557]

Creation Graph

  • Inputs now have a name, so that they can be set from code.
  • Added a Construct Transform node for creating a transform matrix from a position, rotation and scale.
  • GPU Simulation nodes previously only supported 1-dimensional vectors and matrices. We now allow the user to specify up to 4 rows, for creating N × M matrices.
  • Lit output node now supports opacity cutoff when ray traced.
  • Fix for broken lighting code in Billboards output node.
  • Input Image Archive now computes the image validity hash from the actual image data rather then using the filename and time stamp.
  • View Vector node now guarantees that the view vector is normalized.
  • Fixed bug in UV Sphere node causing a broken mesh after tweaking its input data.
  • Draw Call node now supports LOD Settings for specifying level of detail culling conditions.
  • dcc-mesh-lod is a new creation graph prototype found in core that shows how to use the new LOD Settings on the Draw Call node to setup a system for doing mesh LOD.
  • dcc-material-opacity is a new creation graph prototype found in core that automatically gets instantiated for imported materials if we detect that they aren’t fully opaque.
  • Added Perlin and Worley noise node.
  • Added a Fractal Brownian motion node.
  • Input evaluation contexts can be defined for shader output nodes.


  • Path tracing debug view is now available if hardware accelerated ray tracing is supported.
  • Color spaces now support build in transfer functions like Vulkan’s sRGB formats.
  • Added function to visualize a render graph using Graphviz format.
  • Improved AMD and Intel driver support .
  • Added near full support for Vulkan formats.
  • Added output_system that deals with color space conversions.
  • Bug fix for broken near- and far plane view frustum culling.
  • Expose shadow extrusion distance for directional lights.
  • Clip geometry to near plane when rendering shadow maps cascades.


  • Better documentation of the tag component. [#507]
  • Capital letters now work in documentation search.

UI Components

  • Implemented UI Elements selection mechanism.
  • UI Elements are draggable now.
  • Keep common properties when switching elements types.
by The Machinery Team