Graphite progress report (Q3 2024)

By Keavon Chambers & Hypercube. October 02, 2024.

Graphite, a new open source 2D procedural graphics editor, has spent April–June introducing boolean path operations, a new gradient picker, layer locking, and more improvements.

Overall, editor functionality has been shaping up and becoming an all around useful tool suite, with notable reductions in rough edges for the vector graphics workflow (our initial focus). Raster and raw photo processing workflows are also now in-development by our Google Summer of Code student interns. Node graph quality-of-life improvements centered around tidy node organization are also the focus of the summer work that's underway. These projects are detailed below.

This is the second of our quarterly progress report blog posts. If you missed the first one, be sure to check it out as well. If you'd like to help speed up future progress, please consider getting involved with code, QA/bug testing, or art/marketing projects. Donations are also valued, as are stars of GitHub. Follow along and partake in our Discord community, too.

All Q2 2024 commits may be viewed in this list and all noteworthy changes are detailed below. To showcase the much anticipated introduction of boolean path operations, the new Painted Dreams artwork shown here extensively utilizes nondestructive booleans.

Vector art of Changing Seasons

Changing Seasons
Open this artwork to
explore it yourself.

Additions

  • Simplified Boolean Operation node that combines the best parts of the two previous boolean node versions, letting users now convert from a stack of shape layers (of any size!) into a single resulting vector shape that's more versatile to use in both the node graph and Layers panel (#1813, #1933)

  • Path node which enables nondestructive vector editing at stages along the geometry calculation pipeline, even after a procedural shape (like a star) defines the parameters that can tweaked anytime (#1676)

  • Alternate render engine using Vello that brings increased code simplicity and performance (especially with raster layers), but currently only works in browsers with WebGPU support and must be enabled via File > Preferences (#1802, #1865, #1844, #1871, #1874, #1875, #1899, #1905, #1900, #1907, #1902, #1897, #1915)

    Editor preferences menu with Vello setting
  • Additional snapping criteria for alignment and distribution between layers (#1793)

    Snapping choices popover menu
  • Snapping now included with the Artboard tool for precise alignment with other artboards (#1734)

  • Persistence of the last-chosen settings each time the Export dialog is opened (so it's not always reset to defaults), plus artboard names are now correctly written in the Bounds dropdown (commit 4d3e459)

  • Demo artwork, Painted Dreams, featured in the last blog post (commit 80cf486)

    Vector art of Painted Dreams

    Painted Dreams
    Open this artwork to
    explore it yourself.

  • Quick measurement feature that is shown by holding Alt to momentarily see the distance between the selected and hovered shapes (#1894)

  • Support for drag-and-drop and copy-paste of files more widely throughout the editor (#2012)

  • Crash mitigation preventing node faults from taking down the whole editor, containing a crash to the graph so the user can undo the change and save the file (however, reloading the editor is required to stabilize it after this occurs) (#1846)

    Graph execution crash recovery message
  • Seed parameters added to all nodes with random generation (commit c39032a)

    Three nodes and their new seed parameters
  • Percentage Value node for easy sliding between the numbers 0 and 100 (commit d7546fb)

  • Gradient Map node for recoloring grayscale color values to corresponding colors along a chosen gradient (commit 501b562)

  • Assign Colors node for replacing the fill or stroke colors of individual paths in a group of vector elements using choices uniquely sampled along a gradient (#1938)

  • Dehaze node for reducing the appearance of the atmospheric haze or fog in photographs (#1882)

  • Node catalog reorganized with the naming and categorization of nodes given improved consistency (commit e647ca9)

  • Layer node chains that help keep a linear sequence of nodes organized by encapsulating them within their destination layer (#1794, #1812)

  • Subgraph data import/export connectors drawn along the top left/right sides of the graph, instead of the previous representation as node-looking boxes (#1794, commit 8e774ef, #1911)

  • Improved layer positioning for upstream nodes when being reordered so they don't overlap or leave behind large gaps anymore (#1928, #1945)

  • Improved shifting of layers in stacks so they act as blocks that collide and bump other layers/nodes instead of getting stuck inside each other (#1940)

Performance

  • Add caching to boolean operations and fix click targets (in, e.g., the boolean node) by resolving footprints from render output (commit 6ecb173, #1946, #1986)

  • Add path-bool library (#1952, #2000)

  • Memoize hashing (#1876)

  • Refactor document node type lookup function to fix performance degradation over time (#1878)

  • Speed up Graphene graph compilation (#1924)

Fixes

  • Fix rulers showing in the wrong spot when initially opening a document (#1801)

  • Restore backwards compatibility broken with #1750 to prepare next release (commit 621f469)

  • Fix multi-subpath boolean operations (#1804)

  • Fix bug causing some node outputs to fail connecting wires to other inputs (commit 84d7262)

  • Fix 'Zoom with Scroll' not working after a page refresh (#1807)

  • Fix Pen and Freehand tool path extension (#1809)

  • Fix snapping bug where snapped-together shapes couldn't be moved (#1818)

  • Apply the graphic group transform in the boolean node (#1825)

  • Remove artboard from graphic element (#1824, #1830)

  • Insert transform node on groups (#1829)

  • Restore functionality of GPU infrastructure (#1797)

  • Fix breakage of shallow select mode in the Select tool (#1843)

  • Fix graph not being resent after Ctrl+D node duplication (#1852)

  • Fix Layers panel UI not updating on selection change and expand/collapsing (#1847)

  • Fix rendering of non closed paths and improve bounding box calculation (#1859)

  • Serialize documents with images in linear space instead of sRGB (#1856)

  • Fix grid overlay color showing as none (commit a4a5139)

  • Fix viewport bounds getting out of sync at times, like when toggling rulers (commit 0617759)

  • Improve rendered SVG output syntax for better compatibility and terseness (#1880)

  • Use a coarse bounding box to avoid a detailed check for intersection when clicking artwork (#1887)

  • Make noise generation resolution aware (#1909)

  • Fix node graph type errors not being shown (#1917)

  • Add colors to all nodes in a graph, even if disconnected, and properly display hidden network imports (#1921)

  • Respect 'Clip' on Artboards when exporting "All Artworks". (#1916)

  • Format demo artwork's nodes in layer chains (commit e28e841)

  • Improve history system (#1945)

  • Add selection history (#1945)

  • Fix crash from gradients with bounds of zero (#1950)

  • Fix broken SVG importing and crash when exporting (#1953)

  • Switch attribute-based vector data from referencing PointIds to indexes in the points table (#1949)

  • Bezier-rs: Fix crash when outlining a small bézier (#1958)

  • Fix invalid segment crash when dissolving point loop (#1959)

  • Set integer ruler intervals when zoomed in (#1966)

  • Fix some typos in the node graph code (#1970)

  • Make the node graph use a document node's default type (#1965)

  • Make the primitive shape tools avoid setting a negative transform scale (#1973)

  • Nudge only the shallowest selected layers to avoid amplified translation (#1975)

  • Improve select tool click targets (#1976)

  • Correctly apply transforms to vector data and strokes (#1977)

  • Fix types of inputs to nodes with a nested network implementation (#1978)

  • Fix blend modes and opacity on raster data (#1996)

  • Use overlays to draw artboard names (#1981)

  • Fix broken Opacity slider in Layers panel (#2004)

Internal

  • Refactor graph editing to go through a NodeNetworkInterface (#1794, #1906)

  • Scope API (#1814)

  • Reorganize cargo dependencies and upgrade most of them (#1815)

  • Fix a lot of Clippy warnings (#1808)

  • Simplify build process by auto-installing npm packages and simplify the contributor guide (#1799)

  • Fix Rust-Analyzer conflicts with build targets and other compile speed issues (commit 857bc77)

  • Update dependencies and lock files (#1841)

  • Fix, document, and update npm dependencies and tooling; fix Bezier-rs demos not building (#1857)

  • Fix spelling in several code comments (#1860)

  • Restore the Imaginate node with the full node graph architecture (but a flaky deadlock remains) (#1908)

  • Add profiling metrics for Graphene graph compilation (#1924, #1974)

  • Post Clippy warnings as PR comments (#1926, commit a93dcb2)

  • Fix all Clippy warnings (#1936)

  • Add a profiling action to CI which comments on PRs with notable demo art performance variances (#1925, #1939)

  • Add self-hosted build asset deployment to GitHub releases in the CI action (commit f2493d5)

  • Implement node path insertion at compile time (#1947)

  • Rename document_node_types.rs to document_node_definitions.rs (commit 6a2b0d7)

  • Refactor navigation metadata (#1956)

  • Refactor the node macro and simply most of the node implementations (#1942, #1999, #2002)

  • Update Cargo.lock to fix CI (#1994)

  • Box TaggedValue::VectorModification (#1995)

  • Fix Graphene CLI crash (#1993)

  • Fix compilation on nightly (#2001)

  • Upgrade the third-party library license generation (commit 14de67c)

  • Clean up web code errors and make CI enforce them (commit 1ee5ffb)

  • Upgrade web dependencies (commit aa03dc8)

  • Remove serde from Bezier-rs web demos to reduce Wasm size (commit 0b0169a)

  • Add manually-runnable benchmarks for runtime profiling (#2005)

Raw-rs

  • Raw-rs: add post-processing steps (#1923)

  • Raw-rs: use camera white balance when available (#1941)

  • Raw-rs: Add preprocessing and demosaicing steps (#1796)

  • Raw-rs: Flip and rotate image based on camera orientation (#1954)

  • Raw-rs: run tests in parallel (#1968)

Website

TODO: Contest winner