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.
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 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)
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)
-
Seed parameters now included in all nodes with random generation (commit c39032a)
-
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:
-
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, #1996)
-
The final report and weekly updates are available for more details
-
-
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 September:
-
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)
-
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
-
Revamps to the website (commit 5d74178, commit 40fd447, commit 98ab069)
-
Updates to various content on the website (commit fb7d597)