402 Commits over 92 Days - 0.18cph!
Add JsonPointer (RFC 6901) implementation and tests
Add RFC 6902 compliant JSON diffing / patch generation
Use JsonNode instad of JsonDocument in pointer
Add ApplyPatch functionality
Generate roundtrip tests
Add Test Generator for GameObject hierarchies
Remove Copy & Move operations
I can't make it work there are extremely rare edge cases for enormous diffs (thousands of objects and operations).
The code to support these edge cases was becoming more and more unhinged and illegible.
Can still tackle it later if we really need it.
Add tests for LCS
Work around .net runtime bug in Json.DeepEquals
dotnet/runtime/issues/112769
Clone/Move attempt 2
Move optimization still fails for very large diffs -> disable for now
Cleanup some debug code
Potential optimization in CreatePrefabObjectLookup
This helps a bit when cloning larger prefabs, not sure how much it will reflect in our benchmarks, on my machine the gains were quite small.
Revert "Improve player spawn performance" so we can optimize for go clone/creation performance
This reverts commit 318474ee16bf9e057c1e8fbc8e2ee7877cf4dcd2.
Improve player spawn performance, by enabling/disabling player go instead of destroy/create
Before:
Function Name: GameManager.SpawnPlayer
Number of Functions: 22
Average: 9ms 448µs
Median: 8ms 353µs
After:
Function Name: GameManager.SpawnPlayer
Number of Functions: 21
Average: 4ms 945µs
Median: 4ms 870µs
Copy bone scale from GameObject instead of internal bone
Can't use TryGetBoneTransform because it still holds the old transform (before gibbing)
Fixes: sbox-deathmatch/issues/129
Remove duplicate key to fix resource compilation
Fix NRE for gluon gun, happened if player died before RPC was processed.
Fixes sbox-deathmatch/issues/121
Hide transform gizmos for prefab root in the prefab editor for now.
Hide transform widget for prefab root in the prefab editor for now.
Related to sbox-issues/issues/7316 sbox-issues/issues/7577 sbox-issues/issues/6785
Catch serialization errors when pasting game objects
Fixes sbox-issues/issues/7645
Fix undo for TagSet ControlWidget
Fix regression when cloning List of user defined classes that contain a member called "Prefab"
Fixes sbox-issues/issues/7638
Fix being able to select prefabinstance child objects when using box selection in scene editor
Remove old undo system (#1824)
Removes all the private members/method related to the old undo system.
Strips functionality from all public methods, but holds on to the public method stubs, so we don't completely break older editor tools. Older tools will still compile but their undo/redo won't do anything anymore.
Scene editor, select outermost prefab instance when clicking on a nested prefab instance
Fix iterating modified collection when cloning components & gameobjects
Fix iterating modified collection when updating prefab instances
Don't allow parenting to prefab instances via scenetree
Play error sound when drop operation fails.
Fixes sbox-issues/issues/7628
Move gameobject creation for empty/new prefabs into the correct scene scope
Should avoid the GO being created in the wrong scene.
Related: sbox-issues/issues/7602
Remove old undo system
Removes all the private members/method related to the old undo system.
Strips functionality from all public methods, but holds on to the public method stubs, so we don't completely break older editor tools. Older tools will still compile but their undo/redo won't do anything anymore.
Fix scene hierarchy right click (context menu) delay
Always refresh PrefabCacheScenes PostLoad even if the prefab didn't change. Ensures types of older assemblies are refreshed.
Should fix issue where TypeLibrary.GetType() would return null when reconnecting to a server.
The root of the issue was that typelibrary got refreshed on reconnect while the prefabcachescenes were not.
Automatically break prefab instances if part of the instance is reparented to another game object.
A warning is emitted when this happens.
Fix edge case for nav agent ground trace
Properly simulate deceleration for nav agents
New logic also tries to decelerate them as fast as possible
Gluon Hose Shader
https://files.facepunch.com/lolleko/2025/February/07_14-11-LavishTinamou.mp4
Some minor spline tweaks I forgot to backport from scenestaging
Spline Class (#1817)
General purpose spline class for 3D.
Uses a composite 3D cubic Bezier curve under the hood.
Shape and behavior of the spline are controlled through points and handles.
Two consecutive points and their handles define one segment/curve of the spline.
The spline can be turned into a loop (Beziergon), which combined with linear handles can also be used to create a polygon.
Splines are useful for animations, camera movements, marking areas, or procedural geometry generation.
Added Object property to WrappedMethod<T> (Fixes Facepunch/sbox-issues#7497)
Fixed Show Interpolation Debug not being able to be toggled in the UI. If a ConVar value is a boolean, use its integer form. Fixes Facepunch/sbox-issues#7503
ActionGraph: add warning frame for graphs that can't be saved
Fix case where empty editor scene is opened
Fixes Facepunch/sbox-issues#7026
Added Show Hitbox Debug option in Debugging Menu in the editor. debug_hitbox ConVar. Can debug hitboxes in the editor or in-game similar to Show Interpolation Debug. Fixes Facepunch/sbox-issues#7505
Update mouse capture position if we get new absolute pos while locked (eg when unfocused, tabbed)
Keeps cursor position predictable/reliable, stops occasional out of date position being restored and yeeting my mouse across the screen
Only SetCursorPosition while engine window's got mouse focus, prevents unwanted movement in editor
Add bitmap loader for IES files, treat them as images
Do InputRouter::OnWindowActive based on engine window (not app) focus, fixes click-to-focus going thru as an input and shooting or whatever
IES should be using RgbaF16 to avoid banding
Default WindowedLocalInstances preference to true
Remove logic to migrate from old project cookie, editor layout locations
Fix default layout raising cloud browser, do asset browser instead
Invert Ladder climbing controls when looking down (just like half-life)
Fixed previous Show Hitbox Debug displaying BBox hitboxes in the wrong place
Standalone: projects that only have the VR control mode enabled should automatically launch in VR, otherwise default to using the `-vr` launch param
Moved DirectoryMetadata from Project Cookies to Project Config folder. Metadata is only saved when changes are made instead of saving a bunch of default values that are identical.
If folder metadata isn't found, check ProjectCookie for legacy data
Make ResourceLibrary work for all Resources - meaning we can network resource references
Revert sbox/commit/11b227aac0ff5e756beae0ced2410445b1270c70, it's causing hammer objects to duplicate for remote clients over the network
Gpu decals point towards forward and not left 🤦
Fix Gpu Decals normals not transforming to world space
New decal component - https://sbox.game/dev/doc/reference/components/decals/
Add missing shader include
Build shaders
Decal: Update transform when dirty too Fixes Facepunch/sbox-issues#7518
Add thumb to published workshop clothing
Fixed issue with calling RPCs from within RPCs when using HostOnly / permissions and Caller not being set correctly. Fixes Facepunch/sbox-issues#7452
Make use of the return type of Scene.Load and return false if SceneLoadOptions has no valid scene set
Calling Network.AssignOwnership with a null connection will pass empty guid instead of throwing NRE
Standalone: Separate operations up into build steps & sort
Standalone: ignore dxcompiler
Shader Graph Functions (Sub-Graphs) (#1806)
- Adds a new Asset type with `.shdrfunc` extension.
- Shader Functions do not have the "Material" node as their final output node. Instead they have a "Result" node which has a variable amount of inputs defined by the user
- You can change the preview type of a Function Output so the value can be previewed while working on it
- Dragging a `.shdrfunc` file into a Shader Graph (or a subgraph) will create the subgraph node
- When "Add To Node Library" is set to `true` on a Shader Function it will be added to the Right Click -> Create menu
- Double Clicking on a Shader Function Node will open the Shader Function
- GraphCompiler now keeps track of the current Subgraph stack when compiling the preview and the output code, fully supports subgraphs within subgraphs.
- Constant nodes now have a "Preview" input when you're in a Shader Function
- Can Right Click -> Create Custom Node with a bunch of nodes already selected to instantly create a Shader Function. Will automatically create all the input parameters and result outputs.
- Texture Parameters/Attributes are fed the whole way up from each nested subgraph since you cannot define a default texture in the `.shader` file.
- Subgraph Nodes are now colour-coded Green and Result nodes are now colour-coded Blue
https://files.facepunch.com/CarsonKompon/2025/January/28_18-05-OddAsiantrumpetfish.mp4
Require DropOwnership() to clear owner instead, document exception
Remove Parameter.GetDefaultValue() and grab the current value as the default value
Fix Default Color Editor in Subgraph Node Properties
Subgraph Node ColorEditors are now bound to the defaults properly
Add [SkipHotload] to RcSortedQueue comparator
Simple AssetPicker displays Cloud Assets in a separate tab by default (with the option to combine them like it used to be). Show Cloud Assets is set to true by default so you can set Cloud Assets for anything called from native (like material/modeldoc)
https://files.facepunch.com/CarsonKompon/2025/February/05_16-10-CoarseTasmaniandevil.mp4
We aren't using m_pTransformBufferPrevData and probably won't need to with compute transforms, also remove m_hTransformTexture which has been deprecated for years
Allow texture asset type to be dragged into texture image control
Default texture generator to empty image file for null texture properties instead of showing vtex resource control
Add "list_sound_handles" console command
To help investigate Facepunch/sbox-issues#7450
Warn if the mixing thread is choking
https://files.facepunch.com/ziks/2025-02-06/sbox-dev_0l4IVOqJgB.mp4
Facepunch/sbox-issues#7450
Example networking test for asserting certain message types
Some safety around ResourceLibrary.Unregister
Resources get unregistered in their finalizer, so this race condition could have happened:
1. Resources are loaded
2. Resource library gets cleared
3. Resources are loaded again
4. Old resources get GC'd, remove new resources from ResourceIndex
Fix warning when using AssetSystem.CreateResource
Remove TypeKey from EditorShortcuts and use Type instead of string as key.
EditorShortcuts will now resolve shortcuts in parent classes. Resolves Facepunch/sbox-issues#7531
Remove some logs
Standalone: we might need this DLL actually 🙈
Dispose SoundStream in VoiceComponent when finished. Facepunch/sbox-issues#7450
First person: move FireModeSelectAnim weightlists into prefabs
Decals gradient uv scales off the proper axis (stops mipmapping way too soon)
Delete unused (or should be unused) shaders
* ui
* ui_texture_on_model
* visualize_cloth
* visualize_nav
* visualize_physics
* blur
* unlit (ui shader)
Deleted unused non-compute gaussian blur shader
Delete pre SM4/DX10 compatability code
Don't try to disable these shader warnings
Revert commit a6f4d1d0dcdda5da45be89b9ece67c21f18e9901 for now since that wasn't the correct solution
Another potential VoiceComponent fix for Facepunch/sbox-issues#7450
Unused materials using those unused shaders
ActionGraph: don't try to set { init; } properties
Fixes Facepunch/sbox-issues#7533
ActionGraph: fixed not being able to save expression delegates
Merge branch 'master' into spline-class
Rename functions (Tangent -> Handle)
Sync splines with PR branch
Merge In/Out & In/OutRelative into a single property.
Fix spline editor to support vector3 scale
Bring spline code in sync with engine PR
Update test to match changed API
More comments, shorten various property names
Custom JSON converter for spline points
Reduces serialization overhead by omitting certain fields when set to their default value.
Also uses shorter property names.
Add more summaries
more summaries
Make SegmentParams struct internal
Spline Class
Ported from scenestaging
Create separate spline class
Cleanup SplineComponent
Cleanup test scene
Merge roll, up, scale & tangent mode into spline point
Fix breaking from prefab not refreshing editor selection
Fixes sbox-issues/issues/7502
Update spline tests scene
Add viewport option to toggle default prefab lighting
https://files.facepunch.com/lolleko/2025/February/02_20-07-ConsciousCormorant.mp4
sbox-issues/issues/5527
Skip hotload for DtNode, hopefully fixes issue when hotreloading while navmesh query is in progress.
Catch type library returning null, event if it really shouldn't return null in the first place.
Related: sbox-issues/issues/7496
Optimize ComponentList.GetAll by getting rid of LINQ
The combination of recursion and LINQ allocated a lot of garbage in GetAll, this would result in a heap reallocation during many GetAll calls.
Removing LINQ yielded a nice performance improvement.
Getting rid of the recursion gives another tiny performance improvement, but not big enough to justify the reduction in code readability.
I can not show results directly for ComponentList.GetAll, because the function executes too fast after the optimization and is no longer captured by the sample profiler.
But here are the improvements for PhysiscsWorld.OnIntersection, which makes heavy use of ComponentList.GetAll internally via InvokeListeners<T>().
Before:
Function Name: Sandbox.PhysicsWorld.OnIntersection
Number of Functions: 2907
Total time: 9s 406ms 99µs
Maximum: 11ms 86µs
Top Quartile: 3ms 848µs
Average: 3ms 235µs
Median: 3ms 176µs
Bottom Quartile: 2ms 684µs
Minimum: 20µs
After:
Function Name: Sandbox.PhysicsWorld.OnIntersection
Number of Functions: 2779
Total time: 3s 661ms 358µs
Maximum: 6ms 971µs
Top Quartile: 1ms 552µs
Average: 1ms 317µs
Median: 1ms 220µs
Bottom Quartile: 975µs
Minimum: 19µs
Related to sbox-deathmatch/issues/104
Move some files
Spawn players at the spawn point furthest away from other players
Use ReflectionQueryCache in Component Serialization