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.
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
after_me fields of
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.
tm_sprintf_apiadds support for printing and logging custom types.
tm_os_file_io_apinow uses an explicit
validflag in returned structs instead of
tm_os_system_apinow has an
execute_in_background()function for executing non-blocking processes.
- A new string type for ranged strings
tm_str_thas been added.
tm_path_apinow 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_assertmacro where available.
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.
encode-c-stringutility 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_CALLBACKwhich 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
INITgraph event. [#486]
- Graphs no longer get marked as dirty when navigating between parents and subgraphs. [#557]
- 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.
Litoutput node now supports opacity cutoff when ray traced.
- Fix for broken lighting code in
Input Image Archivenow computes the image validity hash from the actual image data rather then using the filename and time stamp.
View Vectornode now guarantees that the view vector is normalized.
- Fixed bug in
UV Spherenode causing a broken mesh after tweaking its input data.
Draw Callnode now supports LOD Settings for specifying level of detail culling conditions.
dcc-mesh-lodis a new creation graph prototype found in core that shows how to use the new LOD Settings on the
Draw Callnode to setup a system for doing mesh LOD.
dcc-material-opacityis 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.
output_systemthat 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.
- Implemented UI Elements selection mechanism.
- UI Elements are draggable now.
- Keep common properties when switching elements types.