Update 26.09.15

A new drawing API, razor-sharp GPU text, improved host migration, game hover cards, and Block Party. Plus mesh editing tools, performance gains, and Mac and Linux improvements.

Painter is a small utility struct that replaces HudPainter and the panel rendering system. It's now used to render the whole panel system and you can use it to render things like UI, HUDs, panels and world panels manually using a common sense API.Shapes are generally SDF rendered so they are totally antialiased and beautiful.

We have the ability to draw Arcs, Arrows, Bezier Lines, Capsules, Circles, Credcents, Crosses, Hearts, Lines, Poly Lines, Polygons, Quads, Rects, Rings, Stars, Ticks and Triangles..

We support a bunch of different strokes. Inside, center and outside. Solid, dashed, dotted..
And fill can be a color, an image, a radial gradient, a linear gradient or a conic gradient..
Line rendering supports different miters, including bevel and round, with a miter limit..
This all uses a batching system under the hood, so performance is actually pretty insane. This demo is all rendered in one single draw call.
Here's what the code looks like, in a component..
void Update()
{
	using var painter = Camera.BeginHud();

	var color = Color.Green;
	painter.Fill = Fill.LinearGradient( Color.Red, Color.White, 45.0f );
	painter.Stroke = Stroke.Solid( color, 3 );
	painter.Circle( new Vector2( 100, 100 ), 50 );
}

This change also makes IPanelDraw now redundant, a you can now just override the OnDraw( Painter painter ) function.
Text Rendering has been the oldest component of our engine, it worked well, but it had it's caveats, specially for being generated from the CPU, was blurry on any transform.

Since we are going to focus on using our UI system for tools, we ought to make text rendering awesome.

Continuing from my work from a few hackweeks back, I have fully implemented GPU Text Rendering based on the Lengyel algorithm to the engine while retaining all the current API, curves are passed to GPU and all drawn on the shader.

You don't need to do anything, it just works, supports CJK, emojis, shadows, outlines, and everything that the previous system supported, and looks unbelievably sharp even from a millimeter away

This ends up being significantly faster than our previous system while always looking awesome.

All still rendered using our UI renderer in one draw call
When the host leaves, their snapshot state now gets restored on the new host, host-only objects included. If your state survives a late join, it should survive host migration.
Running code doesn't carry over though, so anything mid-flight needs resuming on the new host. There are analyzers to help you check that your state and behaviour are migration safe.

You can find more detailed information in the docs.
We added hover cards to the menu. Hover a game and you can quickly glance at the info you need to decide whether to play.

We've also reworked the game modals and toasts elsewhere in the menu. Making game interactions like Reviews, Favorite, Hide Game... more visible and consistent.
Changing graphics settings in the editor previously meant launching a scene and opening the in game settings menu.
There's now a dropdown in the viewport controls to switch quality presets directly. 
Here's a new game using the 2d sprite system for you to check out:
https://sbox.game/facepunch/blockparty/
It's got leaderboards with replays, a level editor with workshop support, gif exports, and some other fun features. 

GameObject cloning is now ~2.6x faster with about 38% fewer allocations in synthetic tests. Anything spawning prefabs at runtime benefits.
In our actual tests it's less significant because the main bottleneck here for cloning is spawning models collisions etc.. the actual serialization overhead of the cloning was already quite low.

Network snapshots are also cheaper on the host. Scene state is still captured on the main thread, but JSON, blob and packet encoding now runs on workers, so players joining or loading in cost the host a lot less.
A bunch of Mac and Linux improvements:
  • Mac fixes cover game-view input, editor DPI scaling, Finder folder opening and scene staging.
  • Geometry shader support for Mac, fixes Highlight component crashes; procedural render callbacks also have a lifetime fix.
  • Code editor detection and the publish/export controls work on Mac and Linux.
  • Linux native builds use Steam Linux Runtime 4.0
  • Colour emoji fallback uses Twemoji on Mac and Linux.

I've improved the open source workflow a bit more, adding a simpler Setup.bat and now Setup.sh for Linux & Mac.
The Setup.bat now has progress reporting, mainly for the download steps as you had no idea how much or how long you were downloading for before previously.

On top of that the setup now installs Git hooks - each time you pull or switch branch the download step is run automatically, meaning you don't have to run Setup.bat every time.

Redesigned the storage settings page.

I've implemented the CSS property overscroll-behavior which lets you both disable the edge bounce of scrolling and also prevent scrolling cascading to the parent panel.
I halved the price from $20 to $10 this week.

There has been speculation on twitter that this was a desperate attempt to get more players. Well fucking DUH. Of course it is. We need more players, we don't have enough players. We're being told in reviews constantly that the price is too high, so we're going to lower it to try to encourage more people to play.

Our primary goal on the platform right now is to get more active players. We're improving the platform, encouraging the right type of games, encouraging better discovery and improving performance. We're pushing in a bunch of different directions to achieve a higher active player count, and this is one of them.

26.09.15

26.09.15
15 September 2026
Areas
57 changes in this update

Added

13 changes
UI & CSS
  • Painter - added a shared drawing API for panels, HUDs, world panels, textures and command lists, with antialiased shapes, paths, fills, strokes and clippingPR #5785 by @garrynewman, @handsomematt

  • Panel drawing - added OnDraw(Painter painter) for custom panel renderingPR #5785 by @garrynewman, @handsomematt

  • Overscroll behaviour - added overscroll-behavior and per-axis controls to disable scroll edge bounce8296281 by @handsomematt

Editor
  • Mesh flipping - added controls to flip selected meshesPR #5786 by @bakscratch

  • Surface-aligned blocks - hold Shift while dragging to create a block along the hit surface normalPR #5781 by @bakscratch

  • Graphics presets - switch rendering quality directly from the viewport toolbar080e430 by @lolleko

  • Multiplayer testing - added editor and MCP tools to host sessions, spawn local instances and migrate the host5acd730 by @lolleko

Networking
  • Host migration analyzers - added diagnostics for unsynchronised state and pending host logic, enabled according to the project networking settingb9ef291 by @lolleko

Menu
  • Hover cards - hover a game to see an interactive preview with play, rating, favourite, review and hide actions87e792911e4a11 by @lolleko

  • Game context menu - added like, dislike, favourite and hide actions to the right-click menu6a4bd24 by @lolleko

  • Jam nominations - nominate eligible games from hover cards, the game modal and the end-of-game toast, with minimum play-time checksbab2a6357aa0db by @lolleko

Rendering
  • Shader feature values - read a feature by name as an integer in shader code without extra declarationsPR #5776 by @wheatleymf

Platform

Improved

15 changes
UI & CSS
Editor
  • Connect Vertices - validate selections before editing and explain why vertices cannot be connectedPR #5720 by @aylaylay

  • Movie Maker export - capture frames through scene update hooks in the main loop; AV1 is now the default video codecPR #5784 by @metapyziks

Networking
  • Host migration - graceful host departures now hand off a snapshot to the next host, including host-only objects, snapshot state and replicated ConVarsac95437 by @lolleko

Menu
  • Game modals - moved rating, favourite, review and hide controls beside Play, and added a write-review prompt57aa0db by @lolleko

  • Jam browsing - jam shelves link to the Jam tab, nomination controls use gold styling, and entry cards show Play until eligible088bfc2612c2ec by @lolleko

  • Storage settings - redesigned downloaded-content usage and type breakdowns, with scan progress, clearer cleanup recommendations and removal confirmationPR #5806 by @xezno

Platform
  • Linux runtime - native Linux x64 builds now use Steam Runtime 4, with updated libcurl dependencies and bundled ICU0df6dcd062c296PR #5808 by @handsomematt

  • Source setup - simplified bootstrap, added timed build and download progress, and introduced public Setup.bat / Setup.sh with platform-specific artifact downloads and Git update hooksPR #5808 by @handsomematt

  • Graphics diagnostics - include the graphics environment alongside hardware information in system reports4c60c25 by @lolleko

Performance
  • GameObject cloning - reduced cloning time and allocations; the commit benchmark reports approximately 2.6x faster cloning and 38% fewer allocationsd527633 by @lolleko

  • Snapshot encoding - moved JSON, blob and packet encoding for join, scene-load and migration snapshots onto workers while preserving per-connection send orderb21367e by @lolleko

Navigation
  • Crowd steering - improved wall avoidance and cornering, limiting wall checks to the next path corner and neighbour avoidance to agents on a collision course6a9bd11aeabfc994a8167 by @lolleko

Fixed

29 changes
UI & CSS
Editor
  • Asset Browser layouts - restore every saved Asset Browser, reuse disabled browsers and remove stale closed-browser menu entries after restartingPR #5557 by @carsonkompon

  • Publish hotload - recover from hotload by returning to compilation so the wizard uploads fresh assembliesPR #5775 by @devultj

  • Doo editing - mark scene changes dirty and integrate Doo edits with undo handling#11772PR #5721 by @handsomematt

  • Mesh mirroring - preserve grouped mesh transforms and scalePR #5763 by @handsomematt

  • Pivot picker - set the pivot without changing the selected meshPR #5782 by @bakscratch

  • Mapping materials - use the latest Asset Browser material selection in mapping tools, including Hammer#11399d2ed97c by @handsomematt

  • FBX import - preserve bone streams when scale helpers are generatedPR #5787 by @aylaylay

Networking
  • Connection serialization - correctly resolve connection types that differ between peersd9ae0de by @lolleko

  • Targeted messages - prevent recursive nested messages from overflowing the server stackc7fc6de by @lolleko

  • BytePack - track nesting depth explicitly and limit nested data to 32 levelsdb678e4 by @lolleko

  • HTTP requests - prevent hostnames resolving to 0.0.0.0 from bypassing loopback restrictionsc354923 by @lolleko

Menu
  • Game actions - favourite, vote and nomination buttons update immediately and reconcile with the server responseaf667b3 by @lolleko

Rendering
Platform
  • Mac rendering - fixed procedural-render callback lifetime crashes and Highlight component crashesPR #5798 by @sampavlovic

  • Mac editor - fixed game-view input, DPI scaling, Finder folder opening and scene stagingPR #5798 by @sampavlovic

  • Mac and Linux tools - fixed code editor detection and availability of publish/export controlsPR #5798 by @sampavlovic

Navigation
  • Agent transforms - runtime object and parent transforms no longer reset the simulated agent or its path; use SetAgentPosition to reposition it explicitly#11811364a039 by @lolleko

  • Custom link traversal - preserve the agent landing position when completing a custom linke472ae8 by @lolleko

  • Navmesh rebaking - discard loaded tiles that the latest bake leaves empty5e0fe16 by @lolleko

Physics
  • Character Controller - respect StepHeight when grounded movement hits an obstaclePR #5783 by @aylaylay

  • Collider cleanup - avoid a null-reference exception when destroying a keyframe without a scene601b0ef by @aylaylay

Characters
  • Female skin - corrected outdated roughness, normal and ambient-occlusion texture detailsf316f9b by @danduwfp

matt
Facepunch
JoinedApr 2021 Posts264 Score2,045
Update 26.09.15 : news/update-26-09-15
The Relentless
Member
JoinedApr 2026 Posts13 Score455
 Great update! 
Trundler
Member
JoinedOct 2021 Posts127 Score996
Another great blog post!
zxcdulsed
Member
JoinedAug 2023 Posts26 Score1,355
Thanks for the update
Titanovsky
Member
JoinedSep 2021 Posts323 Score3,958
 The biggest news is of course the price drop. Not a discount, not a free weekend. Idk how to feel about it, this approach makes me a bit nervous. Idk who was pushing harder for the $20 price, Garry or Alistair, but it was already pretty clear that it's way too much for a platform with insanely little content. We saw that in April.

As for $10, it's the burger theory, but will it work? Probably. I hope Facepunch has everything under control, and that in December we won't see s&box go free, because that could only mean one thing, that things are going badly.

Lorenz, the light theme is mvp!
Patrick Jr.
Member
JoinedApr 2021 Posts36 Score4,410
Another fantastic post ❤️
Zontax
Member
JoinedMay 2023 Posts81 Score8,257
How wonderful!
RuubDev
Member
JoinedAug 2026 Posts2 Score2,815
Garry ❤️
edited 12 hours ago#9
Skylor Beck
Member
JoinedJan 2023 Posts4 Score3,147
BaseCombatWeapon is missing it's Crosshair code with the new painter. Every weapon in S&Box has no crosshair now, unless the devs made their own before this update.
Missing
Member
JoinedJul 2022 Posts64 Score2,196
W update
herruardo200
Member
JoinedFeb 2023 Posts3 Score65
Actually, thank You for the price decrease! I was able to gift the Game to a friend just now, so I hope this Will be the case for other people.
wired
Member
JoinedJul 2024 Posts2 Score885
9 Ball Brawl spotted ❤️
G+
Member
JoinedFeb 2024 Posts76 Score3,100
awesome 
Member
JoinedDec 2024 Posts45 Score12,200
No more sale after the jam it seems like? 
people
Log in to reply
You can't reply if you're not logged in. That would be crazy.