Graphite progress report (Q3 2024)

By Keavon Chambers & Hypercube. October 15, 2024.

Graphite, a new open source 2D procedural graphics editor, has spent July–September building major improvements to performance, node graph organization, nondestructive path editing, a new render engine, and more helpful nodes, amongst over 100 other features and fixes.

This has been the most productive quarter yet in the project's three-year history. Most of our Google Summer of Code student intern projects have already reached their goals, adding to the goodies included in this progress report. All Q3 2024 commits may be viewed in this list and all noteworthy changes are detailed below.

This is the third in our series of quarterly progress reports. If you missed the first or second ones, be sure to check them 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.

The new Changing Seasons artwork shown here showcases some of the recently introduced nodes in this update. And it animates! Give it a try yourself by opening the artwork and dragging the percentage slider to morph from oak to maple leaves as the colors change.

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 be tweaked anytime (#1676)

  • 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, working to isolate crashes within 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 now included in 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)

  • Noise Pattern node updated to generate resolution-aware coherent noise, meaning it extends forever in all directions and zoom depths (#1909)

  • Dennis Kobert's Google Summer of Code project has concluded, adding many improvements to performance and internal improvements listed in the following sections, but also:

  • Adam Gerhant's Google Summer of Code project has concluded, adding several high-impact features and improvements to the node graph editing experience, including:

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

    • 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)

    • Layer selection history feature, letting users go back and forth between prior states of which layers were selected using the back/forward navigation buttons on some mice (Chromium-based browsers only) or the Alt[ and Alt] hotkeys (#1945)

    • Improved layer positioning for upstream nodes when being reordered so they don't chaotically 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)

  • Elbert Ronnie's Google Summer of Code project, building a library for decoding raw image formats, has continued and will wrap up in early November:

    • Implementation of the pre-processing and demosaicing steps in the decoding pipeline (#1796)

    • Implementation of the post-processing steps in the decoding pipeline (#1923)

    • Factoring in of camera white balance metadata when available (#1941)

    • Flipping and rotating of images based on camera orientation metadata (#1954)

    • Automated tests now made to run in parallel (#1968)

    • Weekly updates are being posted while the project is ongoing, following a mid-summer hiatus

Performance

  • Caching of boolean operations enabled by fixing the Select tool's layer click targets robustly despite the boolean node altering the shape data (commit 6ecb173, #1946, #1986)

  • Rewritten boolean operations algorithm (our new path-bool library) that runs purely in Rust instead of making high-overhead calls into a JavaScript library (#1952, #2000)

  • Internal hash-based data tracking now benefits from caching of hash calculations (#1876)

  • Refactored document node type lookup process that fixes performance degradation over time (#1878)

  • Speed-ups to the node graph compilation that must occur after every change before it's rendered (#1924)

  • Usage of a coarse bounding box when clicking on layers to avoid a detailed check for intersection (#1887)

Fixes

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

  • Fix for backwards compatibility broken in a prior change (commit 621f469)

  • Fix for boolean operations containing multiple subpaths (#1804)

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

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

  • Fix for broken extending of paths in the Pen and Freehand tools (#1809)

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

  • Fix for transforms in groups not being pre-applied in the boolean node (#1825)

  • Fix for dragging groups so the transform node is inserted as intended (#1829)

  • Fix for restoring older prototype GPU infrastructure functionality to work again (#1797)

  • Fix for a breakage to shallow select mode in the Select tool (#1843)

  • Fix for the graph not being updated in the UI after using CtrlD to duplicate a node (#1852)

  • Fix for the Layers panel UI not updating when the selection changes or a layer is expanded/collapsed (#1847)

  • Fix for the rendering of non-closed paths and additional improvements to layer bounding box calculation (#1859)

  • Fix for how documents are saved with images now correctly serialized in linear space instead of sRGB (#1856)

  • Fix for the grid overlay color choice that was incorrectly appearing as no color (commit a4a5139)

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

  • Fix for compatibility issues with rendered SVG output syntax (#1880)

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

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

  • Fix to respect the "Clip" parameter on Artboards when exporting "All Artworks" (#1916)

  • Fix to improve the undo/redo history system's robustness (#1945)

  • Fix for a crash caused by gradients with bounds of zero (#1950)

  • Fix for SVG importing and exporting which had both broken (#1953)

  • Fix for a crash in our Bezier-rs library when outlining a small path (#1958)

  • Fix for a crash due to an invalid segment when dissolving a vector path point loop (#1959)

  • Fix to improve how integer ruler intervals are set when zoomed in (#1966)

  • Fix for layer stacks inadvertently producing a 0x0 image because of an incorrect default type for the disconnected bottom layer node input (#1965)

  • Fix to make the primitive shape tools avoid setting a negative transform scale (#1973)

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

  • Fix to the Select tool's click targets which had extended too far on narrow layers (#1976)

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

  • Fix for the types imported into subgraphs (#1978)

  • Fix to now properly use overlays for drawing artboard names in the viewport (#1981)

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

Internal

  • Refactor for graph editing to go through a new abstraction layer, the node network interface (#1794, #1906)

  • Addition of a new Scope API for exposing data within graphs and subgraphs (#1814)

  • Reorganization and upgrading of most Cargo dependencies (#1815)

  • Removal of artboards as a type of graphical element, which is no longer in use as such (#1824, #1830)

  • Cleanup of many Clippy warnings (#1808, #1936, #1995)

  • Build process simplifications by auto-installing npm packages and reducing the contributor guide's project setup complexity (#1799)

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

  • Fixes, documentation, and updates for npm dependencies and tooling, as well as fixes for Bezier-rs demos not building (#1857)

  • Partial restoration of the Imaginate node within the modern node graph architecture, but more work remains (#1908)

  • Profiling metrics development infrastructure for Graphene graph compilation (#1924, #1974)

  • CI infrastructure to post Clippy warnings as PR comments (#1926, commit a93dcb2)

  • CI infrastructure which profiles the demo artwork test documents and comments on PRs that induce sizable changes in performance (#1925, #1939)

  • CI infrastructure to post a ZIP of self-hosted build assets for the latest editor release tag on GitHub (commit f2493d5)

  • Refactor to support node ID path insertion at compile time (#1947)

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

  • Refactor for the navigation metadata that stores the node graph UI view's current pan and zoom (#1956)

  • Refactor for the node definition syntax to make it easier, shorter, and more consistent to define nodes across the board (#1942, #1999, #2002)

  • Fix for a crash when using the experimental Graphene CLI tool (#1993)

  • Upgrades to quality of third-party library license notice generation (commit 14de67c)

  • Cleanup for various TypeScript code errors and additions to CI infrastructure to enforce TS error checking (commit 1ee5ffb)

  • Simplifications to the Bezier-rs web demos to reduce the bundle size and streamline its code (commit 0b0169a)

  • Manually-runnable benchmarks for document runtime speed profiling (#2005)

Website

Announcements

Graphite @ Maker Faire

Poster for the Bay Area Maker Faire

Graphite will have a booth at the Bay Area Maker Faire this weekend, October 18–20. If you're in northern California, come visit and meet our team. We'll be located in Coal Shed 2 and plan to showcase the latest features, answer questions, teach how to use the app, get to know the maker community, and give away stickers and art postcards. We hope to see you there!

Nodevember

Poster for the Bay Area Maker Faire

We're excited to be participating in Nodevember next month! The event celebrates procedural art and design with themed prompts throughout the month. We're looking forward to seeing what the community creates with Graphite's nodes. We'll be sharing some of our favorite submissions on our social media channels. Be sure to tag @GraphiteEditor and use the #MadeWithGraphite hashtag together with #Nodevember2024.

Community art contest

Congratulations to VDawg, the winner of the community art contest, whose work is featured below. The next contest is open now! Submit before the end of the year to be featured in the Q4 progress report by posting your creations in the #🎨art-showcase channel in our Discord.

Winning artwork depicts a dark landscape with an ethereal diamond forming a constellation with the stars above