
Steam news
Full Steam announcements and update articles for this title.
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-07-22
We've released the first version of AnimGraph 2 onto a separate branch on Steam this week. We invite developers to try it out and provide feedback in its early stages.
You can get access by switching to the animgraph2 branch.
You can now make Box Colliders instantly fit the bounds of the attached GameObject. This can be done via a button in the inspector or in code :)
You can now do loop cuts with the edge cut tool.
There is now more information given to you, you can see edge lengths and vertex distance.
You can now extrude a selected edge along another edge, allowing for quick trims.
A new utility in the mapping tools, you can find/replace materials on faces in a scene.
Ever since we moved to using SDL3 for gamepad inputs, we advised users to turn off SteamInput where possible. This isn't a necessity anymore because controllers should get recognized properly with SteamInput enabled.
You can now set the pivot of objects. Objects with bounds will keep the bounds in the same place but move the origin.
We don't want to support 50 VS Code forks individually, so the more pragmatic option is allowing you to set your code editor through its executable. You can now do that.
Available tokens for replacement are: {file}, {line}, {column}, {solution}, {project_root}
We've added a new setting for controller users, the ability to modify the joystick deadzone. Previously it was hard-coded at 12.5%.
A solid week, if not a little small. A few of our programmers are out at industry events this week so it's to be expected. Getting AnimGraph 2 out to developers is a big focus right now, so as we've said earlier, hop on the branch, give us feedback, tell us what you love, but especially what you hate about it. We'll probably do this more with big features if it's helpful to us. See you next week!
🎁 Added
🧼 Improved
🪛 Fixed
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
Adds subtitles and lip sync to sound files. This is kind of how HL2 did it, except better.
Adds import-time processing options to sound compiles, driven from the sound's `.meta` and applied by the native sound compiler:
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 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:
This is how it looks in action:
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.
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.
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.
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.
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.
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.
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.
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:
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.
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.
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
Flood Fill - Noise
Flood Fill - Occlusion
Flood Fill - Curvature
As well as supporting Invert and Clear Paint data. Also some quick nice time savers too; Improve Colour Lift
Quick Colour Pick
Scale Brush Distance
Added this back, if you pin s&box editor to your task bar you can launch projects quickly with this.
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.0fThis 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.
🎁 Added
🧼 Improved
🪛 Fixed
A new update has been released, you can view the full changes on our blog post.
Previously, you were able to publish a single asset to our workshop, you'd be able to add code and use your own components. However, you weren't able to use the game's code, just stuff from the engine. This week, we've added support for these addons to target games. In your addon, you must set the "Target/Parent Game" field in Project Settings to make use of this. This should really increase the capabilities for community addons and we're hoping to see that with Sandbox Game in the coming weeks.
The s&box editor now has a MCP server. The server allows stuff like Claude to talk directly to the editor. This isn't adding an annoying AI assistant chat box to the editor. It's totally invisible unless you're already using AI and want it to be able to communicate with the editor. I know there's going to be whole swale of the community that opposes this. I think the impression is usually wrong around this stuff. This is here to save time and make boring repetitive tasks quicker and easier.
✅ Find out why my models aren't compiling
✅ Diagnose and fix the broken paths on my prefabs
✅ Change all the tree models in this scene to oak_06 instead of oak_07
✅ Give all the published assets in the models/rust/ folder nice descriptive titles
✅ Can you spot anything wrong with my scene? The lighting is all broken.
❌ Generate a game that is like the matrix vs rollercoaster tycoon
❌ Generate a model of shrek
❌ Generate a pixel art image of a plumber for me to use as my game character
Our bloom was hard to balance. It was easy to land into overblown territory. This week, we've made the threshold parameter work like an actual threshold. There was also an under lying issue where light would contribute exponentially as we went down the mip chain.
The threshold parameter also takes into eye adaptation. So going from a dark scene to a bright scene should retain the same amount of bloom. This should make it easier for everyone to balance no matter the scene.
Our engine has a built-in fur shader that allows getting pretty nice fluffy visuals using the shell technique. It's used by some cosmetics, like santa hat, and probably used in some community content as well. It was useable, but its code was barely readable because it was made with Shadergraph long time ago. It had some other issues too, like no texture packing, mismatched color space on textures, and missing UI groups. This is not very good, considering that almost all of our shader code is open source - anybody should be able to peek how these shaders are made and learn something new from them. So I rewrote the fur shader with a goal to keep visuals 100% intact. Full rework inside, no changes from outside:
Fixed missing UI groups, all inputs should be properly categorized in Material Editor now
Fixed sRGB color space on some texture inputs (fur noise and normal map)
Added proper texture packing for compiled textures. Previously each material would write 6 separate textures to disk, now it's just 3
Rewrote wind displacement code, instead of calculating simplex noise at runtime, just sample blue noise texture
Simplified math where it's appropriate
Added an option to convert vertex color from sRGB to linear color space
Added an option to toggle between transformed/geometric normals for rim lighting
Matt also added a handy helper that now allows safely upgrading sensitive shader code without breaking existing materials, it's called FeatureUpgrade. `FeatureUpgrade` is a special utility in `FEATURES` block that marks an already-declared feature as an internal upgrade toggle. New materials will be automatically created with a new feature value assigned, while keeping old materials unaffected. You can use this to wrap upgraded code in a static combo, and it will be always enabled by default in all new materials, while old ones will continue executing old code. I wrote a detailed explanation with usage example in s&box docs here. You can see how exactly this thing is used in the fur shader source code. While at it, I've also fixed a long standing bug with Material Editor, where some custom shaders with identical variables defined in multiple static/dynamic combos would reset affected properties to defaults whenever you click on any feature. It was more likely to happen with code upgrades like in fur shader, but now you can safely define variables under the same name in multiple code paths.
For most of s&box tools we using Material Icons, which work for most things but for the mapping tools we've reached a point there either there isn't ones which match the function or an icon is used for multiple functions which causes confusiong. Also it should make it eaiser to see functions from a glance now.
Our clutter renderer was barebones. We instanced the models, but that was about it. There was no culling at all for instanced models, and LOD selection was done entirely on the CPU. It worked, but didn't scale when trying to scatter a large amount of clutter.
This week we've reworked the clutter renderer:
LOD selection is now done on the GPU
Culling is also now done on the GPU in the same pass
Collision for painted instances works as expected
You should see a performance boost across the board. On our benchmark scene with a lot of scattered clutter, we went from 60ms to 8ms.
We've also unified the render path across every instance type, so all clutter whether painted, procedural, volume-based will benefit from the same improvements.
We cleaned up the GPU profiler:
Timings that were bogus due to work being split across threads are now accurate and no longer inflated.
We also added a hierarchy, so command lists nest under their parent stage, making it easy to see which part of a stage is actually costing you.30_12-52-LightgrayCoelacanth.png 610.32 KB
We've struggled with where the seam between the engine and game code is in s&box. In GMod the engine had player controller, inventory, weapons, and all the supporting effects and UI around that built in. We added the native player controller in s&box, but weapons and inventory have always been something you had to completely implement yourself. Well this week we're adding a native inventory and weapon system. This contains all the components you need to provide a working weapon system in your game, including things like muzzle flashes, impact effects, tracers and brass ejection. Care has been taken to serve a large variety of games with this system. You can derive from and implement a custom version of InventoryComponent to make it do whatever you want while still using the same backbone. The same with BaseWeapon and BaseCarriable. The idea is that the components should offer 90% of required functionality natively, and then you can add the other 10% on yourself by overriding, if you need to.
Rasterized Shadow Maps have a limitation that their detail is only as fine as the resolution of the shadow itself, as you double it's detail, the work needed to be done on the rasterizer is increased 4x. We want to be able to support fine shadow details everywhere without overblowing the budget, we have implemented Contact Shadows that run in screen-space for every pixel, this fills every gap where there would be discontinuity on shadow maps by whether the shadow map's resolution or it's bias.
This is based on Bend Studio's incredible implementation, all raycasting tests are done in parallel in the GPU and this makes it ridiculously perfomant, taking just 0.00006s to compute on a RTX 3080
Traditional Contact Shadows implementations can have this issue there's discontinuity between the actual geometry and the shadow map, specially on softer shadow maps, the way we do it allows for very fine penumbras that accurately transition
As a bonus, our changes to it allow us to have very nicely detailed view model shadows at no extra cost over the contact shadows pass we already execute.
This implementation on the engine opens the door for light masks support in the engine, allowing you to compute any kind of shadow through compute shaders, eg cloud shadows, RT shadows, etc, backend of this can be applied to normal lights as well but want to iterate slowly.
You can now flag entire GameObjects as static
A static GameObject is one that does not move at runtime, allowing us to hint precomputed information about it to improve performance. This is useful for optimizing calculations related to lighting, occlusion, and navigation. This is a pre-requisite to be able to support Static Shadow Caching, letting you render static objects only once in lights.
🎁 Added
First-party inventory, weapon, ammo, camera shake, camera modifier, tracer, and scene anchor APIs.
Targeted Addons so published code can target a parent game package, including a Target Game option in the project wizard.
An editor MCP server so local AI agents can inspect and drive open projects through discoverable editor tools.
Screen-space shadows for lights, including support for soft contact shadows and viewmodel shadowing.
Static GameObjects for static-layer rendering and future static shadow caching.
A viewport orientation gizmo for quickly orbiting and switching between orthographic axis views.
Lip sync generation support to the sound editor.
Mapping texture lock, mesh edge path selection, and refreshed mapping icons.
Draw count and stride parameters to indirect draw calls.
A local loopback networking socket for multi-instance testing. Thank you, @dictateurfou!
`PlayerController.RestoreGrounding()` for restoring grounding after temporarily losing it. Thank you, @2czu!
A camera ignore tag set to PlayerController camera collision. Thank you, @nixxquality!
Missing menu binding support for map list context menus. Thank you, @766974616c79!
Multi-edit support for particle resources. Thank you, @PolEpie!
Rich text label support for the `style` attribute. Thank you, @kEllieDev!
Shortcut on tooltip of Play/Stop, pause and eject.
🧼 Improved
GPU clutter rendering with per-view GPU LOD selection and culling for painted, volume, and procedural instanced models.
Polygon mesh serialization by storing versioned binary blobs for faster loads, faster saves, smaller files, and larger maps.
The fur shader with cleaner packing, fewer compiled textures, better color-space handling, and new optional lighting controls.
The GPU profiler with accurate nested timing, fixed editor frame timing, and clearer scope names.
Performance API reporting with idle timing, accurate timing accumulation, and higher precision GC pause reporting.
Terrain rendering by using cull distance for holes and bounds so clipped terrain avoids pixel shader work and keeps early-Z.
Bloom threshold behavior and made bloom intensity more linear.
Shader compilation recovery when existing compiled shader data is corrupt or still contains a git-lfs pointer.
Single-asset addon publishing so code-path files such as stylesheets are included.
Asset Browser behavior so Find In Asset Browser clears the current search before selecting an asset.
Scene drag-and-drop for textures, images, and 2D view placement.
AddressSanitizer builds so they are easier and faster to use when debugging native memory issues.
Clothing metadata with missing clothing categories.
Sound previews with playback shortcuts.
Benchmark timing by moving forced GC out of the measured first frame.
When entering play mode, carry the current selection to the runtime object.
🪛 Fixed
ByteStream copies reading pooled buffers after disposal and hardened BytePack against deeply nested payload crashes.
Occluded sounds briefly playing at full volume when they start.
Menu boot errors when sound occlusion traces run before surfaces are loaded.
Nested prefab instances losing data when applying prefab changes.
Old sprite files loading as white or invalid textures when legacy loop points were present.
Sprite opacity incorrectly affecting scissor clipping cutoff.
A Sprite string allocation issue that could scale badly. Thank you, @K3rhos!
Doors playing their close-finished sound when a game launches. Thank you, @Fitamas!
Terrain brush size being treated as a radius instead of a diameter. Thank you, @PolEpie!
Terrain holes rendering black or crashing on AMD hardware.
Terrain requiring at least one valid splatmap before continuing. Thank you, @766974616c79!
Viewmodels and game overlays being overwritten by world depth prepass effects.
Vertex explosions on skinned instancing.
Shadow receiver depth bias producing bad shadow artifacts and validation issues.
Several Vulkan validation issues.
Material editor shader variable duplicates resetting properties when toggling features.
Movie keyframe merging and reduction edge cases when loading older movie projects.
GameResource inspectors prompting to save unchanged assets and SpriteInspector not enabling Save for some edits.
The editor console ignoring its filter after compiling.
Editor ray casts at non-100% DPI. Thank you, @PolEpie!
Badge components not updating when their value changes. Thank you, @zxcPandora!
GameObject transform control margin in the editor inspector. Thank you, @Tripperful!
DontDestroyOnLoad survivor hierarchy preservation during non-additive scene loads. Thank you, @deadmonstor!
Pressing Escape in the editor opening the pause menu instead of freeing the cursor.
Targeted addons not swapping to the hotloaded parent game assembly.
Radius( 0 ) traces missing everything.
PlayerController press interactions not searching parent objects for pressables.
AssetPreviewWidget null reference errors.
VFX serialized data compatibility for newly versioned data.
Fix Eject keybind inconsistency.
AssetBrowser.FocusOnAsset isnt suitable for filter clearing.
🚯 Removed
Removed obsolete `CameraComponent.ISceneCameraSetup`.
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-06-24
The menu home page has been updated with a couple of discovery moves. First of all we have a social feed on the right. This will show your friends interactions with the game (if you have any, and if their profile is not set to private in Steam). Then we have a spotlight on the top left, where we can highlight one or two games. We plan to use this to highlight new and under-appreciated games.
I struggled with the games tab, because you'd click on it and you'd see the most popular games, which I feel encourages stagnation. What should we default that to? New games? Trending? There's arguments for and against everything and I don't know if people know how to change the order. So now when you click on Games it'll show a bunch of different categories that we can control from the backend.
We've added a bunch more Rust content to the rust org. This is an ongoing process in terms of getting the import process correct and making everything work, but there are a lot more models and sounds available now.
You're free to use these assets in your games and addons on the platform, you can enable Play Fund too! I'm really interested to see if anyone can use the Rust assets to create something unexpected, or even try to recreate Rust in s&box. Seems like a fun thing to play around with.
Whilst I was importing Rust into s&box I kept hitting the resource compiler falling over and miscompiling. So I fixed all of it.
Publishing thousands of things at once revealed a bunch of validation problems too:
I feel like there's a lot of sound packs that everyone wants to use. So I uploaded them to a new org for everyone to use more easily. The new org is called OpenSound.
Here you'll find a ton of great sounds from multiple sources that have been released under the CC0 license, so are totally good to use in your projects. We also have a ton of free music by Kevin MacLeod, which is all licensed CC-BY. Additionally, you can preview sounds on the website now, too.
The recently added Cloud Asset Licenses page has been really helpful for letting people know what cloud assets they're still actively using, but it didn't point you towards where those references WERE. So now you can click into any cloud asset in the list and see all your local files that reference it from one place :)
Auto LOD can now cull or swap materials as it generates LOD levels. Faces using a specific material can be removed entirely, or swapped out for a different one. This is handy for cutting draw calls at a distance, for example by dropping detail materials that you'll never notice once an object is far enough away.
We've trimmed down per-frame allocations across the engine. On our benchmark system we now see around 100KB less allocated per frame on average. In some benchmark scenarios that translates to a 30% frame time improvement. In a regular game expect an improvement from 1-3%. Lower end hardware could see the bigger wins.
You can now run our benchmarks straight from ingame, via the Developer settings tab.
Once a run finishes, a modal pops up with a quick overview of the results, plus a link to the full breakdown on the website:
You can now set start/end loop points to the Sprite Editor so you can have animations with a lead-in section, loop section, and lead-out.
We've fixed a handful of issues with complex nested prefab structures, making them more stable to work with. The main culprits were around nested prefab instances losing track of their IDs, when breaking or reparenting an instance, and in an edge case during loading where nested mappings were built too early. If you've run into nested prefabs behaving unpredictably, this should clear a lot of that up.
The terrains tools needed some love, after spending some time using there was a bunch of features I wanted to add so I did so. These should help speed things up for people.
Videos now have player controls, volume, click-to-pause, and remembered volume, with controls that hide until hovered.
We were experimenting with this in shadows2 but ultimately didn't ship it. Now I've re-added it to reduce shadow acne on cascaded, point and spot lights.
We've started building tooling to attack shader performance through static analysis of our compiled shaders, pulling together tools like the AMD Radeon Developer Suite. The goal is to be able to sweep across our whole shader pipeline and isolate performance problems faster - register pressure, occupancy limits, spilling - without having to profile every pass by hand on real hardware. One of the first big wins it surfaced is quite embarrassing, the unused area-light shading path was drastically hammer our forward lighting shaders. Removing it took a bare PBR cluster loop from 120 VGPR at 75% occupancy (spilling) down to 68 VGPR at 100% (no spill), and a 4K lit pass ran 26% faster (245.5ms → 181.7ms on an RX 9070 XT). The full standard shade dropped from 150 to 116 VGPR with spilling eliminated entirely. The embarrassing thing is we never caught it in a year, a single dead branch was silently taxing every lit shader in the engine, and nothing in our workflow would have flagged it. That's the gap we're closing next. So alongside the analysis tooling, we're wiring this into our CI and PR workflows: per-PR GPU benchmarks, rendering regression tests, and static shader analysis that reports VGPR usage and occupancy as part of review. The aim is to catch this class of regression before it lands..
🎁 Added
🧼 Improved
🪛 Fixed
🚯 Removed
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-06-17
We're going to be making a bunch of small scoped, polished, fun games. The first of many is Mini Motors - we've worked on this as a small team of a few people over the last 2 weeks, start to finish.
Mini Motors is a top down arcade racer which includes a bunch of maps, cars, pickups, achievements and leaderboards, where you can compete for the fastest lap times. You can also play against bots! The objective here is to provide nice polished experiences for players but also to provide a learning resource in many ways to developers: the code is open-source to use as an example, and we've created tutorials based on the game on how to use the stats system, build ghost recordings and replay support.
In previous versions we supplied a code archive with the games. This was kind of like a zip file of the source code for that game. We thought nothing of it, because if you were using Lua in Garry's Mod the code would be right there, and dlls are trivial enough to decompile. But you guys didn't like that logic, you didn't like that anyone could see your code. So last week we shipped it so we compile your code on our backend and ship a compiled, trusted dll with your games instead. This had the benefit that clients don't need to compile code, so games start faster etc. This week we removed the code archive completely, so it's never downloaded and never shown to clients. So raw source code should be completely secret now. Unless you choose to open source.
We've got a mounts system in s&box that lets you play with content from your installed Steam games. This has been accessible in Sandbox mode for some time, but this week we've integrated it into the platform and stuck it right on the main menu.
You'll now see a Mounted Games list on the main menu and pause screen, where you can enable and disable game mounts. You need to own the game on Steam and have it installed on disk to mount it. This replaces the old automatic behaviour in Sandbox, so you're in control of what's loaded, as we add support for more and more games.
The mounts API is open for anyone to use.
Get started here
.
With this new integration, and as mounts can now provide scenes, we've extended the map picker to include mount maps right alongside workshop maps — meaning you can now play on maps from other games, where the mount provides them.
It should work with any games that support workshop maps, and it works in multiplayer too, though other players will also need to own the game and have it installed to join. This is still early days, and is fairly limited for now, but there's some really cool potential here, and just exploring levels from your favourite games with your mates - exciting stuff.
Our mounts editor side panel needed a bit of love, there's now a search bar and shows which mounts are installed or not and takes you to the steam page to install or buy games for supported mounts.
You can now inset faces in the mapping tools.
This feature was already in the scene editor but I've ported it to work with the mapping tools now.
Tidied up the unboxing scene so cards now show item rarities, particles display to hint at the rarity of the items inside, and the scene itself got a bit of a makeover. There's also a custom transition between the scenes!
Movie Maker's track list now features a sub-track search box, and various track creation bugs have been fixed.
To help everyone play by the rules, there is now a new page in the Publish Wizard which informs you of the Cloud Assets you are using and whether or not they: a) Are elligible for the Play Fund b) Require attribution c) Have no set license and should be used with caution d) Are CC0 and can be used freely
We've got a few engine components that we ship as built-in projects, stuff like our UI components, and most of our editor tools. Until now, we'd recompile each of these from scratch every time you opened the editor, even though most people would never change anything here. Now though, we build once when we need to, and the results are cached and re-used. If you do edit one for whatever reason, we'll recompile that one. This should speed up editor launch times quite a bit. On my pretty decent machine, this cuts startup times by more than 10 seconds every editor launch.
A feature requested by a user to have a function that computes the penetration normal and distance required for 2 overlapped colliders to resolve penetration.
When working on mounts I would run into texture loading bugs, to debug this it would have been useful to inspect each mip level of a texture, so I added it, along with showing a checkerboard background to see the alpha channel more clearly and a way to see each color channel.
Like particles and world panels, the 3d text renderer now also has an option to face the camera.
I'm slowly going through our existing shader documentation and expanding all pages where it's possible. This will not be a fast process, but the goal is to keep all articles up to date, and provide information that has not been included there previously, which should make learning shaders a bit easier. So far, I was able to do the following:
Updated the Light class documentation, which includes new information about directional light's shadow path, new types of light contributions, and some other little additions
More detailed Fog class
Updated the Material struct documentation, added functions that weren't referenced there before. Should be now inline with the current implementation from source code
Updated G-Buffer page with an example how you can write normal and roughness/opacity to g-buffer yourself
Wrote a big update to Attribute and Variables:Documented a bunch of mip generators that you can use when creating a new Texture2D: Box, PreserveCoverage, AlphaWeighted, and many others. This also comes with some image examplesDocumented BoolAttribute/FloatAttribute/TextureAttribute and some other related things: what's their purpose? When they should be used? Which ones are read by the engine, and when you should use them? These questions should be answered now.Documented OutputFormat, which specifies the image format that will be used in a compiled textureSlightly expanded the texture packing section with a fancy graph and more detailed description how it can be used.
Added a new page, Procedural Effects, which goes over an existing collection of procedural noise and pattern functions that you can use from your code. I tried to add a preview image for every function.
There will be more in the future, and eventually I will write a number of beginner-friendly tutorials on s&box shaders, which will be on the Learn page.
Our GTAO pass was taking up more time than we wanted so we improved it. fter opening it up in a frame profiler I spotted a couple of things we could do better. The was the three denoising pass right after the main AO pass. Those big blue bumps are L2 cache throughput, and we were completely maxing it out by the sheer number of texture fetches those passes did. Every pixel was re-reading depth and normals straight from textures, over and over, including the exact values its neighbours had just read.
By doing some shader magic and a memory optimization called Local Data Share, we were able to reduce those texture fetches and improve memory throughput for those passes. Now each group of pixels loads its little patch into shared memory once, up front, and does all its blurring from there. This Halved the time spent on average on each denoise pass. From 0.12ms -> 0.05ms on average.
We also did various improvements to relieve memory pressure
Depth chain went from 32-bit to 16-bit
Edge texture went from 16-bit float to 8-bit
Fuse depth + normal load
Reduce denoise pass from 3 -> 2 on medium and low setting.
We know our player experience isn't what it should be. It isn't meeting expectations. Our developer experience is shining star in s&box - but that's not what 99% of people see, they don't get that far. So our plans are to keep improving the player experience, then do a sale and promotion. We have a few different goals to improve the player experience. First of all, we need to do Game Jams again. They need to include the player community more. The jams should be aimed at getting players in game to play and vote just as much as they're aimed at developers. We 100% need to avoid the situation we've seen in previous jams where people reveal their game an hour before the Jam ends. Secondly, we need to improve the Sandbox game. While we've resisted "subscribing" to addons in favour of cloud based runtime spawnable entities, I think we're coming around to the idea of the two systems co-existing. I need to personally spend more time developing and fleshing out the Sandbox Game. Then we can do a sale and some promotion. We're going to do that once we're happy with the condition of everything. There's no point doing a Rust crossover and getting a bunch of new players that are going to play it once and be immediately turned off. We think that aiming to do this around Christmas time will give us plenty of time to tweak and polish everything that needs to be done.
🎁 Added
Games are mounted in the main menu
Maps from mounted games can be played
Menu framerate limit option.
Editor: Mounts are grouped by installed / not installed, with a search bar
Editor: LOD and material group selector in the model preview toolbar
Editor: Mip level selector in the texture preview
Editor: Inset Tool for mesh editing
Text renderer billboard mode.
Scale snapping in the editor.
Terrain editor trace support.
`Collider.ComputePenetration`.
Local-space bone following for particles via `ModelEmitter`.
Movie recorder support for custom track names.
Publish Wizard license warnings.
Quake mount support for loose files, not just files inside a pak.
Whitelist System.Memory
Whitelist System.ReadOnlyMemory
Whitelist System.IO.InvalidDataException
Whitelist System.Runtime.CompilerServices.Unsafe.SizeOf()
Whitelist System.Runtime.CompilerServices.InlineArray (For compiler generated code only)
🧼 Improved
GTAO optimization.
General shader fixes.
IRenderThread components are now stored off for the render threads.
Hoisted `sc_reject_all_objects` out of the per-object cull loop.
Removed the unused `s_nNumOutstandingDrawLists` counter.
Double-checked locking in `CMemoryManagerVulkan::GetCommandBuffer`.
Inlined `CConstantBufferVulkan::GetBufferAndOffset`.
Texture hardening pass.
`CMaterial2::m_hCopySource` is now a strong handle to address the long-standing `SetMaterial` crash.
`CommandList` gained locks that should never contend in normal use.
Allocation metrics now exclude their own self-noise.
Editor now caches built-in project assemblies.
Mapping "align down" support.
Minor menu fixes and a quick `PackageSelectionModal` refresh.
More explicit access control around System.Span / System.ReadOnlySpan
Mount snags cleanup.
Scene v2 unboxing.
🪛 Fixed
Disabled bone objects now use the correct bind pose.
Terrain crash when enabling/disabling fixed.
`b3Shape_IsOverlappingSensor` was reading the sensor from the wrong argument.
Buoyancy fixed for light props.
Indirect Light Volume bakes now work on unsaved scenes.
Move snap precision fixed.
Block placement precision fixed.
Dresser now ensures clothing is not null.
Local clients fixed with editor assembly caching.
TextureGenerator publishing/networking fixes.
Movie Maker track creation fixes.
Quake palette fallback fixed.
Missing nullptr check added in `CTextureVulkan::AssignTextureObject`.
`CVfxStaticComboData::Decompress` guarded against corrupt combo sizes.
Rebuilt transients after the vtexwriter fix (many falsely claimed mips that don't exist).
Don't include the checker pattern when rendering thumbnails.
Tracy disabled on Linux for now (static TLS blocks were preventing the server from booting).
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-06-10
The random drop reward system was pretty opaque. You didn't know why you didn't get your drop, you didn't know how close you were, you didn't know what you needed to do. So I've added a progress thing to the menu to make that more clear.
That should make things a lot clearer. Once you open your reward you'll be presented with three skins and be able to choose one of them to keep, for free. Right now you need to play for 30 minutes on 7 days (they don't have to be consecutive), play 4 games you haven't played before (for at least 2 minutes) and unlock 6 achievements. These seem like obtainable goals and all stuff that should happen naturally through regular play.
Once you are eligible for a Reward, you get a nice little box containing 3 options for you to choose from 🥳🎉
Whichever reward you decide to claim is yours to keep, forever (or trade/sell/ect)
We've added rarity to some of the items. This rarity is only added to items that are only obtainable by drops and act as an indicator of the probability of them dropping.
Our human heads were from Rust - they weren't very attractive and they looked stoned all the time. I've reshaped a lot of the heads now to look more friendly, our intention is to retire the old heads completely.
Each time you joined a game you would download the code and compile it on your machine, we did this for:
This worked great but there's a couple of downsides:
Now when you upload your game it's automatically compiled on our backend and served to everyone. This drastically reduces loading times of games by anywhere from 5 to 60 seconds and by compiling on our backend we can ensure the security of the DLL before it's distributed to users. After this update is out we'll start removing cll files from public manifests. There was a lot of infrastructure that surrounds this sort of change, and it's reusable - in the future we might recompile resources and shaders on the fly so we can continue improving the API without breaking anything.
Adding your Game or Map to the Play Fund now requires minimum quality levels to be met. We saw too much low quality, low effort shit being ploughed into the Play Fund.. seemingly in the hope that creating 50 low quality games would make as much as creating one medium quality game.
I have restored and improved the Twitch/Streamer api, so it's not fully possible to make games that interact with Twitch again. This API allows games to access viewer names and events like chat messages. The idea is that if someone is streaming s&box on twitch, they'll be able to play games that allow the people in chat to interact directly with the game. This seems like a pretty fertile game to explore a whole bunch of game ideas that haven't really been possible before because the barrier to implement these things was too large, so I'm excited to see what new things will be created.
If you're interested in making a Twitch game, I made a tutorial on how to use the new Streamer Api here.
If you're a streamer and want to try a game, you just need to start streaming on Twitch in your normal way, start s&box then find the game "Twitch Poop". If a game can interact with Twitch it'll have this purple button:
Click that and it'll pop up a box that will allow you link your account to Twitch. Once linked, you'll be able to enable the Twitch interaction by clicking the `Start Stream` button.
My example game is obviously pretty stupid, but like I say, this is a rich seam and I hope that game developers will spot some kind of possibility in this API and make some new, fun and inventive stuff.
I've added a new section to this website for Benchmarks. In the game folder we have `benchmark.exe` which will go through a bunch of benchmarks when you run it. When you go to the benchmarks page you'll see a list of your results. You'll then be able to share them with your friends and compare your results. One of the primary reasons we have added this is so if someone says the game runs like shit for them, they can share their results with us. That way we can see their hardware and their timings in all the categories we test for, and be able to diagnose exactly why it runs badly and optimize specifically for that. Here's an example result from my home pc.
Added a new 2D View that's built specifically for making 2D games. In this view, +X is Right, and +Y is Down, matching the same coordinate space as other screen elements (like UI)
When building a game in this view, it means Vector2.Up/Down/Left/Right will ALWAYS correspond to the correct direction whether it's a UI panel, a GameObject, ect.
Some of our artists wanted a way to control specific contributions for each light, so you could have lights affect diffuse lighting but no specular, etc. Engine already supported the but was never exposed, now it is.
Indirect Light Volumes needed some love for a while, seems they've been suffering regressions over updates, you'd end up with shit blotches all around specially as you increased density. I've had previously tried to to tighten visibility checks for each probe so that light leaks on thin walls could be minimized but that ended up being a terrible choice and caused a lot of aliasing. Now it should be all nice and smooth, with the caveats that we recommend thicker walls if using it.
With this we can compress per-probe visibility checks without a guilt with BC6H too, making them 8x smaller.
I still want to iterate on Sparse Volumes & use Spherical Harmonics, that seems to be ultimate way to support higher detail, lower memory usage, no light leaks & cover large worlds, we have a prototype ready but should try to do it more incrementally so we dont use many months for it.
Our previous terrain displacement would move the vertices up, which worked great, but created weird transitions between different materials. The vertices now also move down to keep the elevation between different materials consistent.
Terrain can now specify which texture sampler is used for rendering. This is useful for different art style where a more pixelated look might be needed. You can change this setting in the advanced settings on the terrain component.
Our initial water buoyancy wasn't very good, things would keep bobbing up and down and never settle. Our improved buoyancy feels much better and we now have a component in engine for it.
We added a widget to the toolbar to show shortcuts that aren't clearly displayed anywhere.
Layers that handled Command Lists used to run on the main thread, now fired for in threads for different groups. SSAO/SSR adopts own Descriptor Sets so their index is all handled in GPU to better work with multithread usage, instead of being passed by sequential Attributes.
This is an incredibly small change, but I made it so sampler states are now properly displayed as a component property in the editor, and can be actually edited from there.
By default, the only visible setting from there will be the filter mode, but you can always click on the right button to see the rest of sampler options. Might be useful if you want to configure whole sampler state for any reason.
I added Tracy support throughout the engine, Tracy is another profiler but specifically designed for games with realtime nanosecond resolution that reveals performance blockers that just aren't visible with ETW based profilers.
This is internal right now, but if we can figure out a way to distribute it to developers without additional overhead on clients, we'd love to.
🎁 Added
🧼 Improved
🪛 Fixed
🚯 Removed
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-06-03
The package tiles can now show more information about the package. by overlaying an icon on top. We're calling these flair, like in Office Space. Right now we supply these types of flair:
Workshop Approved - a clothing item that has been accepted
Updated Since Played - this game or map has been updated since you last played it
Favourite - you have favourited this package.
Contest Winner - this package won a prize in a Game Jam
This is a system I am hoping we'll be able to expand in a few different ways in the future.
We figured out that change lists are pretty important when it comes to games and maps. If you play a game that you like then when you're not playing it you're probably waiting for it to update. So we need to be better at showing you the games that you have enjoyed that have now had an update.
We've made the change lists independent of news on the packages, so you can add a change list without needing to post news. Change lists get their own dedicated section on the package's page and show on the front page.
The backend now has a new quality metric for games and maps. These packages will be punished if they don't have a completed profile. For example, if someone publishes a game with no thumbnail, no description, no tags, no categories, no screenshots and no videos - then it will be treated as a low quality upload, and will be punished in discovery. This is a response to a bunch of orgs that had fired out 7 games with no real effort or care. This stuff makes us all look bad, so it's pushed off the front screen.
I iterated on the search bar, here's what's new and improved:
Recommended tags and recently played games are now displayed front and center when you first click the search bar
We've improved how searches are queried, which should mean that you're seeing more relevant search results.
The most relevant search entry is also now highlighted, with slightly more information than other results
It's more obvious that you can view more search results (either by clicking the button at the bottom, or by pressing enter)
We've overhauled how sound propagates in s&box. This new system adds physical sound simulation, sounds now behave more like they do in the real world. Under the hood we're using Steam Audio's effects (HRTF, reverb, distance attenuation), but with our own lightweight propagation simulation. Headphones recommended for the video:
Occlusion & Transmission Previously, occlusion was binary. If a wall was between you and a sound source, the volume dropped by a flat 20%. Now the system counts how many obstacles a sound passes through and factors in the material. For example, wood will resonate differently to concrete. Each physics material defines how much it transmits in the low, mid and high frequency ranges. Reverb Room reverb is now fully dynamic. Instead of having to manually place DSP volumes , the system automatically approximates room size and material characteristics and then feeds that into a dynamic reverb processor. Diffraction Sound bends around corners. Standing just outside a doorway or around a corner, you'll still clearly hear what's on the other side instead of it cutting off the moment LoS breaks. This is a basic implementation. It handles simple single corners and openings but doesn't do any path tracing, so complex geometry won't be handled perfectly. Performance The system should run well below sub millisecond, on mid to high end machines. Very low core count CPUs may see some more impact. If you run into issues the simulation can be disabled in the audio settings. As always Performance will also improve over time.
This is a first release and most games should sound better out of the box. Sound is subjective though, so several settings are configurable if you want to tune things and more will likely be added in the future.
Let us know what you like and what you hate, and we'll keep iterating.
We've tidied up how player names work throughout the engine. Previously we were networking player's display names for other players, if a lobby host had a nickname for a player everyone got that nickname for them. Now we've got a clear split:
Connection.Name - is now the formalized player's name, where as before it was sort of a debug name for the connection sometimes - use this when dealing with networking / dedicated hosting.
Connection.DisplayName - is now always grabbed from Steam along with any personal nicknames or filtering settings you have in Steam. This is for displaying names in UI contexts.
We swapped most instances of Connection.DisplayName in the engine for Connection.Name, typically for internal logic, logging and identity checks. Local instances now get a random name outside of the networking layer, instead of appending a number to the end of your local username.
Join/leave messages are now pushed to chat at the platform level, so game code no longer needs to wire this up manually. We're trying to provide a nice default consistent experience.
Our Volumetric Fog uses a novel denoising technique based on traditional AABB-Clamp TAA in a froxel. This works really great and is incredibly reactive to changes, however it had a few issues where it would jitter a lot specially as you would move away from the center of the world, all of these are fixed and it should be stable now. I've also optimized it so instead of using 27 texture fetches for denoising, it uses 8 hardware filtered fetches, denoising should be much faster now. While working at it, I noticed the Henyey-Greenstein Phase Function formula was inverted, corrected it and make actual fog density contribute to it, Volumetric Fog should look much more natural now
Can tint volumetric fog too, I'd like to see to just use it for underwater fog so it's all unified without needing a special different system.
The terrain component has gotten some much needed love. Previously our terrain was pretty limited with a lot of loose ends that we never tidied up, but as we evolved our APIs we can make it a lot better now.
Terrain creation - creating terrain is instant now, you don't need to set it up or save to a file
Resource improvements - terrain resources are now stored as binary data
Dynamic Resolution - Change storage resolution dynamically without losing your data
We removed the creation dialog and directly create the terrain in the scene making the overall workflow much smoother. It's still possible to do everything you could do before, except it's all now in the component properties where it belongs.
Terrain storage resource will now be embedded directly in your scene by default. It can still be saved as a standalone resource if you ever need to share it between scenes. It's also now stored as a binary data making serialization faster. You will notice a new `terrain_d` files show up as a consequence(or `scene_d` if embedded).
Previously, if you wanted to change terrain resolution, you would lose your heightmap data(not good). It's now
possible to change the storage resolution dynamically without losing your terrain data. A mixture of upscaling & downscaling is used.
Note that the transformation is not lossless if downscaling then upscaling
When we improved our painting system to support up to 64 materials, we introduced the concept of painting layers. As we got more feedback we realized it got confusing to have to select which layer to paint on. The paint tool now will automatically handle and select the appropriate layer to paint.
We deprecated the old GPU Resident Textures viewer for a proper GPU Resources Viewer, with live preview, live updates, memory stats, and integrated properly as an editor tool. At a glance you can see which textures are being actively used on the scene, live preview render targets, see if there are any memory leaks, etc.
There's also a treemap view, so you can see worst offenders at a glance.
Textures that are not fully loaded by texture streaming will show the amount of mips that are streamed in.
Some GPU memory stats available to the game as well
We have instancing for common objects, if you spawn a bunch of boxes on Sandbox mode they're all drawn in one go on the GPU. Characters are more complex and we would draw them one at the time, we've reworked how we batch them so we can group all transforms together, even if they're animated, tinted, and so on.
Instancing for skinned objects works everywhere and without changing any shaders. There are ways we can make it better, right now we're breaking batches through spatial partitions, looking to simplify the entire scene system out of these soon.
Morphs are used for facial animations of characters and other per-vertex animation driven by artists. Whenever we have a bunch of skinned objects like players, we would individually update their morphs at start of frame individually, even with Instanced Skinning.
This doesn't scale well at all, specially as you have a crowd. Now all morphs are batched and executed in a single drawcall with bindless targeting, even with multiple different models.
I've updated our CSS parsing system with as much missing stuff as I could find. The system was pretty much all fully functional but it was missing a bunch of shortcuts. For example, you could do `font-family: poppins` but you couldn't do `font: 20px poppins`. There was a lot of that kind of stuff - check the changelist for more information. As well as that, there's some optimizations and a couple of new features.
Can now use `inherit`, `initial`, `unset`, `revert`.
Can use `none` in a bunch of places that make sense
Animations accept ms units
`font-family` can take generic font type (like `monospace`)
Stylesheet recovers properly when one property is wrong, instead of failing the whole sheet.
Can use `currentColor` in properties
Added css `text-align: justify`
I made some changes to how input scoping works this week. Input scoping is our API that handles multiple game controllers, for local multiplayer / couch co-op. Previously, we had no way of splitting a keyboard and mouse user from the first gamepad. That is now possible. For example:
if ( Input.PlayerScope( PlayerIndex.KeyboardAndMouse ) ) { ... }Will only parse inputs from the keyboard and mouse.
We've made some much-needed improvements to our cloud browser.
You can browse more things now - with the addition of collections, prefabs, sprites, and decals
Adding a collection to the sidebar applies instantly - you don't have to restart the editor anymore, and you can search for collections inside the editor itself too now
Filters are now shown in their own separate area rather than trying to squeeze them next to the search bar
Sorting through orgs collections should be easier: there are submenus for all the different asset types now
We've added an "update all" button to the referenced assets tab, so you can update everything at once
We've got a big batch of Movie Maker editor improvements this week. Special attention has been given to the Create Targets option, which automatically creates any missing GameObjects and Components needed to play back your movie. Many edge cases have been fixed, and now you can easily promote these objects to be saved in your scene just by dragging them around in the hierarchy.
Check out the patch notes at the bottom of the page for a complete list of fixes.
We changed our API endpoints from services.facepunch.com to public.facepunch.com at the start of last month. The old endpoint is going away now so update your shit, there's a small grace period with auth tokens. The paths are the same, only the domain is changed, check out the API usage routes here:
You now have an option to make your game open source. If you opt to do this, your code will be searchable in our new Code Search page and be fully browsable on your package page.
The aim of this is to build up a library of code so that anyone learning or unsure how to achieve something will be able to search for a specific class or function and see real world usage straight away.
I've improved the package exceptions pages. They load more reliably now and feel a bit more accessible. When viewing an exception it'll try to show the source code where the exception happened.
If you have a lot of models uploaded to your org (like facepunch does) it could be hard work to release them, hide them, or change the license on them. This week we added the asset batch editor. You can find it under the Assets tab on your Org's page. This lets you go in, tick boxes, and apply licenses and release mode quickly and easily.
We also have special views for Models, Games and Materials where you can view and sort by some stats unique to each type of asset.
Similar to the Model stats, Material Assets are also now enriched with information about their contents. These show on the package's page and are available via the API, so we can show them in game.
You can also now filter by alphatest, hdr, nomips, sky, translucent, trimsheet, uncompressed and worldmapped - which are all automatically tagged in the appropriate material packages. We have an extra facet too, which is the representative texture size.
We now extract a bunch of model stats on any published models. They show on the model's page but the stats are also available to the engine.
This in turn lets you filter models that have animations, bones and hitboxes. You can also filter by triangle count.
In our efforts to reduce file sizes on the platform, we've been using the above new tools to target and optimize models & materials across our official asset libraries - namely s&box assets & Trimsheets. We've added more LODs, reduced drawcalls and trimmed down on texture resolutions where appropriate without compromising visuals. Expect a file size reduction of up to 70% per asset in some cases. We'll obviously keep optimizing where possible moving forward. Any existing projects already using our assets can benefit from these changes by updating the assets in-editor.
🎁 Added
Audio: Physical sound simulation - a new physically based sound propagation system, using Steam Audio for reverb, HRTF and distance attenuation.
Audio: Basic reverb and occlusion settings to tune the new sound simulation.
API: `Mesh.AddSubMesh` lets a single mesh carry multiple materials as separate draw calls, sharing one vertex and index buffer instead of duplicating them.
Editor: GPU Resources Viewer with live preview, live updates and memory stats, plus exposed refcounts and a treemap view to spot leaks
Added package flair (updated, favourite, contest winner)
Added change lists to package view
UI: css min(), max() and clamp() for lengths
UI: css-wide keywords inherit, initial, unset, revert (incl. shorthands)
UI: added currentColor keyword to css
UI: colors can parse oklch(), lab() and hwb()
UI: added css text-align: justify
UI: css white-space: pre-wrap and break-spaces
UI: added css word-break: break-word
UI: parses css image-rendering: crisp-edges (point sampling)
UI: added css inset shorthand
UI: now parses 1–4 values in the css border-width shorthand
UI: added css transition-duration, -delay, -property and -timing-function longhands
UI: css :has() now supports descendant selectors
UI: added css opacity percentages
UI: added css overflow: auto (maps to scroll)
UI: added css gap: normal
UI: added css filter: none
UI: css transform: scale() now takes comma-separated args
UI: css animations now accept ms units
UI: added more css justify-content, align-* and text-align keywords (start, end, …)
UI: parses css dvh/svh/lvh/dvw viewport units (treated as vh/vw)
UI: parses css object-fit: scale-down (treated as contain)
UI: added css margin-block / margin-inline (+ the logical margin sides)
UI: added css padding-block / padding-inline (+ the logical padding sides)
UI: added css inset-block / inset-inline (+ the logical inset sides)
UI: added the css flex-flow shorthand
UI: added the css font shorthand
UI: added css font-size keywords (xx-small … xxx-large)
UI: css letter-spacing and word-spacing now accept normal
UI: added css font-smooth: none
UI: css aspect-ratio now accepts the auto form
UI: css font-family now maps generic families (serif, sans-serif, monospace)
UI: added css flex-flow
UI: added css font
🧼 Improved
Updated SDL to 3.4.8.
Skinned meshes now render with instanced skinning, cutting draw call overhead for scenes with many skinned objects.
Morph targets are processed in a single bindless draw call instead of one update per mesh, improving performance for animated characters.
Volumetric fog no longer jitters when far from the world origin or in high-contrast areas, and the denoise pass is much cheaper (8 trilinear taps instead of 27).
Procedural render layers now run in parallel jobs, improving performance when rendering multiple views.
Reworked input scoping to cleanly separate keyboard/mouse from controllers, improving local multiplayer support.
Overhauled the main search bar with structured autocomplete, better result sorting and a more prominent top result.
Cleaner, less cluttered cloud browser with filters moved below the search bar.
Terrain tools improvements: auto-create terrain, prompt to save `.terrain` on scene save, a resolution dropdown and a clipmap preview.
Terrain painting now automatically decides which layer to paint on based on opacity.
UI sounds now target the UI mixer by default when no mixer is set, so 2D sounds aren't spatialized like world sounds.
Rebuild model hitboxes when the renderer scale changes.
UI: css rule matching is ~3–5× faster on large stylesheets (rules indexed by class)
UI: ~2× fewer allocations in css transitions (snapshot styles once, not per property)
UI: finished css animations no longer re-layout every frame
UI: less GC in css sibling/child selector queries (no list copies or wrappers)
UI: less GC diffing active css rules (no LINQ or hashsets)
UI: faster, lower-GC Yoga layout wrapper
UI: css stylesheet hotload now watches newly imported files
Movie Maker: Don't show redundant full path to GameObjects in the track list, just show the name
Movie Maker: Created targets are now nested under a NotSaved GameObject parented to the MoviePlayer's GameObject
Movie Maker: You can promote a created target into a saved object in the scene by dragging it out of the MoviePlayer's ancestors
Movie Maker: Wait a little before updating export preview when changing res, so it doesn't try to allocate an RT on every key press
Movie Maker: Support capturing BeamEffects with a MovieRecorder
Movie Maker: Add icon / tool tip text in track list to easily see which tracks are bound to a created target
StringControlWidget now selects its entire contents on click. Thanks @Matt9440!
🪛 Fixed
Fixed a NaN assertion when running physics traces with invalid translation values.
Removed lingering invalid bodies from the physics world.
Fixed `OnEnabledInternal`/`OnDisabledInternal` being called out of order.
Fixed regular world panel transforms and world panel custom draw transforms.
Fixed a race in `SoundHandle.Time` so only the mix thread advances the native sampler.
Fixed a race condition when destroying sound streams by queuing destruction to a safe time.
Fixed stereo sounds (music and some SFX) being incorrectly spatialized in mono.
Fixed a performance regression when many sound handles exist.
Fixed inspecting procedural textures that aren't backed by a disk source, such as those from mounts.
Fixed dedicated server connection names by resolving them during the handshake.
Fixed cloud asset directory serialization exceptions.
Validate `ObjectCreateMsg`/`ObjectCreateBatchMsg` so clients can't create objects on behalf of other clients.
ServerPackages fixes, including no longer shipping the game package in the server package table.
UI: fixed css !important dropping the whole declaration
UI: css line-height without units is now a multiplier
UI: fixed css calc() division and full-expression parsing
UI: fixed the css flex shorthand for single-number and three-value forms
UI: fixed the css transition shorthand when the property is omitted
UI: css font-family now uses the first family in a comma stack
UI: colors now parse fully in the css background shorthand
UI: an unknown css @-rule no longer drops the whole stylesheet
UI: css variables no longer match on partial tokens
UI: injected css variables are kept across stylesheet hotloads
UI: fixed css selector specificity overflowing when comparing rules
UI: css background: none now resets the background (image and colour)
UI: css filter: none now overrides a filter set by a base class
UI: css transform: none now overrides a transform set by a base class
Movie Maker: Avoid animgraph playback going crazy when scrubbing
Movie Maker: Fix animations updating at the wrong speed when previewing sequences
Movie Maker: Immediately repaint scrub bars if their background colour changes
Movie Maker: Make sure timeline tracks get created when track list changes, fixing keyframes not always getting created
Movie Maker: Fix created targets escaping to the scene root if their parent changes
Movie Maker: Fix lots of edge cases where created targets aren't created / removed when changing movie / toggling CreateTargets
Made the stylesheet cache context aware to stop styles bleeding between games and the menu. Thanks @Matt9440!
Don't normalize remote URIs. Thanks @Noztik!
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-05-27
🎁 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!
Re-enabled 'None' anti-aliasing option. Thanks @Mykol-Word!
Editor now opens on the correct monitor. Thanks @boxrocket6803!
Splash screen now always starts centered. Thanks @boxrocket6803!
Fixed a collection of issues with new Platform Chat, most importantly clients not receiving messages
Fixed game video settings being stomped in the editor
Fixed certain objects becoming wrongly transparent after opaque fade fixes
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-05-20
As referenced in last week's analysis of the Steam Reviews, there are a lot of misunderstandings of what s&box is and what it isn't. We haven't done a good job of explaining ourselves on the game side. It feels like we have done a good job of explaining ourselves to developers, but have trood in a bunch of dog shit when explaining it to gamers.
This week I've added a welcome screen to the game to explain some of the unobvious. This screen will pop up on first run, explain a few things, and make a suggestion to play Sandbox Mode or Sausage Survivors 2. The hope being that people who are coming here for the first time will read it and their first experience will be a good one.
Obviously, no-one reads anything any more. No-one is even reading this. They're probably being told what it says in a youtube video, or a tiktok video with fart noises and someone playing tetris at the side to make sure they don't get bored. But you know, at least we can say we tried.
We now have a random drop system. There are certain criteria to meet to be eligible for a drop, and once you reach that threshold you'll receive a random item. These items can be traded and sold, like any other item. You can get one of these drops every week.
We want to do more with this system in the future to encourage positive community interactions, rather than purely play time. For this reason we've made our own programmable backend for it, rather than using the existing Steamworks system.
Right now your chances of drops are based on factors like games played, new games played, time played, reviews and game ratings. We'll tweak this in the future so that people who are positive community members will be more eligible for rarer rewards. We'll be keeping an eye on it too, to make sure it's not being botted and gamed.
You can see which skins have been dropped at the bottom of the Skin Metrics page.
This site now has developer tutorials. This started as a way for us to write smaller tutorials without filling the documentation without too much noise, but it's obviously way more useful if the community can edit them too.
This is accessible at https://sbox.game/learn - and is something we'll be contributing to and will be improving over time. Let us know what you think!
Trade Protection is active for the Steam Inventory items in s&box. You can read more about it at that link.
Basically there's no reason not to have it, and it's better to have it enabled sooner rather than later, so if we do stuff in game with the items we can show that they're trade protected instead of doing it retroactively.
Everyone had to implement their own chat into their games, that was stupid. Now there's a default chat, this makes a consistent platform experience, players can turn chat off, mute other users and filter naughty words.
For new projects this is turned on by default, for older projects this is opt-in. It can be toggled on and off in the project settings.
You can use `Chat.AddText( ... )` to add system text for notifications, or whatever you'd like.
This has blocking behaviour built-in, and you can disable the chat in your settings menu. You can listen to chat messages using `IChatEvent.OnChatMessage`, so if you want to filter for stuff like team chat, add commands to your game, you can do that. We have potential plans for first-party commands / chat channels in the future.
We have a "Voice" volume slider in our settings, but we were relying on game developers to implement this functionality themselves. This was shit, and as a result it didn't work for most games...
Now all voice transmission MUST go through the Voice Mixer, or some Mixer that is a child of the Voice Mixer.
That way games can no longer circumvent the "Voice" volume slider, and both players and streamers alike can rejoice in the fact that they won't have to hear another soul once muted.
Before we optimize anything, we need to know which areas to focus on, which areas are holding players back. Is it the GPU? Is it the CPU? Is it physics, is it animation? The answer changes dramatically depending on the hardware people are running.
This update we started collecting GPU frametime in our performance analytics. Combined with our existing CPU profiling we can now classify every player session as either GPU-bound or CPU-bound, and iif CPU-bound pinpoint which stage (render, physics, animation, particles, etc.) is the culprit.
I've then added a new page to our metrics, performance bottlenecks - this groups players into hardware tiers and shows the dominant bottleneck for each CPU x GPU combination.
This gives us a clear picture that we are almost always CPU bound submitting rendering work to the GPU, the GPU never struggles to actually run this work.
You can also filter by game and map to see how specific content shifts this balance - a physics-heavy game might bottleneck the CPU, where as a very art heavy map might bottleneck on the GPU.
The sample sizes are low right now, as the update rolls out we should have a very clear picture going forward.
A smaller update this week because of hackweek but we still got a lot of important stuff done in just a few days.
We've been tweaking discovery still on the backend, pushing the good stuff forward and dragging the slop to the bottom. The welcome screen should help new players get a more positive experience too.
Tutorials are a vital part of the ecosystem, we've already been seeing many new developers trying out s&box, learning the toolset and creating new experiences for everyone to play.
The performance data is leading the way with optimizations, now we know where the biggest bottlenecks are for all users across all hardware, we know where to focus our efforts.
We're getting what needs to be done, done. No slowing down - see you next week. 💪
🎁 Added
Default platform chat system - games can toggle this on/off in project settings, and hook into it with IChatEvent
Welcome screen shown on first game startup to communicate what s&box is
`SoundFile.FromOgg` for loading OggVorbis sound files
`GpuBuffer.CopyTo` for GPU-side buffer-to-buffer copies
`RenderAttributes.Set(uint)` overload for correctly passing unsigned integer attributes to shaders
`CameraComponent.RenderToBitmap` overload with optional UI rendering parameter
Clutter LOD support for instanced models — models in the same LOD level are batched into a single draw call
Voice Mixer added to default mixers; Voice Component now restricted to only use Voice Mixer or sub-mixers, ensuring the voice volume setting always works
Terrain storage grid visualization when painting materials
UI panels can perform custom drawing again via `IPanelDraw` and `Draw(CommandList)`
Backend notice system for item drops
🧼 Improved
Trace results no longer allocate arrays, reducing GC pressure — use `HasTag()` instead of the now-obsolete `.Tags` property
Redesigned package modal to match the rest of the UI
Doo methods renamed to include "Doo" in their names for clarity and to avoid variable name conflicts (old names remain as `\` extension methods)
`GpuBuffer.SetData()` now accepts `ReadOnlySpan` instead of requiring `Span`
SceneTree search no longer filters out prefab contents
Video settings are now applied on first launch, fixing potential poor performance before settings are saved
Heightfield collision no longer snags player movement
`TerrainStorage.Resolution` setter made private — use `SetResolution()` instead
`GameObjectSystem` properties now respect property initializers and `\` attributes
Stale config values are now removed on failed deserialization
`LoadAllGameResource` can now replace existing resources when loading addons or syncing network files
Disabled opaque fade being wrongly enabled on on GameOverlays
🪛 Fixed
Backwards seek (e.g. from `SoundHandle.Time`) causing an infinite loop when hitting the very start of a sound
Opaque Fade not working without MSAA and not rendering properly in shadows
MSAA edges appearing in translucent `screenshot_highres` captures and scene panels
`CameraComponent.RenderToBitmap` UI scaling incorrectly to the bitmap size
Pivot tool grid snapping when dragging fast
Editor shortcuts getting stuck after ALT+TAB or pressing the WIN key while navigating the viewport
Square particles on some impact effects due to incorrect texture paths
Vertex painting not working with custom blendable shaders
System scene overwriting game object systems of the actual scene
Clothing hide parameter selecting wrong bodygroup for human models
Scene system render stats breaking with multiple render scopes
TreeView item not committing pending name change when unfocused
Screenshot UI resolution not matching when resizing - Thanks @Matt9440
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-05-13
I've been making a lot of changes to our Workshop so we can identify and discourage the AI Slop.
Our moderators can now mark packages as having AI thumbnails, which will reduce their prevalence in lists and searches. I can understand why people would want to use AI to generate these thumbs, since it makes generating them easy and fast, it does have the massive downside of making everything look like the same shit. So we're actively discouraging it.
I've added a warning to the thumbnail page about this.
Last week I added a new review system which contains positive and negative tags. This week we started using those reviews and their tags to help out with discovery.
First of all, you can now filter by the rating. The star rating is generated from a combination of thumbs up and down and the actual review ratings. My hope here is that it's intuitive for people to find games that other people have enjoyed, instead of having to fight their way through games that no-one loves.
You can also filter by the prominent review tags. For example, you might want to play a game where everyone agreed universally that the story was standout, or where everyone liked the graphics. Hopefully that's a lot easier now.
I think this gives some good community-led discovery options that we didn't have on launch, but obviously we'll keep improving this stuff over time.
Our steam reviews obviously aren't great. They're painful for us. They are showing us where we have made missteps in the release.
Around 35% of the reviews compare the game to Garry's Mod. They point out the differences between s&box and Garry's Mod, they wish it was more like Garry's Mod. I understand this, they wanted an iteration of Garry's Mod onto the Source Engine. They didn't want an engine and a platform. They wanted a Source 2 SDK, they didn't want a modern c# engine built on top of Source 2. I don't think we can win in that argument, it's going to be an expectation and preference thing. My only real hope is that eventually everyone will realise that this is a much better way to work for developers, and we'll end up with much better content because of it.
Around 27% of reviews think we're missing Workshop integration. They liked the way you used to subscribe to stuff out of game and then join the game and have all those mods. There is probably something in that, for certain types of mods, and we'll look into it. We have a system in our Sandbox Mode where you don't need to subscribe to anything. If you want a weapon or an NPC you click on it, and it downloads and spawns it. I guess this appears like we're shipping all this stuff with the game.. but we're not. Anyone can make these entities and publish them for anyone else to use.
Around 24% of reviews complained about AI Slop. I think I addressed this before. It's not our intention to encourage games created using AI. It's not our intention to encourage people making shit no effort games. But it's a UGC platform, there is always going to be dog shit. What we need to do is remove obvious trolls, discourage it and make sure it doesn't keep floating to the top. We are developers and this is our platform. Of course we don't want it filled with shit.
Around 20% of reviews complained about performance. This is a legit greivence, we have the data to back it. We're working on it constantly, and have made some big strides this week.
Around 12% of reviews complained about NFT's. I have no idea what this shit is about. Of course we don't have NFTs or blockchain stuff, and never will.
About half the people that reviewed negatively went on to play more. 6% of them played for over 10 hours. One French guy played for 280 hours after posting their negative review.
What I'm getting at is that we're listening and it's appreciated, so please keep the feedback coming, it's extremely useful to us.
I've added three upscalers this week based on the ones that ship with Valve's Deadlock. Upscalers let you render the game at a lower resolution to your display. They're useful if you're trying to play on a high resolution display, or simply have lower end GPUs. Onlythe 3D rendering is upscaled, UI elements are still rendered at native resolution.
They're not going to improve performance in every game or on all hardware, and they're not a replacement for real optimization work that needs to be done. But they are a good option for some people.
Stretch
The most straight forward, no tricks, just renders the image lower and stretches it bilinear to your native resolution. This is the fastest, for older GPUs, but makes zero effort to add to the image quality.
FSR
This is the FSR1 and it's a solid option still, it uses spatial upscaling instead of temporal upscaling. This means it's great for fast camera movements and games with heavy particles/effects where temporal usually shits the bed.
FSR3
This is the big one. FSR3 is a temporal upscaler, it accumulates detail across multiple frames, this produces a great looking image quickly, but comes with a big caveat - ghosting.
Fast moving cameras, translucents, particles and 3D world UI are all going to look a bit shitty, this is the nature of temporal and why we don't want to use it in our core rendering tech. However it's the expectation of many to be able to use this, so it's here as an opt-in but clearly labelled for what it is.
We're looking to add DLSS next, but it'll more or less be the same as FSR3. And absolutely no frame generation.
We added an Open Microphone option to the sound settings. If active it will automatically transmit your voice if you are in agame that supports voice chat.
For anyone paranoid, we also added an option to completley disable microphone input.
Box3D has been updated to the latest version. In this version is misc changes and bug fixes but the biggest feature added was something called contact recycling. This enables much more stable stacking of objects ontop of each other.
Explosive barrels didn't blow up when you'd throw them at shit. Now they do. What a blunder.
🎁 Added
Upscalers: Stretch, FSR, FSR3 - rendering the game at a lower resolution and upscaling it
Mapping: boolean tool
Mapping: vertex extrude via Shift+Drag
Mapping: vertex select loop
Mapping: UV vertex mode for moving UVs directly in the texture view.
Clutter props now support instanced rendering with physics collision, no longer need a prefab for collision
New Citizen/human animation parameters
Open microphone voice setting with an explicit disable option for users who never want voice transmitted
Gizmo handle preferences: worldspace, depth test, scale, and render distance
Cone shape traces via `Scene.Trace.Cone`
`Rigidbody.SleepThreshold` advanced property for controlling when rigidbodies go to sleep, useful for games with lots of stacking objects
Mouse wheel up/down support for keyboard shortcuts, including with modifier keys
Added `Color32.Lerp` and `Color32.LerpTo`
🧼 Improved
Updated Box3D physics engine with contact recycling for more stable object stacking, mesh contact rework, and solver optimizations
Platform overlay now renders independently even when no active cameras are present, preventing apparent freezes during loading
Texture tool merged back into the face tool with collapsible groups
Vertex mode layout improved, properties now saved to cookies
Texture tool correctly saves and loads last state including bounds, mapping mode, and grid size
Impact sounds now use more of the available sound variants
Sound files created from data now correctly preserve loop points
Addon editor assemblies now properly load ConVars, Mounts, and EditorEvents
Explosive props detonate instantly from impact damage
Prop break pieces now inherit MaterialGroup
Achievements list no longer limited to 10
Publishing now excludes all dot-files and dot-folders
Layered modals get proper stacked z-indexing
`GameTask.WhenAny` methods now return `Task`
Eliminated SceneTrace boxing allocations in filter callbacks
JSON reflection warmup is now cancelled before hotload to avoid race conditions
Launching a map in another game ignores ParentPackage dependency
Editor mouse position now updates while game widget is unfocused. Thank you @aidencurtis!
🪛 Fixed
Fixed terrain crash in editor from null material during heightfield shape casting
Fixed shape cast traces returning incorrect hit points on overlaps
Fixed CCD bullet bodies incorrectly triggering sensors based on AABB instead of actual shape
Fixed bone scaling not preserved through animation add pose operations
Fixed invalid scale in animation subtract pose operations
Fixed null and dangling resource crashes in animatable objects and scene objects
Fixed vertex colors lost during mesh topology operations
Fixed multi-edge merge in mesh editor
Fixed vertex paint on non-manifold meshes
Fixed BoolControlWidget not calling SignalValuesChanged
Fixed NRE in console autocomplete for convars
Fixed various issues reported in PVS static analysis
Fixed URL validation hanging on DNS lookup
Fixed DefaultMap stomping map selection for games that don't use the create game modal
Fixed `TaskSource.WhenAny` not returning the completed task
Fixed ModelPhysics created components not being available immediately after creation
Fixed isolate selection when isolating children
Fixed resize mode in mesh editor
Fixed extrude nudge direction
Fixed pivot mode snapping
Fixed crash web page opening on benchmark runner
Fixed Steam networking stutter on joining clients from stats collection on connections that haven't finished handshaking
Fixed runtime configs not matching sbox.runtimeconfig.json
Fixed incorrect tintMask in material output. Thank you @Beldaa!
Fixed `GetComponentsInParent` in TriggerHurt causing double damage with player controllers. Thank you @Deotexh!
Fixed a stutter on dedicated servers when new clients joined
Fixed maps with a target game not launching at all for other games
Discover in it's own menu tab, Games has no dropdown, Hub removed
Game browsing uses new ratings and tags
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-05-06
The review system has been updated with tags. This will allow users to select specific elements of a game that they like, or don't like.
These tags are aggregated so you can see exactly what everyone thinks at a glance.
The intention is to use these reviews to punish and reward games in terms of discovery. We'll also be able to create new discovery categories, like most original, most polish and biggest ai slop.
You can now file reports in game. The reports system has a similar tag system, which allows us to categorize and group the reports on the backend. This should help us tweak discovery too.
We've updated the performance metrics page to be even more transparent, not only showing medians but also first (P25) and third quartiles (P75) showing the worst and better experiences.
There's now a breakdown of the best and worst performing popular games on the platform.
As well as a breakdown of the best and worst performing popular hardware - as you can see we have a lot of work to do with the Steam Deck still.
We've moved away from Cloudflare for both our API and CDN, replacing them with Azure Front Door and Bunny.net. There's advantages and disadvantages of course, but they've left a bad taste with obscure pricing that we'd rather not support over all.
This isn't really a drastic change for us, our tech stack is flexible enough that we can try out different places easily.
Most people shouldn't even notice a difference, downloads should be just as fast.
For Russians it should be great since Cloudflare is mostly blocked there, so now you should be able to play the game without a VPN.
We've optimized the loading process, especially when joining servers and lobbies. Joining should be up to two times faster now.
Turns out, that for years, we were loading and compiling packages twice on connect, that's fixed now.
When we released we got a shit load of lobbies - querying 1000 of them on the main menu was causing big stutters for some people.
Whilst querying lobbies is async it wasn't always being done on the thread pool, and if it ran on the main thread it would stall the game for 2.5 seconds each time it queried lobbies every 10 seconds.
We've fixed this by both: optimizing the actual query removing heap allocations and locks, and enforcing the work to be done on the thread pool.
Steam trading cards are now avaliable along with emoticons, badges and profile backgrounds.
These won't drop if you got the game for free unless you've purchased cosmetics, that's just how Steam works.
You can also get these items in the Steam Points Shop.
The price in Poland was bullshit, it was set from Steam's pricing tool but didn't properly reflect the current economy. So last week we changed it from 91,99zl to 69,99zl.
If you got it whilst it was more expensive feel free to refund and rebuy.
Our first weekly patch after release! 🎉
While there has been a lot of negativity, both deserved and undeserved, it has been really great to see people enjoying everyone's game. I love seeing developers see their games get played. It's exactly what we have been missing during the developer preview, where people only really played their own games. Now we're seeing real world usage and we're reacting directly to it.
We always release as early as possible and iterate. We did it with Garry's Mod, we did it with Rust, and we're going to do it with s&box. We know what our challenges are right now. We know what sucks, and we're iterating to fix it all.
Cya next week for another one 😘
garry
🎁 Added
Project templates including Player Controller, Sandbox Map, and Sandbox Game Addon
Mapping components: door & button with Doo support
Content reporting system
Reviews now let you select various positive and negative tags
Prop explosion damage now includes an "explosion" tag so games can react to it
`Connection.OwnerSteamId` shows the owner of a family sharing account
`Sound.Play(SoundEvent, Mixer)` overload for playing sounds with a specific mixer
Separate mesh components added to object selection mode (Alt+N)
Drag models, maps, sounds directly into the Hierarchy panel instead of just Scene View
Tools context menu showing per-tool keyboard shortcuts
`version` console command to display engine version info
Allow multiple `\` attributes on a single property
Physics simulation on proxy rigidbodies when transform sync is disabled
🧼 Improved
Loading screens now show meaningful progress with the main thread unblocked during load
Scene objects now render off the main thread by default, improving rendering parallelism
PreJIT moved off main thread, eliminating 4+ second stalls when joining servers
Clients no longer download redundant code archives when joining servers, cutting load time by ~33%
Lobby queries are significantly faster with async processing and reduced allocations
UI panels with backdrop blurs can now be batched, reducing draw calls
Matchmaking silently retries the next best lobby on connection failure
Particle system performance improved with object pooling
PolygonMesh.Rebuild optimized — menu scene mesh build time reduced from 1s to 300ms
Eliminated per-field boxing allocations in network message serialization
Reduced sound cache memory usage from 512MB to 256MB
Sprite batch rendering uses zero-copy approach for better performance
Deep-copy of embedded resources only performed in editor, not at runtime
"Waited 500 ms for jobs to complete" no longer gets stuck on main thread jobs
🪛 Fixed
Collision contact point calculation using best separation from manifolds
Potential crash with material overrides when copy source handle is invalid
Managed callbacks firing before BuildDependencyData completes
Vulkan swapchain destruction handling
Material load reentrancy crash in terrain tool
Animated textures (GIFs, animated Steam avatars) not playing through the lazy load path
`GameObject.GetBounds` incorrectly including origin when components have bounds
Box/lasso selection picking hidden objects in the editor
Unfinished mapping primitives lingering when entering Play mode
Death ragdolls spawning in T-pose on explosion
Vertex paint tool undo/redo sync, selection tracking, and vertex count display
Duplicating GameObjects sharing ResourceGenerators between original and copy
Lobby privacy settings not being applied immediately on creation
Other players appearing with no clothing due to inventory verification on clients
Unowned avatar items not being removed when first loading
Esc Key now closes modals, dropdowns, and cancels text entry
Footer friends list debounce
Missing Steam auth ticket validation
3D text bounds not recalculating when text properties change - Thanks @Infiland
All-white material thumbnail lighting on blend and reflective materials - Thanks @frotstar
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/post-release
The release went pretty much exactly as expected and has put us in profit for this month. We've enjoyed seeing people play on twitch and youtube and hearing all the feedback from you guys. A lot of it has already started to be implemented. The backend went down once or twice. One time we accidentally DDOS'ed ourselves, and one time we had to scale some services to meet demand. As it usually is in these scenarios, the services that got overwhelmed weren't the ones we had considered at all.
Our current mixed review status (44%) wasn't unexpected. It's the reason we didn't want a frontpage takeover or any other push from Valve, because we wanted people to find this organically - not have it sold to them. The main complaints are AI Slop, Performance and This Isn't Garry's Mod. Not forgetting of course, our biggest fans got the game for free - so can't leave a review. I want to talk through some of these complaints below.
We released yesterday and made a bunch of money and got a bunch of new players, so we've doubled the play fund to $1,000,000 a year.
It's our hope to grow this more over time. We'll review it in a month to see what we're able to do.
The huge majority of games are created by smart, dedicated humans. So when the games are dismissed as "AI slop" it's really an injustice to the work those developers have put in.
Some games have their thumbnails created by AI and so get dismissed too. I don't think these guys are doing themselves any favours, but it's easy, so people do it.
AI is the teacher now. It's how people are going to learn how to program from now on. They're going to be generating their own examples and have it explain the code to them. I feel that outright banning the use of AI is a bad thing, because I'm not worried, I think human creativity is always going to win out.
We're not an AI based product in any way, but we live in the real world, so we're not anti-AI either. We're not going to put a pointless AI Assistant button for no good reason. We're not going to shove any AI tools down your throat. We're not gonna have a "make game" wizard that generates code for you. But if the best game in the world is made using the help of AI we're not going to tell you that you can't post it.
Our discovery algorithm isn't perfect right now but we're improving it every day. The main aim is that the good games float to the top and the bad games float to the bottom, while offering new, fresh content to people all the time.
One of the biggest things we're getting nailed on is performance, so I wanted to share where we are with it, what we're doing now and what our long term plans are. If you're coming from Garry's Mod, things are going to feel different. Garry's Mod runs on a 20 year old engine that'll hit 300fps on a toaster - we're not there yet, and it's a fair comparison to make. We're aware that mid-range hardware in particular is having a rougher time than it should.
This is the worst the performance will ever be, we've been improving and will continue to improve. We know what the bad stuff is and we know how to solve it. We have a roadmap full of things we're actively working on to do it.
We sample performance data from the players across all varieties of hardware, and we display it all right here on sbox.game, this means when we fuck up you can hold us accountable, and when we improve we can gloat.
Here you can see we've improved from a 17ms average to a 12ms average in the past 6 months, this is from looking at profilers, seeing the worst thing and improving it. Rinse and repeat.
Here's our average frame times we're seeing on the most popular low -> high hardware:
Ryzen 5 3600 + RTX 3060 = 54fps
Ryzen 7 7800 + RTX 4070 = 108fps
Ryzen 7 9800 + RTX 5080 = 125fps
There's a lot to improve on here across all hardware tiers, but it's not completely tragic. Each combination will have it's own set of limitations we'll have to solve.
Most modern engines spread rendering work across multiple frames. Temporal upscaling, temporal AA, amortized GI - it's fast but it all adds up to a blurry, ghosty mess that falls apart the moment you move.
We're not doing that. We render one frame every frame. It should look great in motion, not just screenshots. We're doing forward rendering, MSAA and everything in one frame.
This is a challenge, there are problems that are harder to solve, but we'd rather face those challenges than take the shortcuts other modern engines do.
A release to a wider audience always brings focus onto the most important things that we need to do.
We have development challenges ahead of us but this is what we're here for. This is what we love. We love it when things break because then we get to fix them. We want the opportunity to show everyone what we can do, we want that fight 💪🏼.
🎁 Added
Server Browser shows ping
🧼 Improved
Marked loads of convars as cheats
Networking.QueryLobbies filters out disbanded lobbies
Hide hidden items unless they're owned
Performance analytics are sampled to 1% of users now
Update GameObject enabled status when changing parent
Call TransformChanged on inactive children too
Display org thumbnail next to org name in Game Modal
Optimize TypeDescriptor.Create
VideoPlayer: Support ctts 1 in MP4s
🪛 Fixed
Crashing during model hot-reloads (e.g spawning models from Sandbox)
Play Fund
Text rendering on top of blurred
Game.Render NRE
Modeldoc LOD UI fixes
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/release-26-04-28
After multiple years, multiple false starts and multiple engines, we're now finally live on Steam.
I told someone the other day that it's kind of embarrassing how long it's taken us to get here. That if I was going to make it all from scratch now it'd probably take less than a year. They made the point that that's like a song writer saying if I knew what the song was I could have knocked it out in 5 minutes. I think that's true. It would have been easy to have taken Garry's Mod and applied it to Source 2. I wasn't happy to do that. I knew we could do more, I knew we would have regretted walking the easy path.
It isn't perfect. It's likely never going to be perfect. At some point we have to say that it's good enough for v1. We know we have work to do. We know we have challenges. We know that we're going to have to find ways to deal better with discovery. We know that we have to deal with people using AI in obvious, low quality ways.
But we're happy for you to join us on our adventure. We hope you enjoy what we have created, that you enjoy what our community has created and that you will consider joining us and becoming a creator so you can fully appreciate the engine on the same level that we do.
It isn't perfect but at this moment in time It's both the worst it will be and the best it has ever been.
Our plan is to continue doing what we were doing. We will release weekly updates. We will listen to the community, we will play, we will develop and we will improve everything. Our roadmap shows a bunch of the bigger things that we're looking forward to improve on.
One of our main focuses is always going to be on how we're serving the community. I got my start in the game industry with Garry's Mod. A lot of our staff got their start in the Garry's Mod community. My proudest moments are when people have told me that Garry's Mod got them into the industry, that they are a game developer now because of that. I want Facepunch to keep doing that. I want to show people how fun and rewarding making games is. I want them to be able to make money from it.
Today, in the hopeful anticipation of finally being in profit, we're going to double the Play Fund. And it's my hope that we can steadily increase it more and more over time.
So more of the same. This is how we work. We release and improve. This is what we did with Garry's Mod, this is what we did with Rust. This is what we're going to do with s&box.
This is what we love doing. ❤️
garry
Linux Dedicated Server
Editor: Selection Sets
Editor: Paste Special
Native library loading now happens at runtime instead of at InteropGen, enabling cross-platform binary compatibility
Zio case-insensitive filesystem wrapper for Linux
Offline mode login handling is more resilient, menu no longer throws errors when launched offline
Video encoder now uses libyuv for much faster RGB to YUV conversion, enabling 2K AV1 recording at 60fps
Video export render target now uses MSAA, eliminating dithering artifacts
Video recorder quality improved for scenes with fast-moving objects and camera
Video container format settings now properly passed from managed to native layer
AO upscaler is now pixel-perfect compared to full-res, with proper MSAA support
Slow rotation no longer stutters due to improved per-component Rotation.AlmostEqual precision
Menu layout improved for ultrawide displays with constrained content width and feathered edges
Menu fixes across store CTA positioning, search overlay, server list filters, and various UI components
Batch publisher UX improvements including org handling and completion messages
Component categories reorganized for better discoverability in the editor
Removed unused shadow data from lightbinner, cleaning up for future GPU-driven lighting
Missing undo support to TransformComponentWidget for reset, paste, and toggle operations
Storage settings page no longer takes minutes to scan large download caches. Thank you @Zaddish
StringBuilder race condition that could lead to remote code execution
Two AnimGraph crashes
Crash in FindOrAllocateTransforms during model hot-reload
CResourceSystem crash when reloading symlinked resident resources on Linux
WebM video header being written twice
Odd-size resolutions breaking the AV1 encoder
Inverse scissor box shadow rendering in UI
World panel transformation being applied twice in subpanels and render targets
IsRunningOnHandheld always returning false, causing small UI on Steam Deck and other handhelds
Dedicated server errors when using Steamworks.Friend methods
Focus in 2D editor views incorrectly moving camera toward objects instead of framing them
Rigidbody properties not being reapplied when ModelCollider updates, causing lost gravity scale on resize
Editor exceptions when performing large project structure changes
Client disconnect not triggering when game load fails during handshake
Shorts clothing models clipping with the player body
Menu carousel null reference exception
Menu toggle styles and context menus on game cards
Restored holding ESC to force quit game
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-04-22
Here's some highlights from the blog.
You can link cameras to TVs now, great for contraptions, or just generally messing around.
This is a feature I added a few weeks back, but it really shines now with the addition of the Rocket Launcher, and support for the Physics Gun.
This means your contraptions can shoot rockets..
Sometimes, when trying to join a game, you'd get thrown back to the menu without really knowing why or at what point things went wrong. So this week, we've straightened out the connection flow, formalised things under the hood, and added a bunch more feedback.
Players will now see big new message boxes when they're disconnected from a server, or when a connection attempt fails, with fairly descriptive reasons. This is how we show kick messages now too, and we've fixed an issue that would sometimes make these messages appear garbled, so you'll know when you've been kicked for RDMing and to hang your head in shame.
After merging UI batching and new shadows we've been seeing some minor to intense artifacting on AMD cards.
We switched all these shaders to use bindless textures, which are great but needed explicit marking with NonUniformResourceIndex to work in non-uniform cases (which were 99% of our cases...). Whilst we were marking these like Bindless::GetTexture2D( NonUniformResourceIndex( TextureID ) ) they weren't actually doing anything as a function parameter, they needed to be done on the descriptor heap itself.
The solution was simple, if 99% of the time we needed to be doing NonUniformResourceIndex we might as well do it inside Bindless::GetTexture2D( TextureID ) so people don't have to bother with what it means. If we have justification to we can do a variant for when you know you have a uniform resource index.
No more artifacts on AMD.
We've removed FFmpeg and replaced it with our own implementations of a few codecs, we now only support the following formats: VP9, AV1, animated WebP, H264.
We've also reworked our workshop to serve videos in the AV1/WebM format, this means videos are about 50% smaller and load faster.
I've updated our open finance metrics to be even more detailed, adding our costs for running s&box as a company, salaries, server costs, taxes, play fund, it's all there.
People will say it's crazy to be this transparent, showing how much we're making or even losing - I think the benefits outweigh the negatives, it's important people see the sustainability of the platform. We're not after short term financial success here, we're here for the long haul.
We got UI Batching in last week which came with a huge drop in draw calls and a big increase in FPS. This was a huge change for the huge amount of things we could do with our UI system and all the various ways you can layer and blend your panels together - obviously some things broke, but we've fixed them. 💪
Blend Modes
The most noticable bug was blend modes weren't being set correctly, our text renders should've been rendering in a premultiplied alpha blend mode but weren't, creating very unappealing text. This was also noticable in the Sandbox mode inventory.
Deferred Batching
But fixing this had broken our batching all together, we were doing immediate mode batching, every bit of text was causing a flush and breaking the batch. We needed a new approach. Deferred collects it all first, sorts it into groups with a sort key derived from the z-index, the layer, the blend mode, then flushes in the new sorted order.
The images show:
Immediate batching with improper blend modes
Immediate batching with proper blend modes
Deferred batching with proper blend modes
Parties have been a thing in S&box for ages, this week we've given them a pass to refresh the UI, better integrate them with newer systems and features, and cut the faff.
Before now, parties were a bit tucked away, accessed from a creation menu on the main menu footer. Now, you're basically always in one. You can invite a friend right off the bat, and we'll automatically set up the real party behind the scenes.
There's been a bunch more changes to buff up the party experience, too: You now need to be party leader to be able to start and join games. You can kick players from your party. You can invite friends and accept their invites directly from the Steam overlay. Party voice chat is back. And just like for game servers, we've added more player-facing feedback when joining and creating a party - maybe it doesn't exist anymore, maybe it's full, now you'll know.
Parties are a quick and easy way to experience games on s&box, and they work just like you'd expect. Invite your mates, and they'll follow you right into any game on the platform. Give it a go! 🥳
Done the second part of AO optimizations, AO runs at half resolution now, so it's 4x faster while keeping same sample count as previously, 16x if on low preset (quarter-res), the upscale makes it look pretty much the same, going in line with what others do.
The optimizations from previously made spatially denoised AO look like shit, so I've completely redone the denoiser it uses, and it looks as good as the temporal approach.
We deprecated temporal denoising, it's all done in one frame - we want to prioritize pleasent gameplay experiences by focusing on image clarity and stability instead of photorealism and excess graphics fidelity.
Automatic LOD generation in ModelDoc, allowing users to build LOD chains from a single mesh. Auto-generated and handcrafted LODs can be mixed.
Spritesheet Importer for the Sprite Editor with automatic strip detection, row/column selection, and persistent padding settings.
Bridge Tool for the map editor, enabling quick bridge geometry creation between surfaces.
Clip Tool cycle mode for toggling between clip sides without restarting the operation.
SoundFile.FromMP3 API for loading audio from MP3 files in mounts.
SoundFile.FromPCM API for loading raw PCM audio data without creating a fake WAV wrapper.
Editor option to hide GameObjects in the scene view while keeping them visible in the hierarchy.
MovieRecorderOptions.BufferDuration property for ring buffer recording mode, with `movie_save` command to save without stopping.
Foliage Subsurface Scattering using an improved Frostbite-based SSS term, restoring foliage rendering broken in the Shadows2 update.
Ctrl+A shortcut now selects all faces in texture mode, matching face mode behavior.
Whitelisted `System.Threading.Tasks.TaskCreationOptions` for sandbox use. Thank you LeQuackers!
Apply-and-continue shortcut (Spacebar) for the Clip Tool, allowing consecutive cuts without exiting the tool. Thank you @trende2001!
Background Audio toggle in Audio Settings. Thank you @drekunia!
Sound file support for the NS2 mount, reading FMOD sound banks with PCM16 and MPEG formats. Thank you @nixxquality!
🧼 Improved
Removed FFmpeg dependency entirely, and replaced them with other alternatives -- reducing binary size by ~30MB and improving video export quality.
Movie Maker timeline grid rendering optimized from >10ms to <1ms by only repainting when the view changes.
Multiplayer party system improvements: Steam party invites now work, menu buttons restricted to lobby leader, player kick functionality, auto-leave when joining a different server, and better error messages.
Better disconnect feedback with formal disconnect messages, retry support for SteamId connections, and connection loading screen fixes.
GameClosedToast lifetime increased from 4 to 10 seconds, countdown pauses while hovered.
Mesh components now automatically add a world tag to their GameObject.
Bindless shader API now uses NonUniformResourceIndex by default, removing redundant explicit calls.
Upgraded Zio library to latest version, fixing a detected security vulnerability.
Menu UI/UX cleanup: GameCard activates on click, adjusted heading sizes, removed unused styles.
Line material now lazy loaded in a thread-safe way.
SceneCustomObjects now safe to run on non-main thread.
AssetSystem defers orphan deletion until parents are fully resolved, preventing incorrect asset removal during project load.
SpriteBatchSceneObject sprite data collection moved back to UploadOnHost, fixing single-frame sprite artifacts.
Physics filter component now creates its internal joint in OnStart, ensuring rigidbodies exist first.
Fast Texturing Tool settings now properly saved when the window is closed and undo scope is correctly disposed in all cases. Thank you @CarsonKompon!
Editor Widget API: OnWheel renamed to OnMouseWheel for consistency with other mouse event callbacks. Thank you @RumBugen!
Formatting for \ in collections is now correct. Thank you @boxrocket6803!
🪛 Fixed
VR editor play/stop crash no longer occurs when toggling game mode.
Asset scan startup crash resolved.
Assets now correctly detect changes when activating mods.
UI VRAM leak fixed by removing threadlocal panel renderer and adding proper thread synchronization.
Sprite.BroadcastEvent type now displays correctly with proper \ attribute, and unnamed broadcast events render properly.
EnumControlWidget now correctly triggers OnChildValuesChanged.
HudPainter.DrawLine now handles colorspace (gamma correction) and blend modes correctly.
Menu fonts no longer disposed when unloading games, fixing garbled text in the overlay.
Menu no longer clears out when game load is cancelled or errors at certain points.
Foliage red flicker issues fixed, along with improved antialiasing.
ModelDoc Auto LOD fixes: ngon simplification, infinite loop in mesh list simplification, better tooltips and defaults.
Menu framerate limit setting now persists correctly. Thank you @RumBugen!
Standalone startup timing event submission no longer throws a NullReferenceException. Thank you @RumBugen!
SCSS inset values with commas no longer break shadow lists. Thank you @boxrocket6803!
UI tooltip children now have pointer-events: none, and hover flicker on icon edges is resolved. Thank you @pedroforbeck!
🚯 Removed
FFmpeg dependency removed, replaced with free codec alternatives.
MPG123System removed from binding definitions.
Fixed a VRAM leak with the new UI batching causing out of memory crashes
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-04-15
Here's some highlights from the blog.
Thank you for everyone that has helped us during this period - the developer preview is now closed!
The developer preview has been invaluable to the development of s&box, putting the engine in front of it's core audience from day 1 - you guys telling us what you love and what is shit has turned the engine into what it is today.
We'll be open again on Steam on the 28th April for $20.
Out of 800,000 people who joined the developer preview, 40,000 get to keep it and the rest have been revoked. Who got to keep it:
Developers who have published games people have played
Anyone who has purchased any cosmetics
Anyone who has played a good amount and actually opened the game this year
We're doing this in batches, making sure it's right, it might take a short while to complete.
I've merged the UI batcher, which means UI will render much much faster now. You can expect major performance improvements in your user interfaces(which is almost every game) with some users reporting up to 54% more FPS while on the menu.
Previously we would render each panel individually as we traversed the DOM. The GPU would paint each individually which worked fine for a while. But as complexity grew, the number of individual draw that your GPU would execute would affect performances. We can now, in the best case scenario, draw everything all at once.
Our discover page went down from 1080+ draw calls to only 5.
We've added a parallel / upright joint, so you can keep objects upright reliably.
🎁 Added
Added `UprightJoint`, which constrains objects to remain upright, useful for characters, vehicles, and other physics objects that should resist tipping. Also has a parallel mode when targeting another body.
Added on-demand navmesh tile generation API — new `NavMesh.DeferGeneration`, `NavMesh.RequestTileGeneration`, `NavMesh.RequestTilesGeneration`, `NavMesh.UnloadTile`, and `NavMesh.UnloadTiles` APIs for large open-world games that need to generate and unload navmesh tiles at runtime rather than all at once on load.
Added a search bar to the main menu navbar for quickly finding games and content.
Added "Convert to Mesh" in the mapping editor — converts a placed model to an editable scene mesh, similar to Hammer's workflow.
Added `movie` command support for recording Light Components — light brightness and colour changes are now captured in recordings.
🧼 Improved
Rewrote the UI renderer with a batching system that groups panels into a single draw call where possible, yielding massive performance improvements — up to ~4× faster in benchmarks (40fps → 150fps). Also introduces a new `Panel.Draw.XX` API for custom panels to emit drawing commands directly.
Improved ambient occlusion performance with various shader and sampling optimisations.
Improved hotspot tool in the mapping editor — now uses the active material, supports mirror horizontal/vertical, and adds a per-face apply button.
Improved prefab editor performance when handling large prefabs — faster diffing and reduced initial load times.
Improved serialization accuracy for prefab and scene files — positions, rotations, and transforms no longer silently drift between saves, eliminating unnecessary prefab instance noise and large git diffs. Switched to lossless `G9` float format.
Improved `WildcardMatch` performance by replacing expensive regex with `MatchesSimpleExpression`.
Improved shadow mapper hot path by eliminating array, `IEnumerable`, and LINQ allocations.
Improved `SetObjectBounds` with minor overhead reductions.
New s&box installs now default to MSAA 4× anti-aliasing on first launch.
"Make Editable Mesh" in the mapping editor is now undoable.
🪛 Fixed
Fixed a VRAM leak where shadow map textures were never returned to the pool when a `SceneLight` was destroyed — in scenes with many lights this would fill VRAM quickly.
Fixed a transform equality regression where `Rotation.AlmostEqual`'s default threshold was too loose (~1.62°), causing `SetLocalTransform` to silently drop small updates and producing jittery camera movement.
Fixed `Rotation.AlmostEqual` incorrectly returning `false` for two default (zero-length) quaternions.
Fixed cascade shadow exclusion culling overculling objects at the edge of shadow cascade spheres.
Fixed managed textures (prefab-embedded textures) never being present on headless/dedicated servers, which caused missing icons for inventory items, health, ammo, etc.
Fixed `ScenePanel` being completely reset on hotload — panels that manage their own `Scene` now survive hotloads intact.
Fixed the `TextEntry` caret becoming invisible after the move to command lists.
Fixed a ~300ms stutter when first opening the settings panel.
Fixed `MaterialAccessor` retaining stale material overrides after deserializing new data, causing phantom overrides to persist after prefab instance reverts.
Fixed `PolygonMesh` writing world-space properties into JSON, which broke prefab diffing.
Fixed blob IDs regenerating on every save, producing unnecessary git noise.
Fixed light probe regression caused by an incorrect call to a stubbed `RenderDevice->IsUsingGraphics()` on headless servers.
Fixed modeldoc wireframe rendering.
Fixed crash when accessing `MusicPlayer.Title` with an invalid URL.
Fixed assert triggered on `MusicPlayer` disposal.
Fixed null `TargetComponent` crash in the Doo invoke block inspector.
Fixed `SimplePicker` showing cloud assets when searching in the "Local Assets" tab.
Fixed package modal portal layout regression.
Fixed several Linux server path and library casing issues that prevented the dedicated server from starting.
Restored center pivot behaviour in object selection mode.
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-04-08
Here's some highlights from the blog.
The Sandbox game itself is now open-source, people can contribute or take the code for their own games.
🎁 Added
Doo, a simpler visual scripting system for wiring up component events — designed as a friendlier alternative to ActionGraph for common use cases
Mesh cable tool in the mesh editor for creating cables, working similarly to Hammer
New games dashboard with a rotating carousel and redesigned game cards
`lang.showkeys` cvar and editor toggle to display localisation keys instead of translated text for debugging
CSS `overflow: clip` and `overflow: clip-whole` properties for UI element clipping
CSS `background-playback-state` property to pause video backgrounds
`\` and `\` attributes now support null checks
Center option added to the pivot list in mapping tools
`IFormattable` whitelisted for use in the sandbox. Thank you @RumBugen!
🧼 Improved
Texture editor moved into the inspector - Thank you @boxrocket6803!
Cascaded shadow map exclusion culling — shadows no longer render beyond each cascade boundary and objects from previous cascades are no longer re-rendered, significantly improving shadow performance
Networking thread now processes messages at the same tick rate as the main thread
Particle sprite GPU upload performance — buffer uploads moved into valid Graphics.Scope to avoid unnecessary render context creation
Network packet byte arrays are now pooled in DecodeStream, reducing GC pressure for large compressed payloads
Fixed a Steam buffer GCHandle leak where N-1 handles would leak per broadcast packet; replaced with a cheaper memcpy approach
`Package.MountAsync` now supports mounting specific package revisions, allowing games to pin map versions
`LoadingScreen.IsVisible` is no longer overridden every frame, allowing games to manually control loading screen visibility
`Game.ChangeScene` now shows a loading screen for all clients instead of just the host
Engine overlays remain visible during loading states
ScreenPanel `Scale` property now works when Auto Scale is enabled, and `Opacity` now correctly affects ScreenPanels
Undo support for WrapTextureToSelection and WrapTexture operations in the mapping tools
Pause modal now uses the lighter HtmlPanel instead of a full WebPanel
Launcher window geometry is saved when auto-closing
PATH changes are now a no-op on non-Windows platforms. Thank you @MrSoup678!
🪛 Fixed
Disabling shadows on a directional light now works correctly
Shader compiler shutdown crashes resolved by properly draining the material system and preventing Steam callbacks after managed shutdown
Exceeding the maximum light count no longer triggers assertions or causes directional light flickering
`GetPixels` arguments are now validated to prevent negative values, fixing a security vulnerability
Referencing a deleted prefab no longer crashes — the editor shows a warning and preserves instance data for recovery
Creating a prefab from a GameObject now correctly restores the object's position
Reverting changes on a nested prefab instance no longer wipes all outermost overrides
Applying changes to a nested prefab no longer regenerates all GUIDs
Fixed cyclical library references caused by built-in projects referencing libraries
Fixed a null `AssetTypeAttribute.Name` NRE that silently shut down the GameInstance on editor startup
Game loading is now properly cancelled on disconnect, preventing background loads from continuing
Fixed filesystem unmount exceptions when a load is cancelled
Prop gibs now properly inherit velocity when spawned in a batch group
`IgnoreSingleObject` trace now correctly checks both rigidbody and collider GameObjects
Glass shader tint now blends correctly through multiple layers using premultiplied alpha blending. Thank you @Infiland!
`backdrop-filter: blur` no longer generates excessive mipmap levels Thank you @Infiland!
Toast notifications (e.g. achievements) no longer persist indefinitely
Post-game info popup is no longer dismissed on click, so its actions can be used. Thank you @RumBugen!
Fixed human models having deformed hands with the "holditem" holdtype
Fixed TextRenderer alignment not updating on re-enable
Fixed possible NRE in `Button.Text` setter
Fixed possible NRE in `UpdateMusic`
Grab yourself these Community-made cosmetics! Mob Boss Pinstripe Trousers, Waistcoat and Shoes, Golden Earrings, Pirate Hook, SWAG Chain, Bandana Hair and Bag Mask!
Sale ends May 1st 2026, after which it'll only be available on the Community Marketplace. Sales proceeds go towards the cosmetic item's creators, the playfund and engine development.
Playfund data is public. Learn more about the playfund and track how much money we pay out to s&box cosmetics and game creators here:
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-04-01
Here's some highlights from the blog.
We overhauled the third person camera to be a lot smoother, so being in a vehicle feels great.
You can now stick hoverballs on your contraptions to fly around!
There are now Saves in Sandbox so you can save and load entire play sessions. These work in singleplayer or multiplayer, and will keep track of the map, players, all props and entities, ect.
We had no ways to configure the performance settings of shadows, now we have a shit ton of convars to control max shadows, max number of cascades, shadow filter quality, max resolutions, and more.. These are globally configured in the graphics settings menu now too.
We've made our input system use scan codes now, which standardizes input keys based on position instead of name. Meaning when a game binds something to the W key, if you're an AZERTY keyboard that will be bound to the Z key automatically.
Everything is continuing to come together, we've been playing Sandbox everyday, it's starting to feel very well rounded. Building contraptions, messing around, taking screenshots for our Steam page.
We tried to quietly announce our release date — 28th April, but it seems everyone has got excited. Before then we'll be revoking anyone who hasn't played a lot recently, developed games or bought skins. And we'll then go on sale for $20. It's April — we've got the month left to really beat out the worst of the rough edges. Don't expect too much fanfare in the upcoming updates, we're doing the boring stuff before we can get to the fun stuff again.
🎁 Added
New C# shadow mapper, fully replacing Source 2's native shadow mapper
Bindless per-light shadow maps
Directional light configurable cascade counts
Per-light shadow hardness
User quality settings for shadows
ModelDoc hulls from meshes now supports per-mesh and per-element hull generation, allowing better collision when saving map meshes with mixed hull and mesh collision types
HtmlPanel now supports ordered and unordered lists
Footstep sounds for glass surfaces
Mesh element selection now supports undo/redo in the editor
New hub page layout with smarter game cards showing upvotes/downvotes and active players, condensed friend activity grouped by game, and achievements sorted by completion percentage
Movie recordings can now be imported from any game into a blank project, and games can disable demo recording on clients
🧼 Improved
Input system now uses scan codes for gameplay input, making the game usable on non-QWERTY keyboard layouts (e.g. AZERTY) without rebinding — key glyphs are translated to local key names
Vulkan per-thread data rewritten with a dynamic slot pool that bounds memory usage and eliminates potential out-of-bounds access from unbounded thread indices
Pixel shaders are now stripped for opaque objects during shadow and depth passes, reducing GPU work
Physics hull creation is more robust, routing through CQuickHullBuilder to avoid potential infinite loops with coplanar points and adding support for planar geometry
Network broadcast now encodes the wire payload once instead of per-connection, and large messages are compressed before chunking — client decompression is ~3.4x faster
Network serialization omits null values, reducing JSON processing overhead and improving compression/decompression speed
Sprite system optimized to perform a single GPU upload instead of one per group, eliminating upload overhead
RadiusDamage batches and parallelizes LOS traces with reduced allocations, improving heavy explosion processing from ~10s to ~2s
Heartbeat ping/pong switched to unreliable channel, eliminating head-of-line blocking under packet loss
Movie recording performance improved by avoiding reflection in hot paths, reducing per-frame recording cost
🪛 Fixed
Potential infinite loop in PolygonMesh.Rebuild with fractional/coplanar vertex positions
Memory leak in DeltaSnapshotSystem where pooled snapshot IDs were not cleared before returning to the pool
OutOfRangeException in Rigidbody when Bodies and BodyTransforms sync lists arrive independently
"Lobby Disbanded" spam, lingering socket, and stuck loading screen when host disconnects mid-join
Modals not closing when joining a game, server, or lobby
Lingering error toast popups not dismissing across game/menu context switches
Atmosphere sky shader not using the new single sunlight path
IgnoreGameObjectHierarchy not applying to child objects
Client hotload not clearing reflection type cache, causing errors after server-side code changes
Damage falloff being inverted in RadiusDamage
Movie recording of TextRenderer, NaN rotations, and target creation edge cases
🚯 Removed
Deprecated OnDirty, MakeDirty, and OnPropertyDirty in favor of field-backed properties
Make the most of Easter with the Easter Bunny Hat and Easter Bunny Nose, perfect for sniffing out easter eggs!
These items are only available in the store until 13th April 2026, after which it'll only be available on the Community Marketplace.
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-03-25
Here's some highlights from the blog.
We're getting closer to release, so we want to start being more open about what's coming next. We've put together a public roadmap - think of it less as a strict plan and more as a big wishlist of high-level features we're excited to work on.
It's not everything. It's not a promise. It's the stuff we're genuinely pumped about and want you to know is on our radar.
You can upvote items you care about and leave comments - so if something matters to you, let us know.
We signed the new license with Valve this week, allowing us to allow people to export games from s&box's editor and ship them as standalone games on Steam completely royalty free. This has been a bit of a complicated journey, but with a lot of reassurance and compromises, we've got there.
We still have work to do on our end. We need to create a license between Facepunch and the people shipping games, then double and triple check everything is legit, but I wanted to share this progress with the community so they know that Valve did the bizzo.
When it's ready we'll be piloting it with a few select people. The first out the door is likely to be My Summer Cottage.
We've added the first version of face posing to Sandbox Game this week, fully networked, and supports presets!
There aren't many weeks left until the doors open, so we're heads down making sure everything's ready. There's always going to be things we could be doing better. At some point you just have to say "this is the release" and do it. So that's what we're doing.
Right now the focus is simple - rounding off as many sharp edges as possible from a player's perspective. How do we make that first experience as good as it can get? What games do we point new players to so they have a great time right away, and want to stick around and explore?
🎁 Added
Mounts can create prefabs with PrefabBuilder
Open the pause menu programmatically with `Game.Overlay.ShowPauseMenu()`
Cylinder hitbox support in ModelDoc
`Model.SaveToVmdl` and `Model.SaveToVmdlAsync` APIs for saving models to VMDL format
Select all support for vertex, edge, and face in the mesh editor
Lift vertex color under cursor in the vertex paint tool
Network diagnostic tools with `net_diag_record` and `net_diag_dump` console commands for detailed RPC and sync var stats
ConVars for maximum incoming and outgoing network messages per tick
Support for `font-variant-numeric` CSS style property with `tabular-nums`. Thank you @aidencurtis
🧼 Improved
Smoothstep anti-aliasing for rounded border corners in the UI
Video player now uses a compute shader for YUV resolve instead of VS/PS
Updated zstd compression library from 1.4.6 to 1.5.7 for faster shader compilation
Morph crossfade control between animation-driven and override morphs
Mesh trace now supports RunAll for tracing all mesh components
Interop code generation optimizations
Reduced LINQ usage in hot paths to eliminate iterator allocations
`ClipScope` is now a ref struct to avoid megabytes of heap allocations per second
Eliminated array and list allocations in `TemporaryEffect.OnUpdate`
Asset Browser defaults to sorting by name and fixes context menu for mounted assets
Demo recording improvements: parent change recording, skeleton bone detection, ragdoll physics fix, and cloud asset references
Terrain tool UX: opacity slider is now disabled for base layers with an explanatory tooltip
Better menu avatar lighting with AGX tonemapper
ThumbLoader now waits for thumb render in the editor instead of returning a placeholder icon
Unix platform support: ARM64 interop fixes, DLL import resolver, Mac now uses KosmicKrisp instead of MoltenVK
`MODES` section in the compute shader template so new compute shaders work out of the box. Thank you @boxrocket6803
`STANDALONE` compile constant when exporting standalone games. Thank you @boxrocket6803
🪛 Fixed
Envmap rendering everything in one frame, overwhelming descriptor pools and crashing
Multiple Vulkan validation errors on boot and game launch
`CommandList.DrawText` evicting textures in cached CommandLists
`Gizmo.Draw.Sprite` crash when used with a texture URL
Labels not redrawing when text is cleared
File path DragData URIs containing `#` being truncated
Networking: DeltaSnapshotCluster ID not being set from pool, incorrect KB/s in Network Graph, and sent cluster tracking
Duplicate/Group crash with prefab roots
System config enum deserialization
`FindDirectory` throwing exceptions for missing directories
Frame 0 bone-merged renderers stuck in bind pose for avatar hover icons
Multiple null reference exceptions in ThumbLoader, UI selector, and mount textures
Menu overlay being attempted in standalone mode
Network `CanRefreshObjects` validation for refresh messages
Addon libraries editor not being loaded. Thank you @PolEpie
⚠️ Known Issues
Still seeing a small amount of crashes on latest Nvidia drivers
There was a crash when using new NVIDIA GeForce 595.71+ drivers, we have released a hotfix for this.
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-03-18
Here's some highlights from the blog.
We've added a demo recording feature this week, fully integrated with Movie Maker. You can record objects and components in your scene to a MovieClip that can be played back in-game, or imported into Movie Maker for further editing. These movies could be edited into gameplay trailers or machinima, or used within games for killcams, leaderboard replays, or tutorial demonstrations.
We released our first public version of Sausage Survivors 2 this week, give it a go! Community member Eridium did a great video covering it too below, including some developer interviews.
🎁 Added
In-game demo recording for Movie Maker — automatically record objects with renderer components in any game, play them back in-game or import into the Movie Maker editor
Mapping displacement tool for terrain sculpting, similar to Hammer
Paste and duplicate objects at cursor position in the editor, with an option to disable in editor preferences
Up/down arrow keys now nudge the value of float and integer controls when focused
Float control step buttons for fine-tuned value adjustment
Quad slice line preview when changing the number of cuts
Added `GameObject` reference to missing component log messages for easier debugging
Added `TypeHintAttribute` for Object/Value types with hinted types
Added `ControlWidget.OnLabelContextMenu` for extending right-click context menus on control widget labels
🧼 Improved
Upgraded shader compiler (DXC) to HLSL 2021, enabling namespaces, improved syntax, and paving the way for Slang migration
Sprite batch bounds are now calculated in parallel for better performance
Fast Texturing Tool initializes the rectangle based on existing UVs instead of defaulting to full-size
Resize tool now works on all selection modes, not just the default
Clip tool improvements
Allocation overlay now shows additional stats and improvements
Undo dock UI improvements
Launcher UI tweaks — fixed text alignment, boosted button brightness, consistent window icons
Replaced VariantControlWidget switcher button with right-click label
Gibs now use BatchGroup when spawning for proper networking to non-local clients
`InterfaceConverterFactory` now respects `JsonConverterAttribute` on interface types
`GameTags.GetTokens` now returns all tags including ancestor tags
`GetTokens` now uses atomic pointer swap to avoid race conditions when iterating
🪛 Fixed
Dresser component fully trusting user data, allowing players to equip cosmetics they didn't own
DDGI stale buffer crash caused by referencing deleted Vulkan buffers in render attributes
Bounds calculation for boneless meshes on `SkinnedModelRenderer`
Defensive checks for valid poses and bones to prevent animation system crashes
Cash on shutdown caused by `crashhandler64.dll` — now properly calls `SteamAPI_Shutdown()`
Race condition crash during Steam Audio HRTF initialization
Persistent data loading crash when files no longer exist on disk
ModelDoc close crash by removing all binding targets before shutdown
Terrain flickering caused by divergent GPU access on AMD GPUs
Vulkan validation error for `NonPixelShaderResource` pipeline stage flags in barriers
`SpriteRenderer` sorting improperly against other renderers like `TextRenderer`
Texture corruption caused by `CopyFrom` unregistering textures from the resource system
UI regressions — filter applying after transform causing cropped images, and rotation animation using distance-based lerp
Toolbar buttons in viewport sidebar disappearing after exiting Play Mode
`MemberCopyCache` hotload exception
Undo breaking when undo scopes made no changes — now properly cleans up with try/finally
Navmesh bounds not updating when loading scenes in succession
`OnDragStart` sometimes getting called twice, causing multiple drops
Incorrect offset when extracting faces from a scaled mesh
Bake scale recomputing UVs from coordinates instead of preserving existing UVs
Underwear appearing incorrectly when legs or chest are hidden by clothing, and removed underwear from clothing icon previews
Terrain texture memory leak on prefab save — terrain component now cleans up on destroy
Editor camera NRE when double-clicking a GameObject in the hierarchy during Play Mode
Protected command bypass in `ConsoleSystem.Run`
`CompilerService` attributes-based RCE exploit by blacklisting `UnsafeAccessorAttribute`, `SkipLocalsInit`, and `AsyncMethodBuilder`
Audio thread safety issues — audio resources are no longer destroyed by the main thread while in use by the mixing thread
⚠️ Known Issues
Nvidia drivers 595.71 onwards crash, last knowing working version is 591.86
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-03-11
Here's some highlights from the blog.
We've made some rendering optimizations this week, Screen Space Reflections is using indirect dispatches now, the GPU is feeding it's own commands, if you have this component enabled in your scene and just have rough surfaces it should have functionally zero cost now.
In a fully reflected scene you can see good improvements as well, our benchmarks SSR is down about ~0.4ms on average, whereas depth of field is down about ~1ms.
As part of adding spawnlists to sandbox, we needed to add some more features to our Storage/Ugc system.
You can now query for authors, specific workshop packages, and reupload workshop items instead of only publishing new ones.
Last week we reported that our crash rates are down.
That was fake news, we were tricked by our backend which wasn't recording the stats correctly. Turns out crashes are even slightly up, hovering around 4%, which is obviously too high.
We dropped a new batch of crash fixes this week that should bring that number down and will continue looking into it. Stability & Performance remain a primary focus while gearing up for the release.
You can hold us accountable and track our progress via
https://sbox.game/metrics/stability
Read more on the blog!
Grab yourself these Community-made cosmetics! Aviator Helmet, Surgical Face Mask, Sports Bandage, Siren Hands, Cardboard King, Navy Raincoat with Cap, Gumball Machine, and The Loving Look.
Sale ends April 1st 2026, after which it'll only be available on the Community Marketplace. Sales proceeds go towards the cosmetic item's creators, the playfund and engine development.
Playfund data is public. Learn more about the playfund and track how much money we pay out to s&box cosmetics and game creators here:
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-03-04
Here's some highlights from the blog.
A new tool has been added to procedurally place objects in your scenes. It is completely independent from the terrain system and supports both prefabs and instanced models.
It can be used to automate tasks such as procedurally generating landscapes, painting enemies, or even acting as a world grid system.
We're polishing the menu ready for release, nothing is significantly different but we're making it all look pretty.
The depressing dark foggy scene is gone and replaced with Flatgrass. The header bar has been spaced out and made transparent. And the latest update is display on the front page. We'll keep polishing stuff bit by bit each week.
UI could only render on the main thread - now it can render on any thread thanks to command lists. This means whilst your game is rendering the 3D world it can also start rendering the UI layers.
You'll notice a performance boost mostly on low-mid range CPUs and in games with a considerable amount of UI and 3D at the same time.
It can be toggled with the convar r_ui_multithreaded to measure impact.
We reorganized the timings so they now more accurately break down a the time needed to render a frame. Garbage collection pauses are now also tracked as individual timing, and subtracted from other timing scopes.
We also improved the visuals for various overlays with significant community contributions from @darkfated
The inventory got rebuilt to be slot based. You can drag and drop stuff from the spawnmenu right into your inventory. It's kinda cool.
The scoreboard and HUD got a new lick of paint. You can also mute people.
Brought up the weld tool to gmod parity by adding the ability to rotate after easy welding.
We also added a screen to the physgun that spits out info based on what you're doing with it.
🎁 Added
Clutter system — the clutter/scatter tool and system has been moved in-engine
CSS outline property — outline draws outside a panel's border without affecting layout, matching web standards
Multithreaded UI rendering — UI can now render off the main thread
New main menu front page — redesigned around flatgrass, refreshed navbar and footer
ContentBlock row scroll buttons — left/right scroll arrows appear on hover as an alternative to drag-scrolling
DepthTextureRef on RenderTargetHandle — lets you access the depth buffer of a render target in command lists, not just the colour buffer
Improved UI drag & drop — new OnDragEnter, OnDragLeave, and OnDrop panel events matching standard web behaviour
AdvancedDropdown — ComponentTypeSelector abstracted into a reusable dropdown that supports foldered menus
SerializedProperty.GetCustomizable() — creates a customisable copy of a property with an overridable display name and other metadata
MemberDescription.DeclaringType — exposes the type that declared the member
Json.Serialize / Json.Deserialize — low-level methods plus object/Type overloads for use with IJsonConvert
Package.MountAsync() — public API equivalent of the internal PackageManager.InstallAsync
Json.Patch, Json.CalculateDifferences, Json.ApplyPatch and related types are now public, along with GameObject.DiffObjectDefinitions and Scene.SerializeProperties()
TestAppSystem exposed to user unit test projects, replacing the old Application.InitUnitTest flow
Vector2Int and Vector3Int added to TryToType
Mirror tool now supports mirroring any selected object type, not just meshes
🧼 Improved
UI rendering now uses command lists — panels only rebuild their command lists when something actually changes, reducing per-frame work
Audio mixing allocations reduced — temp lists are reused in-place and the occlusion sort predicate is cached as a static
CommandList attribute access — switched from ConcurrentDictionary to a regular dictionary, cheaper and avoids expensive clears
Cluster lighting — Cluster::Query now takes a screen-space position instead of world-space, which was unstable near cluster boundaries
Razor incremental processing — only re-runs RazorProcessor on changed files and reuses SyntaxTree instances, speeding up hot reloads
Debug overlay visual clarity — render stats grouped into categories, timing fixed to CPU/GPU order, new metrics added, low-signal rows removed. Thanks @darkfated
SerializedProperty.TryGetAsObject now returns a SerializedObject of the actual runtime derived type, not just the declared property type
Close game if Steam is not running — instead of cryptic errors, the game now exits cleanly with a clear message
Error reports now correctly embed user information
Editor unit tests can now reference built-in tool packages (Shader Graph, Action Graph, Hammer, Movie Maker)
🪛 Fixed
DetermineHuman not checking the base model first, breaking dresser clothing for characters with a base model
PropertySignal.Compile(timeRange) not clamping the first/last blocks to the requested time range, causing "blocks must not overlap" errors when compiling Movie Maker recordings
:last-child pseudo-class updating a frame late when adding child panels
Cancelling a purchase incorrectly showing "You purchased X!" after the 20-second timeout
DefaultMaterialGroup not working for .vmdl files exported from MeshComponent
Clothing properties not serializing to JSON when marked internal — free clothes referenced by resource ID now save correctly
ScenePanel — render scenes are now kicked off during Tick, decoupling them from the render texture step.
CBaseFileSystem::AddSymLink overwriting the target path of an existing symlink
NavArea toggling behaving incorrectly due to stale MakeDirty usage
The M key resetting the active mapping subtool when merging vertices
Editor splash screen losing its taskbar window icon
Minor prefab serialisation and instance ID edge cases
An array pool use-after-free exploit — game code's ArrayPool.Shared usages are remapped to Sandbox.PublicArrayPool to prevent reading memory from other sandboxed games
Missing HTTP redirect URL validation — redirects are now manually followed so blacklisted local URLs cannot be reached through redirect chains
Hammer entity placement always inserting info_player_start instead of the selected entity type. Thanks @Kaikenny
Gizmo.Hitbox.Sphere behaving differently from all other hitbox functions, causing rotation gizmo priority and clickability issues. Thanks @nixxquality
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-02-25
Here's some highlights from the blog.
The editor loading splash got a new modern look, the key change is removing all the noise and showing you only what you need instead.
You can also override the image with a splash_screen.png file in your project folder.
Lots of Sandbox mode goodies, the physgun has a gravgun mode and glows orange, tools have action hints, remove all constraints is in, dupes have a download progress, weld previews show correctly, and more.
On theme for improving the platform experience, I've made some party system improvements this week.
When the party leader starts downloading a game, you'll start downloading the game too in the background.
When they've finished, you'll go with them.
I've added some toasts to make it really obvious what's going on.
🎁 Added
Editor splash screen has a progress bar, no longer spews console, is customizable
Editor Welcome Guide
Time.NowDouble
Incremental compiles: smarter processing, syntax tree reuse
Games can have a dedicated server only launch mode
If a party leader is downloading a game, party members download it async in the menu
Mapping vertex paint selection modes
Updated Scene & Prefab Previews
Scene.BatchGroup disposable method obsoleting SceneUtility.RunInBatchGroup, also batches network spawns
Physics out of bounds event
Selectable abstract AnyOfType
Gizmo.Control.Rotate now outputs Rotation instead of Angle, added trackball and view based rotation @DrakeFruit
🧼 Improved
Mapping: Vertex paint traces only on selected surface
Mapping: Vertex paint shows verts with paint information
Mapping: Vertex paint can paint backfaces
mat_toolvis button in in-game console
mat_toolvis converted to managed from native
Minor menu style tweaks: use actual logo svg, hide LiveLobbyCard whilst loading, tweak notification badge styles
Startup background is smaller, lighter and uncompressed UI image
Several verbose logs moved to trace channel
Cleaned up main menu assets and transient files
Dedicated server no longer does unnecessary transform interpolation
rendersystemvulkan: use SDL_Vulkan_GetInstanceExtensions for surface extensions
Update Vulkan headers and volk (w/ valve mods)
rendersystemvulkan: use VK_EXT_surface_maintenance1 make swapchain recreation a bit better
SceneUtility.RenderToBitmap uses a normal scene instead of an editor scene so components execute normally
Improve allocation overlay (#4121)
Avoid StringToken boxing causing unnecessary allocations
Reduced Trace.WithCollisionRules allocations
Reduced Action allocations from Component.ExceptionWrap
Avoid per-frame KeyValuePair\[] allocations when using Parallel.ForEach
Avoid allocations when creating and iterating CommandList
Remove need for second lightbinner for fog, just do it all on shader, we do classification on the shader itself, edge cases like fog disable are rare to require doing it with an entire new collection of lights
LoadAllGameResource only loads new resources
Make sure SeverPackages.InstallAll only reloads packages once
Close existing project settings window when opening new one
Use InvariantCulture in various places when parsing floats @MrSoup678
Don't show Max Player slider if Min players == Max players @nixxquality
Dynamic splash screen height to avoid stretching @boxrocket
Verify CreateGameResults cookie before usage @nixxquality
🪛 Fixed
mat_toolvis convar doing nothing
Duplicated r_3d_skybox convars
BlitMode.WithBackbuffer actually respects WithMips setting (#4096)
physicalDeviceVulkan12Features.bufferDeviceAddress only enabled if hardware supports it (#4095)
addon type not having ProjectPage
Shadergraph: Don't generate TextureAttributes for albedo if its dynamic
Native Resource networking
PostProcessSystem does not run under dedicated servers
Custom loading screen not showing when joining to an existing session (#4124)
Envmaps, particles and light cookies not being marked as used, meaning they can end up evicted out of VRAM
GameObjectSystem configuration supports collections properly
Native resource reference networking
DirectionalLight gizmo line spacing @boxrocket6803
Tags not being applied to particle sceneobjects @LeDernierPoisson
Guard null button origin if none set in action @peter-r-g
list reorder not updating inspector for class types @Ardivaba
Enforce FriendsOnly lobby privacy during handshake @trende2001
🚯 Removed
Version overlay
A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-02-18
Things have been a bit quieter this month. We're slowing down on the big flashy features - most of the major engine systems are in now and the focus shifted towards making everything feel good.
We've lit a fire under our asses with release, it's forcing us to make decisions - what's in, what's out, what can wait. It's making us focus on the right stuff. Things we'd have spent weeks overthinking are getting solved now or shelved.
We've got a few large doors left to close, mapping has some glaring flaws with interactables that we're actively solving. Sandbox has to be filled with all the fun little things to bring it together.
All in all - our heads are down and shit's getting done.
🎁 Added
Mapping: Shear Mode
Mapping: Object Selection
Screen recording can now record the editor viewport
Fade-in support for Sound.Play
ParticleFloat support for ParticleEmitter properties
New image/rendertarget formats: RGB32_UINT, RG32_UINT, R32G32B32A32_UINT
Paint.Draw overload for pixmap with border radius
🧼 Improved
SHIFT+RMB and CTRL+RMB can now be used outside of the Texture Tool
Save Play in Game Mode with cookie project
Indirect Light Volumes improvements, nicer bounds for "Fit to Scene Bounds" button
Menu server list improvements
Lazy prefab cache loading for prefab dependencies
Make ParticleFloat widget descriptions context-neutral
Make slnx/csproj always use relative paths
Humans: eyelid morphs are now affected by aim_eyes
Particle DieOnCollisionChance works more intuitively
Resize support on GameObjects with IHasBounds
Load cached asset info for new mods in AssetSystem::UpdateMods
Destroy menu scene when entering a game to free resources
Track dynamic states in Vulkan render system to remove redundant vkCmdSetPrimitiveTopologyEXT/vkCmdSetPolygonModeEXT calls per draw call
Upgraded DXCompiler to latest from Vulkan SDK 1.4.341.1
Signed Qt binaries, these were causing Windows Smart App Control to not launch the game
Defer descriptor set deletion to avoid use-after-free on render thread
Confirm GameObject/Component selection on double-clicking a node
Scale baked into physics shape geometry — strip it from the target body when calculating local offset
🪛 Fixed
"Texture manager doesn't know about texture" log spam
Descriptor set layout ref counting leak in RegisterDescriptorSetLayout
NRE in Terrain deserialization when TerrainBuffer is not yet created
Navmesh bake corruption when EditorAutoUpdate is enabled
ResourceIndex holding strong references to native resources
EdgeArchTool going the wrong direction
CompletionQueue assert during shutdown
GTAO depth dispatch size and missing UAV barriers
W and E hotkeys not switching gizmo tools
Crash when ParticleEffect has PushStrength
WorldPanelInput NRE
Incorrect property summaries
Pause modal NREs when no available package (unpublished second instance)
net_debug assertion spam by calling SetDebugFunction with DebugOutputType.None when disabled
When reparenting a SkinnedModelRenderer, clear out new skinned parent
Only create/update nav mesh area when active
Linux: Non-small struct args (>8 bytes) passed as ptr in managed but not received as ptr in native (InteropGen)
Linux: Added missing libdxcompiler.so and libswscale.so dependencies
Linux: Stop trying to load resourcecompiler when in non-tools builds
Linux: Enable VK_KHR_wayland_surface for Wayland
Linux: Plat_CreateWindow creates an SDL_WINDOW_VULKAN
Humans: prevent skeleton from blowing up when wearing jar head
Defer sentry close to after native AppSystem shutdown
About
This page aggregates Steam news feeds, patch notes, and developer announcements for s&box, sourced from official Steam community posts.
Major updates, balance changes, and seasonal events often correlate with player-count spikes — cross-reference announcements here with the live charts on the main s&box statistics page.
Articles link back to Steam for full changelogs. SteamScope refreshes news entries as new posts are published to the game's Steam hub.