Commit Graph

1431 Commits

Author SHA1 Message Date
Keavon Chambers
f3aeec3c02 New node: 'Gradient to Colors' for unwrapping a gradient ramp into its colors (#4425)
* New node: 'Gradient to Colors' for unwrapping a gradient ramp into its colors

* Update 'Gradient Midpoints' wording
2026-09-14 12:58:52 +02:00
Keavon Chambers
2baf9a8192 New nodes: 'Gradient Reverse', 'Gradient Shift', and 'Gradient Stretch' nodes for rearranging a ramp's stops (#4424)
* New nodes: 'Gradient Reverse', 'Gradient Shift', and 'Gradient Stretch' nodes for rearranging a ramp's stops

* Clip a lone out-of-range stop into the bake, and correct the docs that still promised edge-held stops
2026-09-14 12:58:51 +02:00
Keavon Chambers
23c4ad530b Rename the 'Sample Gradient' node to 'Evaluate Gradient' (#4422)
* Rename the 'Sample Gradient' node to 'Evaluate Gradient'

* Let the Evaluate Gradient node's position reach the out-of-range values its spread modes handle
2026-09-14 12:58:48 +02:00
Keavon Chambers
f1512f5d2d Fix Vello rendering incompatibility with its gradients using premultiplied alpha instead of SVG's straight (#4419)
* Upgrade Vello to a git main revision that honors the brush's interpolation alpha space

* Interpolate Vello gradients with straight alpha, matching the SVG renderer

* Draw the gradient picker strip and fill swatches as SVG so transparency previews with straight alpha

* Keep gradient stop handles opaque so a transparent stop's RGB stays visible

* Paint a stopless gradient's picker strip and swatch black rather than transparent
2026-09-14 12:58:44 +02:00
Keavon Chambers
6e32e97ba1 Add a gradient interpolation attribute with Stepped, Linear (existing), and Smooth modes (#4418)
* Delete dead code function

* Add a Gradient Interpolation axis with Stepped, Linear, and Smooth paths through the stops

* Keep the gradient interpolation attached when dragging stops in the picker

* Give the gradient popover's dropdowns the same tooltips as their row labels

* Order the gradient popover with Intrp. above Space

* Hold gradient stops in place when the cyclic flag is toggled

* Fix wrong Smooth gradient colors around stops sitting on the ramp boundaries

* Consolidate gradient settings plumbing and fix bugs

* Bundle whole-ramp gradient settings into GradientSettings across the editor plumbing

* Name the Smooth gradient interpolation's spline type in its tooltip

* Linearize the gamma hex stop colors recovered from imported Graphite SVGs

* Code review

* Aim the Smooth bake's seam subdivision at the copied boundary color

* Add GradientEvaluator to build gradient sampling state once per loop instead of per sample

* Correct the gradient evaluator's documented setup cost to O(n log n)
2026-09-14 12:58:43 +02:00
Keavon Chambers
244a7e0f78 Add a "Cyclic" gradient option that closes the ramp into a seamless loop (#4416)
* Add a Cyclic gradient attribute that wraps the stop list through the 1|0 boundary back to the first stop

* Show the wrap segment's midpoint diamond in the color picker spectrum strip when cyclic

* Keep the wrap midpoint diamond tracking the pointer by a wrapped strip width when dragged past the ends

* Give the Gradient tool's viewport overlay the same cyclic wrap midpoint diamond and drag behavior

* Correct the docs claiming the final stop's midpoint is always ignored now that cyclic uses it

* Move the gradient cyclic toggle onto the Ends row as a Link icon checkbox

* Update labels

* Register GradientHueDirection with the Data panel so its attribute column renders

* Reword wrap segment to wrapped interval and stray segment usages to interval

* Clean up comments

* Fix the color picker write-back losing default position elision and the blend path guessing the cyclic flag
2026-09-14 12:58:41 +02:00
Keavon Chambers
a35143586a Add the "Perceptual" and "Classic" families of gradient spaces with OkLab as the new default (#4415)
* Add an OkLab gradient interpolation space and make it the new default

* Fix the Properties panel fill row resetting the gradient interpolation space to the default

* Add OkLch, Lab, LCh, and HSL gradient interpolation spaces

* Add a hue direction attribute and picker choice for polar gradient interpolation spaces

* Add an HSV gradient interpolation space

* Rename the sRGB Linear and sRGB Gamma gradient spaces to RGB Linear and RGB Gamma

* Divide the gradient interpolation dropdown between absolute and relative color spaces

* Rename the OkLch gradient interpolation space to OkLCh for channel-notation capitalization

* Shorten the color picker popover's hue direction row label to Arc

* Call the Gradient Interpolation node's parameter Space and extend the picker tooltip title to match

* Rename the gradient interpolation attribute and type family to gradient space

* Rename the gradient tool's gradient space transform to gradient to viewport transform

* Add serde aliases and a node replacement covering the gradient space renames

* Give the gradient space choices artist-facing labels and reorder the dropdown sections

* Add a Gradient Hue Direction node and its attribute read node

* Say interpolate instead of blend for gradient stop color traversal in docs and tooltips

* Label the polar perceptual gradient spaces as Perceptual Hue and group the dropdown sections by geometry

* Add a migration alias covering the gradient space attribute reader rename

* Carry the gradient hue direction attribute through boolean operations

* Register GradientHueDirection wire types in the node registry
2026-09-14 12:58:40 +02:00
Keavon Chambers
11dfc27645 Make gradient evaluation follow the ramp's interpolation space attribute (#4414) 2026-09-14 12:58:39 +02:00
Keavon Chambers
3678826a48 Give whole-expanse gradient layers a transform cage based on the gradient line (#4413) 2026-09-14 12:58:37 +02:00
Keavon Chambers
f8975b7d94 Add a gradient interpolation space attribute with sRGB Gamma (existing) and sRGB Linear (new) (#4412)
* Build dropdown menu entries from choice type metadata

* Add a gradient interpolation color space attribute, blending stops in linear light by default

* Add a Space interpolation dropdown to the color picker popover

* Stamp legacy gradient ramps with their implicit gamma interpolation during deserialization

* Resolve color-interpolation from SVG style blocks and fix cascade order among repeated declarations
2026-09-14 12:58:36 +02:00
Keavon Chambers
c71f78edb5 Add a Clear gradient spread that cuts off to transparency beyond the ends (#4410) 2026-09-14 12:58:32 +02:00
Keavon Chambers
ba5b25112b Build radio widget entries from choice type metadata so variants display their icons (#4408)
* Build radio widget entries from choice type metadata so variants display their icons

* Route the node properties enum radio through the shared choice type entry builder
2026-09-14 12:58:29 +02:00
Keavon Chambers
4da366acf1 Rename gradient type to gradient form (#4405)
* Rename gradient type to gradient form

* Update the demo art for the gradient form rename

* Say form not type in the Gradient Form node's doc comment
2026-09-14 12:58:26 +02:00
Keavon Chambers
167da6a210 Rename spread method to gradient spread so it matches the other gradient attribute names (#4404)
* Rename spread method to gradient spread so it matches the other gradient attribute names

* Keep the legacy gradient struct's spread method field name matching its on-disk key
2026-09-14 12:58:24 +02:00
Keavon Chambers
27f1e8a65b Move the gradient-focused nodes from the Color category to a new Gradient category (#4403) 2026-09-14 12:58:23 +02:00
Keavon Chambers
c5cb466e28 Move the gradient spread method into GradientRamp and the color picker popover (#4402)
* Add a spread method field to GradientRamp, carried at runtime as the gradient item's attribute

* Retire the Fill node's spread method input, folding its value into the gradient ramps on document upgrade

* Add an Ends spread method radio to the color picker popover, replacing the Gradient tool's control bar radio

* Update the demo art
2026-09-14 12:58:22 +02:00
Keavon Chambers
360321e0ce Wrap serialized gradient stops in a new GradientRamp struct and unify FillChoice (#4400)
* Introduce the GradientRamp exchange struct as the serialized TaggedValue::Gradient payload

* Unify FillChoice and FillChoiceUI into one enum generic over color format, carrying GradientRamp stops

* Rename the TaggedValue::Gradient variant to GradientRamp to match its payload

* Move the Color variant into the tagged_value macro list since its stored and wire forms match
2026-09-14 12:58:19 +02:00
Keavon Chambers
86d4106592 Rework Gradient into a newtype of List<Color> with optional position and midpoint attributes (#4397)
* Rework Gradient into a newtype of List<Color> with optional position and midpoint attributes

* Fix Vello stopless-gradient fallback coverage, empty legacy gradient tables, the node docs gradient swatch, NaN position elision, and wired setter input overwrites
2026-09-14 12:58:16 +02:00
Keavon Chambers
b78e4b107e Remove custom (de)serializers from the DashPattern and BoxCorners TaggedValue variants (#4394)
Replace the DashPattern and BoxCorners custom serde impls with storage-shaped Vec<f64> TaggedValue payloads
2026-09-14 12:58:15 +02:00
Keavon Chambers
69148d1b36 Replace raw node input indices with compile-time parameter symbols (#4387)
* Remove the dead InputAccessor traits and the uncallable test helper built on them

* Replace raw node input indices with macro-generated parameter symbols across the editor

* Audit dynamic input index usage, converting to parameter symbols and named input position constants

* Abstract the remaining input index plumbing behind ParameterRef APIs and accessors

* Build SetInputValue messages as struct literals to keep message enums impl-free

* Delete the typed parameter markers in favor of explicit-output test introspection

* Wire the interpolation control path input per chain node type

* Return no input when a parameter symbol is read against the wrong node's parameter view
2026-09-14 12:58:14 +02:00
urisinger
b42b00febe Move the math expression parser from Pest to Chumsky and add more features (#2685)
Rewrite the math-parser library using a chumsky-based lexer and parser, adding functions, comparisons, logic, and conditionals
2026-09-14 12:57:20 +02:00
Keavon Chambers
c77359bedf Add a Connect Cells option to the 'Grid' node (#4374)
Add a Connect Cells option to the Grid node
2026-09-14 12:57:19 +02:00
Keavon Chambers
24ba1e047c Box big enum variants to satisfy Clippy's lint warnings (#4292)
* Box the `value` field of `NodeGraphMessage::SetInputValue`

* Box the `ExecutionResponse` variant of `NodeGraphUpdate`

* Box the `Layer` variant of `NodeTypeClickTargets`

* Box the `Scope` variant of `ParsedValueSource`
2026-09-14 12:57:18 +02:00
Keavon Chambers
31239f77c6 Make the 'Angle Between' node report the signed angle and fix its zero-vector output (#4362) 2026-09-14 12:57:10 +02:00
Keavon Chambers
85dd39c35b New nodes: 'Sign', 'Distance', 'Cross Product', and 'Lerp' (#4361) 2026-09-14 12:57:09 +02:00
Keavon Chambers
28f8325a64 Add Vec2 support to the scalar math operator nodes (#4360)
* Add Vec2 support to the scalar math operator nodes

* Support the scalar-with-Vec2 operand order in the Exponent, Root, Logarithm, Min, Max, and Clamp nodes

* Detect an f32 base of e in the Logarithm node despite inexact widening to f64
2026-09-14 12:57:09 +02:00
Keavon Chambers
5dbcdaf0c2 Fix the 'Divide' node dividing partially-zero Vec2 denominators and the 'Logarithm' node misdetecting base e (#4359) 2026-09-14 12:57:08 +02:00
Keavon Chambers
83d24251d7 Rename the nodes 'Length' -> 'Magnitude', 'Flatten Path' -> 'Combine Paths', 'Vec2 Value' -> 'Combine Vec2', and add a new 'Vec2 Value' node (#4349)
* Rename the node 'Length' -> 'Magnitude'

* Rename the node 'Flatten Path' -> 'Combine Paths'

* Replace the node 'Vec2 Value' with 'Combine Vec2' and add a new 'Vec2 Value' that's actually a vec2

* Update demo artwork
2026-09-14 12:57:07 +02:00
Keavon Chambers
095f169b2f New nodes: 'Voronoi Cells', 'Tesselate', and 'Relax Points' (#4345) 2026-09-14 12:57:06 +02:00
Keavon Chambers
cba642a7a1 New nodes: Sum, Average, Minimum, Maximum, Any, All (#4344)
Co-authored-by: Dennis Kobert <dennis@kobert.dev>
2026-09-14 12:57:05 +02:00
Keavon Chambers
67690d22d4 Convert the node catalog to rank-polymorphic kernels, materialize stored values as ranked wires, and display wire rank in the graph
Co-authored-by:    Dennis Kobert <dennis@kobert.dev>
2026-09-14 12:57:05 +02:00
Keavon Chambers
5bc41c4c58 Reshape the node catalog: rename the list access nodes, split Text to Vector, reinstate Upload Texture as a proto node, and delete the vestigial debug nodes 2026-09-14 12:57:04 +02:00
Keavon Chambers
7ddab438d1 Split Fill's optional transform into a has-transform toggle and add the DashPattern and BoxCorners value types 2026-09-14 12:57:03 +02:00
Keavon Chambers
6acc0638e4 Add Graphic::None and store paint choices as plain color, gradient, and no-paint values 2026-09-14 12:57:02 +02:00
Keavon Chambers
fd7f67b3e9 Rename GradientStops to Gradient and the legacy Gradient/Fill structs to LegacyGradient/LegacyFill 2026-09-14 12:57:01 +02:00
Dennis Kobert
21eae1e2a1 Carry eight dropped columns through flatten_graphic 2026-09-14 12:57:00 +02:00
Dennis Kobert
9311c957c4 Carry four dropped columns through the flatten path kernels 2026-09-14 12:56:56 +02:00
Dennis Kobert
5599f1d652 Give VectorRow a top lane and thread it through the walk recursion 2026-09-14 12:56:55 +02:00
Dennis Kobert
413547401e Carry the boolean operation kernels through lane 0 map_element 2026-09-14 12:56:54 +02:00
Dennis Kobert
04966278d4 Build a gathered subject's copy plan on collapse and reject an empty carry 2026-09-14 12:56:54 +02:00
Dennis Kobert
5035fae83b Adopt map_element in the mirror kernels 2026-09-14 12:53:18 +02:00
Dennis Kobert
b54c1a45b0 Adopt map_element in the assign colors kernels and drop the dead carried_lane_attrs helper 2026-09-14 12:53:18 +02:00
Dennis Kobert
aed7855002 Add a map_element primitive to Lane and teach the node macro to emit it 2026-09-14 12:53:17 +02:00
Dennis Kobert
1a20718a3b Box the largest message and update payloads 2026-09-14 12:53:17 +02:00
Dennis Kobert
8281d082f4 Drop redundant conversions, assertions and struct updates 2026-09-14 12:53:15 +02:00
Dennis Kobert
aa20c2c167 Elide the arena lifetimes that the signatures do not need 2026-09-14 12:53:14 +02:00
Dennis Kobert
4f9402dad6 Explain why the selective color and spline loops index by range 2026-09-14 12:53:13 +02:00
Dennis Kobert
f27d90d152 Fold attribute names through monitors and skip coercing name inputs 2026-09-14 12:53:11 +02:00
Dennis Kobert
53608ae7bf Row a reading input's element generic instead of erasing it 2026-09-14 12:53:11 +02:00
Dennis Kobert
93d9b595ef Name a type's live spelling beside its static one 2026-09-14 12:53:00 +02:00