A new drawing API, razor-sharp GPU text, improved host migration, game hover cards, and Block Party. Plus mesh editing tools, performance gains, Mac and Linux improvements and a price drop.
matt, garry, Sam Pavlovic, Lorenz and 3 othersarticle
14 sections
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..image.png11.83 KB We support a bunch of different strokes. Inside, center and outside. Solid, dashed, dotted..image.png12.02 KBAnd fill can be a color, an image, a radial gradient, a linear gradient or a conic gradient..image.png3.19 KBLine rendering supports different miters, including bevel and round, with a miter limit..image.png5.39 KBThis all uses a batching system under the hood, so performance is actually pretty insane. This demo is all rendered in one single draw call.20260914-1433-40.6689436.mp42.62 MBHere'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
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.image.png43.44 KBRunning 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.
Changing graphics settings in the editor previously meant launching a scene and opening the in game settings menu. image.png83.64 KB 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/bpvid.mp434.99 MB 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. 15_20-50-WhitesmokeBullmastiff.png33.16 KBIn 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.
I've improved the open source workflow a bit more, adding a simpler Setup.bat and now Setup.sh for Linux & Mac.image.png43.71 KBThe 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.
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.