The Machinery Beta — February 2021 (version 2021.2)

Hope your winter was cozy and warm. Days are starting to get longer and we see spring buds on the branches. To brighten your days, we have a new release coming your way with some improvements we hope you will like.

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 as well as this import and rigging tutorial. 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 the forum or Discord.

Key highlights in this release are:

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

Support for Custom Fonts and Icons

The Machinery now has support for custom fonts and icons.

Custom glyphs and fonts used in the UI sample.

Custom glyphs and fonts used in the UI sample.

You can add your own fonts to the engine by implementing the tm_font_provider_t interface. You can also request specific glyphs from a font to be made available, by implementing the tm_font_request_glyphs_t interface. This can be used for example if you want to write a plugin that implements localization for a language using a special script.

We have switched most of our icons to use the Ionicons font instead of using Unicode glyphs from the default font. This gives the icons a consistent look across platforms, regardless of what font is used for the UI. (Before, the rendering of the icons would depend on exactly how the icon Unicode glyphs were rendered in that particular font.)

tm_ui_button_t and tm_ui_menu_item_t now takes an icon parameter, allowing adding an icon to the display.

We’ve also extended Ionicons with some custom characters for The Machinery, such as icons representing mouse clicking. Our modified font is released under the MIT license and available on GitHub here if you want to use it for your own projects.

Mouse icons in the status bar.

Mouse icons in the status bar.

Import Workflow Improvements

We have added a number of improvements to the import workflow for bringing assets into The Machinery. Each single improvement is small, but together they make the workflow a lot smoother.

Have a look at this video for an introduction to importing and rigging in The Machinery:

Import and rigging tutorial.

We know we still have work to do, to make the import workflow even better. Let us know what issues you are having and we will do our best to address them.

Here is a detailed list of the small changes we’ve made in this release:

  • The DCC Asset will now remember the path from where it was last imported, making reimports easier.

  • A Reimport button has been added to the property panel of the DCC asset.

  • When reimporting DCC assets, any Scene Tree component that references it will have its scene tree rebuilt. This enables us to respect changes to the position and rotation of meshes in the source asset.

  • Meshes in entities rigged from DCC assets now have more unique names, based on the names of the scene tree node and the material of the mesh.

  • When extracting assets (rigging entities, extracting materials and textures) from a DCC asset, we now extract them to the same directory as the DCC asset and no longer create a .resources directory.

  • There is now an option to create a subdirectory based on the name of DCC asset, in which all entities, materials and textures extract will end up. It is still possible to divert the materials and textures using specific Material and Texture override directories.

  • When importing FBX files, the model should now be correctly rotated based on the coordinate system specified in the FBX file. This rotation can be manually changed afterwards.

  • Any unit scaling, for example conversion between centimeter and meter, contained within the source asset should now be respected.

  • The Import Assets button previously found in the DCC asset properties has been renamed to Extract Assets in order to avoid confusing it with File > Import… which imports DCC assets from disk.

  • The option to provide a manual scaling factor has been added, for situations where the source file has incomplete or incorrect unit scaling specified.

  • We have removed the Entity Rigger component, making rigged entities less cluttered. The same functionality is accessible from code in tm_entity_rigger_api.

API Type Safety

We are doing a big review of The Machinery API — improving the documentation, clarifying function names, etc. This is an ongoing project that will take multiple releases to finish.

One thing we want to do, as a part of this work, is to add a bit more type safety to the APIs, to help developers and catch some common bugs. There are a lot of functions in the API that take an uint64_t as an argument, but expect that uint64_t to be a very specific kind of value. To the API user, it is not always clear what kind of uint64_t is expected and it’s easy to make mistakes which will lead to errors.

For example, in The Truth API, both types and hashes of type names were passed as uint64_t and were easy to get mixed up.

To remedy this, we are refactoring these types to struct that wrap an uint64_t. This prevents passing any arbitrary uint64_t or a different wrapper struct:

typedef struct tm_tt_type_t
    uint64_t u64;
} tm_tt_type_t;

We don’t plan to do this for all uses of uint64_t in the engine, only the most used and most easily confused ones — because juggling a lot of different types can also be a mental burden.

This release introduces two new wrapped types: tm_tt_type_t for Truth types and tm_strhash_t for hashed strings. Your existing plugin code will need to be modified to work with these new types.


  • The Entity Tag Component UI has been improved and allows for easy adding and removing of Entity Tags.
  • Fix for horizontal scroll bar hiding the last line of Console output [#478]
  • The back mouse button now goes to the parent directory in the Asset Browser.
  • Any toolbar can now be dropped within the tab, as a floating toolbar. It’s position will be remembered.
  • The Visualize toolbar button has been split into Component and Render to reduce menu nesting.
  • Back and forward mouse buttons can now be used to navigate history in Graph and Scene tabs.
  • When dragging files from the OS to the Asset Browser, they end up in the folder they’re dragged into..
  • Fixed a bug where Zoom to Scope would not work in device memory tab.
  • Fixed a bug where a black screen was shown for one frame after a modal dialog was closed.
  • Project saves are now done asynchronously and a modal is shown during the process.
  • Fixed bug where the Modified Assets Tab wasn’t always refreshed when necessary.

Asset Pipeline / Import

  • Fix for a crash when importing certain FBX files. [#469]
  • Fix for files failing to import if their file extension was capitalized.


  • Subgraph inputs marked as public — i.e. inputs that are exported for editing from the property panel of the graph asset — are now hidden under a collapsible group in the subgraph node.
  • The Graph tab now has back & forward history buttons.

Creation Graph

  • Fixed a bug where publishing a project caused some creation graphs to be stripped of inputs, causing things to not render.
  • When inspecting a Creation Graph asset, any subgraph within it which has public inputs will now have those inputs editable from the property panel of the Creation Graph asset.
  • Material and Image Creation Graphs now have icons in the Asset Browser.
  • Added a new node Ray Trace Instance which creates a ray tracing instance by pairing a GPU Geometry with a Shader Instance. (WIP)
  • Support for closest_hit_shader stage in lit output node. (WIP)
  • Added a new shader node Math Pow.
  • Added a new shader node Normal from Heightmap.
  • The Lit Output node now has an Ambient Occlusion input to support prebaked AO. If connected, it masks the indirect lighting of the scene.
  • User defined structs are now supported in the shader nodes. This is useful for creating more modular shaders, relying on chaining features together declared in subgraphs.
Construct Material Properties and Deconstruct Material Properties use the new struct support when authoring shader nodes.

Construct Material Properties and Deconstruct Material Properties use the new struct support when authoring shader nodes.

Entity Graph

  • Added a Terminate node, which gets triggered when the Graph Component is destroyed.
  • Added a GGN_PARAM_TOOLTIP() macro to specify tooltips for graph connectors.
  • Added P``ower, S``quare R``oot, As``in, Ac``os, and At``an nodes.
  • Added D``egrees to R``adians and R``adians to D``egrees nodes.
  • Graph nodes are now highlighted when they execute in the simulation.
The Set Vec3 Variable node lights up when the ball collides with the west wall.

The Set Vec3 Variable node lights up when the ball collides with the west wall.

Asset labels

  • The asset labels file extension has been renamed to .asset_label .
  • Asset labels can now be created using the context menu in the asset browser.


  • Fixed a crash that could cause project assets to be deleted from directory projects if just the case of the asset name was changed.
  • Asset Plugins are no longer loaded in Safe Mode.
  • When a project with Asset Plugins is opened, the user is asked if she wants to run the asset plugins our not. Running untrusted plugins is not recommended, since they have full access to your computer.
  • Added tm_the_truth_api->create_object_from_hash().



  • Fixed a crash when deleting entities that render meshes.
  • Fixed a startup crash on some AMD GPUs. [#476]
  • Fixed a corruption seen on AMD cards caused by incorrect usage of NonUniformResourceIndex().
  • Added a ray tracing debug visualization mode for validating material system integration. Outputs same result as rasterized but ray traced. (WIP)
  • Added the ability to set light intensity values in Candela, Lux, and Lumen.
  • Added the ability to specify light color in Kelvin.
  • Render Graph: Fixed an issue with persistent resources not getting created unless their resource descriptor was inherited from another resource.
  • The shader system condition language now supports querying is_system_active() to enable/disable specific shader stages.

Entity Tree

  • Fixed a bug where some edits where not recorded correctly in the undo stack. [#449]
  • Fixed a Shift + click selection bug. [#444]
  • The Page Up/Down buttons can now be used to navigate and select elements. [#450]
  • Hiding entities now works as expected with inherited sub-entities. [#415]
  • It is now possible to lock an Entity: it will become unselectable in both the Entity Tree and the Scene Tab.
  • Entity reordering now works as expected with inherited sub-entities.
  • Improved reordering behavior when dragging multiple entities.
  • Improved context menu usability.
  • It is now possible to propagate changes to a single child/component to the parent prototype. [#397]
  • The Add Child Entity submenu in the context menu can now be populated with custom entities. To do it, add asset_label assets to the core/shortcut_labels folder. Any entities tagged with these labels will appear in the Add Child Entity menu.

Project Management

  • The Welcome Tab is now displayed the first time the engine is launched.
  • Publish settings and Application Settings tabs are now correctly restored.
  • Pinned tabs are now correctly restored at startup.
  • Fixed a bug where the last opened project was opened after a new project was created.
  • An empty project is now open in case crash recovery is unable to recover the project and changes are discarded.

2021.2.a Hotfix

  • Fixed issue with Runner not working correctly with DPI scaling on WIndows. [#493]
  • Added missing unit-test.exe from Beta distribution. [#498]
  • Fixed crash when applying forces to a kinematic rigid body. [#494]
  • Fixed issue where dropping a DLL into a new project wouldn’t load it. [#497] [#492]
  • Removed naming requirement for Asset Plugins and misleading log messages. [#483]
  • Fixed crash when editing an ASM blend state without setting the Preview unit. [#495]
  • Fixed Profiler freeze when opening the Save dialog. [#487]
  • Fixed Collaboration freeze when disconnecting from a non-existing server. [#488]
by The Machinery Team