This update introduces new tutorials, random drops, a platform chat system, a new welcome screen, rendering and audio API additions, performance improvements, and a wide range of editor and rendering fixes.
Default platform chat system - games can toggle this on/off in project settings, and hook into it with IChatEvent
Welcome screen shown on first game startup to communicate what s&box is
`SoundFile.FromOgg` for loading OggVorbis sound files
`GpuBuffer<T>.CopyTo` for GPU-side buffer-to-buffer copies
`RenderAttributes.Set(uint)` overload for correctly passing unsigned integer attributes to shaders
`CameraComponent.RenderToBitmap` overload with optional UI rendering parameter
Clutter LOD support for instanced models — models in the same LOD level are batched into a single draw call
Voice Mixer added to default mixers; Voice Component now restricted to only use Voice Mixer or sub-mixers, ensuring the voice volume setting always works
Terrain storage grid visualization when painting materials
UI panels can perform custom drawing again via `IPanelDraw` and `Draw(CommandList)`
Backend notice system for item drops
Trace results no longer allocate arrays, reducing GC pressure — use `HasTag()` instead of the now-obsolete `.Tags` property
Redesigned package modal to match the rest of the UI
Doo methods renamed to include "Doo" in their names for clarity and to avoid variable name conflicts (old names remain as `[Obsolete]` extension methods)
`GpuBuffer.SetData()` now accepts `ReadOnlySpan<T>` instead of requiring `Span<T>`
SceneTree search no longer filters out prefab contents
Video settings are now applied on first launch, fixing potential poor performance before settings are saved
Heightfield collision no longer snags player movement
`TerrainStorage.Resolution` setter made private — use `SetResolution()` instead
`GameObjectSystem` properties now respect property initializers and `[DefaultValue]` attributes
Stale config values are now removed on failed deserialization
`LoadAllGameResource` can now replace existing resources when loading addons or syncing network files
Disabled opaque fade being wrongly enabled on on GameOverlays
Backwards seek (e.g. from `SoundHandle.Time`) causing an infinite loop when hitting the very start of a sound
Opaque Fade not working without MSAA and not rendering properly in shadows
MSAA edges appearing in translucent `screenshot_highres` captures and scene panels
`CameraComponent.RenderToBitmap` UI scaling incorrectly to the bitmap size
Pivot tool grid snapping when dragging fast
Editor shortcuts getting stuck after ALT+TAB or pressing the WIN key while navigating the viewport
Square particles on some impact effects due to incorrect texture paths
Vertex painting not working with custom blendable shaders
System scene overwriting game object systems of the actual scene
Clothing hide parameter selecting wrong bodygroup for human models
Scene system render stats breaking with multiple render scopes
TreeView item not committing pending name change when unfocused
Screenshot UI resolution not matching when resizing - Thanks @Matt9440
Don't forget to update the description on the Steam page as well.
In improved it's said:
What does "no longer allocate arrays" means?
How does it help with GC?
What does it have to do with having a function returning what you're looking for instead of a property? :)))
Impatient to learn about it!!! ^^ 😊
awesome week update
Reducing allocations means first... well you're not allocating, so saved work there. Plus those allocations don't need to be cleaned up by the GC later, so saved work there too. With less allocations the GC needs to run less often. All of this can improve memory usage and performance (especially if you have a bunch of these improvements or you run the affected code frequently per frame).
They were probably either unwilling to outright replace the code in Tags (maybe it behaves differently enough to not be 1:1 compatible) or they decided they wanted it to be a function after all (semantically, maybe it behaves like a function. For example properties may not be expected to do a lot of work or have side effects, whereas functions don't have this expectation). Either way, it wasn't possible to simply update Tags in-place. So they made a new function HasTags() which has the new desired behavior and is now a function. Tags is kept so old projects will still work, but it is given an ObsoleteAttribute so developers will see a warning identifying their usages of Tags and instructing them to change it to HasTags().
Can't you just buy the NFT?