The Hammer map builder we got from HL: Alyx Workshop Tools has always broken up map meshes into excessively small render clusters, resulting in huge amounts of draw calls.

We backported a few changes from CS2 and fixed a regression we caused:
  • Increase render cluster volume size from 256 -> 2048
  • Increase render cluster max triangles from 2048 -> 16384
  • Backported new visibility mesh merger (uses vis to merge meshes in similar vis areas) 
  • Restored collapsing materials behaviour
Over all this should drastically reduce draw calls in larger and more open maps, reducing CPU frame time.
The map above saw over a 2x improvement in fps in the worst performing area the fps went from 46 → 96.

Your maps will need to be recompiled to see any benefit.
The physics engine is now updated to the latest Box3D.
What does this mean for you? We're seeing improvements in most of our benchmarks, better stability for chained joints, and the ability to run more substeps. 

I'll give a bit of history on the physics engines we've used because I've seen this asked many times. We started with Valve's Rubikon. We then moved to Izabu, which is basically just a cleaned-up Rubikon without Valve-specific code. We then moved to Box3D, by the creator of Box2D, which will eventually be free and open source. Rubikon and Box3D are closely related, so this isn't a major difference for users, but it's good for our ecosystem to use libraries that are open source and continually updated.
I finally started making the official Sandbox Mode! I'm being deliberately slow and considerate with it. it's my baby and I want to do it right.
The plan is to create a foundation and then experiment on that for a while. There's a few tent poles that this brings to the game. Mounts and Addons are the biggies.. but there's a bunch of other stuff I want to try.
New Toolgun for the Sandbox mode
Before, when you tried to load a project that couldn't compile, we’d try loading it as best we could and leave you to figure out the rest. This usually meant everything was pretty broken, and it was a bit confusing if you didn't know what went wrong. Even after you'd sorted it out, you'd still need to restart the editor to get it properly usable again.

Now, we'll raise any issues at startup and let you fix them before continuing. You can jump straight to the errors in your code editor, and it reloads live as you make code changes.

Once all the issues are resolved, we carry on loading from there. No restart required. You can still choose to load it broken if you really want to.
We’ve added AgX to our built-in tonemapper implementation. It’s similar to ACES but preserves detail in low light areas like shadows, which makes it particularly good for outdoor scenes. It’s also Blender’s default tonemapper, so it should have a nice  familiar appearance.
We’ve also documented all our tonemappers in detail with some comparison screenshots, which should make it a little easier for you to choose one.
When overriding materials on a ModelRenderer, you previously had two options. You could override ALL of them, or you could write some code to override specific materials using an attribute trick.

This wasn't ideal and wasn't what anyone expected. Generally, it's expected that you could see the used materials in the inspector, and override them by index. And now that's what you can do.
We've done a few under-the-hood cleanup and fixes for the auto-exposure system and backported the auto-exposure curve from CS2, previously autoexposure was too easy to feel blown out, either too dark or too bright, now it has a nicer smooth curve, it's super nice.

Loads of new features and fixes for the new decal renderer we recently added. In case you missed it this new decal renderer renders with the surface instead of on top, this lets it both inherit and modify surface properties like normals, roughness, etc. As well as render on transparent surfaces like glass – all high performance.

We've added: Color Mix which lets you have normal only or roughness only decals, Parallax Occlusion for adding height to your decals, and HDR color range allows your decals to bloom.
The decal system was a bit of a bastard to use. All the ingredients were there, but they hadn't been prepared. So now individual decals are defined with a DecalDefintion resource. Then they're used in the Decal component.

The Decal component can define multiple decals and one will be chosen randomly. You can also make it randomize and animate the decal properties, like scale, rotation, color etc. This built in functionality reduces the need to code it - which is what everyone previously had to do.
The Surface definitions were a bit of a mess. They defined sounds and decals for various impacts, but they all used strings instead of linking to the resources directly.

All that's gone in the bin. They now provide a list of sounds for the surface (Surface.SoundCollection) and some prefabs for the surface. (Surface.PrefabCollection).
Our aim is to include a baseline of this stuff with the engine, so not everyone has to remake them.. but you can if you really want to.
As Garry mentioned - with the new Decals and Surfaces in place, it only makes sense to rework the core library of impact decals that we offer.  This pass covers concrete, metal, wood, flesh, dirt and glass.

This is a refined list that covers the most common surface types, with more coming to the Workshop in the future.


You couldn't make glass or water shaders without having to dig into shader code... but now you can do it in ShaderGraph with the "Scene Color" node. Also great for post-process effects, with options for coord wrap/mirror.

Here's what else is new:
  • Added "Is Front Face" node
  • Added "Normal Blend" node (with modes Default and Reoriented)
  • Added "Reflection" node
  • Added "Tangent View Vector" node
  • Fixed issues with backfaces not rendering when they should have in created materials
The Curve Editor is very powerful, but in it's current form it was quite limiting, with no panning or zooming, and no way to modify the x-range (and had a few quirky bugs). So this month I made it much more intuitive and friendly :)
  • Curve Evaluations are much more performant, so things like particles have less of an impact on framerate
  • Can now Pan/Zoom around the Curve Editor with Mouse3 and Mwheel
  • Can drag handles outside the bounds of the curve to automatically extend it's range
  • Added X-Range inputs and new icons for both X and Y range inputs, with functions to disable either
  • Added buttons that allow you to modify the curve ranges without changing the values themselves
  • Holding CTRL while moving a handle will snap it's position to the current grid level
  • Added [TimeRange] and [ValueRange] attributes so you can set default range values (and clamp them)
  • Fixed any known issues with the previous Curve Editor
I've added a "grab stance" to our first-person weapons, with four different actions: three sweeps across the screen, and one "button push". This is inspired by "Left 4 Dead", which made your first-person left arm reach out towards any objects that could be picked up.
As usual, you can find all the first-person weapons we provide to you in this workshop collection!

And their documentation can be found on this page.
We have a thing called ControlSheet in the editor. You pass it an object and it will create an "inspector", allowing you to edit its properties. This month I added a Panel version of this, so we can use it in game too. It all works pretty much the same.
I added a new BeamEffect component. This operates a bit like a ParticleSystem, but it creates beams from one point to another. You can tweak things like beam count, scroll rate, texture size, beam size, colour, alpha, and brightness.

It also has a "travel" mode - which makes creating tracer effects simple and easy.
The particle system was improved with a bunch of community requests.

ParticleEffect.LocalSpace

This is a ParticleFloat ranging from 0 to 1. If it's 0 the particle simulates in world space, if it moves with its parent. This allows you to make effects like flames where they start off following the parent, then fade to world space.

ParticleEffect.InitialVelocity

You can directly set the initial velocity of the particles. Previously, this was only possible if the emitter provided what you wanted to do.

ParticleEffect.ConstantMovement

Move without having to think about velocity at all. Using curves allows for some really fun movement.
More progress. Everything is getting easier and more refined. Everything is coming together. Sandbox mode actually being worked on is a signal that there is a release in sight. 

At the moment, I'm imagining we'll release early next year. I think by that point, we'll have enough to show people what we're trying to do and keep them engaged with it. This won't be the end, this'll be the start. After the release, we'll keep iterating every month like we are, until we're dead.
July Update
0.4.0
1 July 2025
🎁 Added
  • Box3D Physics
  • Editor: Added new startup errors dialog for resolving code errors
  • Editor: Component Selector now supports nested sub-categories separated by "/"
  • Editor: Added Flat View option to Component Selector
  • Editor: Missing Undo Steps to ControlSheet and certain ControlWidgets
  • Curve Editor: Added "Move Range When Panning" button, which moves the entire curve when panning or zooming
  • Curve Editor: Added "Retain Values When Changing Min/Max" button, which doesn't resize the curve's values when resizing ranges
  • Curve Editor: Added "Fit to Screen" button, which fits the viewport to the curve's current range
  • Curve Editor: Added [TimeRange] and [ValueRange] attributes to specify default range min/max and whether or not it's clamped
  • ShaderGraph: Added Scene Color node (with UV address modes)
  • ShaderGraph: Is Front Face node
  • ShaderGraph: Normal Blend node
  • ShaderGraph: Reflection node
  • ShaderGraph: Tangent View Vector node
  • ShaderGraph: Added GraphCompiler.RegisterGlobal
  • Shaders: Automatically append mode combo to mode if no arguments are set
  • Decals: Gizmos for the size
  • Decals: Color Mix option for normal/rmo only decals
  • Decals: Parallax Occlusion
  • Decals: Color Tint is HDR enabling blooming effects
  • Decals: Added decal resources
  • Decals: Added transient properties
  • New default surfaces
  • Networking: Ability to specify port to use when hosting a dedicated server - defaulting to 27015
  • Added AgX Tonemapper
  • Enabled sc_visualize_batches publicly
  • ParticleEffect.LocalSpace - float, allows sliding between local and world space
  • ParticleEffect.InitialVelocity - velocity to start with
  • Particle.ConstantMovement - apply movement without velocity
  • Particles: ParticleModelRenderer.RotateWithGameObject
  • BeamEffect component
  • API: BaseControl.CreateFor - allows creating Panel based controls for specific property
  • API: ViewSetup
  • API: ReflectionSetup + RefractionSetup
  • API: Pixmap.UpdateFromPixels( Bitmap )
  • API: VideoWriter.AddFrame( Bitmap )
  • API: SoundHandle.Time setter
  • API: System.Random.FloatDeterministic( int seed )
  • API: Color.WithColorMultiplied( float )
  • API: [InfoBox] - allows adding inline help to inspector properties
  • API: Scene.FindAllWithTag & Scene.FindAllWithTags
  • Add FogStrength to TextRenderer
🧼 Improved
  • Hammer: Map builder produces maps with significantly less draw calls, hugely improving performance
  • Audio mixing crackling resolved by switching to a request based system
  • Curve Editor: Dragging a Curve Handle outside the bounds of the Curve will automatically update the range(s)
  • Curve Editor: Grid lines now have nice value increments and change with range instead of being static
  • Curve Editor: Can now Pan/Zoom around the Viewport with Mouse3/MWheel
  • Curve Editor: Clicking on a Curve Preset will reset the Viewport to fit the Curve
  • Curve Editor: Added X-Range Inputs so you can modify the TimeRange of the Curve
  • Curve Editor: Holding CTRL while dragging a Curve Handle will snap the Handle's position to the grid
  • Curve Editor: Now draws a light grey rectangle with a dashed line to denote the min/max ranges of the Curve
  • GameTransform.World is now cached instead of recalculating every access
  • ShaderGraph: Can no longer delete Result nodes (the final output nodes)
  • Editor: Simplified the Filter Menu in the Component Selector
  • Editor: Component selector improvements
  • Networking: Stop breaking prefabs during NetworkSpawn
  • API: Re-categorize PlayerController.RotateWithGround and remove PlayerController.GroundYaw
  • Bloom (quarter depth, fix rendering behind walls)
  • Display default property values in editor inspector tooltips
  • Clamp alpha on ParticleSpriteRenderer, fixes negative alpha rendering black
  • RenderTarget.GetTemporary thread safety
  • CommandList state is scoped allowing recursive command lists
  • Nav Agent path invalidation behaviour
  • Highlights: More accurate depth testing on outlines
  • Highlights: Can target other renderers explicitly
  • Don't render ScreenPanel if it's excluded by a camera's RenderExclude tags
  • GameOverlay layer is split into opaque/transparent
  • Material Overrides
  • Curves use Binary Search for better performance
  • Bail out of SoundHandle.Stop if already finished or fading out
  • Prefab instance context menu: edit shortcut, tidy
🪛 Fixed
  • Startup crash on GTX 900 series cards
  • Tooltips were recreating every frame
  • Hotload errors when encountering anonymous types
  • VideoPlayer: Unable to play VP8 (webm) videos
  • Native editor tools (Hammer, ModelDoc) stylings
  • Launcher showing added projects as launching when they weren't
  • Curve Editor: Fixed grid numbers disappearing when increasing the range
  • Curve Editor: Popup no longer opens between two monitors when opened near the edge of the screen
  • ShaderGraph: "Render Backfaces" setting getting reset on recompiles
  • ShaderGraph: shaders not rendering backfaces in Material Editor
  • Fix [CallerLineNumber] not being properly whitelisted
  • RenderTarget.GetTemporary: Don't try to UAV bind or create mips for depth formats
  • Decals: Poor culling at edges for rotated decals
  • Decals: Normal maps not decoding or transforming to world space correctly
  • Decals: Not inheriting their GameObject tags
  • Decals: Fix Decals in Valve's Shading Model
  • Game Tick/Update running for one frame after ending the game
  • [ColorUsage] HasAlpha issues
  • Tint, Tags, Shadow Flags, and Source not getting reset on MeshComponent when disabling "Hide In Game"
  • Standalone exports showing black screen
  • Editor: Enum selectors showing a horizontal scrollbar instead of wrapping
  • Editor: Cloud code assets failing to resolve on project initial launch
  • Editor: Disabled text theme color
  • VR: Duplicate floor in main menu
  • Undefined nav agent behaviour if nav link traversal is not implemented
  • Navmesh links worldstart/end position not taking rotation into accont
  • WebM video playback for UI and VideoPlayer
  • Fixed nested prefab issues related to undo/redi
  • Fixed GameObject Transform not transfering to Prefab when Converting a GameObject to a prefab
  • Fixed an issue when converting a GameObject (that is part of a prefab instance) to a prefab.
  • Fixed prefab changes not propagating correctly to all their dependencies and open editors
  • Fixed unlinking a nested prefab not correctly propagating to instances in open editor scenes
  • Fixed GameObject to prefab conversion for sub hierarchies that contain nested prefabs
  • Fixed reparenting parts of a prefab instance to another GameObject
  • Fixed cloning parts of a prefab instance
  • Fixed Gameobject ordering not updating when reverting instance to prefab state and applying instance state to prefabs
  • Fixed Component order not being restored in some cases after undo/redo
  • Fixed NavMeshLink.OnLinkExited not getting called if the link is completed on the frame the agent enters
  • Fix drag/drop material preview not resetting in some cases
  • Hotload: Fix NRE in DelegateUpgrader
  • Hotload: Don't let DefaultUpgrader process delegates
  • Fixed connection crash when trying to join via new instance to editor lobby with no game running
  • Fixes [Property] properties from a Component's base class not being serialized when sent to other clients
  • Fix network owner being unset in OnAwake when doing NetworkSpawn
  • Fixed css gap property creating ugly uneven gaps
  • Fixed white viewport when opening the editor
  • Fixed terrain still being enabled on disabled GameObjects
  • Fixed ListViews holding onto stale items
  • Ensure ReflectionQueryCache.ClearTypeCache is called on hotload for game instance
  • Fix faulty logic for in-place static field hotload upgrading
  • Input Editor Fixes
  • Inspector history/locking fixes
  • Fix DressPrefabScene
  • DebugTextSceneObject uses Graphics.DrawText in worldspace
  • Fix HashSetEx Remove() being O(N)
  • Shaders: Depth-Aware Mask Fix - Fixes objects in front of glass looking aliased
  • Renderer: Multiple Vulkan Validation Fixes
  • Renderer: Fix native legacy 2D debug overlays not rendering
  • Renderer: Fix prefab thumbnails rendering with black background due to opaque bloom
  • Renderer: Fix Alpha Test not clipping on non-MSAA
  • Renderer: Fix MSAA alpha-to-coverage on depth prepass
🚯 Removed
  • Obsoleted CameraComponent.AddHookBeforeOverlay - Use CommandLists instead
  • Obsoleted CameraComponent.AddHookAfterTransparent - Use CommandLists instead
  • Spritecard shader - Was only used by legacy particles
  • Sandbox.Game.dll - Merged everything into Sandbox.Engine.dll
  • Panel.Bind
  • Projected Decals
trophy 1110
Apr 2021 61 posts
July Update : news/july-2025
trophy 660
Aug 2024 1 post
Lookin good. Will addons work the same as they worked on GMOD where users have to download the addons prior on workshop to be able to use them in Sandbox? I know there were many flaws with that (taking 30 mins to load 500 addons or some shit), curious to see new approach. 
trophy 335
Jul 2023 3 posts
👍
trophy 1945
Apr 2021 38 posts
Awesome stuff this month 😄
trophy 1110
Apr 2021 61 posts
>  Will addons work the same as they worked on GMOD where users have to download the addons prior on workshop to be able to use them in Sandbox? 

no lol that'd suck
trophy 70
May 2024 1 post
dont really like the new toolgun tbh
want the old one back
trophy 2818
Dec 2023 46 posts
How does one use the new toolgun?
Do you use the trigger as an input like a telegraph?
trophy 1135
Jul 2022 90 posts
Yeah why would you want to load the add-ons before launching the game
trophy 260
Nov 2022 1 post
I'm hoping I could use Sandbox mode as a kind of gateway drug into using S&box for game dev. I've always been interested in making 3D games, but I've always felt there was a large wall in front of me. I just started working on a small 2D game in Godot (I like how GDScript is much like Python), so I'll at least be doing something dev-related as I wait for S&box to release fully.
trophy 2818
Dec 2023 46 posts
Hope you all feel so much relief having a release in sight after working on this thing for so long now.
trophy 605
Feb 2024 22 posts
wow s&box truly is the future
trophy 1050
Sep 2021 80 posts
I'm glad that the developers have become more confident and the platform-engine is being updated with new features, but still there is a list of things to do before the release.:

Agreement with Valve on the export of games to Steam (due this year)
Private server code (development started 2 weeks ago)
The release of Sandbox Game, I also call it Garry's Mod 2 (judging by the progress, this summer)

After that, can safely release this wonderful platform-engine. Good job, FP 💖
trophy 2818
Dec 2023 46 posts
Wasn't there also an issue with VR?
Idk I don't have a vr set ;-;
trophy 5
Aug 2022 1 post
Hello there ! 
I would like to share my love about the toolgun with you guys, i really like the new model. It just looks like that it has been made directly from the workbench. Its refreshing and the details are amazing !
trophy 1065
Sep 2022 22 posts
So proud of it !
trophy 0
Jul 2024 10 posts
 I'm being deliberately slow and considerate with it. it's my baby and I want to do it right.

Ooh I gotta remember that one. ;)
people
Log in to reply
You can't reply if you're not logged in. That would be crazy.