We updated the Steamworks SDK to 1.63 and now also ship the latest steamclient binaries.
Why does that matter?
When you launch a dedicated server without a local Steam install, Steamworks falls back to the Steam client binaries we ship. But it turns out we hadn't updated those in 2 years 🥴, meaning dedicated servers without a proper Steam or SteamCMD setup were quietly missing 2 years of Steam updates.
We suspect this was a contributing factor to the "pkt lurch" errors some hosts have been seeing. Newer Steam clients contains a lot Steam networking fixes, so hopefully this helps. From now on, we'll keep the fallback binaries updated, so it doesn't silently drift again.
The audio system got a pretty significant rewrite. The old threading model used locks everywhere and was responsible for a bunch of crashes - the new one is completely lock-free. Each frame we snapshot the audio state and triple buffer it to the mix thread, similar to how render pipelines work. This makes us lock free, which should reduce audio stuttering and help any odd crashes.
We also ripped out the Steam Audio DLL (phonon.dll) entirely. We only used a handful of its effects, so we now compile just those directly into the engine. Building it ourselves means we can use AVX SIMD - which roughly doubles the performance of spatial audio. This also makes it easier for us to ship for Linux.
None of this changes how audio works from a game developer's perspective, but it's a much better foundation for the audio features we want to build next.
A new addition to runtime model building used in mounts is a way to provide data to create morphs. Morphs are used to displace vertex positions and normals, usually for face posing.
public readonly record struct MorphDelta( int VertexIndex, Vector3 PositionDelta, Vector3 NormalDelta );
Mesh.AddMorph( "name", deltas );
Some users kept running into issues where create model from meshes wouldn't create collision by default, leading them to wonder why they had no collision in game. To make this easier, a new dialog opens when creating model from meshes, to let you choose what collision you want on them.
Our custom cursor page needed a revamp, it's now easier to override system cursors and as a bonus you no longer have to add cursor images to resource files list, they get published automatically.
Our in-game performance overlay wasn't cutting it, a lot of information wasn't avaliable and the way it was presented was hardly actionable.I've added:
Levels of verbosity, overlay_frame convar now has 1-3 detail levels.
The layout, grouping, colors, etc. were all redesigned to improve clarity for what you're looking for, or to even flag what you're not looking for.
Not a lot of features this week, mainly bug fixes and community contributions - we need some time to catch up. A weekly release cycle is fast, and we have a lot of pending features we didn't want to merge right before the patch. They'll be avaliable first on the staging branch in order to get properly tested.
Lots to come next week. 👻
26.05.27
26.05.27
27 May 2026
🎁 Added
Runtime mesh morphs API - `Mesh.AddMorph()` lets you add morph targets (position and normal deltas) to meshes at runtime
Mesh to model dialog now shows options for configuring collision when converting meshes
Mirror tool can now be repositioned after placing, similar to the clipping tool
Bounding box snapping - bounding boxes now snap to grid by default
`ResourceWriter.AddExternalReference` for referencing external resources (e.g. materials from model resources)
Model inspector has useful info about meshes
`DragEvent` constructor is now public, allowing custom input systems to forward drag events through the UI pipeline. Thanks @dictateurfou!
Viewport background color is now customizable in editor preferences. Thanks @boxrocket6803!
Cursor page rework in project settings - now shows all system cursors you can override and auto-adds cursor images on upload
🧼 Improved
Audio system refactored with a lock-free triple-buffer threading model, eliminating previous crash-prone locking
Steam Audio effects compiled directly into the engine with AVX SIMD, roughly doubling spatial audio performance and removing the external DLL dependency
Physics queries no longer allocate heap memory for multi-result queries, using thread-local buffers instead
Physics callback virtual dispatch overhead eliminated by using concrete types and caching body type lookups
Rendering performance improved by removing redundant render attribute duplication, unnecessary performance trace scopes, and unused render pipeline stats
LOD clutter screen coverage now calculated per-model instead of per-tile for more consistent results
Media recording now captures at the end of the render pipeline, including overlays
VMDL writer now also saves the PHYS block when exporting models
Physics resource system modernized to use proper resource handling, enabling vphys resource previews
Steamworks SDK and steamclient updated to latest version, which should reduce network packet issues
Default video settings aligned between native and managed - MSAA now defaults to 4x (was 16x native), fullscreen defaults to borderless
Grass rendering looking super dark in places
Player display names now resolved locally, instead of by the host. Thanks @Matt9440!
Compile timeout raised from 60 to 120 seconds for large projects. Thanks @MrBrax!
Props now ignite their gibs when a burning prop breaks. Thanks @Xenthio!
Scene wheel zoom now treated as camera movement. Thanks @TheGWOO!
Dragged decal game objects now assigned proper names. Thanks @wheatleymf!
🪛 Fixed
Fixed morph target names and categorization when importing models
Fixed incorrect FBX morph normals
Fixed managed video settings overwriting CLI flags like `-sw` and `-720` on startup
Fixed shader "Internal Compiler Error" for inline shaders on Linux/Mac caused by wchar_t encoding differences
Fixed Steam Audio not working correctly on Linux
Fixed model scaling in mapping mode
Fixed ESC not cancelling mesh tools
Fixed ragdoll joint rest length using bind pose body positions instead of frame offsets
Fixed scaled physics bones when world transform has scale
Fixed objects wrongly becoming transparent after opaque fade fixes
Fixed chat network messages not registering on non-host clients
Fixed platform settings property getting cut off in the editor
Fixed custom shaders having tinted wireframe
Fixed mouse wheel direction for natural scrolling
Fixed material override not clearing properly when applying model material groups. Thanks @Matt9440!
Fixed Doo visual scripting not showing return assignment when function has no arguments. Thanks @PolEpie!
Fixed viewport flashing on Linux/XWayland by suppressing Qt paint cycle. Thanks @AlexTrebs!
Fixed pointlight shadows breaking when shadow resolution decreases. Thanks @boxrocket6803!
Fixed missing hover styles when dragging items over folders in asset browser. Thanks @Matt9440!