A new update has been released, you can view the full changes on our blog post.
https://sbox.game/news/update-26-09-22
Game Jam Progress
The Game Jam is 19 days in and we've had over 200 entries. I think we're all pretty stunned by the quality of some of these entries.. and it's really obvious that we should have done a Jam 6 months ago. We'll definitely be making this a regular thing from now on.

This is the first run of this nomination and vote system, so we're dealing with things in the background and fixing it on the road. There are always going to be little things that pop up and we are being as reactive as we can. Nominations will close this Sunday and the most nominated games will enter the voting phase. At that point it's a knockout every day. The community will vote on each game, and the one with the lowest vote count will be eliminated. The votes will be reset, and we'll vote on the remaining bunch. Until there is one winner. It might be a total disaster but I'm looking forward to seeing how it goes.
Main Menu Improvements
Some smaller improvements on the menu this week. Rewards now open in a compact popup instead of a whole page, game previews are snappier, and we've fixed an issue with the menu being way too small at higher resolutions (1440p+), as well as smaller style improvements across a majority of the pages.

We fixed another issue with the loading screen, where you'd have two loading screens stacked at once.
Party Improvements
We now support parties with up to 16 people, up from 8. We've also made a visibility pass, so it's more obvious what's going on when your party leader is joining a game.

You can cancel joining without leaving the party, or retry if something goes wrong. We have also fixed problems with following the leader between games, duplicate invites and Steam connection cleanup, with clearer errors when a connection fails.
Resource GUIDs
We're giving assets a stable identity, so you can freely move or rename files without breaking references. Each asset will now have a GUID stored alongside it in a `.meta` file, and any references to that resource will store this ID alongside the path. On load, we'll try to resolve the resource by this ID first, and fall-back to the last known path if needed. It's important you include these .metas in your source control. If you don't, everyone on your repo will end up with different IDs for the same asset, and that's not what you want.

This is the first part of the work, covering the core infrastructure and references from GameResource types, including most of the Scene system and Prefabs. References from Valve formats (such as materials referenced inside a model) are still to-do. We'll keep expanding support until everything uses this new system, but just be mindful for now, and probably don't go rearranging your whole project just yet. We'll get there.
TLDR: Assets now have permanent IDs, so moving or renaming files won't break things that point at them. Just make sure the
.meta
files travel with your assets and go into source control.
Scripting v0.1
I added a scripting system. This is like a c# version of Lua. This is experimental and I'll be iterating on it. It's not its final form but feel free to have a play with it. It comes with a syntax highlighted ScriptControl for editing the script.. it's a panel based control so it can be used in game.
The idea is to add something that can run in place scripts. It'll become part of Doo, and make the transition from ActionGraph easier for a bunch of people. I also want to integrate it into the material editor so it'll allow dynamic expressions on properties.
TLDR: Scripting is here. You write in a built-in code editor and changes run live as you type, so instant feedback instead of building/rebuilding the whole project. It's also a text-based alternative to the visual node graphs (ActionGraph) people have been using.
Panel Docking
The Panel system now has a built in docking system.. if you want that. You can use this in your games. You can do the usual stuff, resize the panels, drag from one section to the other. Works just like every other docking system made in the last 10 years.

We'll be using this when the editor switches from Qt to Panels.
Panel Curve Editor
A new panel based `CurveEditor` lets you edit curves, just like the editor one. Well, that's a lie. It's better than the editor one.
Window Handling in C#
We have moved ownership of game and panel windows into C#. Window creation, resizing and presentation now sit alongside the managed `PanelWindow` code, with SDL event routing, cursors and controller connections handled there too.
Key bindings, console configuration and config-script execution have moved with them. This brings more of the application layer into the same codebase as the panel-based editor work and removes a substantial amount of duplicated native window and input code.
TLDR: Windows and input handling have been moved out of the old native code, cutting a load of duplicated code and putting more of the engine in one place
Camera Piloting
You can now pilot a camera directly from the scene view. Select a camera and click Pilot in its preview window to move it around with the usual viewport controls. The view uses that camera's settings, with a 16:9 frame and rule-of-thirds guides to help line up your shot.
This is especially useful for recording camera movement in Movie Maker. Press Alt+F8 to start or stop recording while you fly, then use the Smoothen tool to tidy up any sudden movements. Press Escape when you are done piloting.
Demo Recording Fixes
In-game demo recording (using the `movie` command) now more accurately captures your scene. We've added support for fog and skybox related components, and various bugs with first-person view models are fixed. Video exporting has also been improved, for when you've finished editing your demos in Movie Maker. The encoder should now never skip frames, giving you perfectly smooth motion.
Sprites in Painter
Painter can now draw animated sprites. A new `SpriteInstance` keeps track of playback independently of the sprite asset itself. This allows you to draw sprites in your panels and on your HUD without needing to do anything special.

Quick Model + Material Setup
When creating a model from context menu in asset browser, you can use `Try generating materials` to automatically set up materials for your model. Editor will scan the model folder (and its subfolders) for matching texture sets, create a new material based on chosen shader, and put all found textures into appropriate slots. Your textures in a set must follow a specific pattern.
- Their file name must end with a suffix, like `_color`, `_normal`, `_rough` etc... These suffixes must match what is expected by the shader, you can check that from Material Editor.
- Textures must start with a name that matches material slot name in the model. So if you assigned a material slot to your model in Blender with a name `my_cool_material`, then texture set for this slot must start with this name too. For example, `my_cool_material_color`.Editor supports any amount of material slots, it will generate a material for each slot as long as model has all necessary texture sets provided.
This should work with all shaders, including custom ones, as long as your shader properly declares expected suffix name inside texture input slots. (see docs for shader attributes) This feature isn't a replacement for anything, it's just an alternative workflow that you can use for fast model+material setup.
More UV Channels
Custom shaders can now access a model's third and fourth UV channels through the `LowPrecisionUv2` and `LowPrecisionUv3` vertex-input semantics. They are not available in your shader out of the box, you need to add them into your VertexInput struct in the shader first. Here's how you can add UV2/UV3 on top of the standard vertex input:
VS
{
// Adding fields for UV2/UV3 channels on top of standard vertex input
#include "common/vertexinput.hlsl"
float2 vTexCoord3 : TEXCOORD4 < Semantic( LowPrecisionUv2 ); >;
float2 vTexCoord4 : TEXCOORD5 < Semantic( LowPrecisionUv3 ); >;
}
There's also a docs page covering all vertex input semantics (and more information about what the hell they do)
Smaller Shaders

I've drastically reduced the size and compile times of shaders by implementing Vulkan Specialization Constants and flagging various static combos (shader variants) as them. This let's us remove repeated work and shader variant code from the shader compilation, it'll still have the same amount of pipelines at runtime. When applied to complex, the amount of PS compile jobs drops from 5728 to 856, skin drops from 512 to 128. That means substantially less shader compilation work dropping from 6 minute compiles to 1 minute compiles. This is pretty far from when complex.shader used to take 20 hours to compile. As well as the combo reduction, compiled shaders now store shared modules once per shader program, rather than repeating the same bytecode across combinations. Modules and reflection data are compressed together in groups, and each combination keeps a reference to the code it uses. All of this together gives us a massive reduction from 129.88MB to 10.80MB for our shipped shaders.
TLDR: Shader features that only change behaviour (not inputs) can now share compiled code instead of each combination needing its own build, cutting the complex shader from 5,728 compile jobs down to 856, which is a huge reduction in shader compilation time.
Bindless Rendering Artifacts
Fixed the blocky, speckled artifacts some people were seeing around environment probes, shadows and other stuff particularly on AMD RX 6000-series cards. The GPU was being allowed to treat a texture index as uniform when different pixels could actually be asking for different textures.

Bindless lets a shader pick a texture by its index in a big array. GPUs run shader invocations together in groups called waves. If that index varies across a wave, the lookup needs to be marked `NonUniformResourceIndex`. Miss that annotation and the GPU can sample the wrong texture. It can look fine on your machine and turn into the mess above on someone else's.
Our Bindless API now applies these annotations automatically in every shader stage.
Texture2D texture = Bindless::GetTexture2D( textureIndex );
The default is safety first. But if you're really sure the index is the same across the wave, you can opt into the uniform path fast path. It's not a guaranteed speedup by any means.
cbuffer DrawConstants
{
uint g_nTextureIndex;
};
// This index is shared by the draw, so use the uniform path.
Texture2D texture = Bindless::GetTexture2D( UniformIndex( g_nTextureIndex ) );
Terrain Material Sampling
For the longest time we had nearly all terrain splat sampling code stuck in the standard terrain shader. Now it's been moved out to the rest of our terrain API, and you can use it in almost any shader, not just terrain. To use it in your shader, include `terrain/TerrainCommon.hlsl` in pixel shader section (PS) and simply use `Terrain::Sample( float3 WorldPosition, bool bUseGeometricNormals )`. It will return a Material struct that contains blended terran material with all textures - albedo, roughness, normal, ambient occlusion, etc... Second argument decides whether it should copy terrain's baked geometry normals or not - it is false by default. This function will output terrain splat that is visually identical to what you see on the terrain mesh itself, fully reflecting all terrain and material settings as well. This is what main terrain shader uses now too! I also wrote a pretty big documentation page covering most of our terrain backend - it is probably fair to warn that it is not a final API, and things may change, but this should be sufficient if you'd like to write custom terrain shaders, or do something more complex.

Standalone Export Fixes
Standalone got some love this week. We fixed not being able to launch exported games that had custom icons. We also embed the s&box project file and other metadata in the .exe, to clean the assets folder up.

Exports now include the compiled game assemblies without the accompanying CLL source archives or XML documentation. Standalone game data also uses the data root directly, avoiding an extra per-game subfolder. Thanks to boxrocket6803 for the data-folder fix.
Shadow Improvements
We got some great shadow fixes from the community this week, covering both how directional shadows look and some distracting rendering bugs.
Soft shadows that actually stay soft
The Shadow Hardness setting could stop making a difference in distant directional-shadow cascades. Even with hardness set to zero, the result could look almost the same as the hardest setting. PolEpie fixed the clamping so the softness control works at a distance too.


Drag the divider to compare the same view at Shadow Hardness 0, before and after the fix.
Smoother hard-shadow edges
Another change from PolEpie reduces the repeated teeth along hard directional-shadow edges at the highest shadow-filter quality. The filter transitions as hardness increases, keeping the original soft appearance at hardness zero and using the same maximum of 16 comparison samples.


These before/after captures both include the cascade-hardness fix above, so they show the additional filtering improvement. Lower shadow-filter qualities and local lights keep their existing filtering.
No more moving dark lines
Scenes with multiple shadow-casting local lights could show dark lines across surfaces that crawled around as the camera moved. CorentArts tracked this down to calculating the shadow receiver normal inside a light loop, where neighbouring pixels could take different paths.

We now calculate that normal before the loop and pass it through the shadow code. Custom shaders can do the same with the new explicit-normal overloads on `Light::From`, `Light::Init` and `Light::Shadows`. Thanks to CorentArts for the fix and everyone who supplied examples in the original report.
Orthographic views
Sam also fixed skewed screen-space shadows in orthographic views. That technique assumes a perspective camera, so we now skip its shadow mask for orthographic cameras.
Changelog
🎁 Added
Editor
- Camera piloting - position cameras through the scene viewport with camera-matched settings, 16:9 framing and rule-of-thirds guides; record movement in Movie Maker with Alt+F8 facepunch/sbox PR #5803 by @metapyziks
- Panel docking - added DockHost tab groups, resizable splits, lazy panel registration and JSON layout state facepunch/sbox PR #5716 by @garrynewman
- Floating panel windows - added PanelDockWindows for moving panels between editor windows and saving/restoring workspace layouts and window geometry facepunch/sbox PR #5716 by @garrynewman
- Doorway shapes - choose which outer wall faces to generate while keeping doorway jambs and the inner arch facepunch/sbox PR #5826 by @aylaylay
- Automatic materials - optionally generate and assign materials when creating models from meshes, matching texture names and shader suffixes in the model folder and subfolders facepunch/sbox@98b0152 by @wheatleymf
- Model placement - added a Scene View preference to control whether models with colliders are placed as props facepunch/sbox@ec89dcc by @wheatleymf
UI & CSS
- Animated sprites - added SpriteInstance playback and Painter.Sprite drawing, with independent animation selection, pause, speed, reverse playback and loop support facepunch/sbox PR #5812 by @garrynewman, @handsomematt
- Panel layout controls - added Toolbar, StatusBar, TabBar and TabPanel controls, plus texture icons through Button.IconTexture facepunch/sbox PR #5854 by @garrynewman
- Canvas and graphs - added CanvasPanel with pan, zoom and draggable handles, plus GraphPanel and GraphAxis with configurable ticks, labels and grids facepunch/sbox PR #5854 by @garrynewman
- Curve editing - added CurveEditor with key and tangent handles, snapping, undo and presets, plus curve and curve-range property controls facepunch/sbox PR #5854 by @garrynewman
- ScriptControl - added a panel-based script editor with syntax highlighting, diagnostics, completion, hover information and signature help facepunch/sbox PR #5852 by @garrynewman
- Label style spans - style ranges of plain text through SetStyleSpan and ClearStyleSpans facepunch/sbox PR #5852 by @garrynewman
Networking
- Loading progress - exposed the current download progress through LoadingScreen.Progress facepunch/sbox@72eb5db by @lolleko
Rendering & Shaders
- Material applicability - added ActiveIf() annotations for feature-dependent material controls and texture inputs, preserving saved values while inactive facepunch/sbox@c5ac37a by @handsomematt
- Custom light loops - added explicit shadow receiver normal overloads to Light::From, Light::Init and Light::Shadows; compute the normal before entering the light loop facepunch/sbox@12bd1db by @handsomematt
- Extra UV channels - added UV3 and UV4 support through explicit LowPrecisionUv2 and LowPrecisionUv3 shader inputs facepunch/sbox@c6032f0 by @wheatleymf
- Shader schema - exposed texture filename suffixes through Shader.VariableDescription.TextureEnding facepunch/sbox@11ed06b by @wheatleymf
- Sampler filtering - accept Linear as an alias for trilinear filtering in shader sampler states facepunch/sbox@a1e8c1b by @lolleko
- Vulkan diagnostics - added -vulkan_validation_stack_trace to print a call stack with validation messages facepunch/sbox@cf78218 by @lolleko
- Shader specialization - added StaticCombo(..., ShaderConstant()) declarations with automatic Vulkan constant IDs, shared compiler jobs and specialization-aware pipelines facepunch/sbox@28d80c9 by @handsomematt
Assets & Resources
- Resource GUIDs - added stable asset identities in .meta files and GUID-first JSON resource references with path fallback; existing path-only references remain supported facepunch/sbox PR #5307 by @solwllms
Terrain
- Terrain material sampling - added Terrain::Sample() for sampling blended terrain materials in custom shaders using local UVs or world-space coordinates, including transformed terrain facepunch/sbox PR #5694 by @wheatleymf
Media
- Video encoder readiness - exposed VideoWriter.ReadyForVideoFrame so callers can wait for space in the encoding queue facepunch/sbox PR #5880 by @metapyziks
- VP8 playback - added support for VP8 WebM videos, including companion alpha streams for transparency facepunch/sbox@9b11bb8 by @lolleko
Main Menu & Parties
- Avatar preview - drag the main-menu avatar to rotate it facepunch/sbox PR #5847 by @devultj
Scripting
- Experimental scripting - added Game.Scripting with reusable scripts, typed return values, bound arguments and local/global stores, backed by Breen and TypeLibrary facepunch/sbox PR #5852 by @garrynewman
Movie Maker
- Environment recording - capture gradient fog, cubemap fog, volumetric fog volumes and 2D skyboxes, plus light contribution and directional contact-shadow settings facepunch/sbox PR #5881 by @metapyziks
🧼 Improved
Main Menu & Parties
- Game hover cards - limit preview growth on large cards, position away from the footer and screen edges, and avoid covering overlays or lingering after scrolling away facepunch/sbox PR #5864 by @devultj
- Party size - increased the party limit from 8 to 16 players facepunch/sbox@cea5870 by @lolleko
- Party joining - added a bottom-right status card with leader and follower download progress, connection status, cancel and retry controls facepunch/sbox@4961ff5 by @lolleko
- Friends list - show Main Menu when a friend has no game title facepunch/sbox@baccd7d by @lolleko
- Party joining - display the game thumbnail on the join status card facepunch/sbox@df943f8 by @lolleko
- Rewards - open item-drop progress and objectives in a compact popup beside the navigation rail facepunch/sbox PR #5847 by @devultj
- Menu scaling - use consistent-height scaling so the interface stays readable at higher resolutions facepunch/sbox PR #5847 by @devultj
- Game previews - reduced the hover delay on game cards facepunch/sbox PR #5847 by @devultj
- Menu polish - refreshed the friends list, party popup and game jam layouts, standardized loading spinners and made store discounts clearer facepunch/sbox PR #5847 by @devultj
Terrain
- Flatten tool - added Align to Surface to flatten along the slope at the start of a stroke, with clearer plane guides facepunch/sbox-public PR #11397 facepunch/sbox PR #5509 by @polepie, @antopilo, @handsomematt
Rendering & Shaders
- Directional shadow filtering - smooth hard shadow edges at the highest filter quality while preserving soft filtering facepunch/sbox@45501b3 by @polepie
- Bindless textures - sampled-texture lookups now support non-uniform indices in every shader stage by default, with an explicit UniformIndex path for known-uniform indices facepunch/sbox@ba36487 by @handsomematt
- SpriteRenderer - now shares SpriteInstance playback and dispatches frame events during the component update facepunch/sbox PR #5812 by @garrynewman, @handsomematt
- Shader compilation - consolidate SPIR-V optimization into one pipeline using SPIRV-Tools, followed by binding fixups and final cleanup facepunch/sbox@9fb368c by @lolleko
- Shader errors - reject unknown render-state enum names during compilation and report the accepted values facepunch/sbox@30d0bdb by @lolleko
- Shared shader storage - deduplicate shader modules per program and compress them in shared groups; new output uses VCS 67 while retaining VCS 65-66 loading support facepunch/sbox@d18c6b8 by @handsomematt
- Complex shader - specialize bent normals, normal scaling, normal self-shadow, cloth and transmission, reducing pixel-shader compiler jobs from 5,728 to 856 facepunch/sbox@9c3b64b by @handsomematt
- Skin and generic shaders - specialize skin bent normals and age textures and use material-controlled backfaces in generic; pixel-shader compiler jobs fall from 512 to 128 and 144 to 72 respectively facepunch/sbox@1e867c5 by @handsomematt
Assets & Resources
- Prefab references - track prefab sources by GUID so references can survive asset moves and renames facepunch/sbox PR #5307 by @solwllms
- Asset file operations - move, rename, copy and delete related asset files together, and include .meta files in published and exported games facepunch/sbox PR #5307 by @solwllms
Editor
- Pause menu shortcut - use Shift+Escape for the platform pause menu in editor play mode; unhandled Escape returns focus to the editor facepunch/sbox@3b56cff by @antopilo
- Viewport modes - include perspective when cycling viewport views facepunch/sbox PR #5830 by @aylaylay
Engine
- Scene queries - reduce allocations with a dedicated Scene.GetAll enumerator and struct-based internal scene lookups facepunch/sbox@db03fa8 facepunch/sbox@f67cb55 by @lolleko
- HashSetEx - make iteration allocation-free facepunch/sbox@768ac48 by @lolleko
- Trace results - pre-size RunTraceAll result lists to reduce resizing allocations facepunch/sbox@6dd3c6a by @lolleko
- Hot lookups - avoid closure allocations in input actions, render-target caching, Razor render trees and performance timings facepunch/sbox@f930a7b by @lolleko
- Particle gradients - reuse the default white gradient instead of rebuilding it for every instance facepunch/sbox@0075320 by @lolleko
- Steam integration - updated the bundled Steam client libraries to the September 2026 release facepunch/sbox@c7aba4a
- Managed windowing - moved game and panel window ownership, SDL input routing, cursors and controller handling into C# facepunch/sbox PR #5858 by @garrynewman, @handsomematt
- Configuration - moved key bindings, console configuration and config-script execution into C#, with migration of legacy user settings to JSON facepunch/sbox PR #5858 by @garrynewman, @handsomematt
Networking
- Snapshot acknowledgements - send acknowledgements without copying them into a temporary array facepunch/sbox@6ce9e1a by @lolleko
Standalone
- Executable metadata - embed the game manifest, project settings, title and icon in the exported Windows executable and load the project as read-only facepunch/sbox PR #5855 by @devultj
UI & CSS
- Text editing - added selection drag-and-drop within and between text entries, including copy and move handling facepunch/sbox PR #5852 by @garrynewman
🪛 Fixed
Main Menu & Parties
- Party joining - fixed following the leader into a game, cancelling obsolete join attempts and handling download/connection failures facepunch/sbox@f25715c by @lolleko
- Lobby invites - ignore duplicate invitations facepunch/sbox@7b87a8b by @lolleko
- Party avatars - fixed clicks being intercepted by avatar contents facepunch/sbox@bbc913e by @lolleko
- Friend invites - fixed clipped invite button text facepunch/sbox@afd93a3 by @lolleko
- Context menus - prevent multiple menus stacking on top of each other facepunch/sbox-public #11868 facepunch/sbox@15e7e75 by @lolleko
- Game shelves - fixed shelves containing one game stretching the card across the full width facepunch/sbox@2533e20 by @lolleko
- Party download progress - refresh progress indicators as values change and report completion for cached downloads too facepunch/sbox@773c007 by @lolleko
- Waiting for the leader - keep downloaded content and wait while the leader sets up a server in the game menu facepunch/sbox@68c3446 by @lolleko
- Party invitations - restore invite notifications to the top of the screen facepunch/sbox@db98dea by @lolleko
- Game loading - cancel and tear down an in-flight load before starting another, preventing duplicate loading screens, overlays and a potential freeze facepunch/sbox PR #5840 by @devultj
- Menu alignment - centered the party deck and fixed clipped news descriptions, store alignment and the leaving countdown facepunch/sbox PR #5847 by @devultj
- Achievement totals - use lifetime achievement and score totals instead of the limited recent-achievement overview facepunch/sbox PR #5862 by @devultj
Networking
- Steam lobbies - fixed connection cleanup and stale join attempts; improved timeout handling and error details for lobby, Steam route and game-handshake failures facepunch/sbox@92860cb by @lolleko
- TCP fake lag - keep delayed receive callbacks on the tick thread facepunch/sbox-public #11786 facepunch/sbox PR #5727 by @handsomematt
Editor
- Uniform scale gizmo - use camera-facing, screen-relative dragging for consistent scaling facepunch/sbox-public #11315 facepunch/sbox PR #5734 by @handsomematt
- Fast texturing - respect the scene grid spacing facepunch/sbox PR #5827 by @aylaylay
- Function-key shortcuts - remain available while flying or piloting the viewport camera, including Movie Maker recording facepunch/sbox PR #5803 by @metapyziks
- Startup shaders - reload shaders after compiling them when opening a project, so already-loaded resources use the updated files facepunch/sbox@8d512db by @handsomematt
- Launcher news - reserve the news area during startup to prevent layout jumps, load thumbnails instead of full-size images and keep Open button text on one line facepunch/sbox@81f56d9 by @handsomematt
Terrain
- Brush preview - clear the preview when the cursor no longer intersects terrain facepunch/sbox PR #5509 by @polepie, @antopilo, @handsomematt
- Terrain normals - refresh the baked normal map after sculpting for live lighting feedback facepunch/sbox PR #5569 by @polepie, @handsomematt
- Concurrent terrain traces - stop sharing a scratch list between simultaneous traces facepunch/sbox@df203cf by @lolleko
UI & CSS
- Images - update layout when asynchronously loaded textures change size facepunch/sbox@dfb7fb7 by @handsomematt
- Transparent backgrounds - fixed fully transparent background images tinting the box background in both standard and batched CSS rendering facepunch/sbox-public #288 facepunch/sbox@1a3ea7f facepunch/sbox@b61bcea by @lolleko
- Preformatted text - fixed alignment for white-space: pre text facepunch/sbox@45ac820 by @xezno
- Filtered panel shadows - include box shadows in layer bounds so filters do not clip them facepunch/sbox PR #5836 by @polepie, @handsomematt
- Mouse dragging - stop dispatching mouse events to an active panel deleted or rebuilt by its drag-start handler facepunch/sbox@65ebede by @samfadi-dev
- Mouse active state - preserve active styling when another mouse button still holds a panel or its descendants facepunch/sbox PR #5854 by @garrynewman
- Text-entry validation - validate Unicode code points and account for selected text when entering decimal separators or minus signs in numeric fields facepunch/sbox PR #5852 by @garrynewman
Rendering & Shaders
- Directional shadow hardness - preserve the softness control in later cascades instead of clamping different settings to the same result facepunch/sbox@a669733 by @polepie
- Clustered shadow artifacts - calculate receiver normals outside per-light loops to fix dark lines at cluster boundaries that crawl with camera movement facepunch/sbox@cc91792 facepunch/sbox@12bd1db by @corentarts, @handsomematt
- Orthographic shadows - skip perspective-only screen-space shadow masks for orthographic views facepunch/sbox PR #5875 by @sampavlovic
- Inactive material textures - use explicit fallback bindings without missing-texture diagnostics for disabled features, while retaining diagnostics for active missing textures facepunch/sbox@c5ac37a by @handsomematt
- Environment probes - use non-uniform-safe cubemap indexing when sampling reflections facepunch/sbox@e834b54 by @handsomematt
- Legacy dev materials - restored vertex paint support facepunch/sbox-public #11286 facepunch/sbox PR #5723 by @handsomematt
- Clutter shadows - respect disabled shadow casting for screen-space shadows facepunch/sbox PR #5614 by @polepie, @sampavlovic
- Shader sampler defaults - use sampler-state defaults instead of interpreting sampler IDs as render-state IDs facepunch/sbox@0f2c391 by @lolleko
- SPIR-V optimizer - match the optimizer environment to the SPIR-V 1.5 modules emitted by Slang facepunch/sbox@f86456e by @lolleko
- Linux and macOS shaders - preserve the leading slash on absolute shader paths so compiled shaders are found instead of repeatedly recompiled facepunch/sbox@e940641 by @sampavlovic
- GPU text - fixed flickering with many TextRenderers by uploading shared glyph and instance data before render display lists are submitted facepunch/sbox PR #5810 by @sampavlovic
- SceneObject batching - split batches when render attributes differ while keeping objects with equal attributes batchable facepunch/sbox@7565be0 by @handsomematt
- Decal sampling - use non-uniform sampler access when clustered decal selection differs between pixels facepunch/sbox@08a4d2f by @handsomematt
- Slang capabilities - explicitly declare supported capabilities to prevent implicit shader-profile upgrades facepunch/sbox@90e3b6f by @handsomematt
- Shader compatibility - explicitly mark the fixed dynamic-reflection texture slot as uniform and remove deprecated HLSL inheritance from MaterialMultiblend facepunch/sbox@56c8c0c facepunch/sbox@35f2efa by @handsomematt
- Realtime cubemaps - finish rendering environment maps before building camera views that sample them, fixing one-frame black flickers in game facepunch/sbox PR #5859 by @sampavlovic
- Cubemap captures - exclude UI from managed and native cubemap rendering, preventing UI in reflections and associated rendering errors facepunch/sbox PR #5859 facepunch/sbox@c37d247 by @sampavlovic, @lolleko
- Vulkan barriers - only include the ray-tracing shader stage in buffer barriers when ray tracing is enabled facepunch/sbox@06c204b by @lolleko
- Material expressions - warn instead of asserting on evaluation failures and only mark texture results after a successful lookup facepunch/sbox@5e9b3e1 facepunch/sbox@38c232e by @lolleko
- Recycled scene objects - clear stale tags when creating SceneObjects and SceneModels from recycled native objects facepunch/sbox@97d1b8e facepunch/sbox@ebf1fee by @samfadi-dev, @handsomematt
- Ambient occlusion - explicitly mark the fixed SSAO texture slot as uniform to resolve shader warnings after the bindless changes facepunch/sbox@630910c by @polepie
Gameplay
- Inventory - equip the initial active item when the component starts, including items received in an initial network snapshot, without double-equipping facepunch/sbox-public #11787 facepunch/sbox PR #5732 by @handsomematt
Engine
- Async waits - correctly respect zero and finite timeouts, including time spent processing queued work facepunch/sbox PR #5812 by @garrynewman, @handsomematt
Assets & Resources
- Resource bindings - synchronize resource-name allocation and release, and retrieve native resource GUIDs through strong handles facepunch/sbox@f6eca9a facepunch/sbox@7ca9815 by @solwllms
- Asset GUIDs - do not treat duplicate BuildFileList entries as collisions or generate replacement GUIDs for them facepunch/sbox PR #5843 by @solwllms
- Texture GUIDs - fetch the GUID from the loaded texture handle facepunch/sbox PR #5844 by @solwllms
Build Tools
- macOS content builds - restore executable permissions on downloaded content-builder binaries facepunch/sbox@34a2253 by @polepie
- Public repository sync - allow long Windows paths when cloning the public repository facepunch/sbox@49ac137 by @handsomematt
Standalone
- Exported games - fixed Windows standalone games failing to launch by using an unbundled launcher with embedded game configuration facepunch/sbox PR #5855 by @devultj
- Game data - use the standalone data root directly instead of creating an extra game subfolder facepunch/sbox-public PR #11737 facepunch/sbox PR #5856 by @boxrocket6803
Movie Maker
- Video exports - wait for space in the encoder queue before submitting each frame, preventing dropped frames when rendering outpaces encoding facepunch/sbox PR #5880 by @metapyziks
- Demo visibility - capture Renderer.RenderOptions so first-person and world-model visibility changes are preserved in recordings facepunch/sbox PR #5857 by @metapyziks
- Demo prefab targets - defer component initialization until unrecorded components are stripped and prevent Dresser from changing body groups in prefab cache scenes facepunch/sbox PR #5857 by @metapyziks
Audio
- Sound hotloading - dispose active sound handles and drain mixer disposals before reloading; avoid freeing a source still referenced by voices facepunch/sbox@cd49f2e facepunch/sbox@76f9856 by @lolleko
🚯 Removed
Rendering & Shaders
- Bindless sRGB argument - replaced GetTexture2D(index, true) with GetTexture2DSrgb(index); use GetTexture2D(index) for linear sampling facepunch/sbox@ba36487 by @handsomematt
- NonUniform sampler wrapper - replaced the wrapper overloads with GetSamplerNonUniform(index) and GetSamplerComparisonNonUniform(index); compute RW texture indices must remain uniform facepunch/sbox@ba36487 by @handsomematt
- UV aliases - removed the uv and uv1 semantic aliases; use LowPrecisionUv and LowPrecisionUv1 facepunch/sbox@c6032f0 by @wheatleymf
Standalone
- Export contents - no longer include CLL source archives or XML documentation alongside compiled game assemblies facepunch/sbox PR #5855 by @devultj
Engine
- Resolution presets - removed legacy launch presets such as -720; use explicit -width and -height arguments facepunch/sbox PR #5858 by @garrynewman, @handsomematt