* 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>
Uses vulkan-native NGX integration instead of Streamline.
Also fixes a pre-existing bug where the temporal upscaler wasn't recreated on
display-resolution change.
* Support for multi-drawcall LODs in clutter GPU-driven path
* store arg offset in variable instead of hardcoding it
* use flat draw index
* dotnet format
* Add Qt-Advanced-Docking-System 5.0
* Bind new CDockManager, dock areas
* Use Valve's CSS & images for ADS as a baseline, load stuff from disk instead of embedded in c++
* dockmanager.css in tool styles, auto loads and hotloads
* Rewrite DockManager
* delete toolwindowmanager
* Delete the 50 different ways to create/add/register a dock, you just add a dock, that's all u need
* More dockmanager rejigging
* restore all editor dock layouts and asset browser on the new docking system
* remove last toolwindowmanager remnants, add ADS to third party legal notice
* build classic default layout in code for main editor reset/first-run, add relative area AddDock overload
* relativeTo placement API, restore correct default layouts for all tool windows, register [Dock] types closed instead of eagerly docking
* styling pass
* disable ADS built-in stylesheet load, styling comes from editor stylesheet
* lock picker browser tabs against closing/dragging, make ActionGraph reset layout actually reposition docks
* add DockManager.OpenDock, dedupe layout code in EditorMainWindow/ActionGraph
* CloseDockWidget internal
* add "Close Tabs to the Left/Right" to dock tab context menu
* expose dock MinimumSizeFromContent
* only offer close left/right tab options when open tabs exist on that side
* move "Close Tabs to the Left/Right" out of the ADS lib into a components factory
* guard dock tab context menu against pinned docks with no dock area
* fix crash when pinned tab is destroyed before delayed auto hide timer fires
* recreate scene widget swapchains when Qt recreates their native window on dock reparent
* wrap all sbox changes to the dock lib in #ifdef SBOX
* save a plain window rect as fallback for when Qt rejects saved geometry on mixed-DPI monitors
* expose DockWidget Float/IsFloating
* always restore window geometry from a plain saved rect instead of Qt's DPI fragile geometry blob
* route all window centering through one screen aware helper that handles mixed DPI monitors
* restore window geometry onto the screen it was saved on
* don't close live docks when a dock type unregisters, hotload substitutes them in place
---------
Co-authored-by: Layla <1667289+aylaylay@users.noreply.github.com>
- Optional feature for decals that have a valid heightmap texture
- Controllable with "Coverage amount" and "Coverage range", first property is a ParticleFloat which allows animating it based on decal's lifetime
- Only contributes to existing opacity + attenuation mask
- Build shaders
https://files.facepunch.com/wheatleymf/1b2411b1/sbox-dev_eQfK467sN5.mp4
https://sbox.game/dev/doc/gameplay/inventory-weapons/
Added
InventoryComponent - a slot based inventory, hotbar or shared bucket slots, with a starting loadout
BaseInventoryItem - base class for inventory items, with hooks to veto switching, holstering and dropping
BaseWeapon - a GMod style base weapon - fire modes, magazines and reserve ammo, reloading, dry fire, ballistics, spread, crosshair and HUD
BaseWeaponModel - view/world model base with muzzle flash, brass ejection, tracers and animation hooks
Ammo types are resources (.ammo) - weapons share reserve pools by type, clamped to a max reserve
BaseWeapon.ShootBullets / ShootBullet - bullet tracing with damage, impulse and hitbox tags
Weapon hold types editor
Animgraph enum parameters can be set by option name - Renderer.Set( "holdtype", "pistol" )
NpcUsage on BaseWeapon - engagement range and burst behaviour so NPCs can use any weapon
ICameraModifier - cameras compose their view through an ordered modifier chain, read the result from CameraComponent.View
CameraEffectSystem - screen shake, directional punches and tilts, with world epicenter falloff - camera.AddShake / AddPunch / AddTilt
EnvShake component - shakes the view, rumbles controllers, kicks physics
TracerEffect - an animated tracer line, ITargetedEffect for effects that fly at a target
SceneAnchor - a world position that can follow an object or bone
SkinnedModelRenderer.GetClosestBone( worldPosition )
Vector3.WithAimCone can take a custom Random for reproducible spread
Improve/Fix
PlayerController searches parents for IPressable when pressing
PlayerController camera runs through the modifier chain - IEvents.PostCameraSetup is obsolete
SoundPlayer preview uses shortcuts - Space toggles playback, Ctrl+Space restarts
Fixed Radius( 0 ) traces missing everything
Fixed NRE in AssetPreviewWidget
Removed
Removed CameraComponent.ISceneCameraSetup (obsolete since October, nothing uses)
Adds GPU culling
Fixed collision not working for painted instances
LOD is selected on the GPU now
Improvements on our benchmark: 32ms down to 8ms in some cases
* Depth of field rewrite with tile classification, indirect dispatches, remove focal range (bullshit)
* Clear Vertical/Diagonal DoF blurs across passes so we dont have artifacts from previous one across tile boundaries
* Dont waste more memory than we need for tiles
* Command list texture clears were being deferred to it's own context, do it on the same context immediately
* Do DoF after viewmodel & AfterViewmodel hook actually runs after viewmodel
* Since we precalculate the DoF max range per tile we dont really need this weird logic for optimization
* Fix shitty 1px line for dof when it intersects geometry
https://files.facepunch.com/sampavlovic/1b1411b1/sbox-dev_3p4zfSfTDx.mp4
* update shaders
* Readd focus range but make it almost as far as FarZ by default
* format
* Adjust tests for new behaviour for DoF, reset buffer data on command list
* Particle follow bone
* Add SkinnedModelRenderer.BoneWorldTransforms, PreviousBoneWorldTransforms
* Batch parent space bone reads instead of one call per bone
* Add nogc to the bone setters and parent space read too
* Cache the bone parent array in the world space loop
* Store skinned model renderer on the particle instead of trying to resolve them all, all the time
Co-authored-by: Pol <polepie@gmail.com>
* Add PipelineTextureSlot to assign a render target's color texture to a stable, pipeline-level bindless slot, being able to be produced and consumed entirely on a GPU stable index
* Compiled shaders
* Clean up
---------
Co-authored-by: Matt Stevens <matt@mattstevens.co.uk>
Adds Tracy 0.13.1 support which is a profiler designed for game engines
that can track both CPU and GPU in frame boundaries at a much higher
resolution than ETW based profilers like Superluminal.
Most of this is restoring VPROF defines in 1000 places, hooking up GPU
zones, memory tracking and more.
This is only enabled on non-public developer builds due to the overhead
in this sort of profiling.
https://files.facepunch.com/matt/1b0811b1/tracy-profiler_P9pUMg6Y8n.png
ADDED
css min(), max() and clamp() for lengths
css-wide keywords inherit, initial, unset, revert (incl. shorthands)
added currentColor keyword to css
colors can parse oklch(), lab() and hwb()
added css text-align: justify
css white-space: pre-wrap and break-spaces
added css word-break: break-word
parses css image-rendering: crisp-edges (point sampling)
added css inset shorthand
now parses 1–4 values in the css border-width shorthand
added css transition-duration, -delay, -property and -timing-function longhands
css :has() now supports descendant selectors
added css opacity percentages
added css overflow: auto (maps to scroll)
added css gap: normal
added css filter: none
css transform: scale() now takes comma-separated args
css animations now accept ms units
added more css justify-content, align-* and text-align keywords (start, end, …)
parses css dvh/svh/lvh/dvw viewport units (treated as vh/vw)
parses css object-fit: scale-down (treated as contain)
added css margin-block / margin-inline (+ the logical margin sides)
added css padding-block / padding-inline (+ the logical padding sides)
added css inset-block / inset-inline (+ the logical inset sides)
added the css flex-flow shorthand
added the css font shorthand
added css font-size keywords (xx-small … xxx-large)
css letter-spacing and word-spacing now accept normal
added css font-smooth: none
css aspect-ratio now accepts the auto form
css font-family now maps generic families (serif, sans-serif, monospace)
added css flex-flow
added css font
FIXED
fixed css !important dropping the whole declaration
css line-height without units is now a multiplier
fixed css calc() division and full-expression parsing
fixed the css flex shorthand for single-number and three-value forms
fixed the css transition shorthand when the property is omitted
css font-family now uses the first family in a comma stack
colors now parse fully in the css background shorthand
an unknown css @-rule no longer drops the whole stylesheet
css variables no longer match on partial tokens
injected css variables are kept across stylesheet hotloads
fixed css selector specificity overflowing when comparing rules
css background: none now resets the background (image and colour)
css filter: none now overrides a filter set by a base class
css transform: none now overrides a transform set by a base class
IMPROVED
css rule matching is ~3–5× faster on large stylesheets (rules indexed by class)
~2× fewer allocations in css transitions (snapshot styles once, not per property)
finished css animations no longer re-layout every frame
less GC in css sibling/child selector queries (no list copies or wrappers)
less GC diffing active css rules (no LINQ or hashsets)
faster, lower-GC Yoga layout wrapper
css stylesheet hotload now watches newly imported files
* Remove some dead native sound code
* Rewrite managed audio system to be lock-free
Use a snapshot triple buffering approach (main thread collect snapshots -> mixingthread processes), similar to how we handle batch drawing (mainthread collects snapshots -> render threads processes)
* Remove/Rework managed steam audio abstraction
* Add just Steam Audio effects, build ourselves via vpc
Compile steamaudio with AVX1
* Get rid of native physic query allocations
Keep thread local result buffers
* Reduce vtable lookups for physic queries
Virtualizing has a measurable perf penalty here since these callbacks are very hot.
Devirtualize by using CPhysicsShape/CPhysicsBody directly instead.
* Updated SteamWorks to latest remove client binaries
Should also give use latest GameNetworkingSockets which include a bunch of fixes
* Remove remaining unix ffmpeg libraries
* Remove outdated api from bindings
* Add some new API to bindings
* Launch steam with no authentication, if auth fails
Some Steam SDK version seems to have introduced explicit failure when authentication is failing (e.g. steam nor running).
If auth fails we now fallback to no auth (e.g. for local developement, CI).
* Set registry entry to steamcmd install dir
* add LOD switching for clutter model instances
* DrawModelInstamce with correct LOD level
* removed some useless comments. move stuff around
https://files.facepunch.com/antopilo/1b0711b1/sbox-dev_AcVXDWDDah.mp4
* use biggest scale axis to determine screen coverage for clutter lod level
* clamp LOD in managed
* clamp lod in native
* rename lod Count to maxLodCount