NodeEditorAPI value editor additions #20
NodeEditorAPI value editor additions #20QuackCola wants to merge 897 commits intoFacepunch:masterfrom
Conversation
01c181c to
5f15cd2
Compare
|
You should post some pictures/videos of what these are so I know what I'm looking for when I sit down and test it myself |
5f15cd2 to
2f40a39
Compare
@CarsonKompon Ive slapped together two test nodes in shader graph as an example to show what they would look like. 2025-12-05_09-05-19.mp4 |
2f40a39 to
9895d48
Compare
7ebc4f5 to
aac1cdb
Compare
There was a problem hiding this comment.
Pull request overview
This pull request adds two new value editors for the node graph system: IntEditor for integer values and GradientEditor for gradient values. These editors follow the existing pattern established by FloatEditor and ColorEditor, providing interactive UI controls for editing node parameter values.
Changes:
- Added
IntEditor.cswith range-based slider and drag-to-edit functionality for integer values - Added
GradientEditor.cswith popup-based gradient editing - Both editors integrate with the node graph's value change notification system
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 8 comments.
| File | Description |
|---|---|
| game/addons/tools/Code/NodeGraph/IntEditor.cs | Implements an integer value editor with slider and drag-to-edit modes, similar to FloatEditor but for integer types |
| game/addons/tools/Code/NodeGraph/GradientEditor.cs | Implements a gradient value editor that opens a popup with GradientEditorWidget for detailed gradient editing |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
These look good to me @CarsonKompon |
Keep temp list so we can sort in place Cache occlusion sort predicate in static to avoid action allocation
Fixes timing scopes to more accurately represent a per-frame main thread breakdown, and prevents spikes when GC is executed. - **GcPause** - New separate timing scope showing time spent in GC per frame - GC pause time is subtracted from all other scopes, so each scope now only tracks its own code execution and no longer includes GC overhead - e.g. when GC occurs during the audio scope, the audio scope no longer spikes to 20ms - **AudioMixingThread** removed from the main scopes - Runs on a separate thread, so its timings are effectively meaningless in the main thread view - All other scopes are main thread only - No longer relevant given the audio optimisation work done over the past months - **Scene** scope removed - Didn't make much sense as it was an aggregate wrapping many other timing scopes - Replaced with a finer `Update` scope that tracks `Component.FixedUpdate`/`Update` - **Editor** scope no longer shows in-game - Scopes reschuffled - e.g. verlet rope physics traces are now tracked under the physics scope - Audio occlusion queries are now tracked under the audio scope https://files.facepunch.com/lolleko/2026/March/02_12-59-QuixoticMarten.png
* Move duplicated ProjectInfo building to extension methods * Add moviemaker package reference to editor packages
- Fix last child not getting correct `:last-child` pseudo-class until a frame late - Run UpdateChildrenIndexes right away instead of deferring to next frame - Add some tests
…Facepunch#4180) * Make it easier to unit test movie compilation * Fix track compilation leading to invalid blocks
https://files.facepunch.com/lolleko/2026/March/02_19-27-PlushGalapagosalbatross.png Co-authored-by: darkfated <darkfated@icloud.com> Co-authored-by: Lorenz Junglas <4759511+lolleko@users.noreply.github.com>
* added commandlist at root panel level so we dont have 1 commandlist per panel * added codepath where panel renderer write to the panel roots commandlist instead of their one * added rcon to toggle between both at runtime * cache transform * Build flat commandlist for panels * added globalcommand list in UI system each rootpanel command list will be appended to this global commandlist so we reduce overhead while drawing. * removed debug Ui * gather children command lists * use Count instead of Count() - remove some other code * renamed FlatCommandList to PanelCommandlist removed more unused code * removed ref to cached transform * simply loop * remove useless line, remve unsafe keyword, remove should early cull * added separate profiling scope for building, gathering and executing command lists * forgot this * check if yoga layout rect has changed before setting is render dirty * dont need to draw this quad * Dont append scissor every frame as we cache them. * add seaprate scissor function that does append ot attributes only on rebuild * only update scissor attributes if it has changes, otherwise used cached commandlist * panel renderer check if panel has layer * only build transform commandlist if transform has changed, otherwise used the cached transforms * fixed some UI widgets not updating due to their opacity correctly. This is the bug where widgets wouldnt be visible until you hovered them * use span for iterating commandlists * dotnet format * async SVG and texture loading mark as dirty once loading is done * dont render UI panels flagged as render manually
…ture, let the CommandList handle our RTs for us
Adds left/right scroll buttons to content block rows as an alternative to drag scroll
* Fix GCN/Polaris crash when averaging clusters, snap positionSs to the top-left pixel of the 2x2 quad to avoid cluster divergence without QuadLaneReadAt * update shaders
) **Broadcast** now encodes the wire payload just once and sends the same bytes to every recipient, before we did one redundant compression per connection. This primarily reduces CPU load on the server/host. **Chunking** Large messages are now compressed before chunking rather than after. Resulting in slightly smaller payloads. The receiver now decompresses a single reassembled payload instead of decompressing every chunk independently, significantly reducing CPU load on receiving clients. **Refactor** Chunking and compression are now low-level wire concerns handled by Connection rather than being mixed into the high-level message types. The old `InternalMessageType.Chunk` enum is removed; chunk framing uses a dedicated wire flag byte alongside `FlagRaw` and `FlagCompressed`. **Results (Chunking changes)** Synthetic data, results on real payloads may differ. Benchmarks (1000 GOs / 2000 components, ~1MB payload, 500 iterations): Wire size (chunk-first-then-compress): 275KB Wire size (compress-first): 259KB (5.7% smaller) Send chunk-first: 0.85 ms/op (old) Send compress-first: 0.88 ms/op (new) Recv chunk-first: 1.16 ms/op (old) Recv compress-first: 0.34 ms/op (new, 3.4x faster)
…al key names (Facepunch#4429) * InputRouter uses scan codes (make AZERTY not shit), UI related input remains key codes * Input.GetGlyph and Input.GetButtonOrigin return the local key name e.g if forward is bound to "W" it will show as "Z" on azerty layouts
…isbands while you're joining, fixes "Lobby Disbanded" spam, lingering socket, and getting stuck in a loading screen (Facepunch#4431)
* Menu: PartyMember hover over opens friend popup, so you can leave party again * Menu: Fix News component
…acepunch#4434) * RadiusDamage: batch and parallelize LOS traces, reduce allocations - Reduce LINQ usage - Deduplicate LOS traces per root GameObject (one trace instead of per-RB + per-damageable) - Run all LOS traces via Parallel.For - Rent temporary arrays from ArrayPool instead of heap allocating - Pass through Occlusion flag to skip traces entirely when disabled * Fix dmg fallof being inverted
* Add Component.DontExecuteOnServer to PanelComponent * Add more headless checks to input system to prevent native crashes trying to access inputsystem
…because Bodies and BodyTransforms are two independent syncs and one may arrive before the other (Facepunch#4439)
* add glass footsteps * add step launch * adjust volume
* Some dead config vars * ShadowMapper work directly with SceneLight, we can't reliably create derived light types from native because the lightdesc is modified later * Unused on light_environment
…re before (Facepunch#4447) * Remapped a few other inputs to fix their glyphs to match what they were before * whitespace fix
…punch#4435) Previously, we would call GPUBuffer.SetData many times through a loop. This is now replaced by a single call after all sprite groups have been processed. This reduces GPU fencing and CPU -> GPU transfer overhead.
Avoids System.Byte[] allocations
* Upload SpriteBatchSceneObject buffer inside render context * Bump particle pool size
…nually set `LoadingScreen.IsVisible` now (Facepunch#4412) This means games can pop up a LoadingScreen of their own without it getting stomped immediately.
Added both IntEditor & GradientEditor for their respective value types.
OpenGradientEditorPopupinGradientEditor.cscould probably be added to its own class as a static method or just be an extension method likeGradient.PaintBlockis but ill save that for another PR.