Update 26.01.21

More Sandbox entities, lots of optimizations, baking things, crash fixes and a boat load of new editor tools!

Pressable Tooltipsby garry

In Rust we have this system that shows you tooltips when you look at something. This has two nice effects.. first of all they know they can interact with something instead of just spamming E at everything hoping.. and secondly you can tell them exactly what it's going to do.
sbox.2026.01.21.08.44.41.mp4 50.87 MB
This is now built into the IPressable interface, so anything that implements it can also provide context sensitive help describing what it is going to do.

I don't think this was ever in Half-Life or Half-Life 2 because Valve comes at it from more of a "show don't tell" point of view, where if something looks like it can be interacted with, it will be interactable. We don't have that ability, really, because interacting with things can do unexpected stuff.. so this feels like a pragmatic choice.

More Entitiesby Jase

Much like Garry's Mod, we want a bunch of options for our wheels, thrusters and chair entities for Sandbox mode. 

Thankfully, we already have a lot of options that work well in our asset library, so you should start to see more options when building your mad contraptions in the coming days

Player animation updatesby MaxL

Ponder the days of yore for a moment. You might recall that if you were sitting in a chair or chair-like object in Garry's Mod, and going very fast for whatever reason, the arms of your character model might raise skyward, so as to convey something resembling unbridled glee.
thrill_blog.mp4 2.28 MB

This is back, and tied to a new parameter called thrill. It is also usable outside sitting — which will probably useful to you if you're making a cops & robbers thing. You could even combine it with the wish values that govern leaning to get a rather zombie-like result...

Additionally, humans now blink naturally, and a new entry to the face_override list was added to let programmers forcefully close a character's eyes at any time.

Audio Optimizationsby Lorenz

We improved our audio performance by optimizing the occlusion system, binaural spatialization, and memory management. In our audio benchmark scenes, this resulted in a solid 20–30% reduction in frame time.


We also shipped several improvements to our VOIP component. Now, lipsync and audio processing are disabled for players who aren't speaking. This change should drastically improve VOIP performance on servers with large populations.

Clustered Cullingby Sam Pavlovic

We've moved our renderer from Forward+ Tiled Culling to Clustered Culling.
535136096-ca38cecc-af0c-4f8b-9f68-6be37047dedb-2.png 152.78 KB

Light calculation during shading will only affect what it's actually intersecting on geometry instead of any intersection with the frustum.
asdasd.png 1.11 MB

This is a more modern way to deal with GPU culling of Lights, Envmaps, Decals and other GPU-driven objects, for the average user it's nothing to worry about.

This simplifies a lot our pipeline and improves framerate in some edge conditions, our Tiled Rendering implementation was made targeting D3D11 and was hard to maintain, this also helps us iterating on it as time goes on.

Envmaps Bakingby Sam Pavlovic

Our envmaps are awesome to generate quickly for very fast iteration on the editor but they're an annoyance to the user that they are also generated every time they join a game.

We added the ability to be able to bake and cache Envmaps to disk instead of generating them at load time.
537307759-18c3fcf7-47ec-4c66-ae19-82c4306544e8.png 32.33 KB
Since these use BC6H, VRAM cost for these are 8x smaller than dynamic cubemaps.
image (68)-2.png 1.53 MB
Garry made the API for saving a dynamic texture really awesome with just Texture.SaveToVtex():
public async Task Bake()
{
	RenderCubemap( CubeTexture, CubemapRendering.GGXFilterType.Quality );

	var sceneFolder = Scene.Editor.GetSceneFolder();
	string filename = $"/envmap/bake_{Id}.vtex_c";

	var vtexBytes = await CubeTexture.SaveToVtexAsync();
	var path = sceneFolder.WriteFile( filename, vtexBytes );

	BakedTexture = await Texture.LoadAsync( path );

	// Make envmap baked
	Mode = EnvmapProbeMode.Baked;
}

Backend of this stuff will be used to store the results of other things we want baked like Indirect Light Volumes.

Scene Folderby garry

We've been trying to figure out how to make Scene files function like real maps for a while. We've thought about the compile process, saving lightmaps, navmesh, envmaps etc.

Since Source 1 maps have been compiled to a VPK file, which is basically like a zip file with a bunch of loose files in. We have decided to skip that and just have a folder.

So now you can call Scene.Editor.GetSceneFolder() to get a class to interact with this folder in the editor. You can generate and save resources in there, which your scene will reference and use. For example, when we bake cubemap textures we save them in this folder.

This unlocks a lot of capabilities for us in terms of mapping.

EnumButtonGroupby garry

Enums in the inspector were always a dropdown control. This works, but fuck me it's a click to see the list of options, then a click to select the option. Now if your enum has less than 4 options it's turned into an EnumButtonGroup, which shows the options as a group of buttons.

image.png 5.47 KB


This seems like a stupid thing to care about, but it makes the UX so much better when you can see everything and single click between the options.

You can force enums to use a GroupButtonControlWidget by adding the [EnumButtonGroup] attribute to the property.

Application.Editorby garry

We have this new property on the Application static class. This allows access to the editor tools from the game.

It doesn't have much available right now, just access to the currently editing scene and a Foreach that provides a progress bar while iterating. It's something that I can imagine will be expanded over time, as we want more editor functionality in the game code.

This is null when running outside of the editor.

Editor Menusby garry

You can define editor menus in the game code now. I can't imagine there are a ton of use-cases for this - but it has proven to be useful for me. If you can get away with it, it's always going to be much nicer than having editor code somewhere else.
image.png 49.26 KB

BlobDataby antopilo

You can now store data as binary when JSON no longer fits your needs.
 
The system is fully transparent and integrates seamlessly with existing JSON serialization. Any type that inherits from BlobData will automatically be serialized as embedded binary data alongside JSON.
public class MyBigData : BlobData
{
    public List<float> Data { get; set; } = [];
    
    public void override Serialize( ref Writerwriter )
    {
        writer.Stream.Write( Data.Count ); // Int
        
        foreach ( var instance in Data ) // float * Data.Count
        {
            writer.Stream.Write( instance );
        }
    }
    
    public void override Deserialize( ref Reader )
    {
        var instanceCount = reader.Stream.Read<int>();
        
        for( int i = 0; i < instanceCount; i++ )
        {
            Data.Add( reader.Stream.Read<float>() );
        }
    }
}

GameObject/Component Tree Pickerby Carson

You can now select GameObject and Components right from the control widget! This makes it quick and easy to select something without losing your place in the hierarchy, or having to miss another drag & drop.
13_14-45-GratefulMilksnake.mp4 1.8 MB

Mapping Tool Copy/Pasteby Carson

Added Copy and Paste shortcuts to the Mapping tool so faces can be easily duplicated/manipulated
19_09-11-SnivelingAtlanticspadefish.mp4 9.37 MB

Editor gizmo selectionby alex

We’ve added the ability to select the individual gizmo handles from a list, as well as categories. This stuff is all based on the attributes on a component, you don’t have to do anything extra, it’ll just work.
537643218-5b30a62e-6b87-4215-a094-90b27aaacabe.mp4 8.42 MB

SCSS Mixinsby conna

We've added full SCSS-style @mixin and @include support to the UI stylesheet system.

Mixins let you define reusable style templates that can be included anywhere in your stylesheets. They accept parameters, support nested selectors, and can even use @content blocks for wrapping patterns, dramatically reducing repetition and making your UI code easier to maintain.
image.png 71.88 KB


Read more about Mixins here.

Hotspot Texturingby Layla

Scene mapping tools now has hotspot texturing, it automatically applies UV mapping using hotspot rects embedded in the material.
sbox-dev_HoO038BC5P.mp4 3.15 MB

Mapping Edge Arch Toolby bakscratch

A tool that lets you turn an edge into an arch.
sbox-dev_HQGhVpwo5c.mp4 1.47 MB