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.
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.
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.
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:
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.
Foundation
tm_sprintf_api
adds support for printing and logging custom types.tm_os_file_io_api
now uses an explicitvalid
flag in returned structs instead ofis_valid()
callback functions.tm_os_system_api
now has anexecute_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.
Editor
- 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.
Build
- VS2017 support has been removed. We now require either VS2019 or clang.
Utilities
- 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.
Plugins
- Hot-reloading of DLLs is now more stable.
Graphs
- 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 theDraw 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.
Rendering
- 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.
Documentation
- 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.