- 16 -> 64 parallel downloads: ~600 -> ~1350 small files/sec (2.2x)
- Stream response bodies to disk instead of buffering: 739MB -> 3MB peak heap on a 610MB file
- HTTP/2 so those 64 downloads share connections instead of opening 64 sockets
- Better Backoff and retry logic
- Change TaskCanceledException -> OperationCanceledException in a few places
* Store package:file relationships in a separate links table to support many-to-many tracking
* Prefer versions of files from the newer package when encountering a file shared between packages, so updating packages always takes precedence
* Package validation improvements: verify file size on disk matches entry, hardening for shared files
- Added `Preferences.StreamerMode`, which shows as a "Streamer Mode" setting in the "Game" tab
- Added `Steam.GetAnonymousName()` for when Streamer Mode is enabled
- `Friend.Name` and `Friend.DisplayName` returns an anonymous name when enabled
- `AvatarLoader` returns an anonymous profile picture when enabled, procedurally generated
- `Connection.Name` returns an anonymous name when enabled
- `Profile.Name` returns an anonymous name when enabled
- `"👋 PLAYER_NAME has joined the game"` chat messages are no longer sent as a string, but a new net message with the steamid so clients can resolve the player names on their own (so Streamer Mode shows anonymous names)
* Added Steam Controller / Deck glyphs
* Drop GameControllerType, pass in Name
* Add Nintendo Switch glyphs
* Update SDL3 to 3.5.0, including gamecontrollerdb.txt update
* Simpler light caching
* Simpler cube cache as well, benchmark on RX580 goes from 248ms to 55ms
* Fix logic
* CRenderContext::CopyTexture copies slices for cube in one GPU command
* Do texture copy in a layer so that we handle it all in sequence during scenesystem rendering
* Use Transform Version instead of key, get cache texture only when we actually want it, as cheap for the cpu as it was before
* Only do static caching if our light is static
* Shared cache code for lights (including static cache) instead of duplicating
* Potential fix for pull request finding In the vkCmdCopyImage path, dstOffset.y is set from nDestX instead of nDestY. This will copy to the wrong Y position (and can trigger out-of-bounds clamping/validation errors when nDestX != nDestY).
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Re-do Bloom based how Jimenez, SIGGRAPH 2014 did, remove gamma shit, biquadratic shit, add bloom tint
* Compile shaders
* Format
* Adjust bloom tests, these are no longer relevant
* Mark obsolete properties for Gamma and Filter in Bloom effect
* Blend with rgb only
RequestStreamAsync went through RequestAsync, which sends with the
default HttpCompletionOption.ResponseContentRead - so the whole body was
downloaded before the task resolved, and the "stream" handed back was
the buffer. A response that never ends (NDJSON, SSE, a chunked long
poll) therefore never resolved at all.
It also did `using var response`, disposing the response and with it the
content stream, before returning that stream to the caller. That second
bug hid the first: you could not read the stream far enough to notice
the buffering.
Send with ResponseHeadersRead and return a stream that owns the
HttpResponseMessage and disposes it with itself. RequestAsync's
signature is untouched, so no Sandbox.Access change is needed, and the
consumer side (System.IO.Stream.*, StreamReader) was already
whitelisted. Validation is unaffected: SboxHttpHandler runs
Http.IsAllowedAsync before every send, redirects included, all before
the headers come back.
WebTests.HttpStreamTest serves paced chunked NDJSON on localhost:8080 (a
port Http.IsAllowed accepts) and asserts the call returns before the
body ends, that the lines arrive spread across it rather than at once,
and that a non-2xx still throws.
* Guard Aspect against NaN and build CameraComponent FoV from current camera rect instead of screen's
Getting screen's aspect is actually wrong if we have more than one camera in play (eg splitscreen)
Screen.Aspect not being set until playing is our intended behaviour for what I remember
Fixes https://github.com/Facepunch/sbox/issues/5319
* Add tests and update comment
* Use Normal-offset shadows to deal with shadow acne and peter panning instead of Receiver plane depth bias
much simpler technique and it's what modern game engines use
* Apply shadow normal offset to each shadow type
* Default bias to zero since ApplyShadowNormalOffset deals with it
* ApplyShadowNormalOffset also takes PCF kernel radius
* Update shaders
* Normal bias now scales with PCF kernel size with actual shadow hardness
* build shaders
* GetOrCreateShadowMask() API for shadow masks, simpler to get a per-view texture for the mask and is resolved on the same frame, fixes 1 frame delay on screenspace shadows and VR rendering of them
* Start cleaning up this ShadowMask API
* Move shadow mask stuff to command list, the way we do SSS still needs some stuff we cant nicely expose so use AddAction
* Remove rendering callback from DirectionalLight, add commandlists to scenelight
* Stash a system for shadow masks so I'll revisit later when to make this public
* Do this much simpler, don't expose API for shadow masks yet, intentionally make screenspace shadows part of shadowmapper
* Make this private again and format
* A8 instead of R16
* Only managed cameras reach OnRenderStage, so only they ever clear/dispatch into the mask.
* Use light pointer instead of gethashcode for getting shadow mask
* Init shadowmasktextureindex
Regressed in 4ab8776fdb (multi-listener support).
* Child mixers now feed the parent per listener instead of a pre-collapsed buffer, so a mixer's processors cover its whole subtree.
* Volume is applied before that handoff, keeping the gain cascade intact.
- Adds public `SamplerState.Index` so you can get bindless index for your sampler state and expose it to shaders using `Bindless::GetSampler( int nIndex )`
When used together with Input.SetAction you can make `Input.Pressed` and `Input.Released` return true.
Co-authored-by: badandbest <91832803+badandbest@users.noreply.github.com>
* SceneLoader can provide thumbs (a custom override or from disk)
* mount_generatethumb(s) concmds - writes mount scene thumb to disk on the correct path
* Quake: tag info_intermission as map_preview
* quake map thumbs
* help is backwards whoops
* guard against disposing the singleton ffs