Familiar Territory

Steam Workshop games and Source 1 mounting bring familiar experiences into s&box, alongside big performance improvements, new lighting tools, and achievement-based weekly rewards.

With tonight’s update we’re releasing the first version of Steam Workshop for games. A lot of players missed the familiarity of the steam workshop, with this update we are bringing it back.

Discoverability is still backed by our own workshop, it's a gradual process that we'll give developers time to adjust to. Eventually when we migrate fully to the steam workshop, games, and maps that are not yet published will not be accessible. So we encourage developers to republish.

Feel free to discuss this more on our forums, where we outline any workflow changes for developers trying to publish to the workshop now.

Our weekly item rewards were based on play times and games played. That's in the bin now.

In the new system, every week we choose achievements from games on the platform. If you have unlocked those achievements then you get a reward. If you don't unlock them in the weekly period then you don't get a reward.

I like this system a lot more. It brings people together in a certain game to get the achievement and encourages people to actually play the games instead of just sit in them. Enjoy!
Like Garry's Mod, games you own on Steam can be mounted in game and played with in the Sandbox mode.
And now we can mount Garry's Mod and other Source 1 engine games - the mount system is engine agnostic, we've already got mounts for Goldsrc, Unreal Engine and others, these can be coded by the community too.
I've completely rewritten our SSR to be non-temporal, simpler, sharper and 30% faster. 😎
The new LightModulator component filters direct light through a textured rectangle. It works with point lights, spotlights and sunlight and it affects volumetric fog.

I added this primarily to make a nice solution to add water caustic effects without any great hacks, and it does that quite well:
But this has other purposes that I think people will find over time. Clouds is an obvious one.
I've consolidated our fog components to a new single Fog component. It adds a few more nice to have functions to tweak the look of the fog, like distance based skybox color blurring, and sun coloring.

More importantly, this is refactored so it now works via a PostProcessVolume - so different parts of a map can have different fog settings, and they can be blended between.
Sprite and particle renderers now support normal-map refraction, so they can distort the scene behind them. This provides another option for effects such as heat haze and shockwaves.
Lights now have separate temperature, tint and intensity controls. Temperature uses a Kelvin slider with neutral white at 6500K, while Tint behaves like the previous light colour setting. Existing lights retain their appearance.

All light types can also animate. There are twelve built-in patterns, including the classic Quake and Half-Life styles, plus custom looping intensity curves and colour gradients. Speed, duration and time offsets let you coordinate lights or keep their flickering out of sync. The animation previews in the editor and can be recorded in movies.
Servers and lobbies can now require a password, set through the classic sv_password or with LobbyConfig.Password. This is in addition to lobbies having friends only or private invite only modes.

We have added two more feminine heads and another masculine head to the human models. The avatar menu also groups the skin thumbnails into feminine and masculine options.

This is the initial release of these heads, with further adjustments to both new and existing options planned.

A big limitation we had blocking improving our shaders, rendering features and performance was how scared we were to break existing UGC.

Games and maps could use their own custom shaders and anything we changed had to be very meticulous in order to prevent custom shaders breaking or crashing. The only way to fix them would then be requiring the creators to update and republish their work for the new version.

We now do two things:
  • When a breaking shader change is pushed and the shader version is increased, the backend recompiles and serves new shaders in place of the old ones.
  • If we can't find it on the backend yet or you're offline, we'll update the shader locally so it continues working, this can take a few seconds to a minute depending on the shader complexity, they'll be cached to disk.
We can now make more drastic changes to the renderer without worrying about the fragility of breaking UGC 💪
A bonus of doing the above is games can now procedurally create shaders at runtime outside of the editor with the Shader.CompileAsync API. Which unlocks some fun sandboxy stuff at runtime like this shadertoy demo.
We've always been fixing crashes, but lately new ones were showing up faster than we could fix them. Some went unnoticed for too long because they were buried among the older ones.

So we improved our crash reporting and filtering, and crash reports now collect more data. New crashes stand out as soon as a release goes out, which lets us act on it much sooner.
The dozens of overlays we had locked behind convars are now in a single consolidated place called dev tools.

F11 now opens a dock at the bottom of the game, with an option to pop it out into a separate window, the editor also has a dock for it too.

Alongside CPU, GPU, memory and rendering information, it brings together the console, network traffic and UI inspection. You can inspect synchronized-variable traffic, peers and bandwidth, or drill into frame timings without switching between separate overlays.
We've added CMAA2 as an anti aliasing graphics setting, which is also used in CS2. This is a good compromise between performance and quality from MSAA whilst still being non temporal.
We also never default to 8x MSAA anymore, and have adjusted the quality presets.
I've added GPU occlusion culling, which means skipping drawing objects behind other objects that you can't see.

You're probably thinking "that wasn't already a thing?", no it wasn't, obviously we had frustum culling but occlusion culling is a tricky problem to get right, but we've landed on a great solution that works in most scenarios.
On Construct this leads to a 15-20% FPS improvement in areas with a lot of occluded geometry. Some games might get larger or smaller varying results.

Occlusion culling is on by default, if you want to compare or debug it there are these convars:
  • r_occlusion_culling - toggle skipping objets hidden by the occlusion
  • r_occlusion_debug - draws occlusion culling boxes
  • r_occlusion_freeze - freezes the culling to the current camera position

Our shadows had a horrible hard transition between cascades - so I've made it so that the transition is feathered.
There's no performance cost to this, it's implemented as efficiently as possible.


We rewrote part of our clustered sorting and shader traversal so lights, envmaps and decals share work across pixels, biggest gains on AMD.

Light culling on Steam Deck fell from ~4 ms to 0.1–0.16 ms; on RX 580 forward pass was 36–52% faster in many-light tests, these are measurements of specific rendering work in test scenes, rather than a promise of the same improvement to every game.
Clustered API is also simpler for custom shadingmodels: use ClusterForEach() for most optimized access to any Light, Envmap or Decal in a cluster.
We cut down on rendering work that doesn't contribute anything to the final image.
In most games that should translate to slightly higher framerates and lower memory use.
  • Cameras that don't use post-processing no longer render buffers nobody reads.
  • Colour adjustments, colour grading and chromatic aberration are skipped when their settings don't change the image.
  • Ambient occlusion and contact shadows also got cheaper with MSAA off.


We have continued cutting work from the startup path. Type-library preparation and the resource database scan now begin earlier, overlapping other startup work instead of making the menu wait for them.

Our average startup comparison (on my machine) went from 16.31 seconds to 10.16 seconds to launch into the menu.

We went through the entire networking stack and cleaned up a lot of allocations and redundant work.

Now our networking hot paths are now essentially allocation free and the reduced redundant work frees up some frame time.
About 30% of the assets published in the Top 50 Games are actually unused.
Making users download files their game never uses is obviously a waste. 

We made it easier to only publish with the assets that are actually used in your game, so you can stop shipping dev assets and unreleased content.  

Read more about this feature here

In order not to break existing projects this option is only on for new projects, for existing games you will have to enable it manually in the project settings.

We really encourage you to enable and use it to optimize your game for size.
We're are now keeping transform buffers within cache lines and removed unnecessary locks during transform slot allocation.

This means drawing a lot of objects on the screen is now a bit faster.

Community Contribution by Deadmonstor


Networked objects were doing work every tick even when they had nothing new to send. Each update captured, hashed and compared them again, so large scenes full of idle props were paying for state that never changed.

Deadmonstor kindly contributed an automatic network dormancy system, inspired by Unreal Engine. Networked object can now go to to sleep and skip the per-tick snapshot work.

On the community_bowling  map with 563 networked objects and 32 peers sitting idle, network time per tick dropped from 0.47 ms to 0.09 ms (-81%).

This was a big update. We tried to stick to the highlights for the blog, the changelog below has the full list of changes with a massive amount of crash fixes, bug fixes and performance updates. A lot of great work from the team and our community contributors. 💖

A lot of our work has been making s&box feel more familiar. Steam Workshop, Source 1 mounts and the Sandbox game all feed into that. We want people to be able to jump in, find things they recognise and know what to do.

I know the Steam Workshop move is controversial among our developers, but it's also something players have consistently asked for and we need to strike a balance between what's convenient for developers and what is appealing for players. Neither side can work without the other.

The tooling around performance and stability is well established now, our crash rate is below 1%, the dev tools make it much easier to diagnose performance problems and the shader compatibility removes a huge roadblock for improvements. I feel like we're still sometimes chasing our tails making benchmarks faster rather than making the games and maps people actually play run better on the hardware people actually use. But we're making progress.

Lots more to come still, so please keep with us. 🤝

26.10.27

26.10.27
27 October 2026
Areas
250 changes in this update

Added

35 changes
Rendering & Shaders
  • CMAA2 - added post-process anti-aliasing, with optional combined MSAA, alongside clearer anti-aliasing/upscaler controlsPR #6155 by @xezno

  • Light modulators - filter point lights, spotlights and sunlight through textured rectangles or infinite planes, affecting surfaces and volumetric fogPR #6193 by @garrynewman

  • Light modulation effects - added scroll, caustics, cloud shadows, rotation, kaleidoscope, chromatic split, ripple and pulse effects, with world-sized UVs and appearance controlsPR #6193 by @garrynewman

  • Fog - added independent distance and height layers, fixed or sky-derived colours, camera targeting and post-process volume blendingPR #6185 by @garrynewman

  • Sprite refraction - added normal-map refraction to SpriteRenderer and ParticleSpriteRendererPR #6190 by @garrynewman

  • Camera depth targets - render camera and command-list views into caller-owned depth textures; view/reflection/refraction draws return ViewHandle projection, viewport and depth metadataPR #6154 by @garrynewman

  • Render-pass dependencies - added declared resource inputs/outputs and async-compute scheduling for independent GPU passes; managed overlap is automatic when supported, native SSR/GTAO overlap is opt-inPR #6071 by @antopilo

  • Depth/normals requests - custom material consumers can request the prepass output through NeedsDepthNormalsPR #6166 by @antopilo

  • GPU memory warning - warn when GPU memory exceeds its budgetPR #6151 by @antopilo

Content Mounting
  • Source 1 mounting - ship engine support for Source 1 models, ragdolls, materials, textures, decals, sounds and surfacesPR #6114 by @aylaylay

  • Imported lighting - allow mounts to supply ambient probe textures, constant/linear light attenuation, baked-light indices, mixed shadows and static shadow-caster settingsPR #6159 by @aylaylay

Gameplay & Effects
  • Impact splatters - surfaces can specify decals projected behind weapon impacts, with flesh blood splatters configured initiallyPR #6219 by @wheatleymf

  • Decal fade-in - added height-coverage fade-in for impact decalsPR #6219 by @wheatleymf

  • Water exit - help swimming players climb reachable edges and prioritize ladders over swimmingPR #6148 by @garrynewman

  • Dry-fire animation - weapons now set a dry-fire animation parameterPR #6200 by @solwllms

Editor & Diagnostics
  • Range sliders - added min-max slider support for Vector2 properties and refreshed inspector group headersPR #6185 by @garrynewman

  • Network simulation - added repeatable host/client simulations with latency and packet loss, performance measurements and message-ordering testsPR #6176 by @lolleko

Networking
  • Password-protected games - add sv_password, LobbyConfig.Password, setup/password prompts, protected-server indicators and host-migration support; quickplay skips protected gamesPR #6248 by @handsomematt

Rendering & Gameplay
  • Runtime shader compilation - add Shader.CompileAsync and Shader.CompileFileAsync outside the editor, including dedicated servers, with local-project hotloadingPR #6246 by @handsomematt

  • Explosion scorch marks - exploding props place a networked scorch effect on nearby groundPR #6201 by @solwllms

Creator Tools
  • Chart skill - ship an AI skill for producing consistently styled chart imagesPR #6252 by @xezno

  • Network collection warning - recommend NetList/NetDictionary for synchronized ordinary collections that require per-tick pollingPR #6249 by @lolleko

Developer Tools
  • F11 Dev Tools - expand the performance hub into a dockable console, frame/CPU/GPU/memory/rendering, network and UI inspection toolkitPR #6272 by @handsomematt

Rendering & Characters
  • GPU occlusion culling - add two-phase GPU visibility tests for opaque meshes in native and managed renderingPR #6217 by @xezno

  • Aggregate occlusion - cull individual aggregate fragments, with bounds/depth visualization, freeze controls and expanded statisticsPR #6263 by @xezno

  • Human heads - add female heads 03/04 and male head 06, with grouped avatar skin thumbnailsPR #6164 by @danduwfp

Networking & Gameplay
  • Network dormancy - remove acknowledged unchanged objects from per-tick snapshot work and wake them automatically on relevant changesPR #6271 by @deadmonstor, @lolleko

  • Jump boost - optional, default-off sprint-jump momentum setting on PlayerControllerPR #6171 by @carsonkompon

  • Weapon hit force - add virtual BaseCombatWeapon.GetHitForce for game-specific force rules such as prop protectionPR #6296 by @wheatleymf

Creator APIs & Tools
  • Painter filtering - expose texture filter mode, including point filtering for pixel artPR #6304 by @handsomematt

  • Asset browser folders - support renaming/deleting sidebar folders with protected roots and Windows Recycle Bin deletionPR #6371 by @handsomematt

Lighting & Creator APIs
  • Light colour controls - add Kelvin temperature and separate intensity, rename Light Color to Tint and preserve existing light appearancePR #6387 by @garrynewman

  • Light animation - add twelve built-in patterns plus custom looping intensity curves/colour gradients, speed/time offsets, editor previews and movie recordingPR #6387 by @garrynewman

  • Gradient sliders - add reusable SliderGradientAttribute and full gradient tracks for temperature/intensity controlsPR #6387 by @garrynewman

  • External web links - add Game.Overlay.OpenUrl with player confirmation and HTTP/HTTPS links opening in the system browserPR #6275 by @handsomematt

Improved

73 changes
Rendering & Shaders
  • Clustered lighting - rewrote light culling and made light, environment-map and decal loops share uniform data loads across shader wavesPR #6057 by @sampavlovic

  • Screen-space reflections - replaced temporal-amortized tracing with per-frame Hi-Z cone tracing and roughness-aware GGX filtering; removed the old AMD reflection denoiserPR #5873 by @sampavlovic

  • Quality presets - cap SSR at half resolution and reduce the cost of higher volumetric fog presetsPR #6147 by @sampavlovic

  • Anti-aliasing presets - Low/Medium use CMAA2, High/Ultra use 4x MSAA, and no preset uses 8x MSAA; render scale works with off, MSAA and CMAA2PR #6155 by @xezno

  • Depth prepass - skip unused normals/roughness output for cameras without post-FX or custom command listsPR #6166 by @antopilo

  • Neutral post-FX - skip unchanged colour adjustments, disabled grading/curves and zero-offset chromatic aberrationPR #6166 by @antopilo

  • Non-MSAA mask sampling - read full-resolution AO and contact-shadow masks directly instead of performing unnecessary depth-matched gathersPR #6079 by @antopilo

  • GPU profiling - skip timestamp queries for discarded layers that have no resolve workPR #6195 by @antopilo

  • Light cookies - use more appropriate compression and colour-space settings for core cookie texturesPR #6205 by @wheatleymf

Networking
  • Serialization - serialize value types without boxing and use typed RPCs without temporary object arraysPR #6176 by @lolleko

  • Packet handling - pool packets, encode multicast messages once and reduce per-tick send/receive allocationsPR #6176 by @lolleko

  • Delta snapshots - pack clusters by encoded size so each fits a single Steam packetPR #6176 by @lolleko

Startup & Packages
  • Startup - remove the old Vulkan splash-rendering path and continue reducing startup waitsPR #6125 by @xezno

  • Startup preparation - prepare type libraries and scan the resource database earlier, overlap work and retain the software splash until rendering is readyPR #6150 by @xezno

  • Startup telemetry - record time to startup window and menu initializationPR #6150 by @xezno

  • Package code - request backend-compiled DLLs for the current engine version, cache successful responses and fall back to local code archives when available72ed059 by @handsomematt

Physics & Movement
  • Sleeping props - skip per-step managed work for sleeping rigidbodies and avoid joint-scale updates when scale is unchangedPR #6214 by @lolleko

  • Transforms - avoid change-callback setup for transforms without listenersPR #6214 by @lolleko

  • Prop creation/deletion - remove redundant broadphase updates, reparenting and repeated mass rebuilding when spawning or destroying physics bodiesPR #6216 by @lolleko

  • Scrape sounds - evaluate scraping for active bodies rather than iterating every physics bodyPR #6130 by @aylaylay

  • Player controller - update Box3D and rework step clearance, landings, uneven terrain, platform motion, dynamic supports and surface frictionPR #6181 by @aylaylay

  • Ladders - improve tilted-ladder movement, attachment handling, jumping off and transitions back to walkingPR #6181 by @aylaylay

Editor & Workshop
  • Workshop publishing - select an existing item from a matching-type dropdown instead of entering its ID manuallyPR #6132 by @devultj

  • Workshop downloads - record download timing breakdowns for comparison with backend downloadsPR #6157 by @devultj

  • Probe debugging - show imported probe centres and stored lighting, with sphere/cube views and corrected visibility/depth handlingPR #6159 by @aylaylay

  • Mouse documentation - clarify input modes, cursor sensitivity, custom cursors and UI cursor overridesPR #6172 by @ryleigh

Stability & Diagnostics
  • Shader lookup tables - force constant-index lookup resolution in affected shaders, avoiding local-memory GPU faults seen on NVIDIAPR #6189 by @lolleko, @clemixo

  • GPU crash reports - wait for Aftermath dumps, attach device-fault data and record the crashing thread, Vulkan call and shaderPR #6163 by @lolleko

  • VRAM crash diagnostics - include more detail for video-memory allocation failuresPR #6222 by @lolleko

  • KV3 saves - size binary save buffers up front to reduce allocation pressurePR #6139 by @lolleko

  • Mac development build - update KosmicKrisp, reduce memory use, disable problematic GPU profiler timers and fix splash-screen hangsPR #6199 by @sampavlovic

Engine Development
  • Managed builds - make code generation incremental, preserve unchanged outputs and avoid redundant generator/cache buildsPR #6128 by @handsomematt

  • Native builds - improve precompiled-header coverage, batch Qt moc output, parallelize dependency downloads and remove redundant editor buildsPR #6145 by @handsomematt

  • Tests - run projects concurrently, split integration work, share expensive setup and remove unnecessary fixed waitsPR #6129 by @handsomematt

  • CI - simplify build/test steps, improve logs and job summaries, and make zero-allocation checks more resilientPR #6160 by @handsomematt

  • Shader builds - seed compiled shaders from published artifacts to avoid rebuilding unchanged outputsPR #6122 by @handsomematt

  • Build uploads - parallelize artifact packaging/uploads and add a minimal compile-only archive2ecf079 by @handsomematt

  • Sentry uploads - retry API failures and allow CI to continue after persistent upload failures2af6ead by @handsomematt

Shaders & Publishing
  • Shader upgrades - recompile incompatible package shaders at install time and cache the results alongside backend shader upgradesPR #6254 by @handsomematt

  • Shader loading progress - show updating-shader progress and include preprocessor/parser errors in compiler outputPR #6259 by @handsomematt

  • Publish verification - request backend compilation during editor publishing, display compiling status and report compiler errorsPR #6239 by @handsomematt

  • Package DLL lookup - fetch engine-version DLLs from the backend rather than the package manifest, with code-archive fallbackPR #6239 by @handsomematt

Rendering & Physics
  • Descriptor batching - submit cubemap faces together, generate morph atlases in the caller setup context and skip empty-batch descriptor rotationPR #6245 by @lolleko

  • Descriptor diagnostics - report initial ring growth and subsequent growth every ten setsPR #6231 by @lolleko

  • Contact recycling - enable physics contact recycling for stacked bodies while keeping player-controller contacts freshPR #6230 by @aylaylay

  • GPU crash context - distinguish core/game shader crashes and attach recently bound shaders and textures as diagnostic contextPR #6256 by @lolleko

  • Fast transforms - use cache-line-aware transform storage, atomic slot allocation and opaque rigid-model instancingPR #6265 by @sampavlovic

  • Shadow cascades - feather between adjacent sun cascades over their outer 10%PR #6269 by @xezno

  • Physics creation - initialize 2D/3D bodies and shapes with final creation settings instead of changing them afterwardPR #6273 by @aylaylay

  • Native physics - consolidate the implementation and collision building; fix surface-property leaks and authored Hammer material handlingPR #6283 by @aylaylay

  • Light probes - allow materials to opt out of probes and remove probe debug objects when volumes are deletedPR #6251 by @aylaylay

  • Polygon mesh memory - release temporary render vertices after building and defer paint caches until first usePR #6281 by @handsomematt

  • Editor allocations - cache toolbar/tool/selection state and avoid repeated per-frame gizmo delegatesPR #6329 by @handsomematt

  • Scope allocations - use internal struct scopes in per-frame Gizmo, Scene, networking and Paint paths without changing public signaturesPR #6286 by @handsomematt

  • Object traversal - use a single descendant snapshot for GetAllObjectsPR #6382 by @deadmonstor

Startup & Resources
  • Resource rescans - fingerprint .meta and compiled files and skip unchanged files instead of reopening/reparsing themPR #6227 by @solwllms

  • Splash scaling - improve logo and progress scaling for smaller displays, including Steam DeckPR #6255 by @xezno

  • Steam runtime - update bundled Steam client libraries to the October 2026 versionsPR #5967 by @github-actions

Publishing & Resources
  • Selective asset publishing - follow configured scenes, settings, Resources folders and explicit rules; default on for new games and opt-in for existing projectsPR #6072 by @lolleko

  • Publish review - improve asset previews and rule controls and avoid implicitly including source files for compiled assetsPR #6363 by @lolleko

  • Metadata cache - reuse parsed .meta files until their timestamp or size changesPR #6324 by @handsomematt

  • GUID persistence - read native GUID data once and only write newly generated or changed GUIDsPR #6228 by @solwllms

  • Shader checks - share include reads within each shader MD5 check and remove redundant filesystem existence checksPR #6285 by @handsomematt

Networking & Menu
  • ModelPhysics networking - use change-tracked NetList body/joint collections and automatically upgrade legacy List-dependent codePR #6258 by @lolleko

  • Discover shelves - give featured games another row, use square Continue Playing thumbnails and delay hover previewsPR #6381 by @lolleko

  • Party invites - automatically create a party when inviting a friendPR #6381 by @lolleko

  • Loading updates - show a newer changelist when it is more recent than the latest news postPR #6303 by @handsomematt

Diagnostics & Engine Development
  • Crash diagnostics - add command-buffer/query lifetime checks and report driver memory budgets plus raw pools on Vulkan allocation failuresPR #6392 by @lolleko

  • Public sync - parallelize LFS pointer reads, reuse artifact hashes and skip already-published artifactsPR #6267 by @handsomematt

  • KV3 memory - pre-size owned binary save buffersPR #6262 by @lolleko

Rewards & Graphics
  • Achievement rewards - show weekly achievement objectives, progress and links to their games in the rewards menu, replacing playtime/game-count goalsPR #6390 by @garrynewman

  • Light inspector - organize colour, influence, beam, shadows, fog and animation controls; allow manually entered values beyond slider limitsPR #6387 by @garrynewman

  • Shader compile parallelism - restore one shader-combination worker per core instead of capping by free memory; ShaderCompiler -j remains availablePR #6397 by @handsomematt

Fixed

133 changes
Rendering & GPU Stability
  • Morph compositing - update bindless data before submitting new morph textures and retain textures while used, fixing GPU crashes during character/clothing changesPR #6191 by @sampavlovic

  • Bindless descriptors - reuse only GPU-finished descriptor sets and grow the ring when necessary instead of overwriting in-flight setsPR #6143 by @lolleko

  • Screenshot targets - key pooled render targets by the sample count actually used, fixing screenshot GPU faults and editor hangs with highlightsPR #6133 by @ryleigh

  • Resource lifetimes - fix stale UI material state and mesh override registrations when materials/meshes reloadPR #6135 by @lolleko

  • Environment-map baking - fix GPU crashes with the Quality filter, including RTX 50-series reportsPR #6189 by @lolleko, @clemixo

  • UI shader bounds - clamp gradient-stop and scissor-clip countsPR #6189 by @lolleko

  • 3D skybox meshes - retain scene blob data until deferred deserialization completes so mesh components keep their geometryPR #6212 by @aylaylay

  • 3D skybox lifetime - avoid calling into a deleted parent worldPR #6138 by @lolleko

  • Subview lighting - stop reflection/refraction views sampling the main camera's AO and SSRPR #6162 by @garrynewman

  • Sun shadows - fix speckling and cascade shimmer far from the world originPR #6202 by @polepie

  • Depth of field - handle zero-normal surfaces without producing invalid pixels that spread through bloomPR #6192 by @wheatleymf

  • Texture clears - correct clears affecting screen-space shadows on skyboxes/translucency and subsurface renderingPR #6101 by @sampavlovic

  • Highlights - handle model backfaces correctly to prevent excessive glow on hollow propsPR #6203 by @wheatleymf

  • Reflections - fix near-camera tracing, self-intersections, dark fringing and overbright values contaminating SSRPR #5873 by @sampavlovic

  • Cluster shading - preserve backface transmission, correct overlapping cloth envmap blur and decal mip selection, and bound cluster readsPR #6057 by @sampavlovic

  • Volumetric fog - fix sampling without environment probesPR #6193 by @garrynewman

  • Light modulators - fix stale candidates after small rotations and reversed baked-sun rays applying the filter on the wrong side of a planePR #6193 by @garrynewman

  • Moving text - use interpolated world positions for text renderersPR #6146 by @wheatleymf

Physics & Gameplay
  • Ragdoll joints - map joints to bodies by physics part so skipped parts do not shift the connectionsPR #6215 by @lolleko

  • Joint validation - normalize joint frames and allow joints whose ends reference the same body without throwingPR #6215 by @lolleko

  • Prop gibs - inherit overridden material and surface from the broken propPR #6187 by @wheatleymf

  • Ragdoll skins - include attribute-based material overrides when copying model renderersPR #6165 by @solwllms

  • Explosion damage - correct occlusion trace tags so props can block explosions, ignore the originating weapon and carry weapon attributionPR #6197 by @solwllms

  • Seated players - forward explosion damage from chairs to their occupantsPR #6188 by @solwllms

Audio & UI
  • Sound hotloading - fix an Opus decoder overrun when reloading an in-use soundPR #6134 by @lolleko

  • Sound boxes - update bounds with WorldPosition so sounds follow their objectsPR #6180 by @solwllms

  • Panel ticking - snapshot children to handle deletion or reparenting during tick without an out-of-range exceptionPR #6175 by @solwllms

Editor & Resources
  • Viewport cursor - restore cursor locking after opening panel windowsPR #6223 by @devultj

  • Hammer lighting - skip unbaked probes instead of showing a black All Lighting viewPR #6221 by @devultj

  • Hammer tint - preserve tint on compiled aggregate fragmentsPR #6126 by @devultj

  • Bounds debugging - fix scene-object bounds flickeringPR #6131 by @aylaylay

  • DDGI debugging - restore LPV debug support for DDGI volumesPR #6196 by @sampavlovic

  • Resource compilation - keep native-sensitive resource work on the main thread while moving suitable texture work to workersPR #6152 by @garrynewman

  • SVG hotloading - snapshot SVG textures before reloading themPR #6141 by @lolleko

  • Removed resources - remove deleted assets from the recent-assets working setPR #6142 by @lolleko

  • Bitmap disposal - fix warnings/errors when compiling projects in Visual StudioPR #6161 by @garrynewman

Workshop & Mounting
  • Workshop images - stop uploading the first frame of sbox.game videos as item imagesPR #6132 by @devultj

  • Workshop downloads - fix a stall loop when a download fails partway throughPR #6157 by @devultj

  • Source materials - parse dx90_20b shader variants to restore missing mounted materialsPR #6158 by @aylaylay

  • Garry's Mod addons - fix GMA discovery and loose addon material resolutionPR #6168 by @aylaylay

Linux
Rendering
  • SSR editor crashes - propagate the main camera depth/normals requirement to the editor camera, guard missing roughness input, size indirect tracing storage per view and fix non-MSAA normal samplingPR #6229 by @sampavlovic

  • Shader compatibility - restore DoAtmospherics as an obsolete wrapper over Fog::Apply and Fog::TransmittancePR #6236 by @handsomematt

  • Nested skyboxes - validate skybox content before enabling it and reject nested Skybox3D scenes before their callbacks runPR #6226 by @aylaylay

Networking & Tools
  • Connection retries - do not silently abort retrying on temporary Server closed responses during map-change/rejoin flows; report final failure after retriesPR #6242 by @solwllms

  • Standalone engine path - exported games no longer overwrite the user-level FACEPUNCH_ENGINE environment variablePR #6233 by @metapyziks

  • Retail solution generation - stop native error-reporting workers before unloading DLLs to avoid exit crashes with -generatesolutionPR #6238 by @handsomematt

Networking & Loading
  • Fixed-update jitter - transmit the position the owner displays at send time so snapshot positions and timestamps matchPR #6264 by @lolleko

  • Dormancy wakeup - wake objects before snapshots and transmit changes are processedPR #6271 by @lolleko

  • Networked meshes - retain blob data through deserialization during NetworkSpawn and descendant refreshPR #6279 by @handsomematt

  • Dedicated-server identity - provide the server Steam ID through the handshake instead of returning zero from Connection.SteamIdPR #6353 by @handsomematt

  • Dedicated-server resources - finish installing referenced and nested package resources before startupPR #6362 by @handsomematt

  • Package loading - load DLLs in dependency order and use the correct menu context for console overlay loggingPR #6276 by @handsomematt

  • Cross-branch publishing - prevent different Steam branches interfering with package publishingc4a13c1 by @handsomematt

  • Publish whitelist - block publishing with Disable Whitelist enabled and explain the restriction instead of showing false successPR #6297 by @handsomematt

  • Party rejoin - skip reconnecting to the leader when already in the same gamePR #6288 by @handsomematt

  • Website Play links - handle Steam relaunch callbacks when s&box is already runningPR #6323 by @handsomematt

  • Launch metadata - fetch complete package details so dedicated-server-only games open the server listPR #6322 by @handsomematt

  • Integrated GPU detection - use Vulkan device type rather than adapter-name heuristics for presetsPR #6270 by @lolleko

  • Window overrides - preserve -sw/-w/-h while applying first-run graphics presetsPR #6292 by @handsomematt

  • Startup failure - retain the original error instead of masking it with Function Pointer Is Null during shutdownPR #6334 by @handsomematt

Rendering & Lighting
  • Painter binary compatibility - restore the original Painter.Texture signature so already-published code keeps loadingPR #6393 by @solwllms

  • Foliage edges - calculate alpha-to-coverage derivatives before clipping to avoid clear-colour fringesPR #6282 by @handsomematt

  • SSR normals - avoid bindless lookup for screen-space reflection normal readsPR #6383 by @sampavlovic

  • Vulkan startup - retry without DLSS extensions after device-creation failure and add -vulkan_disable_dlssPR #6294 by @handsomematt

  • Material hotloading - preserve textures and constants on Material.Create materials through shader reloadsPR #6308 by @handsomematt

  • DDGI residency - request full detail for active volume textures so streaming retains or reloads themPR #6340 by @handsomematt

  • Atmospheric sky - cap density exponents so invalid sky pixels do not contaminate indirect-light bakesPR #6344 by @handsomematt

  • Volumetric fog - avoid pow(0,0) corruption on AMD with zero falloff exponentPR #6314 by @handsomematt

  • Bake exclusions - exclude Hide In Game meshes, mapping face highlights, viewmodels and overlays from relevant cube/lighting capturesPR #6359PR #6347PR #6378 by @handsomematt

  • Screenshots - convert BGRA readbacks correctly so red and blue channels are not swappedPR #6354 by @handsomematt

  • Texture mip views - guard missing mip views and clear stale bindings from dynamic parametersPR #6260 by @lolleko

  • Render callback exceptions - catch managed failures in render-layer callbacksPR #6262 by @lolleko

  • Render reentrancy - prevent overlapping Hammer view rendering and mid-frame panel-window drawsPR #6262PR #6392 by @lolleko

  • GPU query lifetime - keep destroyed queries alive until queued EndQuery signals completePR #6392 by @lolleko

  • Texture readback - reject nonresident mip readbacksPR #6384 by @lolleko

  • Ray-tracing test memory - free render-mesh BLAS after GPU work completesPR #6367 by @handsomematt

  • Shader diagnostics - handle EOF, unterminated sections, empty source files and long Slang errors without crashingPR #6262PR #6384 by @lolleko

  • Slang warnings - declare subgroup capabilities and uniform cluster indices; expose RW helpers to IntelliSensePR #6376PR #6333 by @handsomematt

  • GoldSrc cutouts - only treat palette index 255 as transparent on masked textures and preserve alpha-test depth/shadowsPR #6302 by @handsomematt

UI & Input
  • WorldPanel effects - stop layer composites applying object transforms twicePR #6313 by @handsomematt

  • Text effects - retain stroke/shadow colours with background-clip:textPR #6300 by @handsomematt

  • Backdrop filters - clip filters to the resolved circle/polygon border shapePR #6307 by @handsomematt

  • Virtualized cells - refresh VirtualGrid/VirtualList content and styling when the parent rebuildsPR #6352 by @handsomematt

  • Refocus clicks - synchronize cursor coordinates before dispatching mouse button eventsPR #6293 by @handsomematt

  • Fractional DPI - fix Application.HoveredWidget hit testing through mouse-transparent overlaysPR #6365 by @handsomematt

  • Clipboard shortcuts - block Insert/Delete clipboard combinations on limited WebSurfacesPR #6306 by @handsomematt

  • Panel Gallery input - insert typed/pasted text at the caret rather than in reversePR #6319 by @handsomematt

  • Shopping cart - preserve items added during checkout and use the purchased snapshot for confirmationPR #6339 by @handsomematt

Audio & Video
  • Audio filters - replace incorrect low/high-pass behavior with Hz-based biquad filters and resonance, migrating saved cutoff valuesPR #6266 by @lolleko

  • Sample downmix - average all source channels instead of summing stereo into clippingPR #6380 by @handsomematt

  • Soundscapes - use AudioListener position when available, falling back to the cameraPR #6343 by @handsomematt

  • H.264 playback - retain compressed packets while draining decoder output and finish buffered frames at EOFPR #6278 by @handsomematt

  • MP4 timestamps - use 64-bit timing to prevent high-timescale overflow, early looping and incorrect duration/seekingPR #6338 by @handsomematt

  • Video clock - keep video-only playback at real time when engine FPS is lower than the clip ratePR #6375 by @handsomematt

Animation, Models & Physics
  • Grouped subgraphs - bake independent nodes/inputs for animation subgraph instances inside groupsPR #6364 by @handsomematt

  • Tiny blend weights - avoid invalid animation poses and bind-pose fallbacksPR #6309 by @handsomematt

  • Particle sprites - copy dropped/embedded sprites so duplicated effects do not edit each otherPR #6326 by @handsomematt

  • FBX blend shapes - skip duplicate channels to prevent repeated mesh-delta assertionsPR #6291 by @handsomematt

  • Large FBX imports - use wider node indices beyond 65,535 nodesPR #6384 by @lolleko

  • DMX animations - sanitize bone stream names to match ModelDoc and FBX namingPR #6345 by @handsomematt

  • Clutter bounds - ignore nonfinite procedural bounds instead of breaking placement throughout the scenePR #6350 by @handsomematt

  • Mesh indices - defer empty index-buffer allocation until sizedPR #6311 by @handsomematt

  • Rectangular height fields - transpose non-square data without overrunning buffersPR #6384 by @lolleko

  • Animation safety - bound parameter indices and skip editor highlight nodes that no longer existPR #6262PR #6384 by @lolleko

  • Model/map load safety - handle uninitialized ModelDoc, failed render nodes, oversized merged half-edge meshes and missing vmap prefixesPR #6262PR #6384 by @lolleko

Editor & Tools
  • Scene-map teardown - unsubscribe map handlers, cancel pending loads and avoid creating native physics worlds for destroyed scenesPR #6301 by @handsomematt

  • MCP edit ownership - record undo and dirty state in the session that owns the edited objectPR #6330 by @handsomematt

  • Hierarchy selection - stop Ctrl/Shift-selection scrolling back to old selected rowsPR #6289PR #6373 by @handsomematt

  • Prefab replacement - update names and clear repaired missing-prefab error iconsPR #6349PR #6351 by @handsomematt

  • Bevel previews - recover from malformed geometry without leaving the tool unusablePR #6346 by @handsomematt

  • Fast Texture - Escape cancels the edit, restores UV/material state and closes the toolPR #6321 by @handsomematt

  • Face highlighting - retain depth bias near the camera to avoid z-fightingPR #6360 by @handsomematt

  • Hammer layout - defer pane layout changes until menu clicks finishPR #6356 by @handsomematt

  • Hammer soundscapes - rotate snd_soundscape_box helpers with their entitiesPR #6374 by @handsomematt

  • Asset-browser history - tolerate missing saved history/index values instead of failing project loadPR #6342 by @handsomematt

  • Asset previews - avoid stealing focus from ModelDoc/Material Editor when savingPR #6331 by @handsomematt

  • Closed console - skip Clear Console On Play for destroyed console windowsPR #6312 by @handsomematt

  • Play viewport - make Screen.Size correct for OnStart and the first updatePR #6298 by @handsomematt

  • Scene dumps - write complete prefab contents without requiring external prefab filesPR #6358 by @handsomematt

  • Inspector records - hide compiler-generated EqualityContract propertiesPR #6357 by @handsomematt

  • CircularBuffer - reject negative indices after wrapping instead of accessing valid slotsPR #6305 by @handsomematt

Linux & Public Builds
  • Linux parties - correct native lobby callback packing when a party has a selected gamePR #6318 by @handsomematt

  • Linux menus - keep editor menus visible instead of losing them through global-menu integrationPR #6328 by @handsomematt

  • Executable paths - add .exe only on Windows and guard the Windows-only ETW profilerPR #6377 by @handsomematt

  • Interop generation - use ordinal sorting so local managed bindings match CI native layouts across localesPR #6337 by @handsomematt

  • Filesystem scale - support more than 65,535 symlinksPR #6262 by @lolleko

  • Setup permissions - mark public Setup.sh executablePR #6290 by @handsomematt

Upscaling
  • Orthographic jitter - correct projection jitter for orthographic cameras using FSR3 or DLSSPR #6395 by @sampavlovic

  • Render scale defaults - move to render.scale/r_render_scale so previously saved automatic 75% values no longer reduce the default resolution; retain an obsolete UpscalerRenderScale API aliasPR #6396 by @xezno

Removed

9 changes
Engine Development
  • GameCache - remove CreateGameCache, game-cache build/lookup paths and the old UGC depot from Steam app buildsPR #6237 by @handsomematt

  • SyncFlags.Query - mark query-based synchronized-property polling obsolete while preserving existing behaviorPR #6249 by @lolleko

Editor
  • Welcome tutorial - removed the editor startup tutorial popup, overlay and Help menu entryPR #6204 by @garrynewman

  • Legacy overlays - removed obsolete debug-overlay paths alongside the bounds-debugging fixesPR #6131 by @aylaylay

Rendering & Engine Development
  • Stretch setting - removed the separate Stretch option; anti-aliasing/upscaling off now serves that purpose, with existing configs supportedPR #6155 by @xezno

  • Compiled shader tracking - stop committing compiled shader outputs to the engine repositoryPR #6122 by @handsomematt

Native Tools
  • Physics cleanup - remove unused soft-body/cloth/legacy paths, physics schema generation and the separate physicsbuilder DLL while preserving existing asset compatibilityPR #6283 by @aylaylay

  • ModelDoc export - remove the nonfunctional Export As menu itemPR #6372 by @handsomematt

  • Balloon dependencies - remove obsolete missing break-particle references from citizen balloon modelsPR #6366 by @handsomematt

matt
Facepunch
JoinedApr 2021 Posts273 Score2,420
Familiar Territory : news/familar-territory
Missing
Member
JoinedJul 2022 Posts77 Score2,911
ehhh
Titanovsky
Member
JoinedSep 2021 Posts350 Score5,028
A lot of technical improvements, fixes, and bug fixes. Ok, I like it, this is the right approach. It’s also good that you’ve started focusing on lower-end hardware like the 1650 Super, as well as mid-range GPUs and CPUs, because performance is one of the reasons s&box gets negative reviews

I think moving to Steam Workshop is the right decision, even though I personally don’t like it, because your own solution is faster and better. But unfortunately, this is one of those cases where you need to listen to the players. They want a tool that’s easier to understand. About Sandbox Game, I saw how much you improved it. Please talk about it in more detail in around 2 weeks. You need to spread the word about Sandbox Game much more before December, and we’ll help with that too, because... Some people still can’t even find your flagship game inside the platform.

I'm still to play and develope with you, guys. I have some ideas beyond releasing CATLINES on Steam, and tomorrow I’m planning to make some new addons and maps for Sandbox Game too.
DreamPiece
Member
JoinedJul 2022 Posts19 Score4,976
Any updates about the In-Engine script editor that's like a C# version of Lua?
edited 4 hours ago#5
Doctor Law
Member
JoinedApr 2024 Posts17 Score2,395
Hate that we had to move to the Steam Workshop, but I understand why. Great work.
Ashthorne Gaming
Member
JoinedJul 2022 Posts1 Score40
I'm for anything that helps with playing the game offline.
eXodos
Member
JoinedAug 2022 Posts13 Score3,010
I think the Sprite and Particle Refraction stuff is Hot x Cool 
edited 2 hours ago#8
VERMUT
Member
JoinedJul 2024 Posts1 Score12,162
 

SLOW DOWN!!
Member
JoinedJan 2025 Posts26 Score7,821
Huh, apparently when you publish your game on the Steam Workshop it no longer shows previous player counts, reviews, thumbs up, etc. on s&box. All that still shows up on this site though, but not in game. But it seems like discoverability is still controlled by the older metrics... I'm not sure if they intended it to be this way. I'm guessing they want to delete the older data eventually and developers have to re-earn everything? I'm not sure about that...
people
Log in to reply
You can't reply if you're not logged in. That would be crazy.