The Machinery — October 2021 (version 2021.10)

Things are getting darker and colder in Seattle and Stockholm, where we have our main offices. What a perfect time to get cozy and cuddle up with some new game engine software. Fortunately, we have a new release for you with some bug fixes and new things to try out. So set your screen to Dark Mode, turn on the lo-fi hip hop, get a warm mug of apple cider, and dig in.

If you are already running The Machinery, this new release should pop up in your Downloads tab. Otherwise, get it from our download page and have a look at this quick introduction video. We are also working on two books about The Machinery. One is an overview of the engine and the other one a collection of tutorials on how to do specific things. Note that both these books are still works in progress.

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:

And as always, we also have a number of smaller updates.

Entity Property System

This release adds a generic Entity Property System to The Machinery. The Entity Property System allows data in the simulated entities to be addressed through Property Paths. For example, you can get the rotation of a character’s head through the property path scene_tree.Head.local.rot.

Of course, you could also just directly lookup the head’s rotation in the Scene Tree Component. What’s special about the Entity Property System is that it lets you treat a lot of data from a lot of different system in a uniform way. This abstraction makes it possible to support higher level actions on that data, such as tweening, looping, or even binding it to a computed expression:

Property animation nodes.

Property animation nodes.

Here are some examples of property animations:

Animating a Scene Tree node.

Binding properties with expressions.

In a future release, we’ll add support for hand-animating properties using animation curves.

Multiplayer (Preview)

The Machinery now has support for multiplayer games through Network Nodes. Each Network Node has its own simulation context and interacts with other nodes on the network to create the final multiplayer experience.

For example, you can define and instantiate a Server node that transmits its Gamestate changes to all the connected Client nodes, so that they can render the world with reasonable accuracy.

Two Clients and a Server running in a single The Machinery Instance.

Two Clients and a Server running in a single The Machinery Instance.

As the Networking layer is still in an active stage of development, we are releasing it in a preview state. We want developers to start experimenting and playing around with Networking even if it’s not in its final form, and keep improving it with the feedback we receive from you. Expect more features (and bug fixes) to come in the following releases.

If you want to know more about the network layer we wrote an introduction post on our goals and the basic concepts involved here.

You can also familiarize yourself with how Multiplayer works in The Machinery by taking a look at the Multiplayer video Tutorial series, here. They are also available to read in the tutorial book.

Graph Comments

Previously graph comments were just labels. Now they have a background rectangle and any nodes that live within in the rectangle will move together with the comment. The comments can be resized by dragging the corners.

What the default DCC Material graph looks with the new type of comments.

What the default DCC Material graph looks with the new type of comments.

Good to know:

  • The comment can be automatically converted into a subgraph from its context menu, the name of the subgraph will be the comment title.
  • If you wish to reposition a comment without dragging the nodes, hold Shift + Alt while dragging the comment.
  • Comments can have a custom background color, but by default they follow the theme.

Community Contributions

  • Thanks to eigenbom for fixing the pre-commit hook for Windows Github Desktop. [#762]
  • Thanks to minirop for fixing a parameter type in the Animation Simple Play node. [#750]
  • Thanks to RiderAlex for fixing collision settings for mover shapes. [#760]
  • Thanks to infosia for fixing an issue where image resources in the samples were not released properly. [#758]


  • Fix for crash when using nil_render_backend with the rendering API.
  • The orthographic camera now zooms instead of translates when scrolling with the mouse.
  • Exposure can now be disabled using the Render menu in viewports.
  • The tonemapper can now be disabled or customized using the color grading component.
  • Prevent per-pixel motion vectors to go to infinity first frame after spawning an entity.
  • Make sure to refresh creation graph output in ci__fill_bounding_volume_buffer() if the the instance hasn’t been initialized.
  • Added engine phases to Atmosperic Sky and Cubemap Capture components to make sure sky is updated before cubemap capture.
  • Fixed bug causing screenshots generated using tm_viewer_api->screenshot() to be outputted upside down.
  • Better behavior when using image output of a creation graph who’s data hasn’t finished loading.

Asset Browser

  • Added a Find References context menu option on assets. It opens up a new tab, the Reference Inspector, that lists all references of the asset in The Truth. It lets the user remap one or all of these references if they so wish. This is a power-user feature.
  • When using Find Asset, the asset browser now scrolls to the found asset and also clears any search text.


  • Added default values to Plane, Box and UV Sphere nodes. Previously the size and tessellation parameters on these nodes were all zero, while the node’s compile functions actually used other defaults.

Asset Pipeline

  • DCC Image nodes now use a buffer hash instead of The Truth object UUID for their validity hash. This avoids for example texture recompression when duplicating images or extracting images from DCC assets.
  • Fix for materials getting dirty due to incorrectly calculated validity hash of shader variables.
  • Added a migration that recreates Preview Entities held within DCC assets. They are recreated if they use images that are otherwise unused in the project. Some DCC assets ended up in this state due to a (previously fixed) bug in the Extract Assets process. This may reduce disk space usage of some projects.
  • Fixed a bug in DCC asset extraction where previously extracted materials and images were not reused properly when a re-extraction was done.

Entity Graph

  • New nodes: Get Creation Graph Instance and Set Creation Graph Input. These can be used from entity graphs to modify active Creation Graph instances on for example render components
  • New node: Screenshot — takes a screenshot and saves it to disk.
  • Tick UI is now triggered as part of the simulation, for better ordering of update steps.
  • Added a String Hash node for hashing strings.
  • Added a Relative To wire to the Entity From Path node allowing you to specify the root of the path.

Graph Editor

  • The snapping enabled/disabled flag is now on a project-level rather than graph level.
  • The snapping grid size is now saved inside the graph’s Truth representation, making it shared between users. This ensures that positioning consistency from snapping is upheld.
  • Removed the disabled color text from graph node connectors when there is no data on the connector, as this mostly looked like the connector was disabled.
  • The If node now has a Continue event that is executed after the Then or Else events, for easier chaining of If nodes.


  • Fix for UI rect supplied to Simulation Entry being wrong when Native Resolution is set in the Simulate tab.
  • Make sure we never register engines with the same name more than once.
  • Only register the Camera Controller Component once.
  • The simulation now checks that the camera entity is alive as it may have been deleted externally.


  • Added a Ragdoll Tab (Preview) to facilitate creating human-like ragdolls from entities with a Scene Tree Component.
  • Added a Ragdoll API with support for human-like ragdolls.


  • Inline grouping for properties has been added. Properties under a certain type will be rendered with a named box around them if the type specifies the aspect TM_TT_ASPECT__PROPERTIES__DRAW_INLINE_GROUPS. This is used to make it clearer which properties belong to what input when editing Creation Graph asset inputs.
  • The values of properties that live on inherited objects can now, in some circumstances, be seen, without having to check the prototype or override the property. This currently only works within the graph editor and on Creation Graph asset inputs. Generalized support will come in the future. The properties are read-only until overridden.

Publish and Runner

  • When publishing a project, the project data is now exported as a .the_machinery_db rather than a serialized Truth dump.
  • Fix for the Runner having an incorrect mouse position y-offset due to the window title not being included in window rect calculation.
  • Fix for the Runner not behaving correctly with images in the entity UI system.

Scene Tab

  • If you freeflight while having a camera selected, the new position and rotation will be saved to the camera’s transform. [#759]
  • Fix for incorrect picking behavior when a user sets a UI resolution scale other then 100%. [#836]

Plugin System

  • Fix for hotreload copies not being cleaned up. [#855]
  • Fix for plugin generation not working when TM_SDK_DIR is not set. [#754]

The Truth

  • Fix for default values overwriting instance properties. [#819]


  • The foundation library now compiles under Emscripten.

Docking System

  • Fixed a bug that sometimes prevented tabs from being dragged.
  • Reduced stack space usage of docking system.
  • Fix for occasional crash in workspace system.

Download Tab

  • Fix for Get button downloading the Windows version on Linux. [#818]

Creation Graphs

  • Fix for a glitch that failed detecting a Creation Graph swap.
  • Fix for incorrectly selecting the diffuse IBL creation graph instead of specular IBL creation graph when using prebaked IBL textures (i.e. not captured using the cubemap capture component).
  • Fix that prevents peeking at dead creation graph instances in tm_creation_graph_api->named_outputs().
  • Introduced a centralized Creation Graph scheduler responsible for managing any background tasks requested by the creation graph nodes when a new graph is loaded. This allows us to throttle the loading phase to guarantee we don’t consume all system- or GPU- resources when doing lots of heavy operations in parallel like recompressing all textures, or publishing a project.
  • Removed _internal postfix for image_nodes.inl and resource_cache.inl to make sure they can be used without source code access.

Entity Tree

  • Prevent duplication of components and the entity root.
  • Fix for a bug in the Entity Tree where the deletion of an Entity and its Parent at the same time wasn’t recorded in the undo stack.

UI Components

  • All UI renderers now use a centralized font library instead of each creating its own.
  • Fix for incorrect mouse positions in UI Components with different Zoom and DPI settings. [#845]
  • Added aspect ratio options to UI Canvas component.
  • Support textures alpha change in UI Rect component.
  • Added support for custom spritesheet creation.


  • The progress bar in the status field now shows the total number of completed tasks when there are multiple tasks in flight. The previous behavior was to cycle between showing progress for the running tasks, which became messy when there were more than a few tasks.
  • Fixed “Can’t create plugins when TM_SDK_DIR is not set.” [#754]
by The Machinery Team