Skip to content
Patch NotesFacepunch Studios26.07.15

s&box 26.07.15 Patch Notes (15th July 2026)

Terrain rendering gets a serious overhaul with culling and shading optimisations that halve benchmark times. Talking NPCs, improved vertex painting, and a brand new docking system round out this week's update.

Nathan Lees10 min read
s&box editor interface showing terrain rendering with culling visualisation and new docking system.
Share:

Terrain rendering just got a proper workover. The culling system now splits the mesh into granular chunks that the camera can actually test against, which means discarding up to 70% of terrain that's off-screen. The shading side saw even more aggressive cuts: texture fetches dropped from 24 down to 1 in the best case, and benchmark rendering time halved. Height blending discrepancies are fixed too, so rocks won't poke through grass like they own the place.

On the creative side, talking NPCs now get subtitles and lip sync baked into sound files, and the new Advanced Docking System replaces the old toolwindowmanager with Qt's proper IDE-style docking. That means pinning, auto-hide, floating groups, and a central scene widget that stops you accidentally nuking your whole layout by closing one dock. Vertex painting in the mapping tools picked up flood fill variants (noise, occlusion, curvature), colour lift improvements, and quick colour picking. Serious Sam HD maps and props are now mountable too.

The full 26.07.15 update also includes demo recording fixes for first-person views, Movie Maker keyframe improvements, and a taskbar jump list for quick project launching.

Full Patch Notes

Buff Nerf Fix Tweak

A new update has been released, you can view the full changes on our blog post.

https://sbox.game/news/update-26-07-15-4d62b783

Talking NPCs

Adds subtitles and lip sync to sound files. This is kind of how HL2 did it, except better.

Open Video

Sound Import Settings

Adds import-time processing options to sound compiles, driven from the sound's `.meta` and applied by the native sound compiler:

  • Force Mono — averages all channels down to one
  • Trim Silence — strips leading/trailing samples below a threshold
  • Normalize Loudness — surfaces the existing (previously unexposed) LUFS normalization, targeting -16 LUFS
  • Gain (dB) — fixed volume adjustment, ±24dB

All are no-ops unless set, so existing content compiles byte-identical. Loop points are resolved after trimming so they land on the timeline the user authors against in the sound editor. Changing a setting saves the `.meta` and force-recompiles the asset (raw vsnds aren't in the game-resource auto-compile path), debounced so slider drags and multi-select edits produce one compile per asset instead of a stale-compile storm.

Height Coverage Masking for Decals

Height Coverage is a new feature for decals that allows using heightmap as an additional visibility mask. It will be available for use as long as your decal has a valid heightmap texture assigned to it. It it controlled by two properties in the decal component:

  • Coverage Amount: generates a height range mask based on current amount, where 1 is fully visible, and 0 is invisible.This setting has a ParticleFloat type, which means that you can take advantage of decal's lifetime settings and use this not only for static effects, but also for animations.
  • Coverage Range: adjusts the smoothness of mask edges, where 0 will be sharp, and 0.5 is smooth.

This is how it looks in action:

Open Video

Keep noted that it works as an additional mask, meaning that it will be applied on top of opacity/attenuation masks on your decal if you have them. While this mask is fully compatible with parallax, it is not necessary to use it all.

For custom shader enthusiasts, I have also updated the documentation for Decals class, and provided new information about reading height coverage settings from byte buffer, decoding them, and applying them.

Terrain Culling

Our terrain clip maps implementation was basic and prevented us from doing more advanced optimization techniques. This week, I went over almost every aspect of our terrain solution so that we can make it faster.

The mesh is now split into more granular chunks that we can test against the camera to perform culling. In most cases, the play is in the middle of the terrain where at least 70% of the terrain isn't in camera view. By discarding all of those chunks, we can get some nice performance improvements.

Open Video

This allows you to push more detail where it matters, in the camera view. The culling is more aggressive in the video to showcase the culling.

Open Video

Terrain Shading Optimizations

Our other big bottleneck was the sheer number of texture fetches.

We added a precompute pass so we can bake data ahead of time instead of recalculating it every frame while shading. We moved to GatherRed where we were sampling neighboring texels and depth passes now do almost 0 work.

In the best case we went from 24 texture taps down to 1, and our benchmark rendering time was halved.

We've also fixed some discrepancies in our height blending. Rocks pocking through grass should now behave accordingly instead of fading.

Open Video

Serious Engine Mount

Serious Engine joins the list of mountable games (purchased and installed), you can play maps and spawn props & characters from games made in this engine.

Open Video

First-Person Demos

Demo recording now properly supports first-person views by capturing properties like render tags and the Absolute flag. Additionally, we fixed a recording bug that could slightly misalign the values captured to separate tracks, leading to view models appearing to vibrate.

Open Video

Movie Keyframe Improvements

Thanks to your feedback, we've got a batch of fixes and quality of life improvements for Movie Maker's keyframe editing mode. This includes fixing the last keyframe sometimes being skipped in compiled movies, saving the selected interpolation mode as a cookie, and adding a way to change the values of multiple keyframes in the context menu.

Open Video

Advanced Docking System

In the editor we have docks, Qt has these built in but they suck, so we used toolwindowmanager, this wasn't bad but had a lot of flaws - now we're using Qt Advanced Docking.

Overall this gives us a much more complete and polished IDE-style docking system which should be much more stable, without us needing to patch the docking system ourselves.

ADS gives us a more capable base for features such as:

  • Central widgets
  • Pinning and auto-hide
  • Focus highlighting
  • Richer tab menus
  • Closing groups of tabs
  • Floating dock groups
  • Better dock locking
  • Minimum-size handling
  • More consistent layout state
  • Future platform-specific fixes

Additionally the API is much simpler for creating and adding your own docks where code used to be duplicated with DockManager.RegisterDockType, that method is now gone.

Central Scene Widget

For a very long time I've wanted to make tools that use a central widget with docks around it, with the advanced docking system we can now do that. The main scene editor already makes use of it so we don't need a dock per scene session.

This saves our asses in a bunch of ways where you could close your scene dock and fuck your whole layout. And if you're mad you can't dock your scene inside your asset browser anymore, too bad.

Mapping Vertex Paint Improvments

Vertex Painting in the mapping tools was lacking some features, so I worked through a list of stuff I wanted and the community wanted.

This includes;

Flood FIll

Open Video

Flood Fill - Noise

Open Video

Flood Fill - Occlusion

Open Video

Flood Fill - Curvature

Open Video

As well as supporting Invert and Clear Paint data.

Also some quick nice time savers too;

Improve Colour Lift

Open Video

Quick Colour Pick

Open Video

Scale Brush Distance

Open Video

Taskbar Jump List

Added this back, if you pin s&box editor to your task bar you can launch projects quickly with this.

Performance metrics blunder

I'm going to bore you with some statistics. We recently started wondering why our individual frame stage timings showed a steady decline over the past months, while our global average frame time stayed relatively stable.

It takes no mathematician to see that something about our metrics tracking was fucked until last week:

Two issues:

1. We were aggregating the data wrong. We used:

FrameTimeAvg = (FrameTimeAvg + FrameTimeNew) / 2.0f

This skews the average heavily toward the most recent timing. For example, say a thousand frames at 16ms have already been aggregated, then a single 100ms frame arrives. The average would jump to 58ms.

To fix this, we now use Welford's algorithm for an accurate rolling average.

2. We included idle time in our global frame time:

Idle time is the time the game spends sleeping between frames when a frame limit is set. That means a client locked at 60 FPS would always report 16.6ms, even when the actual work per frame is much lower. We now track idle time separately, so we can monitor the real time spent computing a frame.

As you can see in the graph, idle takes up a significant chunk of the overall frame time, since most clients run with a fps limit.

TL;DR We've been chipping away at performance in recent months, but improvements weren't really visible in all our metrics. We improvedo the metric tracking and will keep chipping away.

Changelog

🎁 Added

  • The ability to invite friends directly from the friends list.
  • Per-entry clutter controls for shadows, collision and local scale.
  • Sound import options for mono conversion, silence trimming, loudness normalization and gain, with improved live previews.
  • Mounting support for maps and assets from Serious Sam HD: The First Encounter and The Second Encounter.
  • Baked-viseme lipsync through `SkinnedModelRenderer.SpeakSound`, with realtime analysis as a fallback.
  • Height-based coverage masking for decals.
  • Recent projects in the Windows taskbar jump list.
  • Voice subtitles.

🧼 Improved

  • Replaced the editor docking system with Qt Advanced Docking System, improving scene tabs, layouts, splitter proportions, redocking, fullscreen and viewport overlay behavior.
  • Movie Maker can now record and edit tag sets and flag enums, including properties needed for first-person recordings.
  • Expanded vertex painting with flood fill, noise, occlusion, curvature, inversion, colour picking and brush improvements.
  • Extruded mesh faces now inherit UVs from neighbouring faces.
  • Scaling game objects with the gizmo now preserves their visual proportions.
  • Reduced network log noise by respecting debug settings and removing duplicate player-joined messages.
  • Clarified package identifier validation to mention all supported characters.
  • Terrain performance with improved optimization, including culling.
  • Support for multi-drawcall LODs in clutter GPU-driven path.

🪛 Fixed

  • Unpredictable game-setting ordering and incorrect initial dropdown values in the Create Game dialog.
  • Editor popups remaining open after their owner was destroyed.
  • Hammer lights losing shadows and wide spotlights receiving excessive shadow bias.
  • Batched sprites leaking render attributes and causing scene-lighting flicker.
  • Material Editor controls remaining locked after an untitled material was first saved.
  • Blocked `ComImport` in sandboxed addon assemblies to close a remote-code-execution path.
  • Client asset search paths and loading on Linux.
  • Joining clients receiving objects excluded by `INetworkVisible`. Thank you @deadmonstor!
  • Translucent sprites rendering in opaque passes and interacting incorrectly with skyboxes and screen-space shadows.
  • Linux dedicated-server startup failures caused by stale CRLF line endings.
  • A networking exception when snapshotting an object whose parent was being destroyed.
  • `TextEntry` throwing or exceeding `MaxLength` when pasting text.
  • Movie Maker tracks becoming misaligned when recordings began at different times.
  • Publishing local projects, parent-package validation and targeted-addon code inclusion.
  • Dedicated-server play sessions not activating correctly in the editor. Thank you @deadmonstor!
  • Map collision failing to rebuild after compiling in Hammer.
  • Client-owned props being unable to spawn gibs when the owner was not the host. Thank you @deadmonstor!
  • Rotation-gizmo sensitivity changing with camera distance. Thank you @boxrocket6803!
  • MovieMaker keyframe bugs.

Sources

Share:

Stay on top of every update — find all the latest patch notes and gaming news at XP Gained. Join our Discord for live patch note alerts and discussion.

Written by

Nathan Lees

Gaming journalist and founder of XP Gained. Covering patch notes, breaking news, and updates across 160+ games.

Related Posts