mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-12-23 10:11:54 +00:00
Update links from graphite.rs to graphite.art
This commit is contained in:
parent
a5cf62a90b
commit
fb0fab0622
100 changed files with 575 additions and 576 deletions
2
.github/workflows/build-dev-and-ci.yml
vendored
2
.github/workflows/build-dev-and-ci.yml
vendored
|
|
@ -7,7 +7,7 @@ on:
|
|||
pull_request: {}
|
||||
env:
|
||||
CARGO_TERM_COLOR: always
|
||||
INDEX_HTML_HEAD_REPLACEMENT: <script defer data-domain="dev.graphite.rs" data-api="https://graphite.rs/visit/event" src="https://graphite.rs/visit/script.hash.js"></script>
|
||||
INDEX_HTML_HEAD_REPLACEMENT: <script defer data-domain="dev.graphite.art" data-api="https://graphite.art/visit/event" src="https://graphite.art/visit/script.hash.js"></script>
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
|
|
|||
2
.github/workflows/build-production.yml
vendored
2
.github/workflows/build-production.yml
vendored
|
|
@ -18,7 +18,7 @@ jobs:
|
|||
RUSTC_WRAPPER: /usr/bin/sccache
|
||||
CARGO_INCREMENTAL: 0
|
||||
SCCACHE_DIR: /var/lib/github-actions/.cache
|
||||
INDEX_HTML_HEAD_REPLACEMENT: <script defer data-domain="editor.graphite.rs" data-api="https://graphite.rs/visit/event" src="https://graphite.rs/visit/script.hash.js"></script>
|
||||
INDEX_HTML_HEAD_REPLACEMENT: <script defer data-domain="editor.graphite.art" data-api="https://graphite.art/visit/event" src="https://graphite.art/visit/script.hash.js"></script>
|
||||
|
||||
steps:
|
||||
- name: 📥 Clone and checkout repository
|
||||
|
|
|
|||
2
.github/workflows/website.yml
vendored
2
.github/workflows/website.yml
vendored
|
|
@ -12,7 +12,7 @@ on:
|
|||
workflow_dispatch: {}
|
||||
env:
|
||||
CARGO_TERM_COLOR: always
|
||||
INDEX_HTML_HEAD_INCLUSION: <script defer data-domain="graphite.rs" data-api="/visit/event" src="/visit/script.hash.js"></script>
|
||||
INDEX_HTML_HEAD_INCLUSION: <script defer data-domain="graphite.art" data-api="/visit/event" src="/visit/script.hash.js"></script>
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
|
|
|||
|
|
@ -80,8 +80,8 @@ resolver = "2"
|
|||
[workspace.package]
|
||||
rust-version = "1.88"
|
||||
edition = "2024"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
homepage = "https://graphite.rs"
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
homepage = "https://graphite.art"
|
||||
repository = "https://github.com/GraphiteEditor/Graphite"
|
||||
license = "Apache-2.0"
|
||||
version = "0.0.0"
|
||||
|
|
|
|||
14
README.md
14
README.md
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
|
||||
<a href="https://graphite.rs/">
|
||||
<a href="https://graphite.art/">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/user-attachments/assets/9366c148-4405-484f-909a-9a3526eb9209">
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://github.com/user-attachments/assets/791508ab-bcd5-4e31-a3b9-1187cfd7a2f6">
|
||||
|
|
@ -10,14 +10,14 @@
|
|||
|
||||
# Your procedural toolbox for 2D content creation
|
||||
|
||||
**Graphite is a free, open source vector and raster graphics engine, [available now](https://editor.graphite.rs) in alpha. Get creative with a fully nondestructive editing workflow that combines layer-based compositing with node-based generative design.**
|
||||
**Graphite is a free, open source vector and raster graphics engine, [available now](https://editor.graphite.art) in alpha. Get creative with a fully nondestructive editing workflow that combines layer-based compositing with node-based generative design.**
|
||||
|
||||
Having begun life as a vector editor, Graphite continues evolving into a generalized, all-in-one graphics toolbox that's built more like a game engine than a conventional creative app. The editor's tools wrap its node graph core, providing user-friendly workflows for vector, raster, and beyond. Photo editing, motion graphics, digital painting, desktop publishing, and VFX compositing are additional competencies on the planned [roadmap](https://graphite.rs/features/#roadmap) making Graphite into a highly versatile content creation tool.
|
||||
Having begun life as a vector editor, Graphite continues evolving into a generalized, all-in-one graphics toolbox that's built more like a game engine than a conventional creative app. The editor's tools wrap its node graph core, providing user-friendly workflows for vector, raster, and beyond. Photo editing, motion graphics, digital painting, desktop publishing, and VFX compositing are additional competencies on the planned [roadmap](https://graphite.art/features/#roadmap) making Graphite into a highly versatile content creation tool.
|
||||
|
||||
Learn more from the [website](https://graphite.rs/), subscribe to the [newsletter](https://graphite.rs/#newsletter), consider [volunteering](https://graphite.rs/volunteer/) or [donating](https://graphite.rs/donate/), and remember to give this repository a ⭐!
|
||||
Learn more from the [website](https://graphite.art/), subscribe to the [newsletter](https://graphite.art/#newsletter), consider [volunteering](https://graphite.art/volunteer/) or [donating](https://graphite.art/donate/), and remember to give this repository a ⭐!
|
||||
|
||||
<br />
|
||||
<a href="https://discord.graphite.rs/">
|
||||
<a href="https://discord.graphite.art/">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/user-attachments/assets/ad185fac-3b48-446d-863c-2bcb0724abee">
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://github.com/user-attachments/assets/aa23f503-f3bf-444a-9080-8eaa19fa2fa8">
|
||||
|
|
@ -62,7 +62,7 @@ https://github.com/user-attachments/assets/f4604aea-e8f1-45ce-9218-46ddc666f11d
|
|||
|
||||
## Support our mission ❤️
|
||||
|
||||
Graphite is 100% community built and funded. Please become a part of keeping the project alive and thriving with a [donation](https://graphite.rs/donate/) if you share a belief in our **mission**:
|
||||
Graphite is 100% community built and funded. Please become a part of keeping the project alive and thriving with a [donation](https://graphite.art/donate/) if you share a belief in our **mission**:
|
||||
|
||||
> Graphite strives to unshackle the creativity of every budding artist and seasoned professional by building the best comprehensive art and design tool that's accessible to all.
|
||||
>
|
||||
|
|
@ -78,6 +78,6 @@ Graphite is 100% community built and funded. Please become a part of keeping the
|
|||
|
||||
## Contributing/building the code
|
||||
|
||||
Are you a graphics programmer or Rust developer? Graphite aims to be one of the most approachable projects for putting your engineering skills to use in the world of open source. See [instructions here](https://graphite.rs/volunteer/guide/) for setting up the project and getting started.
|
||||
Are you a graphics programmer or Rust developer? Graphite aims to be one of the most approachable projects for putting your engineering skills to use in the world of open source. See [instructions here](https://graphite.art/volunteer/guide/) for setting up the project and getting started.
|
||||
|
||||
*By submitting code for inclusion in the project, you are agreeing to license your changes under the Apache 2.0 license, and that you have the authority to do so. Some directories may have other licenses, like dual-licensed MIT/Apache 2.0, and code submissions to those directories mean you agree to the applicable license(s).*
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
name = "graphite-desktop"
|
||||
version = "0.1.0"
|
||||
description = "Graphite Desktop"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "Apache-2.0"
|
||||
repository = ""
|
||||
edition = "2024"
|
||||
|
|
|
|||
|
|
@ -8,4 +8,4 @@ Type=Application
|
|||
Icon=graphite
|
||||
Categories=Graphics;VectorGraphics;RasterGraphics;
|
||||
Keywords=graphite;editor;vector;raster;procedural;design;
|
||||
StartupWMClass=rs.graphite.Graphite
|
||||
StartupWMClass=art.graphite.Graphite
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
name = "graphite-desktop-bundle"
|
||||
version = "0.0.0"
|
||||
description = "Graphite Desktop Bundle"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "Apache-2.0"
|
||||
repository = ""
|
||||
edition = "2024"
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ use std::path::{Path, PathBuf};
|
|||
|
||||
use crate::common::*;
|
||||
|
||||
const APP_ID: &str = "rs.graphite.Graphite";
|
||||
const APP_ID: &str = "art.graphite.Graphite";
|
||||
|
||||
const PACKAGE: &str = "graphite-desktop-platform-mac";
|
||||
const HELPER_BIN: &str = "graphite-desktop-platform-mac-helper";
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
name = "graphite-desktop-embedded-resources"
|
||||
version = "0.1.0"
|
||||
description = "Graphite Desktop Embedded Resources"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "Apache-2.0"
|
||||
repository = ""
|
||||
edition = "2024"
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
name = "graphite-desktop-platform-linux"
|
||||
version = "0.0.0"
|
||||
description = "Graphite Desktop Platform Linux"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "Apache-2.0"
|
||||
repository = ""
|
||||
edition = "2024"
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
name = "graphite-desktop-platform-mac"
|
||||
version = "0.0.0"
|
||||
description = "Graphite Desktop Platform Mac"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "Apache-2.0"
|
||||
repository = ""
|
||||
edition = "2024"
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
name = "graphite-desktop-platform-win"
|
||||
version = "0.0.0"
|
||||
description = "Graphite Desktop Platform Windows"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "Apache-2.0"
|
||||
repository = ""
|
||||
edition = "2024"
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
pub(crate) const APP_NAME: &str = "Graphite";
|
||||
#[cfg(target_os = "linux")]
|
||||
pub(crate) const APP_ID: &str = "rs.graphite.Graphite";
|
||||
pub(crate) const APP_ID: &str = "art.graphite.Graphite";
|
||||
|
||||
pub(crate) const APP_DIRECTORY_NAME: &str = "graphite";
|
||||
pub(crate) const APP_LOCK_FILE_NAME: &str = "instance.lock";
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
name = "graphite-desktop-wrapper"
|
||||
version = "0.1.0"
|
||||
description = "Graphite Desktop Wrapper"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "Apache-2.0"
|
||||
repository = ""
|
||||
edition = "2024"
|
||||
|
|
|
|||
|
|
@ -3,15 +3,15 @@ name = "graphite-editor"
|
|||
publish = false
|
||||
version = "0.0.0"
|
||||
rust-version = "1.88"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
edition = "2024"
|
||||
readme = "../README.md"
|
||||
homepage = "https://graphite.rs"
|
||||
homepage = "https://graphite.art"
|
||||
repository = "https://github.com/GraphiteEditor/Graphite"
|
||||
license = "Apache-2.0"
|
||||
|
||||
[features]
|
||||
default = ["wasm", "gpu" ]
|
||||
default = ["wasm", "gpu"]
|
||||
wasm = ["wasm-bindgen", "graphene-std/wasm"]
|
||||
gpu = ["interpreted-executor/gpu", "wgpu-executor"]
|
||||
|
||||
|
|
@ -56,4 +56,3 @@ wasm-bindgen = { workspace = true, optional = true }
|
|||
env_logger = { workspace = true }
|
||||
futures = { workspace = true }
|
||||
tokio = { workspace = true }
|
||||
|
||||
|
|
|
|||
|
|
@ -20,9 +20,9 @@ impl DialogLayoutHolder for AboutGraphiteDialog {
|
|||
|
||||
fn layout_column_2(&self) -> Layout {
|
||||
let links = [
|
||||
("Heart", "Donate", "https://graphite.rs/donate/"),
|
||||
("GraphiteLogo", "Website", "https://graphite.rs"),
|
||||
("Volunteer", "Volunteer", "https://graphite.rs/volunteer/"),
|
||||
("Heart", "Donate", "https://graphite.art/donate/"),
|
||||
("GraphiteLogo", "Website", "https://graphite.art"),
|
||||
("Volunteer", "Volunteer", "https://graphite.art/volunteer/"),
|
||||
("Credits", "Credits", "https://github.com/GraphiteEditor/Graphite/graphs/contributors"),
|
||||
];
|
||||
let mut widgets = links
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ impl DialogLayoutHolder for LicensesDialog {
|
|||
let button_definitions: &[(&str, &str, fn() -> Message)] = &[
|
||||
("GraphiteLogo", "Graphite Logo", || {
|
||||
FrontendMessage::TriggerVisitLink {
|
||||
url: "https://graphite.rs/logo/".into(),
|
||||
url: "https://graphite.art/logo/".into(),
|
||||
}
|
||||
.into()
|
||||
}),
|
||||
|
|
@ -32,7 +32,7 @@ impl DialogLayoutHolder for LicensesDialog {
|
|||
}),
|
||||
("License", "Graphite License", || {
|
||||
FrontendMessage::TriggerVisitLink {
|
||||
url: "https://graphite.rs/license/".into(),
|
||||
url: "https://graphite.art/license/".into(),
|
||||
}
|
||||
.into()
|
||||
}),
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ impl LayoutHolder for MenuBarMessageHandler {
|
|||
.label("")
|
||||
.flush(true)
|
||||
.icon(Some("GraphiteLogo".into()))
|
||||
.on_commit(|_| FrontendMessage::TriggerVisitLink { url: "https://graphite.rs".into() }.into())
|
||||
.on_commit(|_| FrontendMessage::TriggerVisitLink { url: "https://graphite.art".into() }.into())
|
||||
.widget_instance(),
|
||||
#[cfg(target_os = "macos")]
|
||||
TextButton::new("Graphite")
|
||||
|
|
@ -652,13 +652,13 @@ impl LayoutHolder for MenuBarMessageHandler {
|
|||
vec![
|
||||
MenuListEntry::new("Donate to Graphite").label("Donate to Graphite").icon("Heart").on_commit(|_| {
|
||||
FrontendMessage::TriggerVisitLink {
|
||||
url: "https://graphite.rs/donate/".into(),
|
||||
url: "https://graphite.art/donate/".into(),
|
||||
}
|
||||
.into()
|
||||
}),
|
||||
MenuListEntry::new("User Manual").label("User Manual").icon("UserManual").on_commit(|_| {
|
||||
FrontendMessage::TriggerVisitLink {
|
||||
url: "https://graphite.rs/learn/".into(),
|
||||
url: "https://graphite.art/learn/".into(),
|
||||
}
|
||||
.into()
|
||||
}),
|
||||
|
|
|
|||
|
|
@ -894,7 +894,7 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageContext<'_>> for Portfolio
|
|||
}
|
||||
}
|
||||
PortfolioMessage::RequestWelcomeScreenButtonsLayout => {
|
||||
let donate = "https://graphite.rs/donate/";
|
||||
let donate = "https://graphite.art/donate/";
|
||||
|
||||
let table = LayoutGroup::Table {
|
||||
unstyled: true,
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
"name": "graphite-web-frontend",
|
||||
"private": true,
|
||||
"description": "Graphite's web app frontend.",
|
||||
"author": "Graphite Authors <contact@graphite.rs>",
|
||||
"author": "Graphite Authors <contact@graphite.art>",
|
||||
"browserslist": "> 1.5%, last 2 versions, not dead, not ie 11, not op_mini all, not ios_saf < 13",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
|
@ -65,7 +65,7 @@
|
|||
"vite": "^5.4.19",
|
||||
"vite-multiple-assets": "2.2.5"
|
||||
},
|
||||
"homepage": "https://graphite.rs",
|
||||
"homepage": "https://graphite.art",
|
||||
"license": "Apache-2.0",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ export function githubUrl(panicDetails: string): string {
|
|||
|
||||
**Steps To Reproduce**
|
||||
Describe precisely how the crash occurred, step by step, starting with a new editor window.
|
||||
1. Open the Graphite editor at https://editor.graphite.rs
|
||||
1. Open the Graphite editor at https://editor.graphite.art
|
||||
2.
|
||||
3.
|
||||
4.
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ export function createDialogState(editor: Editor) {
|
|||
editor.subscriptions.subscribeJsMessage(DisplayDialogDismiss, dismissDialog);
|
||||
|
||||
editor.subscriptions.subscribeJsMessage(TriggerDisplayThirdPartyLicensesDialog, async () => {
|
||||
const BACKUP_URL = "https://editor.graphite.rs/third-party-licenses.txt";
|
||||
const BACKUP_URL = "https://editor.graphite.art/third-party-licenses.txt";
|
||||
let licenseText = `Content was not able to load. Please check your network connection and try again.\n\nOr visit ${BACKUP_URL} for the license notices.`;
|
||||
if (editor.handle.inDevelopmentMode()) licenseText = `Third-party licenses are not available in development builds.\n\nVisit ${BACKUP_URL} for the license notices.`;
|
||||
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ export function createFontsState(editor: Editor) {
|
|||
}
|
||||
export type FontsState = ReturnType<typeof createFontsState>;
|
||||
|
||||
const fontListAPI = "https://api.graphite.rs/font-list";
|
||||
const fontListAPI = "https://api.graphite.art/font-list";
|
||||
|
||||
// From https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight#common_weight_name_mapping
|
||||
const weightNameMapping = new Map([
|
||||
|
|
|
|||
|
|
@ -197,7 +197,7 @@ function formatThirdPartyLicenses(jsLicenses: Dependency[]): string {
|
|||
!(packageInfo.repository && packageInfo.repository.toLowerCase().includes("github.com/GraphiteEditor/Graphite".toLowerCase())) &&
|
||||
!(
|
||||
packageInfo.author &&
|
||||
packageInfo.author.toLowerCase().includes("contact@graphite.rs") &&
|
||||
packageInfo.author.toLowerCase().includes("contact@graphite.art") &&
|
||||
// Exclude a comma which indicates multiple authors, which we need to not filter out
|
||||
!packageInfo.author.toLowerCase().includes(",")
|
||||
),
|
||||
|
|
|
|||
|
|
@ -3,10 +3,10 @@ name = "graphite-wasm"
|
|||
publish = false
|
||||
version = "0.0.0"
|
||||
rust-version = "1.88"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
edition = "2024"
|
||||
readme = "../../README.md"
|
||||
homepage = "https://graphite.rs"
|
||||
homepage = "https://graphite.art"
|
||||
repository = "https://github.com/GraphiteEditor/Graphite"
|
||||
license = "Apache-2.0"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,11 +3,11 @@ name = "dyn-any"
|
|||
version = "0.3.1"
|
||||
rust-version = "1.85"
|
||||
edition = "2024"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
description = "An Any trait that works for arbitrary lifetimes"
|
||||
license = "MIT OR Apache-2.0"
|
||||
readme = "./README.md"
|
||||
homepage = "https://graphite.rs/libraries/dyn-any"
|
||||
homepage = "https://crates.io/crates/dyn-any"
|
||||
repository = "https://github.com/GraphiteEditor/Graphite/tree/master/libraries/dyn-any"
|
||||
documentation = "https://docs.rs/dyn-any"
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
name = "dyn-any-derive"
|
||||
version = "0.3.0"
|
||||
edition = "2024"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
|
||||
description = "#[derive(DynAny)]"
|
||||
documentation = "https://docs.rs/dyn-any-derive"
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "math-parser"
|
|||
version = "0.0.0"
|
||||
rust-version = "1.85"
|
||||
edition = "2024"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
description = "Parser for Graphite style mathematics expressions"
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
name = "path-bool"
|
||||
version = "0.1.0"
|
||||
rust-version = "1.85"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>", "Adam Platkevič"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>", "Adam Platkevič"]
|
||||
edition = "2024"
|
||||
keywords = [
|
||||
"bezier",
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ syn = "2.0.87"
|
|||
name = "rawkit"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
description = "A library to extract images from camera raw files"
|
||||
license = "MIT OR Apache-2.0"
|
||||
readme = "README.md"
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ A library to extract images from camera raw files.
|
|||
|
||||
It currently only works with the `.arw` files from Sony's cameras. In the future, the library will add support for all other major camera manufacturers.
|
||||
|
||||
Rawkit is built for the needs of [Graphite](https://graphite.rs), an open source 2D graphics editor. We hope it may be useful to others, but presently Graphite is its primary user. Pull requests are welcomed for new cameras, features, code cleanup, ergonomic enhancements, performance improvements, and documentation clarifications.
|
||||
Rawkit is built for the needs of [Graphite](https://graphite.art), an open source 2D graphics editor. We hope it may be useful to others, but presently Graphite is its primary user. Pull requests are welcomed for new cameras, features, code cleanup, ergonomic enhancements, performance improvements, and documentation clarifications.
|
||||
|
||||
### Using Rawkit
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
name = "rawkit-proc-macros"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
description = "Procedural macros for Rawkit"
|
||||
license = "MIT OR Apache-2.0"
|
||||
readme = "README.md"
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ use std::sync::atomic::{AtomicUsize, Ordering};
|
|||
use std::time::Duration;
|
||||
|
||||
const TEST_FILES: [&str; 3] = ["ILCE-7M3-ARW2.3.5-blossoms.arw", "ILCE-7RM4-ARW2.3.5-kestrel.arw", "ILCE-6000-ARW2.3.1-windsock.arw"];
|
||||
const BASE_URL: &str = "https://static.graphite.rs/test-data/libraries/rawkit/";
|
||||
const BASE_URL: &str = "https://static.graphite.art/test-data/libraries/rawkit/";
|
||||
const BASE_PATH: &str = "./tests/images/";
|
||||
|
||||
#[test]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "graphene-cli"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "CLI interface for the graphene language"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[features]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "graphene-application-io"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "graphene application io interface"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[features]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "core-types"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "Core types and traits for Graphene node system"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[features]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "graphic-types"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "Graphic types for Graphene - combines vector types with core infrastructure"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[features]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "no-std-types"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "no_std types for Graphene (shader-compatible)"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[features]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "raster-types"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "Raster data types for Graphene node system"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[features]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "rendering"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "SVG rendering for Graphene"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[dependencies]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "vector-types"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "Vector graphics types and algorithms for Graphene"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[features]
|
||||
|
|
|
|||
|
|
@ -3,10 +3,10 @@ name = "node-macro"
|
|||
publish = false
|
||||
version = "0.0.0"
|
||||
rust-version = "1.88"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
edition = "2024"
|
||||
readme = "../../README.md"
|
||||
homepage = "https://graphite.rs"
|
||||
homepage = "https://graphite.art"
|
||||
repository = "https://github.com/GraphiteEditor/Graphite"
|
||||
license = "Apache-2.0"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "blending-nodes"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "Blending operation nodes for Graphene"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[features]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "brush-nodes"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "Brush rendering nodes for Graphene"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[features]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "graphene-core"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "Core utility nodes for Graphene"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[features]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "graphene-std"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "Graphene standard library"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[features]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "math-nodes"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "Math operation nodes for Graphene"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[dependencies]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "path-bool-nodes"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "Path boolean operation nodes for Graphene"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[dependencies]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "raster-nodes"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "Raster operation nodes for Graphene"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[lints]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "raster-nodes-shaders"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "graphene raster data format"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[lib]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "raster-nodes-shaders-entrypoint"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "graphene raster nodes shaders entrypoint"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[lib]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "text-nodes"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "Text operation nodes for Graphene"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[features]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "transform-nodes"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "Transform operation nodes for Graphene"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[features]
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ name = "vector-nodes"
|
|||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
description = "Vector operation nodes for Graphene"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
|
||||
[features]
|
||||
|
|
|
|||
|
|
@ -3,10 +3,10 @@ name = "graphite-proc-macros"
|
|||
publish = false
|
||||
version = "0.0.0"
|
||||
rust-version = "1.88"
|
||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||
authors = ["Graphite Authors <contact@graphite.art>"]
|
||||
edition = "2024"
|
||||
readme = "../README.md"
|
||||
homepage = "https://graphite.rs"
|
||||
homepage = "https://graphite.art"
|
||||
repository = "https://github.com/GraphiteEditor/Graphite"
|
||||
license = "Apache-2.0"
|
||||
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ if (unusedFiles.length > 0) {
|
|||
console.log("\nFont installation complete!");
|
||||
|
||||
// Fetch and save text-balancer.js, which we don't commit to the repo so we're not version controlling dependency code
|
||||
const textBalancerUrl = "https://static.graphite.rs/text-balancer/text-balancer.js";
|
||||
const textBalancerUrl = "https://static.graphite.art/text-balancer/text-balancer.js";
|
||||
const textBalancerDest = path.join(basePath, "../static", "text-balancer.js");
|
||||
console.log("\nDownloading text-balancer.js...");
|
||||
https
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
title = "Graphite"
|
||||
description = "2D raster & vector editor that melds traditional layers & tools with a modern node-based procedural workflow."
|
||||
base_url = "https://graphite.rs"
|
||||
base_url = "https://graphite.art"
|
||||
feed_filenames = ["rss.xml"]
|
||||
|
||||
compile_sass = true
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ meta_description = "Open source free software. A vector graphics creativity suit
|
|||
<!-- ▛ LOGO ▜ -->
|
||||
<section id="logo">
|
||||
<div class="block">
|
||||
<img src="https://static.graphite.rs/logos/graphite-logotype-color.svg" alt="Graphite Logo" />
|
||||
<img src="https://static.graphite.art/logos/graphite-logotype-color.svg" alt="Graphite Logo" />
|
||||
</div>
|
||||
</section>
|
||||
<!-- ▙ LOGO ▟ -->
|
||||
|
|
@ -36,27 +36,27 @@ meta_description = "Open source free software. A vector graphics creativity suit
|
|||
|
||||
<div class="call-to-action-buttons">
|
||||
<a href="https://github.com/GraphiteEditor/Graphite" class="button github-stars">
|
||||
<img src="https://static.graphite.rs/icons/github.svg" alt="GitHub" />
|
||||
<img src="https://static.graphite.art/icons/github.svg" alt="GitHub" />
|
||||
<span class="arrow">Star</span>
|
||||
<div data-github-stars></div>
|
||||
</a>
|
||||
<a href="#newsletter" class="button arrow">Subscribe to newsletter</a>
|
||||
</div>
|
||||
<div class="social-media-buttons">
|
||||
<a href="https://discord.graphite.rs" target="_blank">
|
||||
<img src="https://static.graphite.rs/icons/discord__2.svg" alt="Discord" />
|
||||
<a href="https://discord.graphite.art" target="_blank">
|
||||
<img src="https://static.graphite.art/icons/discord__2.svg" alt="Discord" />
|
||||
</a>
|
||||
<a href="https://www.reddit.com/r/graphite/" target="_blank">
|
||||
<img src="https://static.graphite.rs/icons/reddit__3.svg" alt="Reddit" />
|
||||
<img src="https://static.graphite.art/icons/reddit__3.svg" alt="Reddit" />
|
||||
</a>
|
||||
<a href="https://bsky.app/profile/graphiteeditor.bsky.social" target="_blank">
|
||||
<img src="https://static.graphite.rs/icons/bluesky.svg" alt="Bluesky" />
|
||||
<img src="https://static.graphite.art/icons/bluesky.svg" alt="Bluesky" />
|
||||
</a>
|
||||
<a href="https://twitter.com/graphiteeditor" target="_blank">
|
||||
<img src="https://static.graphite.rs/icons/twitter.svg" alt="Twitter" />
|
||||
<img src="https://static.graphite.art/icons/twitter.svg" alt="Twitter" />
|
||||
</a>
|
||||
<a href="https://www.youtube.com/@GraphiteEditor" target="_blank">
|
||||
<img src="https://static.graphite.rs/icons/youtube.svg" alt="YouTube" />
|
||||
<img src="https://static.graphite.art/icons/youtube.svg" alt="YouTube" />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
|
@ -85,15 +85,15 @@ meta_description = "Open source free software. A vector graphics creativity suit
|
|||
<section id="screenshots" class="carousel window-size-1" data-carousel data-carousel-jostle-hint>
|
||||
|
||||
<div class="carousel-slide" data-carousel-slide>
|
||||
<img src="https://static.graphite.rs/content/index/gui-demo-creative-coding-poster.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" style="transform: translateX(-100%)" data-carousel-image />
|
||||
<img src="https://static.graphite.art/content/index/gui-demo-creative-coding-poster.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" style="transform: translateX(-100%)" data-carousel-image />
|
||||
<!-- Above is a copy of the last -->
|
||||
<img onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" style="transform: translateX(-100%)" data-carousel-image width="1920" height="1080" loading="lazy" src="https://static.graphite.rs/content/index/gui-demo-painted-dreams__4.avif" />
|
||||
<img onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" style="transform: translateX(-100%)" data-carousel-image width="1920" height="1080" loading="lazy" src="https://static.graphite.rs/content/index/gui-demo-magazine-page-layout.avif" />
|
||||
<video style="transform: translateX(-100%)" data-carousel-image width="1920" height="1080" loop muted disablepictureinpicture disableremoteplayback preload="none" poster="https://static.graphite.rs/content/index/gui-demo-animation-twirl-poster.avif"><source src="https://static.graphite.rs/content/index/gui-demo-animation-twirl.webm" type="video/webm" /><source src="https://static.graphite.rs/content/index/gui-demo-animation-twirl.mp4" type="video/mp4" /></video>
|
||||
<video style="transform: translateX(-100%)" data-carousel-image width="1920" height="1080" loop muted disablepictureinpicture disableremoteplayback preload="none" poster="https://static.graphite.rs/content/index/gui-demo-creative-coding-poster.avif"><source src="https://static.graphite.rs/content/index/gui-demo-creative-coding.webm" type="video/webm" /><source src="https://static.graphite.rs/content/index/gui-demo-creative-coding.mp4" type="video/mp4" /></video>
|
||||
<img onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" style="transform: translateX(-100%)" data-carousel-image width="1920" height="1080" loading="lazy" src="https://static.graphite.rs/content/index/gui-demo-fractal__4.avif" />
|
||||
<img onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" style="transform: translateX(-100%)" data-carousel-image width="1920" height="1080" loading="lazy" src="https://static.graphite.art/content/index/gui-demo-painted-dreams__4.avif" />
|
||||
<img onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" style="transform: translateX(-100%)" data-carousel-image width="1920" height="1080" loading="lazy" src="https://static.graphite.art/content/index/gui-demo-magazine-page-layout.avif" />
|
||||
<video style="transform: translateX(-100%)" data-carousel-image width="1920" height="1080" loop muted disablepictureinpicture disableremoteplayback preload="none" poster="https://static.graphite.art/content/index/gui-demo-animation-twirl-poster.avif"><source src="https://static.graphite.art/content/index/gui-demo-animation-twirl.webm" type="video/webm" /><source src="https://static.graphite.art/content/index/gui-demo-animation-twirl.mp4" type="video/mp4" /></video>
|
||||
<video style="transform: translateX(-100%)" data-carousel-image width="1920" height="1080" loop muted disablepictureinpicture disableremoteplayback preload="none" poster="https://static.graphite.art/content/index/gui-demo-creative-coding-poster.avif"><source src="https://static.graphite.art/content/index/gui-demo-creative-coding.webm" type="video/webm" /><source src="https://static.graphite.art/content/index/gui-demo-creative-coding.mp4" type="video/mp4" /></video>
|
||||
<img onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" style="transform: translateX(-100%)" data-carousel-image width="1920" height="1080" loading="lazy" src="https://static.graphite.art/content/index/gui-demo-fractal__4.avif" />
|
||||
<!-- Below is a copy of the first -->
|
||||
<img src="https://static.graphite.rs/content/index/gui-demo-painted-dreams__4.png" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" style="transform: translateX(-100%)" data-carousel-image />
|
||||
<img src="https://static.graphite.art/content/index/gui-demo-painted-dreams__4.png" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" style="transform: translateX(-100%)" data-carousel-image />
|
||||
</div>
|
||||
|
||||
<div class="carousel-slide torn left" data-carousel-slide-torn-left></div>
|
||||
|
|
@ -133,7 +133,7 @@ meta_description = "Open source free software. A vector graphics creativity suit
|
|||
<div class="screenshot-description">
|
||||
|
||||
<p data-carousel-description class="active">
|
||||
<a href="https://editor.graphite.rs/#demo/painted-dreams"><em>Painted Dreams</em></a> — Made using nondestructive boolean operations and procedural polka dot patterns
|
||||
<a href="https://editor.graphite.art/#demo/painted-dreams"><em>Painted Dreams</em></a> — Made using nondestructive boolean operations and procedural polka dot patterns
|
||||
</p>
|
||||
<p data-carousel-description>
|
||||
Design for a magazine spread, a preview of the upcoming focus on desktop publishing
|
||||
|
|
@ -166,7 +166,7 @@ The latest major update is out now! See what the team has been cooking up recent
|
|||
<div class="block video-container">
|
||||
<div>
|
||||
<div class="youtube-embed aspect-16x9">
|
||||
<img data-youtube-embed="Vl5BA4g3QXM" loading="lazy" src="https://static.graphite.rs/content/index/video-september-025-update.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="September Update - Graphite, the Open Source 2D Graphics Suite" />
|
||||
<img data-youtube-embed="Vl5BA4g3QXM" loading="lazy" src="https://static.graphite.art/content/index/video-september-025-update.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="September Update - Graphite, the Open Source 2D Graphics Suite" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -191,14 +191,14 @@ The latest major update is out now! See what the team has been cooking up recent
|
|||
|
||||
Starting life as a vector editor, Graphite is evolving into a general-purpose, all-in-one graphics toolbox that is built more like a game engine than a conventional creative app. The editor's tools wrap its node graph core, exposing user-friendly workflows for vector, raster, animation, and beyond.
|
||||
|
||||
<a href="https://editor.graphite.rs" class="button arrow">Start creating</a>
|
||||
<a href="https://editor.graphite.art" class="button arrow">Start creating</a>
|
||||
|
||||
</div>
|
||||
<div class="block video">
|
||||
|
||||
<video loop muted playsinline disablepictureinpicture disableremoteplayback data-auto-play preload="none" poster="https://static.graphite.rs/content/index/sizzle-compilation-poster.avif">
|
||||
<source src="https://static.graphite.rs/content/index/sizzle-compilation.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/index/sizzle-compilation.mp4" type="video/mp4" />
|
||||
<video loop muted playsinline disablepictureinpicture disableremoteplayback data-auto-play preload="none" poster="https://static.graphite.art/content/index/sizzle-compilation-poster.avif">
|
||||
<source src="https://static.graphite.art/content/index/sizzle-compilation.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/index/sizzle-compilation.mp4" type="video/mp4" />
|
||||
</video>
|
||||
|
||||
</div>
|
||||
|
|
@ -213,27 +213,27 @@ Stop jumping between programs. Upcoming tools will make Graphite a first-class c
|
|||
|
||||
<div class="feature-icons stacked no-background">
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 12" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 12" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span>Graphic Design</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 17" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 17" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span>Motion Graphics</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 13" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 13" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span>Image Editing</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 14" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 14" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span>Digital Painting</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 15" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 15" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span>Page Layout & Print</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 16" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 16" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span>VFX Compositing</span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -247,19 +247,19 @@ Stop jumping between programs. Upcoming tools will make Graphite a first-class c
|
|||
|
||||
<div class="feature-icons">
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 0" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 0" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span>Vector editing tools</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 10" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 10" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span>Procedural workflow for graphic design</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 8" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 8" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span>Node-based layers</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 3" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 3" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span>Forever free and open source</span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -273,19 +273,19 @@ Presently, Graphite is a lightweight offline web app with features primarily ori
|
|||
|
||||
<div class="feature-icons">
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 4" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 4" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span>All-in-one creative tool for all things 2D</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 5" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 5" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span>Fully-featured raster manipulation</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 7" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 7" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span>Windows/Mac/Linux native apps + web</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 6" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 6" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span>Live collaborative editing</span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -299,7 +299,7 @@ Presently, Graphite is a lightweight offline web app with features primarily ori
|
|||
|
||||
## Desktop-first and web-ready
|
||||
|
||||
Where's the download? The web app is [currently live](https://editor.graphite.rs) and desktop apps for Windows, Mac, and Linux will be released in December 2025.
|
||||
Where's the download? The web app is [currently live](https://editor.graphite.art) and desktop apps for Windows, Mac, and Linux will be released in December 2025.
|
||||
|
||||
Graphite is designed principally as a professional desktop application that is also accessible in a browser for quick access from anywhere. It's built for speed with (nearly) no JavaScript. And regardless of platform, it runs locally and privately on your own hardware— there is no server.
|
||||
|
||||
|
|
@ -346,9 +346,9 @@ Graphite is the first and only comprehensive graphic design suite built for proc
|
|||
<div class="diptych red-dress">
|
||||
|
||||
<div class="block video-background">
|
||||
<video loop muted playsinline disablepictureinpicture disableremoteplayback data-auto-play preload="none" poster="https://static.graphite.rs/content/index/procedural-demo-red-dress-poster.avif">
|
||||
<source src="https://static.graphite.rs/content/index/procedural-demo-red-dress.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/index/procedural-demo-red-dress.mp4" type="video/mp4" />
|
||||
<video loop muted playsinline disablepictureinpicture disableremoteplayback data-auto-play preload="none" poster="https://static.graphite.art/content/index/procedural-demo-red-dress-poster.avif">
|
||||
<source src="https://static.graphite.art/content/index/procedural-demo-red-dress.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/index/procedural-demo-red-dress.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -362,7 +362,7 @@ Scatter circles with just a couple nodes...
|
|||
Want them denser? Bigger? Those are sliders.
|
||||
Want a different placement area? Just tweak the path.
|
||||
|
||||
<a href="https://editor.graphite.rs/#demo/red-dress">Open this artwork</a> and give it a try yourself.
|
||||
<a href="https://editor.graphite.art/#demo/red-dress">Open this artwork</a> and give it a try yourself.
|
||||
|
||||
</div>
|
||||
|
||||
|
|
@ -377,14 +377,14 @@ Nondestructive editing means every decision is tied to a parameter you can adjus
|
|||
|
||||
Blend across color schemes. Morph shapes before they're scattered around the canvas. The options are endless.
|
||||
|
||||
<a href="https://editor.graphite.rs/#demo/changing-seasons">Open this artwork</a> and give it a try yourself.
|
||||
<a href="https://editor.graphite.art/#demo/changing-seasons">Open this artwork</a> and give it a try yourself.
|
||||
|
||||
</div>
|
||||
|
||||
<div class="block video-background">
|
||||
<video loop muted playsinline disablepictureinpicture disableremoteplayback data-auto-play preload="none" poster="https://static.graphite.rs/content/index/procedural-demo-leaves-poster.avif">
|
||||
<source src="https://static.graphite.rs/content/index/procedural-demo-leaves.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/index/procedural-demo-leaves.mp4" type="video/mp4" />
|
||||
<video loop muted playsinline disablepictureinpicture disableremoteplayback data-auto-play preload="none" poster="https://static.graphite.art/content/index/procedural-demo-leaves-poster.avif">
|
||||
<source src="https://static.graphite.art/content/index/procedural-demo-leaves.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/index/procedural-demo-leaves.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -397,15 +397,15 @@ Graphite's representation of artwork as a node graph lets you customize, compose
|
|||
|
||||
<div class="feature-icons four-wide">
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 9" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 9" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span class="balance-text">Infinitely pan and zoom; export any resolution with no pixelation</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 2" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 2" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span class="balance-text">Build workflows to mix AI and human-authored content <em>(future)</em></span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 11" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 11" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span class="balance-text">Deploy asset pipelines in studio production environments <em>(future)</em></span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -435,7 +435,7 @@ Subscribe to the newsletter for quarterly updates on major development progress.
|
|||
You'll receive your first newsletter email with the next major Graphite news.
|
||||
|
||||
</div>
|
||||
<form action="https://graphite.rs/newsletter-signup" method="post">
|
||||
<form action="https://graphite.art/newsletter-signup" method="post">
|
||||
<div class="same-line">
|
||||
<div class="input-column name">
|
||||
<label for="newsletter-name">First + last name:</label>
|
||||
|
|
@ -458,24 +458,24 @@ You'll receive your first newsletter email with the next major Graphite news.
|
|||
</div>
|
||||
<div class="block social-media-links">
|
||||
|
||||
<a href="https://discord.graphite.rs" target="_blank">
|
||||
<img src="https://static.graphite.rs/icons/discord__2.svg" alt="" />
|
||||
<a href="https://discord.graphite.art" target="_blank">
|
||||
<img src="https://static.graphite.art/icons/discord__2.svg" alt="" />
|
||||
<span class="link not-uppercase arrow">Discord</span>
|
||||
</a>
|
||||
<a href="https://www.reddit.com/r/graphite/" target="_blank">
|
||||
<img src="https://static.graphite.rs/icons/reddit__3.svg" alt="" />
|
||||
<img src="https://static.graphite.art/icons/reddit__3.svg" alt="" />
|
||||
<span class="link not-uppercase arrow">Reddit</span>
|
||||
</a>
|
||||
<a href="https://bsky.app/profile/graphiteeditor.bsky.social" target="_blank">
|
||||
<img src="https://static.graphite.rs/icons/bluesky.svg" alt="" />
|
||||
<img src="https://static.graphite.art/icons/bluesky.svg" alt="" />
|
||||
<span class="link not-uppercase arrow">Bluesky</span>
|
||||
</a>
|
||||
<a href="https://twitter.com/graphiteeditor" target="_blank">
|
||||
<img src="https://static.graphite.rs/icons/twitter.svg" alt="" />
|
||||
<img src="https://static.graphite.art/icons/twitter.svg" alt="" />
|
||||
<span class="link not-uppercase arrow">Twitter</span>
|
||||
</a>
|
||||
<a href="https://www.youtube.com/@GraphiteEditor" target="_blank">
|
||||
<img src="https://static.graphite.rs/icons/youtube.svg" alt="" />
|
||||
<img src="https://static.graphite.art/icons/youtube.svg" alt="" />
|
||||
<span class="link not-uppercase arrow">YouTube</span>
|
||||
</a>
|
||||
|
||||
|
|
@ -497,13 +497,13 @@ Get started with Graphite by following along to a hands-on quickstart tutorial.
|
|||
<div class="block video-container">
|
||||
<div>
|
||||
<div class="youtube-embed aspect-16x9">
|
||||
<img data-youtube-embed="7gjUhl_3X10" loading="lazy" src="https://static.graphite.rs/content/learn/introduction/tutorial-1-vector-art-quickstart-youtube__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector Art Quickstart - Graphite, the Open Source 2D Graphics Suite" />
|
||||
<img data-youtube-embed="7gjUhl_3X10" loading="lazy" src="https://static.graphite.art/content/learn/introduction/tutorial-1-vector-art-quickstart-youtube__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector Art Quickstart - Graphite, the Open Source 2D Graphics Suite" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="buttons">
|
||||
<a href="https://editor.graphite.rs" class="button arrow">Launch Graphite</a>
|
||||
<a href="https://editor.graphite.art" class="button arrow">Launch Graphite</a>
|
||||
<a href="/learn" class="button arrow">Continue learning</a>
|
||||
</div>
|
||||
|
||||
|
|
@ -534,7 +534,7 @@ Get started with Graphite by following along to a hands-on quickstart tutorial.
|
|||
<div class="block">
|
||||
Watch this timelapse showing the process of mixing traditional vector art (tracing a physical sketch and colorizing it, first two minutes) with using Imaginate to generate a background (last 45 seconds).
|
||||
<div class="youtube-embed aspect-16x9">
|
||||
<img data-youtube-embed="JgJvAHQLnXA" src="https://static.graphite.rs/content/index/commander-basstronaut-youtube.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graphite - Vector Editing: "Commander Basstronaut" Artwork (25x Timelapse)" />
|
||||
<img data-youtube-embed="JgJvAHQLnXA" src="https://static.graphite.art/content/index/commander-basstronaut-youtube.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graphite - Vector Editing: "Commander Basstronaut" Artwork (25x Timelapse)" />
|
||||
</div>
|
||||
(Recorded in an older version of Graphite from early 2023.)
|
||||
</div>
|
||||
|
|
@ -568,10 +568,10 @@ Watch this timelapse showing the process of mixing traditional vector art (traci
|
|||
|
||||
<div class="image-comparison" data-image-comparison style="--comparison-percent: 50%">
|
||||
<div class="crop-container">
|
||||
<img src="https://static.graphite.rs/content/index/light-bulb-before.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector illustration of a light bulb" />
|
||||
<img src="https://static.graphite.art/content/index/light-bulb-before.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector illustration of a light bulb" />
|
||||
</div>
|
||||
<div class="crop-container">
|
||||
<img src="https://static.graphite.rs/content/index/light-bulb-after.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Watercolor painting of a light bulb" />
|
||||
<img src="https://static.graphite.art/content/index/light-bulb-after.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Watercolor painting of a light bulb" />
|
||||
</div>
|
||||
<div class="slide-bar">
|
||||
<div class="arrows">
|
||||
|
|
@ -597,10 +597,10 @@ Watch this timelapse showing the process of mixing traditional vector art (traci
|
|||
|
||||
<div class="image-comparison" data-image-comparison style="--comparison-percent: 50%">
|
||||
<div class="crop-container">
|
||||
<img src="https://static.graphite.rs/content/index/california-poppies-before.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Sloppy poppy: vector doodle of California poppy flowers wrapped around a circle" />
|
||||
<img src="https://static.graphite.art/content/index/california-poppies-before.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Sloppy poppy: vector doodle of California poppy flowers wrapped around a circle" />
|
||||
</div>
|
||||
<div class="crop-container">
|
||||
<img src="https://static.graphite.rs/content/index/california-poppies-after.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Polished poppy: artistic, high-quality illustration of California poppy flowers wrapped around a circle" />
|
||||
<img src="https://static.graphite.art/content/index/california-poppies-after.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Polished poppy: artistic, high-quality illustration of California poppy flowers wrapped around a circle" />
|
||||
</div>
|
||||
<div class="slide-bar">
|
||||
<div class="arrows">
|
||||
|
|
|
|||
|
|
@ -91,13 +91,13 @@ Graphite is fully funded by its community and beholden to no investors, ensuring
|
|||
|
||||
With great power comes great accessibility. Graphite is built on the belief that the best creative tools can be powerful and within reach of all, from students to studios.
|
||||
|
||||
Graphite is designed with a friendly and intuitive interface where a delightful user experience is of first-class importance. It is available for free under an open source [license](/license) and usable [instantly through a web browser](https://editor.graphite.rs) or an upcoming native client on Windows, Mac, and Linux.
|
||||
Graphite is designed with a friendly and intuitive interface where a delightful user experience is of first-class importance. It is available for free under an open source [license](/license) and usable [instantly through a web browser](https://editor.graphite.art) or an upcoming native client on Windows, Mac, and Linux.
|
||||
|
||||
It's easy to learn and teach, yet Graphite's accessible design does not sacrifice versatility for simplicity. The node-based workflow opens doors to an ecosystem of powerful capabilities catering to casual and professional users alike.
|
||||
|
||||
</div>
|
||||
<div class="graphic">
|
||||
<img src="https://static.graphite.rs/content/index/brush__2.svg" alt="" />
|
||||
<img src="https://static.graphite.art/content/index/brush__2.svg" alt="" />
|
||||
</div>
|
||||
</section> -->
|
||||
|
||||
|
|
@ -112,9 +112,9 @@ It's easy to learn and teach, yet Graphite's accessible design does not sacrific
|
|||
|
||||
<div class="block" id="keavon">
|
||||
|
||||
<img src="https://static.graphite.rs/content/about/core-team-photo-keavon-chambers.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Photo of Keavon Chambers" />
|
||||
<img src="https://static.graphite.art/content/about/core-team-photo-keavon-chambers.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Photo of Keavon Chambers" />
|
||||
|
||||
## Keavon Chambers <span class="handle">(@Keavon)</span> <img src="https://static.graphite.rs/icons/flags/us.png" class="flag" title="American" />
|
||||
## Keavon Chambers <span class="handle">(@Keavon)</span> <img src="https://static.graphite.art/icons/flags/us.png" class="flag" title="American" />
|
||||
|
||||
***Founder, UI & product design, frontend, editor systems***
|
||||
|
||||
|
|
@ -123,9 +123,9 @@ Keavon is a creative generalist with a love for the fusion of arts and technolog
|
|||
</div>
|
||||
<div class="block" id="dennis">
|
||||
|
||||
<img src="https://static.graphite.rs/content/about/core-team-photo-dennis-kobert.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Photo of Dennis Kobert" />
|
||||
<img src="https://static.graphite.art/content/about/core-team-photo-dennis-kobert.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Photo of Dennis Kobert" />
|
||||
|
||||
## Dennis Kobert <span class="handle">(@TrueDoctor)</span> <img src="https://static.graphite.rs/icons/flags/de.png" class="flag" title="German" />
|
||||
## Dennis Kobert <span class="handle">(@TrueDoctor)</span> <img src="https://static.graphite.art/icons/flags/de.png" class="flag" title="German" />
|
||||
|
||||
***Graphene node engine, research, architecture***
|
||||
|
||||
|
|
@ -138,9 +138,9 @@ Dennis is a mix between a mathematician and a mad scientist. While still enjoyin
|
|||
|
||||
<div class="block" id="timon">
|
||||
|
||||
<img src="https://static.graphite.rs/content/about/core-team-photo-timon-schelling.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Photo of Timon Schelling" />
|
||||
<img src="https://static.graphite.art/content/about/core-team-photo-timon-schelling.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Photo of Timon Schelling" />
|
||||
|
||||
## Timon Schelling <span class="handle">(@timon-schelling)</span> <img src="https://static.graphite.rs/icons/flags/de.png" class="flag" title="German" />
|
||||
## Timon Schelling <span class="handle">(@timon-schelling)</span> <img src="https://static.graphite.art/icons/flags/de.png" class="flag" title="German" />
|
||||
|
||||
***Desktop application engineering***
|
||||
|
||||
|
|
@ -150,9 +150,9 @@ Timon believes open source tools are essential to grant digital artists freedom
|
|||
|
||||
<div class="block" id="adam">
|
||||
|
||||
<img src="https://static.graphite.rs/content/about/core-team-photo-adam-gerhant.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Photo of Adam Gerhant" />
|
||||
<img src="https://static.graphite.art/content/about/core-team-photo-adam-gerhant.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Photo of Adam Gerhant" />
|
||||
|
||||
## Adam Gerhant <span class="handle">(@pendapia)</span> <img src="https://static.graphite.rs/icons/flags/us.png" class="flag" title="American" />
|
||||
## Adam Gerhant <span class="handle">(@pendapia)</span> <img src="https://static.graphite.art/icons/flags/us.png" class="flag" title="American" />
|
||||
|
||||
***Editor node graph tooling***
|
||||
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ title = "Announcing Graphite alpha"
|
|||
date = 2022-02-12
|
||||
|
||||
[extra]
|
||||
banner = "https://static.graphite.rs/content/blog/2022-02-12-announcing-graphite-alpha.avif"
|
||||
banner_png = "https://static.graphite.rs/content/blog/2022-02-12-announcing-graphite-alpha.png"
|
||||
banner = "https://static.graphite.art/content/blog/2022-02-12-announcing-graphite-alpha.avif"
|
||||
banner_png = "https://static.graphite.art/content/blog/2022-02-12-announcing-graphite-alpha.png"
|
||||
author = "Keavon Chambers"
|
||||
summary = "The Graphite open source team announces the alpha release of their next-generation graphics editor, a web-based SVG editor with vector-based tools. Future plans include a node-based procedural workflow, a raster graphics compositing engine, and a native desktop client."
|
||||
reddit = "https://www.reddit.com/r/graphite/comments/unw3hi/blog_post_announcing_graphite_alpha/"
|
||||
|
|
@ -17,6 +17,6 @@ The Graphite open source team is proud to announce the release of the alpha vers
|
|||
|
||||
We hope that Graphite can serve the initial use case of a lightweight web-based SVG editor. SVG export and source document saving is supported but editable SVG import will need further work. All the vector and general tools (blue and gray tool icons, respectively) are now available in some form, while raster tools (orange icons, grayed out) are forthcoming.
|
||||
|
||||
While in alpha, file format stability cannot be guaranteed so you may need to finish your saved documents in an older version from near the date it was started. To access an older version, ask a team member [on Discord](https://discord.graphite.rs) to locate an editor build link matching your document's creation date.
|
||||
While in alpha, file format stability cannot be guaranteed so you may need to finish your saved documents in an older version from near the date it was started. To access an older version, ask a team member [on Discord](https://discord.graphite.art) to locate an editor build link matching your document's creation date.
|
||||
|
||||
Your feedback and bug reports will be valuable in helping the team prioritize improvements to ensure Graphite can be as useful as possible for artists during the alpha phase. Please go [make some art](https://editor.graphite.rs) to help inform the development process. Thank you for joining us on this exciting journey.
|
||||
Your feedback and bug reports will be valuable in helping the team prioritize improvements to ensure Graphite can be as useful as possible for artists during the alpha phase. Please go [make some art](https://editor.graphite.art) to help inform the development process. Thank you for joining us on this exciting journey.
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ title = "Graphite: a vision for the future of 2D content creation"
|
|||
date = 2022-03-12
|
||||
|
||||
[extra]
|
||||
banner = "https://static.graphite.rs/content/blog/2022-03-12-graphite-a-vision-for-the-future-of-2d-content-creation.avif"
|
||||
banner_png = "https://static.graphite.rs/content/blog/2022-03-12-graphite-a-vision-for-the-future-of-2d-content-creation.png"
|
||||
banner = "https://static.graphite.art/content/blog/2022-03-12-graphite-a-vision-for-the-future-of-2d-content-creation.avif"
|
||||
banner_png = "https://static.graphite.art/content/blog/2022-03-12-graphite-a-vision-for-the-future-of-2d-content-creation.png"
|
||||
author = "Keavon Chambers"
|
||||
summary = "Graphite is an open-source application for 2D graphics editing and digital content creation, offering a nondestructive, node-based workflow. It combines intuitive UI with powerful procedural image generators to revolutionize 2D content creation."
|
||||
reddit = "https://www.reddit.com/r/graphite/comments/unw3va/blog_post_graphite_a_vision_for_the_future_of_2d/"
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ title = "Distributed computing in the Graphene runtime"
|
|||
date = 2022-05-12
|
||||
|
||||
[extra]
|
||||
banner = "https://static.graphite.rs/content/blog/2022-05-12-distributed-computing-in-the-graphene-runtime__2.avif"
|
||||
banner_png = "https://static.graphite.rs/content/blog/2022-05-12-distributed-computing-in-the-graphene-runtime__2.png"
|
||||
banner = "https://static.graphite.art/content/blog/2022-05-12-distributed-computing-in-the-graphene-runtime__2.avif"
|
||||
banner_png = "https://static.graphite.art/content/blog/2022-05-12-distributed-computing-in-the-graphene-runtime__2.png"
|
||||
author = "Keavon Chambers"
|
||||
summary = "Graphite's 2D editor is built upon Graphene, a node-based editing system for nondestructive design across various data types designed to render artwork faster using multiple machines. The system optimizes execution paths, minimizes latency, and uses a distributed runtime for quick data processing."
|
||||
reddit = "https://www.reddit.com/r/graphite/comments/unw45k/blog_post_distributed_computing_in_the_graphene/"
|
||||
|
|
@ -45,7 +45,7 @@ For security and portability, user-authored nodes are compiled into WebAssembly
|
|||
|
||||
In the product architecture, Graphene is a distributed runtime environment for quickly processing data in the node graph by utilizing a pool of CPU and GPU compute resources available on local and networked machines. Jobs are run where latency, speed, and bandwidth availability will be most likely to provide a responsive user experience.
|
||||
|
||||
<img src="https://static.graphite.rs/content/blog/2022-05-12-distributed-computing-in-the-graphene-runtime/local-and-cloud.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graphene in a local and cloud environment" />
|
||||
<img src="https://static.graphite.art/content/blog/2022-05-12-distributed-computing-in-the-graphene-runtime/local-and-cloud.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graphene in a local and cloud environment" />
|
||||
|
||||
### Scheduler
|
||||
|
||||
|
|
@ -81,4 +81,4 @@ Graphene should recognize when a certain intermediate result already lives in RA
|
|||
|
||||
Presently, we are experimenting with CPU and GPU node composition for the beginnings of the Graphene visual programming language. Most of what was described in this post will likely evolve as we get further into the implementation stage and when we learn more from experts in the fields of computer science that Graphene overlaps with.
|
||||
|
||||
If you have a background or interest in programming language design, functional programming, ECS and data-oriented design, scheduling, distributed computing, general-purpose GPU compute (GPGPU), or high-performance computing (HPC), we'd love to have your ideas steer our work. Or better yet, join the team to make this dream a reality. We discuss most of our architecture and designs on our [Discord server](https://discord.graphite.rs) through text and sometimes voice. Please come say hi!
|
||||
If you have a background or interest in programming language design, functional programming, ECS and data-oriented design, scheduling, distributed computing, general-purpose GPU compute (GPGPU), or high-performance computing (HPC), we'd love to have your ideas steer our work. Or better yet, join the team to make this dream a reality. We discuss most of our architecture and designs on our [Discord server](https://discord.graphite.art) through text and sometimes voice. Please come say hi!
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ title = "Looking back on 2023 and what's next"
|
|||
date = 2024-01-01
|
||||
|
||||
[extra]
|
||||
banner = "https://static.graphite.rs/content/blog/2024-01-01-looking-back-on-2023-and-what's-next.avif"
|
||||
banner_png = "https://static.graphite.rs/content/blog/2024-01-01-looking-back-on-2023-and-what's-next.png"
|
||||
banner = "https://static.graphite.art/content/blog/2024-01-01-looking-back-on-2023-and-what's-next.avif"
|
||||
banner_png = "https://static.graphite.art/content/blog/2024-01-01-looking-back-on-2023-and-what's-next.png"
|
||||
author = "Keavon Chambers"
|
||||
summary = "Looking back on 2023, we reflect on our significant achievements and milestones. As we move forward, we're excited to share what's next, promising a year filled with innovation and progress."
|
||||
reddit = "https://www.reddit.com/r/graphite/comments/18xmoti/blog_post_looking_back_on_2023_and_whats_next/"
|
||||
|
|
@ -22,12 +22,12 @@ I am grateful to everyone who has placed their faith in my vision for Graphite s
|
|||
|
||||
<div class="video-background" style="text-align: center">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/christmas-tree-lights.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/christmas-tree-lights.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/christmas-tree-lights.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/christmas-tree-lights.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
<center><em>Happy Holidays from the Graphite team!<br />These procedural light strands are powered by the newly completed node graph features.<br /><a href="https://editor.graphite.rs/#demo/procedural-string-lights">Click here to explore this demo</a> — drag the wire layer's points with the Path tool.</em></center>
|
||||
<center><em>Happy Holidays from the Graphite team!<br />These procedural light strands are powered by the newly completed node graph features.<br /><a href="https://editor.graphite.art/#demo/procedural-string-lights">Click here to explore this demo</a> — drag the wire layer's points with the Path tool.</em></center>
|
||||
|
||||
## The Alpha 2 release series
|
||||
|
||||
|
|
@ -39,7 +39,7 @@ In March, I attended the Game Developers Conference (GDC) in nearby San Francisc
|
|||
|
||||
Later, in May, I went to another Rust developers meetup here in the Bay Area together with [Leonard Pauli](https://twitter.com/leonardpauli), a Graphite community member and code contributor who was in town on a visit all the way from Sweden. The event was headlined with a [presentation](https://www.youtube.com/watch?v=XjbVnwBtVEk) by [Raph Levien](https://raphlinus.github.io/) about [Xilem](https://github.com/linebender/xilem), an under-development GUI toolkit that Graphite may adopt someday for its promise of powering native, speedy desktop user interfaces. Raph Levien is a researcher and expert in the fields of 2D vector graphics, GPU-accelerated rendering, and the mathematics of splines and curves— topics considerably overlapping with Graphite's own technical disciplines. The meetup was a nice face-to-face introduction before I'd end up seeing Raph and Leonard each again very soon.
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/bay-area-rust-meetup.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Raph Levien speaking about Xilem" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/bay-area-rust-meetup.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Raph Levien speaking about Xilem" /></p>
|
||||
|
||||
<center><em>Raph gives his talk about Xilem and GUIs in Rust</em></center>
|
||||
|
||||
|
|
@ -47,7 +47,7 @@ The next week I accepted Raph's invitation to visit him at his employer, Google,
|
|||
|
||||
## Embark Studios visit in Stockholm, Sweden
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/embark.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Leonard and Keavon in front of the Embark office sign" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/embark.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Leonard and Keavon in front of the Embark office sign" /></p>
|
||||
|
||||
<center><em>Leonard (left) and Keavon (right) at Embark Studios</em></center>
|
||||
|
||||
|
|
@ -55,7 +55,7 @@ In June, as part of a vacation with my family to Europe, I caught up again with
|
|||
|
||||
## Blender visit in Amsterdam, The Netherlands
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/blender-hq.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Graphite and Blender team members in front of the Blender building" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/blender-hq.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Graphite and Blender team members in front of the Blender building" /></p>
|
||||
|
||||
<center><em>Left to right: Dalai, Dennis, Keavon, Ton, Francesco</em></center>
|
||||
|
||||
|
|
@ -63,7 +63,7 @@ The next month in July, together with Graphite's lead engineer [Dennis Kobert](/
|
|||
|
||||
At the invitation of Francesco Siddi, COO of the Blender Foundation whom I'd met earlier at GDC, Dennis and I presented a lunchtime talk for the staff to introduce the Graphite project. Ton Roosendaal, Blender's founder, kindly cooked up some scrumptious, lovingly-made meals of fried eggs for us and his team. We spent a couple hours mingling— answering and asking questions and chatting about design and technical topics ranging from our Rust node graph language infrastructure to Blender's experience with color science standards.
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/blender-presentation.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Keavon presents in front of a projector screen at Blender's offices" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/blender-presentation.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Keavon presents in front of a projector screen at Blender's offices" /></p>
|
||||
|
||||
<center><em>Keavon presents to the Blender staff</em></center>
|
||||
|
||||
|
|
@ -71,7 +71,7 @@ Ton also very generously gave us his time and full attention with an office hour
|
|||
|
||||
## Graphite developer retreat in Karlsruhe, Germany
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/karlsruhe.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Keavon and Dennis in front of Karlsruhe Palace" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/karlsruhe.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Keavon and Dennis in front of Karlsruhe Palace" /></p>
|
||||
|
||||
<center><em>Keavon (left) and Dennis (right) at Karlsruhe Palace</em></center>
|
||||
|
||||
|
|
@ -79,7 +79,7 @@ The week before the Blender visit, I arrived in Karlsruhe, Germany for a two-wee
|
|||
|
||||
## SIGGRAPH in Los Angeles, California
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/siggraph.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Keavon and Oliver standing in front of the SIGGRAPH conference sign" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/siggraph.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Keavon and Oliver standing in front of the SIGGRAPH conference sign" /></p>
|
||||
|
||||
<center><em>Keavon (left) and Oliver (right) at SIGGRAPH</em></center>
|
||||
|
||||
|
|
@ -94,14 +94,14 @@ The next big news of August was my formation of [Graphite Labs, LLC](https://www
|
|||
I allocated my time at several points throughout the year into growing and evolving this website with a refreshed and more visually-appealing home page, dedicated pages for information [about](/about) the project and its [features](/features), an area providing resources and help for [volunteers](/volunteer) and [code contributors](/volunteer/guide), and just this month— a [user manual](/learn) complete with an introductory tutorial series. The first video went up yesterday:
|
||||
|
||||
<div class="youtube-embed aspect-16x9">
|
||||
<img data-youtube-embed="7gjUhl_3X10" src="https://static.graphite.rs/content/learn/introduction/tutorial-1-vector-art-quickstart-youtube__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector Art Quickstart - Graphite, the Open Source 2D Graphics Suite" />
|
||||
<img data-youtube-embed="7gjUhl_3X10" src="https://static.graphite.art/content/learn/introduction/tutorial-1-vector-art-quickstart-youtube__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector Art Quickstart - Graphite, the Open Source 2D Graphics Suite" />
|
||||
</div>
|
||||
|
||||
The user manual and tutorial series will continue expanding throughout the coming weeks. Additional website features including user accounts, forums, and other community features are being planned.
|
||||
|
||||
## 2023 development progress report
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/commit-rate-graph.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graph visualizing the number of code commits each week of 2023" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/commit-rate-graph.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graph visualizing the number of code commits each week of 2023" /></p>
|
||||
|
||||
<center><em>Weekly code commit rate in 2023</em></center>
|
||||
|
||||
|
|
@ -116,7 +116,7 @@ But 2023 wasn't only put towards refactoring code. New features were added all t
|
|||
- The (still rudimentary) Brush tool was added for drawing simple raster-based sketches.
|
||||
- Drawing custom vector shapes with the Pen and Path tools saw usability improvements with point selection, nudging/transformation, and entering exact numerical positions.
|
||||
- Number input boxes in the UI can now be dragged to update their values and have math expressions evaluated automatically for convenience. Double a value just by typing `*2` at the end, or take the square root by wrapping it within `sqrt(` and `)`.
|
||||
- A button to quickly open [pre-made sample art](https://editor.graphite.rs/#demo/valley-of-spires) documents was included at the suggestion of the fine folks at Blender. This helps new users see Graphite in action instead of just opening up an overwhelmingly barren blank canvas.
|
||||
- A button to quickly open [pre-made sample art](https://editor.graphite.art/#demo/valley-of-spires) documents was included at the suggestion of the fine folks at Blender. This helps new users see Graphite in action instead of just opening up an overwhelmingly barren blank canvas.
|
||||
|
||||
## Integrating the node graph
|
||||
|
||||
|
|
@ -124,25 +124,25 @@ With so much to change in the goal of rewriting nearly every system with its Gra
|
|||
|
||||
The previous, intentionally-temporary layer system supported folders, vector shapes, text, bitmap images, and dynamic AI art (part of the Imaginate image generation feature).
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/migration-block-diagram-1.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Block diagram of a Graphite document before the node graph" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/migration-block-diagram-1.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Block diagram of a Graphite document before the node graph" /></p>
|
||||
|
||||
<center><em>Block diagram before the node graph</em></center>
|
||||
|
||||
To begin the incremental integration of nodes, we first added another type of layer, housing an instance of a Graphene node graph, which would supersede the other types. Then began the long process of porting all the other "legacy" layer types—and the viewport tools that operated on them—to become nodes. So the text layer type became a Text node managed by the Text tool, for example. This first phase was completed by April.
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/migration-block-diagram-2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Block diagram of a Graphite document after the first phase of migration" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/migration-block-diagram-2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Block diagram of a Graphite document after the first phase of migration" /></p>
|
||||
|
||||
<center><em>Block diagram after the first phase</em></center>
|
||||
|
||||
Just folders and graph-driven legacy layers remained, but for the second phase, these (as well as artboards which were a separate temporary system) had to be combined into a single graph. Even with graph-based legacy layers, nodes couldn't yet interact between layer graphs to create interesting procedural designs. The Graphite vision calls for a single unified graph per document where all content lives, organized by layers, folders, and artboards collectively living within that graph. So phase two began with adding another node graph instance attached to the document itself instead of any particular layer. Then the old artboard system was replaced by artboard nodes in that graph, providing white backgrounds for the pages of artwork drawn atop by layers. Next, we built a new form of layer that would live in the node graph itself to provide organizational structure, acting as both a container for artwork nodes and a folder for other layers. By August, users could edit the document graph by hand but the viewport tools, folder hierarchy, rendering pipeline, and numerous other systems all still used the legacy layers.
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/migration-block-diagram-3.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Block diagram of a Graphite document after the second phase of migration" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/migration-block-diagram-3.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Block diagram of a Graphite document after the second phase of migration" /></p>
|
||||
|
||||
<center><em>Block diagram after the second phase</em></center>
|
||||
|
||||
For the third phase, we had to yet again port each of the viewport tools so they would operate on the unified document graph instead of the legacy layer graphs. But the incremental approach ended here— this last phase had to happen all at once, which posed a challenge for developing the editor while numerous features were fully broken pending rework. We began with a separate development branch, always kept up-to-date with the latest editor code changes, for a couple months until breakages were reduced to an acceptable level, then integrated with the main codebase in October. By tracking and burning down the list of [62 outstanding issues and regressions](https://github.com/GraphiteEditor/Graphite/issues/1394) one-by-one, in mid-December we finally reached our long-sought goal: deploying a new stable release of Graphite featuring the unified node graph! I'd like to extend an extra big thank-you to core team member ["Hypercube"](/about#hypercube) for the dedication and persistence in grinding through most of these.
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/migration-block-diagram-4.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Block diagram of a Graphite document now that the migration is complete" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2024-01-01-looking-back-on-2023-and-what's-next/migration-block-diagram-4.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Block diagram of a Graphite document now that the migration is complete" /></p>
|
||||
|
||||
<center><em>Block diagram of the completed integration</em></center>
|
||||
|
||||
|
|
@ -182,7 +182,7 @@ Achieving everything listed above is ambitious, but it's ambition that has broug
|
|||
- Graphic designers and artists who put the time into using Graphite on a regular basis and helping us learn its practical strengths and weaknesses would also be valuable contributors. Helping with the creative parts of maintaining the app and assisting new users who have questions in the growing community would relieve the burden from the core team.
|
||||
- And spread the word! Create tutorial videos. Show off your creations on social media. Use it in your classroom. 2024 is the year Graphite is ready to come out of the shadows and get discovered.
|
||||
|
||||
If your New Year's resolution is joining an open source project, consider Graphite! We work hard to help new community contributors get up to speed with resources and guidance. We frequently hear praise that Graphite is a very inviting and supportive project from volunteers who have not had great prior experiences trying to get involved in open source. Join the Graphite [Discord server](https://discord.graphite.rs) and reach out to me (@Keavon) about how you'd like to get involved.
|
||||
If your New Year's resolution is joining an open source project, consider Graphite! We work hard to help new community contributors get up to speed with resources and guidance. We frequently hear praise that Graphite is a very inviting and supportive project from volunteers who have not had great prior experiences trying to get involved in open source. Join the Graphite [Discord server](https://discord.graphite.art) and reach out to me (@Keavon) about how you'd like to get involved.
|
||||
|
||||
## Launching our supporter fund
|
||||
|
||||
|
|
@ -198,4 +198,4 @@ Please help launch Graphite towards the 2024 goal of attaining self-sufficiency
|
|||
|
||||
Thank you to our community for an incredible year. Passing [5000 stars](https://github.com/GraphiteEditor/Graphite/stargazers) on the project GitHub repository was a wonderful gift this holiday season. Everyone who has given advice, written code, and expressed enthusiasm has inspired me every day to stay focused and motivated. It was especially a pleasure and honor to visit the many people and organizations mentioned in this post throughout the past year. The reception by all has been heartwarming and I look forward to staying connected with them and a growing Graphite community in the promising year that now lies ahead. I am most of all excited for the awesome state Graphite will be in when it comes time to write this post again next year.
|
||||
|
||||
Now go [make some awesome art](https://editor.graphite.rs)!
|
||||
Now go [make some awesome art](https://editor.graphite.art)!
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
title = "Graphite internships: announcing participation in GSoC 2024"
|
||||
date = 2024-02-22
|
||||
[extra]
|
||||
banner = "https://static.graphite.rs/content/blog/2024-02-22-graphite-internships-announcing-participation-in-gsoc-2024.avif"
|
||||
banner_png = "https://static.graphite.rs/content/blog/2024-02-22-graphite-internships-announcing-participation-in-gsoc-2024.png"
|
||||
banner = "https://static.graphite.art/content/blog/2024-02-22-graphite-internships-announcing-participation-in-gsoc-2024.avif"
|
||||
banner_png = "https://static.graphite.art/content/blog/2024-02-22-graphite-internships-announcing-participation-in-gsoc-2024.png"
|
||||
author = "Keavon Chambers"
|
||||
summary = "Join Graphite in Google Summer of Code 2024 for a unique opportunity to contribute to open-source software development in Rust and computer graphics. Get paid while learning, working on self-contained projects under experienced mentors, and help Graphite grow."
|
||||
reddit = "https://www.reddit.com/r/graphite/comments/1ax3l8z/blog_post_graphite_internships_announcing/"
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
title = "Graphite progress report (Q1 2024)"
|
||||
date = 2024-05-09
|
||||
[extra]
|
||||
banner = "https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024__2.avif"
|
||||
banner_png = "https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024__2.png"
|
||||
banner = "https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024__2.avif"
|
||||
banner_png = "https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024__2.png"
|
||||
author = "Keavon Chambers & Hypercube"
|
||||
summary = "Graphite's Q1 2024 update introduces a precise snapping system and a customizable grid for enhanced design control. The update also includes improved procedural scattering with the 'Copy to Points' node, demonstrated in new demo artwork."
|
||||
reddit = "https://www.reddit.com/r/graphite/comments/1coa0if/blog_post_graphite_progress_report_q1_2024/"
|
||||
|
|
@ -17,13 +17,13 @@ css = ["/component/demo-artwork.css"]
|
|||
|
||||
Starting in 2024, we are now publishing quarterly reports to summarize the new features and improvements made to Graphite. If you missed the [2023 year in review](../looking-back-on-2023-and-what-s-next), be sure to check it out after this. We anticipate sending our first email newsletter (with more to follow roughly quarterly) in the near future as well, so be sure to [subscribe](/#newsletter) if you haven't already.
|
||||
|
||||
Over the first three months of the year, we are delighted to have seen many contributions both from new and recurrent contributors, including substantial interest by students through [Google Summer of Code](/blog/graphite-internships-announcing-participation-in-gsoc-2024/). We would like to send a big thanks to all of the contributors who made this progress happen. If you are interested in getting involved or just following development, see the [contributor guide](/volunteer/guide) and join [our Discord](https://discord.graphite.rs).
|
||||
Over the first three months of the year, we are delighted to have seen many contributions both from new and recurrent contributors, including substantial interest by students through [Google Summer of Code](/blog/graphite-internships-announcing-participation-in-gsoc-2024/). We would like to send a big thanks to all of the contributors who made this progress happen. If you are interested in getting involved or just following development, see the [contributor guide](/volunteer/guide) and join [our Discord](https://discord.graphite.art).
|
||||
|
||||
All Q1 2024 commits may be [viewed in this list](https://github.com/GraphiteEditor/Graphite/commits/master/?since=2024-01-01&until=2024-03-31) and all noteworthy changes are detailed below. As two of the major new features are the grid and snapping systems, the *Isometric Fountain* artwork shown on this blog post demonstrates what those features can achieve.
|
||||
|
||||
<div class="demo-artwork">
|
||||
<a href="https://editor.graphite.rs/#demo/isometric-fountain">
|
||||
<img src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024__2.png" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector art of Isometric Fountain" />
|
||||
<a href="https://editor.graphite.art/#demo/isometric-fountain">
|
||||
<img src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024__2.png" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector art of Isometric Fountain" />
|
||||
</a>
|
||||
<p>
|
||||
<span>
|
||||
|
|
@ -31,7 +31,7 @@ All Q1 2024 commits may be [viewed in this list](https://github.com/GraphiteEdit
|
|||
</span>
|
||||
<br />
|
||||
<span>
|
||||
<a href="https://editor.graphite.rs/#demo/isometric-fountain">Open this artwork</a> to<br />explore it yourself.
|
||||
<a href="https://editor.graphite.art/#demo/isometric-fountain">Open this artwork</a> to<br />explore it yourself.
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
|
|
@ -45,8 +45,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
- *Copy to Points* node improvements, including randomization of scale and rotation with biasing <small>([#1540](https://github.com/GraphiteEditor/Graphite/pull/1540), [#1541](https://github.com/GraphiteEditor/Graphite/pull/1541), [commit ed82c5](https://github.com/GraphiteEditor/Graphite/commit/ed82c5f20fccd66a959334dee33351657968cdb6), [#1592](https://github.com/GraphiteEditor/Graphite/pull/1592), [commit 7e5069](https://github.com/GraphiteEditor/Graphite/commit/7e5069f638cfcc3e7af21f32eded67a005490402))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/copy-to-points-node-improvements.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/copy-to-points-node-improvements.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/copy-to-points-node-improvements.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/copy-to-points-node-improvements.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -55,45 +55,45 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
- Grid overlay for the canvas with customizable rectangular and isometric grid lines <small>([#1521](https://github.com/GraphiteEditor/Graphite/pull/1521), [commit 5c9d3c](https://github.com/GraphiteEditor/Graphite/commit/5c9d3c5d755e67411c110c0d5fd38d991cb6696c))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/grid-popover.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/grid-popover.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/grid-popover.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/grid-popover.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/grid-demo-art.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/grid-demo-art.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/grid-demo-art.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/grid-demo-art.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- New and improved snapping system for aligning shapes with one another and the grid <small>([#1521](https://github.com/GraphiteEditor/Graphite/pull/1521), [#1567](https://github.com/GraphiteEditor/Graphite/pull/1567), [#1547](https://github.com/GraphiteEditor/Graphite/pull/1547), [#1570](https://github.com/GraphiteEditor/Graphite/pull/1570), [#1574](https://github.com/GraphiteEditor/Graphite/pull/1574))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/snapping.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/snapping.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/snapping.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/snapping.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- *Morph* node for tweening vector shapes <small>([#1576](https://github.com/GraphiteEditor/Graphite/pull/1576))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/morph-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/morph-node.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/morph-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/morph-node.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Visualize which nodes are the source of a graph type error <small>([#1577](https://github.com/GraphiteEditor/Graphite/pull/1577))</small>
|
||||
|
||||
<img src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/graph-error-visualization.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graph error visualization screenshot" />
|
||||
<img src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/graph-error-visualization.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graph error visualization screenshot" />
|
||||
|
||||
- Improvements to document tilting and resetting tilt <small>([commit 8eef96](https://github.com/GraphiteEditor/Graphite/commit/8eef96511e575d58a36289f3d0e30eb68098b4e7))</small>
|
||||
|
||||
- SVG import <small>([#1579](https://github.com/GraphiteEditor/Graphite/pull/1579), [#1656](https://github.com/GraphiteEditor/Graphite/pull/1656))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/svg-import.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/svg-import.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/svg-import.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/svg-import.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -102,48 +102,48 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
- *Poisson-Disk Points* node for sampling randomly distributed points in a shape, with Red Dress demo artwork <small>([#1586](https://github.com/GraphiteEditor/Graphite/pull/1586), [commit 12e16b](https://github.com/GraphiteEditor/Graphite/commit/12e16b9a4efe40fcf779c34f83d3df8b3e3542f3), [#1590](https://github.com/GraphiteEditor/Graphite/pull/1590), [#1596](https://github.com/GraphiteEditor/Graphite/pull/1596))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/poisson-disk-points-node-demo-art.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/poisson-disk-points-node-demo-art.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/poisson-disk-points-node-demo-art.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/poisson-disk-points-node-demo-art.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Pen tool point-by-point undo while drawing without wiping out the full in-progress shape <small>([#1587](https://github.com/GraphiteEditor/Graphite/pull/1587), [#1597](https://github.com/GraphiteEditor/Graphite/pull/1597))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/pen-tool-point-by-point-undo.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/pen-tool-point-by-point-undo.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/pen-tool-point-by-point-undo.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/pen-tool-point-by-point-undo.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Freehand tool support for extending the endpoints of open paths <small>([#1594](https://github.com/GraphiteEditor/Graphite/pull/1594), [#1623](https://github.com/GraphiteEditor/Graphite/pull/1623))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/freehand-tool-endpoint-extension.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/freehand-tool-endpoint-extension.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/freehand-tool-endpoint-extension.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/freehand-tool-endpoint-extension.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Path tool support for breaking a closed shape into an open path by deleting (not dissolving) a point <small>([#1593](https://github.com/GraphiteEditor/Graphite/pull/1593))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/point-deletion-breaking-closed-shapes.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/point-deletion-breaking-closed-shapes.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/point-deletion-breaking-closed-shapes.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/point-deletion-breaking-closed-shapes.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Path tool insertion of a point on a path segment by sliding to the desired spot <small>([#1581](https://github.com/GraphiteEditor/Graphite/pull/1581))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/sliding-point-insertion.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/sliding-point-insertion.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/sliding-point-insertion.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/sliding-point-insertion.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Box-based drag selection in the node graph <small>([#1616](https://github.com/GraphiteEditor/Graphite/pull/1616))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/box-selection-in-node-graph.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/box-selection-in-node-graph.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/box-selection-in-node-graph.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/box-selection-in-node-graph.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -152,20 +152,20 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
- Auto-panning when drawing with each interactive tool when the user's pointer extends past the edge of the viewport <small>([#1625](https://github.com/GraphiteEditor/Graphite/pull/1625), [#1652](https://github.com/GraphiteEditor/Graphite/pull/1652), [#1682](https://github.com/GraphiteEditor/Graphite/pull/1682), [#1690](https://github.com/GraphiteEditor/Graphite/pull/1690))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/auto-panning-in-viewport.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/auto-panning-in-viewport.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/auto-panning-in-viewport.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/auto-panning-in-viewport.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Launch of the Alpha 3 release series in February <small>([commit f02dd5](https://github.com/GraphiteEditor/Graphite/commit/f02dd5c0f625b25bf3510ba0e9839ca182d930e4))</small>
|
||||
|
||||
<img src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/alpha-3-about-graphite.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Alpha 3 release series in the 'About Graphite' menu screenshot" />
|
||||
<img src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/alpha-3-about-graphite.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Alpha 3 release series in the 'About Graphite' menu screenshot" />
|
||||
|
||||
- Search functionality by typing in menu lists <small>([#1499](https://github.com/GraphiteEditor/Graphite/pull/1499))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/search-in-menu-lists.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/search-in-menu-lists.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/search-in-menu-lists.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/search-in-menu-lists.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -176,8 +176,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
- Path tool point selection checkbox for locking an anchor point's handles as colinear <small>([commit 5bca93](https://github.com/GraphiteEditor/Graphite/commit/5bca931813e456e2f6035844c21e77ee590b7728))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/colinear-handles-checkbox.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024/colinear-handles-checkbox.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/colinear-handles-checkbox.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024/colinear-handles-checkbox.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
title = "Graphite progress report (Q2 2024)"
|
||||
date = 2024-07-31
|
||||
[extra]
|
||||
banner = "https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024.avif"
|
||||
banner_png = "https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024.png"
|
||||
banner = "https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024.avif"
|
||||
banner_png = "https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024.png"
|
||||
author = "Keavon Chambers & Hypercube"
|
||||
summary = "Graphite's Q2 2024 update introduces boolean path operations, a new gradient picker, layer locking, and more improvements."
|
||||
reddit = "https://www.reddit.com/r/graphite/comments/1ei9ps2/blog_post_graphite_progress_report_q2_2024/"
|
||||
|
|
@ -17,13 +17,13 @@ Overall, editor functionality has been shaping up and becoming an all around use
|
|||
|
||||
<!-- more -->
|
||||
|
||||
This is the second of our quarterly progress report blog posts. If you missed the [first one](../graphite-progress-report-q1-2024), be sure to check it out as well. If you'd like to help speed up future progress, please consider [getting involved](/volunteer) with code, QA/bug testing, or art/marketing projects. [Donations](/donate) are also valued, as are [stars on GitHub](https://github.com/GraphiteEditor/Graphite). Follow along and partake in our [Discord community](https://discord.graphite.rs), too.
|
||||
This is the second of our quarterly progress report blog posts. If you missed the [first one](../graphite-progress-report-q1-2024), be sure to check it out as well. If you'd like to help speed up future progress, please consider [getting involved](/volunteer) with code, QA/bug testing, or art/marketing projects. [Donations](/donate) are also valued, as are [stars on GitHub](https://github.com/GraphiteEditor/Graphite). Follow along and partake in our [Discord community](https://discord.graphite.art), too.
|
||||
|
||||
All Q2 2024 commits may be [viewed in this list](https://github.com/GraphiteEditor/Graphite/commits/master/?since=2024-04-01&until=2024-06-30) 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.
|
||||
|
||||
<div class="demo-artwork">
|
||||
<a href="https://editor.graphite.rs/#demo/painted-dreams">
|
||||
<img src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector art of Painted Dreams" />
|
||||
<a href="https://editor.graphite.art/#demo/painted-dreams">
|
||||
<img src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector art of Painted Dreams" />
|
||||
</a>
|
||||
<p>
|
||||
<span>
|
||||
|
|
@ -31,7 +31,7 @@ All Q2 2024 commits may be [viewed in this list](https://github.com/GraphiteEdit
|
|||
</span>
|
||||
<br />
|
||||
<span>
|
||||
<a href="https://editor.graphite.rs/#demo/painted-dreams">Open this artwork</a> to<br />explore it yourself.
|
||||
<a href="https://editor.graphite.art/#demo/painted-dreams">Open this artwork</a> to<br />explore it yourself.
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
|
|
@ -45,52 +45,52 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
- Feature for locking layers from being selected in the viewport <small>([#1702](https://github.com/GraphiteEditor/Graphite/pull/1702))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/layer-locking.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/layer-locking.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/layer-locking.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/layer-locking.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Fine-grained choices in the Snapping options popover <small>([#1730](https://github.com/GraphiteEditor/Graphite/pull/1730))</small>
|
||||
|
||||
<img src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/snapping-options.png" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Snapping choices popover menu" />
|
||||
<img src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/snapping-options.png" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Snapping choices popover menu" />
|
||||
|
||||
- Corner rounding added to the *Rectangle* node <small>([#1648](https://github.com/GraphiteEditor/Graphite/pull/1648))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/rectangle-corner-rounding.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/rectangle-corner-rounding.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/rectangle-corner-rounding.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/rectangle-corner-rounding.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Rotation added to the *Repeat* node <small>([commit 72ba4dd](https://github.com/GraphiteEditor/Graphite/commit/72ba4ddfe421c0e17930ad1c2be85be2c69e04ea))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/repeat-node-rotation.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/repeat-node-rotation.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/repeat-node-rotation.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/repeat-node-rotation.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Visibility and deletion buttons added to node sections in the Properties panel <small>([commit 07fd2c2](https://github.com/GraphiteEditor/Graphite/commit/07fd2c27827e4a91ad238d790d41396a33ef2389))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/hide-delete-properties-sections.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/hide-delete-properties-sections.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/hide-delete-properties-sections.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/hide-delete-properties-sections.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Grid color customization and dotted appearance choices <small>([#1743](https://github.com/GraphiteEditor/Graphite/pull/1743))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/grid-coloration.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/grid-coloration.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/grid-coloration.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/grid-coloration.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Demo artwork, *Isometric Fountain*, featured in the [last blog post](../graphite-progress-report-q1-2024) <small>([commit 6b0822d](https://github.com/GraphiteEditor/Graphite/commit/6b0822d31890b6699c4533c3e828da0e9e8c9490))</small>
|
||||
|
||||
<div class="demo-artwork" style="justify-content: left">
|
||||
<a href="https://editor.graphite.rs/#demo/isometric-fountain">
|
||||
<img src="https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024__2.png" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector art of Isometric Fountain" />
|
||||
<a href="https://editor.graphite.art/#demo/isometric-fountain">
|
||||
<img src="https://static.graphite.art/content/blog/2024-05-09-graphite-progress-report-q1-2024__2.png" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector art of Isometric Fountain" />
|
||||
</a>
|
||||
<p>
|
||||
<span>
|
||||
|
|
@ -98,7 +98,7 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
</span>
|
||||
<br />
|
||||
<span>
|
||||
<a href="https://editor.graphite.rs/#demo/isometric-fountain">Open this artwork</a> to<br />explore it yourself.
|
||||
<a href="https://editor.graphite.art/#demo/isometric-fountain">Open this artwork</a> to<br />explore it yourself.
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
|
|
@ -106,38 +106,38 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
- *Area* and *Centroid* nodes which calculate a shape's interior size and center of mass, respectively <small>([#1729](https://github.com/GraphiteEditor/Graphite/pull/1729), [#1749](https://github.com/GraphiteEditor/Graphite/pull/1749))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/area-centroid-nodes.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/area-centroid-nodes.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/area-centroid-nodes.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/area-centroid-nodes.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- *Boolean Operation* node for combining two shape paths with a *Union*, *Subtract Front*, *Subtract Back*, *Intersect*, or *Difference* mode of cutting and combining <small>([#1759](https://github.com/GraphiteEditor/Graphite/pull/1759))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/boolean-ops-1.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/boolean-ops-1.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/boolean-ops-1.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/boolean-ops-1.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/boolean-ops-2.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/boolean-ops-2.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/boolean-ops-2.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/boolean-ops-2.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Gradient picker <small>([#1778](https://github.com/GraphiteEditor/Graphite/pull/1778))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/gradient-picker.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/gradient-picker.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/gradient-picker.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/gradient-picker.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Labels for artboard names displayed in the viewport <small>([#1795](https://github.com/GraphiteEditor/Graphite/pull/1795))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/artboard-names.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/artboard-names.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/artboard-names.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/artboard-names.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -146,8 +146,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
- *Rasterize* node for converting graphical content (like vector art) into an image within a chosen area and resolution scale <small>([#1755](https://github.com/GraphiteEditor/Graphite/pull/1755))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/rasterize-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/rasterize-node.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/rasterize-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/rasterize-node.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -166,24 +166,24 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
- Generalization of layers to support the concept of vertically stackable adjustment layers <small>([#1712](https://github.com/GraphiteEditor/Graphite/pull/1712), [#1738](https://github.com/GraphiteEditor/Graphite/pull/1738), [commit 244c8ad](https://github.com/GraphiteEditor/Graphite/commit/244c8ad10ad79c9ca4fcdb21260c5d5dc60b3a21), [#1763](https://github.com/GraphiteEditor/Graphite/pull/1763), [#1739](https://github.com/GraphiteEditor/Graphite/pull/1739), [#1748](https://github.com/GraphiteEditor/Graphite/pull/1748))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/stackable-layers.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/stackable-layers.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/stackable-layers.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/stackable-layers.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Support for viewing and editing subgraphs by double-clicking nodes with internal node networks <small>([#1750](https://github.com/GraphiteEditor/Graphite/pull/1750))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/subgraph-editing.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/subgraph-editing.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/subgraph-editing.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/subgraph-editing.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Extended support for navigating the graph just like the viewport (with autopanning on dragging near edges, working scrollbars, and zooming shortcuts) by migrating interaction code to the backend <small>([#1768](https://github.com/GraphiteEditor/Graphite/pull/1768), [#1790](https://github.com/GraphiteEditor/Graphite/pull/1790))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/graph-navigation.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024/graph-navigation.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/graph-navigation.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024/graph-navigation.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
title = "Graphite progress report (Q3 2024)"
|
||||
date = 2024-10-15
|
||||
[extra]
|
||||
banner = "https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024.avif"
|
||||
banner_png = "https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024.png"
|
||||
banner = "https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024.avif"
|
||||
banner_png = "https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024.png"
|
||||
author = "Keavon Chambers & Hypercube"
|
||||
summary = "Graphite's Q3 2024 update introduces improvements to performance, node graph organization, nondestructive path editing, a new render engine, and more helpful nodes."
|
||||
reddit = "https://www.reddit.com/r/graphite/comments/1g4h6ya/blog_post_graphite_progress_report_q3_2024/"
|
||||
|
|
@ -17,13 +17,13 @@ This has been the most productive quarter yet in the project's three-year histor
|
|||
|
||||
<!-- more -->
|
||||
|
||||
This is the third in our series of quarterly progress reports. If you missed the [first](../graphite-progress-report-q1-2024) or [second](../graphite-progress-report-q2-2024) ones, be sure to check them out as well. If you'd like to help speed up future progress, please consider [getting involved](/volunteer) with code, QA/bug testing, or art/marketing projects. [Donations](/donate) are also valued, as are [stars on GitHub](https://github.com/GraphiteEditor/Graphite). Follow along and partake in our [Discord community](https://discord.graphite.rs), too.
|
||||
This is the third in our series of quarterly progress reports. If you missed the [first](../graphite-progress-report-q1-2024) or [second](../graphite-progress-report-q2-2024) ones, be sure to check them out as well. If you'd like to help speed up future progress, please consider [getting involved](/volunteer) with code, QA/bug testing, or art/marketing projects. [Donations](/donate) are also valued, as are [stars on GitHub](https://github.com/GraphiteEditor/Graphite). Follow along and partake in our [Discord community](https://discord.graphite.art), 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.
|
||||
|
||||
<div class="demo-artwork">
|
||||
<a href="https://editor.graphite.rs/#demo/changing-seasons">
|
||||
<img src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector art of Changing Seasons" />
|
||||
<a href="https://editor.graphite.art/#demo/changing-seasons">
|
||||
<img src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector art of Changing Seasons" />
|
||||
</a>
|
||||
<p>
|
||||
<span>
|
||||
|
|
@ -31,7 +31,7 @@ The new *Changing Seasons* artwork shown here showcases some of the recently int
|
|||
</span>
|
||||
<br />
|
||||
<span>
|
||||
<a href="https://editor.graphite.rs/#demo/changing-seasons">Open this artwork</a> to<br />explore it yourself.
|
||||
<a href="https://editor.graphite.art/#demo/changing-seasons">Open this artwork</a> to<br />explore it yourself.
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
|
|
@ -45,44 +45,44 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
- 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 <small>([#1813](https://github.com/GraphiteEditor/Graphite/pull/1813), [#1933](https://github.com/GraphiteEditor/Graphite/pull/1933))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/stack-based-booleans.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/stack-based-booleans.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/stack-based-booleans.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/stack-based-booleans.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- *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 <small>([#1676](https://github.com/GraphiteEditor/Graphite/pull/1676))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/path-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/path-node.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/path-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/path-node.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Additional snapping criteria for alignment and distribution between layers <small>([#1793](https://github.com/GraphiteEditor/Graphite/pull/1793))</small>
|
||||
|
||||
<img src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/new-snapping-modes.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Snapping choices popover menu" />
|
||||
<img src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/new-snapping-modes.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Snapping choices popover menu" />
|
||||
|
||||
- Snapping now included with the Artboard tool for precise alignment with other artboards <small>([#1734](https://github.com/GraphiteEditor/Graphite/pull/1734))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/artboard-snapping.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/artboard-snapping.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/artboard-snapping.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/artboard-snapping.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- 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 <small>([commit 4d3e459](https://github.com/GraphiteEditor/Graphite/commit/4d3e459f1f52f04be81727fe5946010bcabeb1eb))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/export-settings-persistence.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/export-settings-persistence.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/export-settings-persistence.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/export-settings-persistence.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Demo artwork, *Painted Dreams*, featured in the [last blog post](../graphite-progress-report-q2-2024) <small>([commit 80cf486](https://github.com/GraphiteEditor/Graphite/commit/80cf486790d9300510904622924162a9b4017b1e))</small>
|
||||
|
||||
<div class="demo-artwork" style="justify-content: left">
|
||||
<a href="https://editor.graphite.rs/#demo/painted-dreams">
|
||||
<img src="https://static.graphite.rs/content/blog/2024-07-31-graphite-progress-report-q2-2024.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector art of Painted Dreams" />
|
||||
<a href="https://editor.graphite.art/#demo/painted-dreams">
|
||||
<img src="https://static.graphite.art/content/blog/2024-07-31-graphite-progress-report-q2-2024.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector art of Painted Dreams" />
|
||||
</a>
|
||||
<p>
|
||||
<span>
|
||||
|
|
@ -90,7 +90,7 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
</span>
|
||||
<br />
|
||||
<span>
|
||||
<a href="https://editor.graphite.rs/#demo/painted-dreams">Open this artwork</a> to<br />explore it yourself.
|
||||
<a href="https://editor.graphite.art/#demo/painted-dreams">Open this artwork</a> to<br />explore it yourself.
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
|
|
@ -98,72 +98,72 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
- Quick measurement feature that is shown by holding <kbd>Alt</kbd> to momentarily see the distance between the selected and hovered shapes <small>([#1894](https://github.com/GraphiteEditor/Graphite/pull/1894))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/quick-measurement.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/quick-measurement.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/quick-measurement.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/quick-measurement.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Support for drag-and-drop and copy-paste of files more widely throughout the editor <small>([#2012](https://github.com/GraphiteEditor/Graphite/pull/2012))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/drag-and-drop-import.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/drag-and-drop-import.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/drag-and-drop-import.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/drag-and-drop-import.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- 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) <small>([#1846](https://github.com/GraphiteEditor/Graphite/pull/1846))</small>
|
||||
|
||||
<img src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/graph-crash-error.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graph execution crash recovery message" />
|
||||
<img src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/graph-crash-error.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graph execution crash recovery message" />
|
||||
|
||||
- Seed parameters now included in all nodes with random generation <small>([commit c39032a](https://github.com/GraphiteEditor/Graphite/commit/c39032ab548d4f33d18a399c64b77d3d6f4ecd45))</small>
|
||||
|
||||
<img src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-seed-parameters.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Three nodes and their new seed parameters" />
|
||||
<img src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-seed-parameters.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Three nodes and their new seed parameters" />
|
||||
|
||||
- *Percentage Value* node for easy sliding between the numbers 0 and 100 <small>([commit d7546fb](https://github.com/GraphiteEditor/Graphite/commit/d7546fb18310490d5ce10d406e7a3faaf1ae98fe))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/percentage-value-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/percentage-value-node.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/percentage-value-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/percentage-value-node.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- *Gradient Map* node for recoloring grayscale color values to corresponding colors along a chosen gradient <small>([commit 501b562](https://github.com/GraphiteEditor/Graphite/commit/501b562d0f17b91a54a14c83a4a0f90a1e03e369))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/gradient-map-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/gradient-map-node.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/gradient-map-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/gradient-map-node.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- *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 <small>([#1938](https://github.com/GraphiteEditor/Graphite/pull/1938))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/assign-colors-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/assign-colors-node.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/assign-colors-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/assign-colors-node.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- *Dehaze* node for reducing the appearance of the atmospheric haze or fog in photographs <small>([#1882](https://github.com/GraphiteEditor/Graphite/pull/1882))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/dehaze-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/dehaze-node.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/dehaze-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/dehaze-node.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Node catalog reorganized with the naming and categorization of nodes given improved consistency <small>([commit e647ca9](https://github.com/GraphiteEditor/Graphite/commit/e647ca9f91a5e823137122126fe9e980f65d62ea))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/reorganized-node-catalog.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/reorganized-node-catalog.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/reorganized-node-catalog.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/reorganized-node-catalog.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- *Noise Pattern* node updated to generate resolution-aware coherent noise, meaning it extends forever in all directions and zoom depths <small>([#1909](https://github.com/GraphiteEditor/Graphite/pull/1909))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/resolution-aware-noise.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/resolution-aware-noise.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/resolution-aware-noise.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/resolution-aware-noise.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -171,7 +171,7 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
- Alternate render engine using [Vello](https://github.com/linebender/vello) that brings increased code simplicity and performance (especially with raster layers), but currently only works in browsers with [WebGPU support](https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API#browser_compatibility) and must be enabled via *File* > *Preferences* <small>([#1802](https://github.com/GraphiteEditor/Graphite/pull/1802), [#1865](https://github.com/GraphiteEditor/Graphite/pull/1865), [#1844](https://github.com/GraphiteEditor/Graphite/pull/1844), [#1871](https://github.com/GraphiteEditor/Graphite/pull/1871), [#1874](https://github.com/GraphiteEditor/Graphite/pull/1874), [#1875](https://github.com/GraphiteEditor/Graphite/pull/1875), [#1899](https://github.com/GraphiteEditor/Graphite/pull/1899), [#1905](https://github.com/GraphiteEditor/Graphite/pull/1905), [#1900](https://github.com/GraphiteEditor/Graphite/pull/1900), [#1907](https://github.com/GraphiteEditor/Graphite/pull/1907), [#1902](https://github.com/GraphiteEditor/Graphite/pull/1902), [#1897](https://github.com/GraphiteEditor/Graphite/pull/1897), [#1915](https://github.com/GraphiteEditor/Graphite/pull/1915), [#1996](https://github.com/GraphiteEditor/Graphite/pull/1996))</small>
|
||||
|
||||
<img src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/vello-preference.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Editor preferences menu with Vello setting" />
|
||||
<img src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/vello-preference.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Editor preferences menu with Vello setting" />
|
||||
|
||||
- The [final report and weekly updates](https://github.com/GraphiteEditor/Graphite/discussions/1773) are available for more details
|
||||
|
||||
|
|
@ -180,40 +180,40 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
- Layer node chains that help keep a linear sequence of nodes organized by encapsulating them within their destination layer <small>([#1794](https://github.com/GraphiteEditor/Graphite/pull/1794), [#1812](https://github.com/GraphiteEditor/Graphite/pull/1812), [commit e28e841](https://github.com/GraphiteEditor/Graphite/commit/e28e841e3bef401c19f5ddcf01c68fedd6b5c9c3))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-organization-chains.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-organization-chains.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-organization-chains.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-organization-chains.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Subgraph data import/export connectors drawn along the top left/right sides of the graph, instead of the previous representation as node-looking boxes <small>([#1794](https://github.com/GraphiteEditor/Graphite/pull/1794), [commit 8e774ef](https://github.com/GraphiteEditor/Graphite/commit/8e774efe9dae51c0c1db2928e22c6de5b93d0584), [#1911](https://github.com/GraphiteEditor/Graphite/pull/1911))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-organization-imports-exports.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-organization-imports-exports.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-organization-imports-exports.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-organization-imports-exports.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- 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 <kbd>Alt</kbd><kbd>[</kbd> and <kbd>Alt</kbd><kbd>]</kbd> hotkeys <small>([#1945](https://github.com/GraphiteEditor/Graphite/pull/1945))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/selection-history.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/selection-history.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/selection-history.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/selection-history.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Improved layer positioning for upstream nodes when being reordered so they don't chaotically overlap or leave behind large gaps anymore <small>([#1928](https://github.com/GraphiteEditor/Graphite/pull/1928), [#1945](https://github.com/GraphiteEditor/Graphite/pull/1945))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-organization-reordering.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-organization-reordering.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-organization-reordering.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-organization-reordering.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- 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 <small>([#1940](https://github.com/GraphiteEditor/Graphite/pull/1940))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-organization-block-collision.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-organization-block-collision.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-organization-block-collision.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/node-organization-block-collision.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -359,7 +359,7 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
- Cleanup for various TypeScript code errors and additions to CI infrastructure to enforce TS error checking <small>([commit 1ee5ffb](https://github.com/GraphiteEditor/Graphite/commit/1ee5ffbbe8a64da5a83da889dd16d41c3463c332))</small>
|
||||
|
||||
- Simplifications to the [Bezier-rs web demos](https://graphite.rs/libraries/bezier-rs/) to reduce the bundle size and streamline its code <small>([commit 0b0169a](https://github.com/GraphiteEditor/Graphite/commit/0b0169a415453b9d9910d765f0538ecd67b618c0))</small>
|
||||
- Simplifications to the [Bezier-rs web demos](https://keavon.github.io/Bezier-rs/) to reduce the bundle size and streamline its code <small>([commit 0b0169a](https://github.com/GraphiteEditor/Graphite/commit/0b0169a415453b9d9910d765f0538ecd67b618c0))</small>
|
||||
|
||||
- Manually-runnable benchmarks for document runtime speed profiling <small>([#2005](https://github.com/GraphiteEditor/Graphite/pull/2005))</small>
|
||||
|
||||
|
|
@ -373,13 +373,13 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
### Graphite @ Maker Faire
|
||||
|
||||
<img src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/maker-faire-banner.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Poster for the Bay Area Maker Faire" />
|
||||
<img src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/maker-faire-banner.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Poster for the Bay Area Maker Faire" />
|
||||
|
||||
Graphite will have a booth at the [Bay Area Maker Faire](https://makerfaire.com/bay-area/) **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
|
||||
|
||||
<img src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/nodevember-logo.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Poster for the Bay Area Maker Faire" />
|
||||
<img src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/nodevember-logo.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Poster for the Bay Area Maker Faire" />
|
||||
|
||||
We're excited to be participating in [Nodevember](https://nodevember.io/) 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`.
|
||||
|
||||
|
|
@ -387,4 +387,4 @@ We're excited to be participating in [Nodevember](https://nodevember.io/) next m
|
|||
|
||||
Congratulations to [VDawg](https://www.instagram.com/vdawg.jpg/), the winner of the community art contest, whose work is featured below.
|
||||
|
||||
<img src="https://static.graphite.rs/content/blog/2024-10-15-graphite-progress-report-q3-2024/art-contest-winner.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Winning artwork depicts a dark landscape with an ethereal diamond forming a constellation with the stars above" />
|
||||
<img src="https://static.graphite.art/content/blog/2024-10-15-graphite-progress-report-q3-2024/art-contest-winner.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Winning artwork depicts a dark landscape with an ethereal diamond forming a constellation with the stars above" />
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ title = "Year in review: 2024 highlights and a peek at 2025"
|
|||
date = 2025-01-16
|
||||
|
||||
[extra]
|
||||
banner = "https://static.graphite.rs/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025.avif"
|
||||
banner_png = "https://static.graphite.rs/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025.png"
|
||||
banner = "https://static.graphite.art/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025.avif"
|
||||
banner_png = "https://static.graphite.art/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025.png"
|
||||
author = "Keavon Chambers"
|
||||
summary = "Graphite has come a long way in 2024. Read about the progress made and the plans for the upcoming year."
|
||||
reddit = "https://www.reddit.com/r/graphite/comments/1i3umnl/blog_post_year_in_review_2024_highlights_and_a/"
|
||||
|
|
@ -21,7 +21,7 @@ Another year has come and gone which has propelled Graphite—further than any y
|
|||
|
||||
In a world where the notion of software ownership seems headed towards extinction, the need has never been greater for an independent, community-built alternative to the vector graphics, animation, image manipulation, photo processing, and publishing tools used daily by millions of creators worldwide.
|
||||
|
||||
Graphite is and will always remain yours to keep, whether that's by running the lightweight, client-side [web app](https://editor.graphite.rs) (no signup, no cloud), <a href="https://support.google.com/chrome/answer/9658361" target="_blank">installing the PWA</a> on your desktop, self-hosting the <a href="https://github.com/GraphiteEditor/Graphite/releases/tag/latest-stable" target="_blank">builds</a>, or downloading the soon-to-be-ready native app for your OS of choice (more news on that later in the post).
|
||||
Graphite is and will always remain yours to keep, whether that's by running the lightweight, client-side [web app](https://editor.graphite.art) (no signup, no cloud), <a href="https://support.google.com/chrome/answer/9658361" target="_blank">installing the PWA</a> on your desktop, self-hosting the <a href="https://github.com/GraphiteEditor/Graphite/releases/tag/latest-stable" target="_blank">builds</a>, or downloading the soon-to-be-ready native app for your OS of choice (more news on that later in the post).
|
||||
|
||||
<style class="float-image">
|
||||
.float-image + p {
|
||||
|
|
@ -35,17 +35,17 @@ Graphite is and will always remain yours to keep, whether that's by running the
|
|||
</style>
|
||||
|
||||
<p>
|
||||
<a href="https://github.com/GraphiteEditor/Graphite"><img src="https://static.graphite.rs/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/10k-stars.avif" style="max-width: unset; margin-top: 0.5em" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Screenshot of 10,000 stars" /></a>
|
||||
<a href="https://github.com/GraphiteEditor/Graphite"><img src="https://static.graphite.art/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/10k-stars.avif" style="max-width: unset; margin-top: 0.5em" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Screenshot of 10,000 stars" /></a>
|
||||
<span>Join me, founder and designer of Graphite, to see where the past year has brought us on this quest. And let me take this moment to thank our growing community for sharing my vision and showing support, both <a href="/donate">financially</a> and by boosting the GitHub project page over the 10,000 star milestone just in time to celebrate the end of a productive 2024.</span>
|
||||
</p>
|
||||
|
||||
## 2024 development progress report
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/weekly-commit-rate.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/weekly-commit-rate.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" /></p>
|
||||
|
||||
<center><em>Weekly code commit rate in 2024</em></center>
|
||||
|
||||
In 2024, Graphite grew from a promising tech demo into a by-and-large useful application for vector artistry and graphic design, equipped with its totally unique secret ingredient: nondestructive, procedural editing via a node graph. This was a year focused on iterating until a prototype became a polished product— at least by the standards of alpha-stage software. If you haven't [tried Graphite](https://editor.graphite.rs) recently, please take another look!
|
||||
In 2024, Graphite grew from a promising tech demo into a by-and-large useful application for vector artistry and graphic design, equipped with its totally unique secret ingredient: nondestructive, procedural editing via a node graph. This was a year focused on iterating until a prototype became a polished product— at least by the standards of alpha-stage software. If you haven't [tried Graphite](https://editor.graphite.art) recently, please take another look!
|
||||
|
||||
Improvements made throughout Alpha 3 (2024's release series) brought the formerly abysmal performance up to now-adequate levels and solved the vast bulk of instability with the once-numerous crashes and bugs. Advancements to [Graphene](/volunteer/guide/graphene), our bespoke node graph engine technology, has let us begin to support new rendering possibilities, introduce more helpful nodes, and remove restrictive limitations with common node combinations that previously were points of frustration. We also made big strides improving the tools used by artists for vector drawing with features like boolean path operations, snapping, layer selection history, quick measurement, gradient picking, and extensive usability-focused tweaks—both big and small—all throughout the editor.
|
||||
|
||||
|
|
@ -62,7 +62,7 @@ Alpha 3 began back in February 2024 and we plan to declare the start of the Alph
|
|||
|
||||
## Google Summer of Code results
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/gsoc-logo.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Google Summer of Code program logo" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/gsoc-logo.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Google Summer of Code program logo" /></p>
|
||||
|
||||
<center><em>Read our short <a href="../graphite-internships-announcing-participation-in-gsoc-2024">blog post</a> about participating in Google Summer of Code</em></center>
|
||||
|
||||
|
|
@ -78,11 +78,11 @@ I would like to express my gratitude to Google for funding the program and its s
|
|||
|
||||
Another part of the GSoC program was the Mentor Summit in October where I got to meet and share knowledge with open source maintainers from the other participating organizations. Hosted at Google's Mountain View offices, it was a weekend of talking tech and learning the lessons of open source project management from the seasoned veterans.
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/gsoc-mentor-summit-photo.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/gsoc-mentor-summit-photo.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
|
||||
<center><em>Group photo of the GSoC Mentor Summit attendees</em></center>
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/gsoc-mentor-summit-session-board.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/gsoc-mentor-summit-session-board.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
|
||||
<center><em>Schedule board highlighting my session on day 2</em></center>
|
||||
|
||||
|
|
@ -98,7 +98,7 @@ In March, accompanied by Oliver Davies, a personal friend/tech artist/contributo
|
|||
|
||||
We introduced Graphite to open source organizations like <a href="https://godotengine.org/" target="_blank">Godot</a> and <a href="https://o3de.org/" target="_blank">O3DE</a>, caught up with Francesco and Dalai from the Blender Foundation, joined a roundtable panel on open source adoption in the games industry, and came together with the <a href="https://gamedev.rs/" target="_blank">Rust Gamedev</a> community for a physical meetup of game and graphics centric Rust developers. It was a treat seeing several people in-person for the first time whom, before, I'd known only online.
|
||||
|
||||
<p class="wide"><img src="https://static.graphite.rs/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/gdc-collage.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
<p class="wide"><img src="https://static.graphite.art/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/gdc-collage.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
|
||||
<center><em>
|
||||
Upper-left: Forest Anderson, host of the Rust Gamedev Meetup <a href="https://www.youtube.com/watch?v=Ea4Wt_FgEEw&list=PLYiOdhpKxxXI9l8V15FciLcsPzkz3Gt4I&index=2" target="_blank">live streams</a> where Graphite demoed many monthly development milestones, with me at the Rust devs hangout;
|
||||
|
|
@ -111,7 +111,7 @@ With March now just around the corner, I am definitely looking forward to the ne
|
|||
|
||||
### Blender Conference LA
|
||||
|
||||
<p class="wide"><img src="https://static.graphite.rs/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/bcon-la-collage.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
<p class="wide"><img src="https://static.graphite.art/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/bcon-la-collage.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
|
||||
<center><em>Left-to-right, top-then-bottom: Ton Roosendaal (founder of Blender) and me (founder of Graphite); the venue on Hollywood Boulevard; talks on the main stage; Colin Levy (director of <a href="https://www.youtube.com/watch?v=Mv30ExfoKcc" target="_blank">Skywatch</a> and the Blender Studio's <a href="https://www.youtube.com/watch?v=eRsGyueVLvQ" target="_blank">Sintel</a>) and Andrew Price (<a href="https://www.youtube.com/@blenderguru" target="_blank">Blender Guru</a> and creator of <a href="https://www.poliigon.com/" target="_blank">Poliigon</a>); my talk on the main stage; Alan Melikdjanian (<a href="https://www.youtube.com/user/CaptainDisillusion" target="_blank">Captain Disillusion</a>) and <a href="https://www.youtube.com/@IanHubert2" target="_blank">Ian Hubert</a> (YouTube filmmaker and director of the Blender Studio's <a href="https://www.youtube.com/watch?v=41hv2tW5Lc4" target="_blank">Tears of Steel</a>); attendees chatting</em></center>
|
||||
|
||||
|
|
@ -120,20 +120,20 @@ The next month in April, Oliver and I went to our second conference of the year:
|
|||
I also took to the main stage to present a lightning talk introducing Graphite to the community:
|
||||
|
||||
<div class="youtube-embed aspect-16x9">
|
||||
<img src="https://static.graphite.rs/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/bcon-la-talk-video-cover.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" data-youtube-embed="x3P5eYv11EU" data-youtube-timestamp="1603" alt="BCON LA 2024 - Lightning Talks" />
|
||||
<img src="https://static.graphite.art/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/bcon-la-talk-video-cover.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" data-youtube-embed="x3P5eYv11EU" data-youtube-timestamp="1603" alt="BCON LA 2024 - Lightning Talks" />
|
||||
</div>
|
||||
|
||||
### Graphite booth at Open Sauce
|
||||
|
||||
The month of June was particularly special because of <a href="https://opensauce.com/" target="_blank">Open Sauce</a>, a convention and expo in San Francisco for makers and creators, and of course, open source projects!
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/open-sauce-booth.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/open-sauce-booth.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
|
||||
<center><em>Adam and Oliver driving a Graphite live demo at our booth</em></center>
|
||||
|
||||
This presented the perfect opportunity to host our own exhibitor booth and talk to hundreds of excited attendees with creative tech backgrounds over the two day show. The event was excellent for networking with fellow makers and a chance to meet an array of the guest YouTube creators including several from the digital content creation realm.
|
||||
|
||||
<p class="wide"><img src="https://static.graphite.rs/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/open-sauce-collage.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
<p class="wide"><img src="https://static.graphite.art/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/open-sauce-collage.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
|
||||
<center><em>Sides: doodles by attendees on our public art wall; Inner-left: <a href="https://www.youtube.com/@IanHubert2" target="_blank">Ian Hubert</a>, Blender filmmaker, visiting again after we met at BCON LA; Inner-right: Daniel Shiffman (<a href="https://www.youtube.com/@TheCodingTrain" target="_blank">The Coding Train</a>), creator of tutorials and explorations into creative coding/generative procedural art</em></center>
|
||||
|
||||
|
|
@ -145,7 +145,7 @@ Joining me again was Oliver to assist with the booth, as well as our new GSoC co
|
|||
|
||||
And then when October rolled around, we did it again! Now located at a post-industrial waterfront venue across the Bay from San Francisco, the <a href="https://makerfaire.com/bay-area/" target="_blank">Maker Faire</a> started with a Friday field trip day for local schools followed by a full weekend of general attendance.
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/maker-faire-booth.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/maker-faire-booth.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
|
||||
<center><em>Visitors making art and learning about Graphite at our booth</em></center>
|
||||
|
||||
|
|
@ -153,13 +153,13 @@ The Maker Faire is ground zero for the Maker Movement. I grew up going each year
|
|||
|
||||
Attracting a more family-oriented audience than Open Sauce, it presented the chance to learn how approachable Graphite is even for kids. Doodling on the LED-backlit whiteboards flanking our booth was especially popular with that age range and brought in many passers-by. Of those who tried Graphite, I was blown away to see how some of our youngest visitors—down to the age of 6—were also the most capable and engaged using the product, diving in deep with barely any instruction. As the UI and product designer, this assured me that I have been on the right track so far. I believe now more than ever that my ambitious goal is achievable: creating the most intuitive and user-friendly professional graphics editor on the market.
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/maker-faire-demo-stations.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/maker-faire-demo-stations.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
|
||||
<center><em>All four demo computers occupied with Graphite's newest users</em></center>
|
||||
|
||||
Another exciting part of the Maker Faire experience was bringing together nearly the full Graphite core team in-person. Oliver and Adam came to help again while we were also joined by Dennis visiting all the way from Germany, conveniently coinciding with a vacation he had planned. We put our commute time towards deeply technical code architecture discussions and knowledge transfer.
|
||||
|
||||
<p class="wide"><img src="https://static.graphite.rs/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/maker-faire-team-collage.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
<p class="wide"><img src="https://static.graphite.art/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/maker-faire-team-collage.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="" /></p>
|
||||
|
||||
<center><em>Left: me (1), Adam (2), and Oliver (3) at the venue; Right: Adam (1), Dennis (2), and me (3) (Oliver and Dennis couldn't make it on the same day)</em></center>
|
||||
|
||||
|
|
@ -179,7 +179,7 @@ Now to get technical, the lazy option exists: chucking the whole web app in an u
|
|||
|
||||
Next, the feature I am personally most itching to dive into developing is animation. I've been recently iterating on the UI design mockup for the Timeline panel which will support keyframing any desired node parameters. This new panel will seamlessly integrate into the existing graph-based, data-driven workflow and make it easy to create motion graphics paired with procedural generation.
|
||||
|
||||
<p class="wide"><img src="https://static.graphite.rs/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/timeline-panel-ui-mockup.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" /></p>
|
||||
<p class="wide"><img src="https://static.graphite.art/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/timeline-panel-ui-mockup.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" /></p>
|
||||
|
||||
<center><em>User interface mockup for the latest animation panel plans prior to being implemented</em></center>
|
||||
|
||||
|
|
@ -196,7 +196,7 @@ It is now becoming time to delve into the next phase of making the node graph mo
|
|||
|
||||
Graphite has included a primitive kind of raster support for a while, mostly used for including reference images when creating vector content. Some raster nodes can adjust the colors of images, but there are no tools yet for selecting and drawing over parts of an image to make localized edits. Furthermore, CPU-centric bottlenecks slow down the editor when big images are in use. The GPU is not used by any nodes operating on pixel-based data.
|
||||
|
||||
Consequently, raster editing just isn't viable yet until tool and GPU node support arrives. The innumerable complexities would not fit in this section, but if you have a background in compilers or graphics programming, please hop on <a href="https://discord.graphite.rs" target="_blank">our Discord</a> and ask about it if you're curious or potentially interested in helping. After the infrastructure parts are in place, we can begin building nodes that make localized edits (such as a masking node) and start developing tools including a fully rewritten brush engine and a mode for drawing marquee selections. I can't yet predict how far we will get by year's end with these interactive localized editing tools because it will all depend on how quickly the prerequisite technical infrastructure components come together. Part of that will depend on how soon the browser vendors ship universal <a href="https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API#browser_compatibility" target="_blank">WebGPU API support</a> so it can be deployed beyond an experimental state in Graphite.
|
||||
Consequently, raster editing just isn't viable yet until tool and GPU node support arrives. The innumerable complexities would not fit in this section, but if you have a background in compilers or graphics programming, please hop on <a href="https://discord.graphite.art" target="_blank">our Discord</a> and ask about it if you're curious or potentially interested in helping. After the infrastructure parts are in place, we can begin building nodes that make localized edits (such as a masking node) and start developing tools including a fully rewritten brush engine and a mode for drawing marquee selections. I can't yet predict how far we will get by year's end with these interactive localized editing tools because it will all depend on how quickly the prerequisite technical infrastructure components come together. Part of that will depend on how soon the browser vendors ship universal <a href="https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API#browser_compatibility" target="_blank">WebGPU API support</a> so it can be deployed beyond an experimental state in Graphite.
|
||||
|
||||
### Graphite in education
|
||||
|
||||
|
|
@ -204,7 +204,7 @@ A valuable discovery came out of exhibiting Graphite at the Maker Faire. I had c
|
|||
|
||||
I was told that other web-based graphics editors are commonly blocked by the IT admins of school networks due to policies against visiting sites with ads. (Crazy!) Since Graphite is entirely ad-free and runs on Chromebooks, this presents an opportunity to focus on better supporting the education market. In fact, I have recently been watching Chromebooks account for a small but rapidly growing portion of our site's visitors which means some educators are teaching Graphite in their classrooms:
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/school-usage-trends.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" /></p>
|
||||
<p><img src="https://static.graphite.art/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025/school-usage-trends.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" /></p>
|
||||
|
||||
<center><em>Graphite visitors on Chromebooks have trended up this school year but dropped down to background levels during summer and winter breaks, hinting at usage in classrooms</em></center>
|
||||
|
||||
|
|
@ -232,7 +232,7 @@ If you choose to [become a member](/donate), you are directly helping fund our e
|
|||
|
||||
If you choose to [volunteer](/volunteer), you lift our greatest bottleneck—time—and bring your unique skills to the table. There are opportunities from coding to technical writing to art, design, and marketing. It's a team effort, but only if there's a team to delegate the efforts to.
|
||||
|
||||
And there are other ways to help out. Sign up as a QA tester in our <a href="https://discord.graphite.rs" target="_blank">Discord</a>. Make it your mission to share Graphite by word-of-mouth on the forums and online communities you frequent. Put it on the radar of the creators you follow. Create and post your own tutorials on the web. Use it regularly and share your creations in our Discord community and by tagging #Made<wbr />With<wbr />Graphite on social media.
|
||||
And there are other ways to help out. Sign up as a QA tester in our <a href="https://discord.graphite.art" target="_blank">Discord</a>. Make it your mission to share Graphite by word-of-mouth on the forums and online communities you frequent. Put it on the radar of the creators you follow. Create and post your own tutorials on the web. Use it regularly and share your creations in our Discord community and by tagging #Made<wbr />With<wbr />Graphite on social media.
|
||||
|
||||
## Upcoming: FOSDEM '25
|
||||
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
title = "Graphite progress report (Q4 2024)"
|
||||
date = 2025-03-31
|
||||
[extra]
|
||||
banner = "https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024.avif"
|
||||
banner_png = "https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024.png"
|
||||
banner = "https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024.avif"
|
||||
banner_png = "https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024.png"
|
||||
author = "Keavon Chambers & Hypercube"
|
||||
summary = "Graphite's Q4 2024 update introduces quality of life features across drawing tools and procedural editing."
|
||||
css = ["/component/demo-artwork.css"]
|
||||
|
|
@ -18,15 +18,15 @@ bluesky = "https://bsky.app/profile/graphiteeditor.bsky.social/post/3llsxykppjs2
|
|||
|
||||
All Q4 2024 commits may be [viewed in this list](https://github.com/GraphiteEditor/Graphite/commits/master/?since=2024-10-01&until=2024-12-31) and all noteworthy changes are detailed below.
|
||||
|
||||
This is the fourth in our 2024 series of quarterly progress reports. If you missed [the previous post](../graphite-progress-report-q3-2024), be sure to check it out as well. If you'd like to help speed up future progress, please consider [getting involved](/volunteer) with code, QA/bug testing, or art/marketing projects. [Donations](/donate) are also valued, as are [stars on GitHub](https://github.com/GraphiteEditor/Graphite). Follow along and partake in our [Discord community](https://discord.graphite.rs), too.
|
||||
This is the fourth in our 2024 series of quarterly progress reports. If you missed [the previous post](../graphite-progress-report-q3-2024), be sure to check it out as well. If you'd like to help speed up future progress, please consider [getting involved](/volunteer) with code, QA/bug testing, or art/marketing projects. [Donations](/donate) are also valued, as are [stars on GitHub](https://github.com/GraphiteEditor/Graphite). Follow along and partake in our [Discord community](https://discord.graphite.art), too.
|
||||
|
||||
At the time of publication, there is **one week left to apply for a summer 2025 internship with us through Google Summer of Code.** [Learn more here](../internships-for-a-rust-graphics-engine-gsoc-2025) and apply before [April 8 at 18:00 UTC](https://www.wolframalpha.com/input?i=April+8%2C+18%3A00+UTC).
|
||||
|
||||
To showcase the newly introduced feature of converting selected nodes into conveniently reusable subgraphs, the new *Parametric Dunescape* artwork is presented below. Every dune layer is generated just by its custom parameters for color, height, and random seed.
|
||||
|
||||
<div class="demo-artwork">
|
||||
<a href="https://editor.graphite.rs/#demo/parametric-dunescape">
|
||||
<img src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector art of Parametric Dunescape" />
|
||||
<a href="https://editor.graphite.art/#demo/parametric-dunescape">
|
||||
<img src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector art of Parametric Dunescape" />
|
||||
</a>
|
||||
<p>
|
||||
<span>
|
||||
|
|
@ -34,7 +34,7 @@ To showcase the newly introduced feature of converting selected nodes into conve
|
|||
</span>
|
||||
<br />
|
||||
<span>
|
||||
<a href="https://editor.graphite.rs/#demo/parametric-dunescape">Open this artwork</a> to<br />explore it yourself.
|
||||
<a href="https://editor.graphite.art/#demo/parametric-dunescape">Open this artwork</a> to<br />explore it yourself.
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
|
|
@ -48,8 +48,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/merge-selected-nodes.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/merge-selected-nodes.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/merge-selected-nodes.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/merge-selected-nodes.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -57,24 +57,24 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/text-area-controls.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/text-area-controls.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/text-area-controls.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/text-area-controls.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Pinnable node sections in the Properties panel <small>([commit e6d8c47](https://github.com/GraphiteEditor/Graphite/commit/e6d8c4743d2aff15985c929df2cc7381a61908a0))</small>
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/pinnable-node-sections.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/pinnable-node-sections.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/pinnable-node-sections.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/pinnable-node-sections.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
- New demo artwork, [*Changing Seasons*](https://editor.graphite.rs/#demo/changing-seasons), featured in the [previous progress report](../graphite-progress-report-q3-2024) <small>([commit fa6b5f2](https://github.com/GraphiteEditor/Graphite/commit/fa6b5f298adf395362e1aaa2c07be89fa89eaee2))</small>
|
||||
- New demo artwork, [*Changing Seasons*](https://editor.graphite.art/#demo/changing-seasons), featured in the [previous progress report](../graphite-progress-report-q3-2024) <small>([commit fa6b5f2](https://github.com/GraphiteEditor/Graphite/commit/fa6b5f298adf395362e1aaa2c07be89fa89eaee2))</small>
|
||||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/changing-seasons-demo.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/changing-seasons-demo.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/changing-seasons-demo.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/changing-seasons-demo.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -82,21 +82,21 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/offset-path-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/offset-path-node.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/offset-path-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/offset-path-node.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- *Flatten Vector Elements* node that turns multiple layers of vector paths into a single combined path; and changes to the *Copy to Points*, *Repeat*, and *Circular Repeat* nodes so they output group data instead of a single vector path, allowing each separate layer to be modified by nodes which operate on groups (like *Assign Colors*), or flattened with *Flatten Vector Elements* to have the prior behavior <small>([#2011](https://github.com/GraphiteEditor/Graphite/pull/2011), [#2045](https://github.com/GraphiteEditor/Graphite/pull/2045))</small>
|
||||
|
||||
<img src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/flatten-vector-elements-node.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Visual description of the change introduced by the Flatten Vector Elements node and its usage with instancing nodes" />
|
||||
<img src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/flatten-vector-elements-node.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Visual description of the change introduced by the Flatten Vector Elements node and its usage with instancing nodes" />
|
||||
|
||||
- Support for *Fill* and *Stroke* nodes with groups, applying to each vector layer within <small>([#2046](https://github.com/GraphiteEditor/Graphite/pull/2046))</small>
|
||||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/fill-and-stroke-nodes-on-groups.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/fill-and-stroke-nodes-on-groups.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/fill-and-stroke-nodes-on-groups.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/fill-and-stroke-nodes-on-groups.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -104,8 +104,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/switch-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/switch-node.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/switch-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/switch-node.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -113,8 +113,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/bevel-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/bevel-node.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/bevel-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/bevel-node.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -122,8 +122,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/jitter-points-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/jitter-points-node.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/jitter-points-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/jitter-points-node.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -131,8 +131,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/node-insertion-button-in-properties-panel.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/node-insertion-button-in-properties-panel.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/node-insertion-button-in-properties-panel.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/node-insertion-button-in-properties-panel.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -140,8 +140,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/path-tool-space-to-drag-anchor.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/path-tool-space-to-drag-anchor.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/path-tool-space-to-drag-anchor.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/path-tool-space-to-drag-anchor.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -149,8 +149,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/path-tool-tab-to-swap-handle.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/path-tool-tab-to-swap-handle.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/path-tool-tab-to-swap-handle.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/path-tool-tab-to-swap-handle.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -158,8 +158,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/pen-tool-combining-layers.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/pen-tool-combining-layers.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/pen-tool-combining-layers.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/pen-tool-combining-layers.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -167,8 +167,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/clamp-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/clamp-node.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/clamp-node.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/clamp-node.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -176,27 +176,27 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
- *Dot Product* node that calculates the mathematical dot product between two numerical vectors <small>([#2126](https://github.com/GraphiteEditor/Graphite/pull/2126))</small>
|
||||
- *Math* node that calculates a custom math expression with variables "A" and "B" <small>([#2121](https://github.com/GraphiteEditor/Graphite/pull/2121))</small>
|
||||
|
||||
<img src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/math-node.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Visualization of the Math node properties showing the example expression: 0.33 * A + (1 - 0.33) * B" />
|
||||
<img src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/math-node.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Visualization of the Math node properties showing the example expression: 0.33 * A + (1 - 0.33) * B" />
|
||||
|
||||
- Degrees/radians option in the trig-related math nodes and "Always Positive" option in the *Modulo* node for more convenient usage of the math nodes <small>([commit d649052](https://github.com/GraphiteEditor/Graphite/commit/d649052255c10c15754c3a3707f2edf996d2468d))</small>
|
||||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/modulo-and-trig-node-additions.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/modulo-and-trig-node-additions.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/modulo-and-trig-node-additions.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/modulo-and-trig-node-additions.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
- Node graph control bar revamp <small>([#2093](https://github.com/GraphiteEditor/Graphite/pull/2093))</small>
|
||||
|
||||
<img src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/node-graph-control-bar-revamp.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="View of the control bar area of the UI in the node graph featuring new buttons" />
|
||||
<img src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/node-graph-control-bar-revamp.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="View of the control bar area of the UI in the node graph featuring new buttons" />
|
||||
|
||||
- Freehand tool feature for drawing new subpaths on an existing vector layer by holding <kbd>Shift</kbd> <small>([commit ed119ad](https://github.com/GraphiteEditor/Graphite/commit/ed119ad3d799030dbc488ccfc8ca9ad057eeff2c))</small>
|
||||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/freehand-tool-draw-appended-to-layer.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/freehand-tool-draw-appended-to-layer.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/freehand-tool-draw-appended-to-layer.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/freehand-tool-draw-appended-to-layer.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -204,8 +204,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/layer-placement-into-artboard-drawn-on.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/layer-placement-into-artboard-drawn-on.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/layer-placement-into-artboard-drawn-on.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/layer-placement-into-artboard-drawn-on.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -213,8 +213,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/layer-menu-bar-additions.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/layer-menu-bar-additions.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/layer-menu-bar-additions.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/layer-menu-bar-additions.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -222,8 +222,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/box-selection-subtraction.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/box-selection-subtraction.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/box-selection-subtraction.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/box-selection-subtraction.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -231,8 +231,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/path-tool-angle-locking-and-15deg-increments.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/path-tool-angle-locking-and-15deg-increments.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/path-tool-angle-locking-and-15deg-increments.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/path-tool-angle-locking-and-15deg-increments.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -240,8 +240,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/layer-stack-multi-top-outputs.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/layer-stack-multi-top-outputs.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/layer-stack-multi-top-outputs.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/layer-stack-multi-top-outputs.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -249,8 +249,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/layer-panel-show-selected-within-collapsed.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/layer-panel-show-selected-within-collapsed.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/layer-panel-show-selected-within-collapsed.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/layer-panel-show-selected-within-collapsed.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
@ -258,8 +258,8 @@ EDITOR'S NOTE: The grammatical structure of each bullet point should follow the
|
|||
|
||||
<div class="video-background">
|
||||
<video autoplay loop muted playsinline disablepictureinpicture disableremoteplayback>
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/quick-measurement-improvements.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.rs/content/blog/2025-03-31-graphite-progress-report-q4-2024/quick-measurement-improvements.mp4" type="video/mp4" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/quick-measurement-improvements.webm" type="video/webm" />
|
||||
<source src="https://static.graphite.art/content/blog/2025-03-31-graphite-progress-report-q4-2024/quick-measurement-improvements.mp4" type="video/mp4" />
|
||||
</video>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
title = "Internships for a Rust graphics engine: GSoC 2025"
|
||||
date = 2025-04-02
|
||||
[extra]
|
||||
banner = "https://static.graphite.rs/content/blog/2025-04-02-internships-for-a-rust-graphics-engine-gsoc-2025.avif"
|
||||
banner_png = "https://static.graphite.rs/content/blog/2025-04-02-internships-for-a-rust-graphics-engine-gsoc-2025.png"
|
||||
banner = "https://static.graphite.art/content/blog/2025-04-02-internships-for-a-rust-graphics-engine-gsoc-2025.avif"
|
||||
banner_png = "https://static.graphite.art/content/blog/2025-04-02-internships-for-a-rust-graphics-engine-gsoc-2025.png"
|
||||
author = "Keavon Chambers"
|
||||
summary = "Join Graphite in Google Summer of Code 2025 for a unique opportunity to contribute to open-source software development in Rust and computer graphics. Get paid while learning, working on self-contained projects under experienced mentors, and help Graphite grow."
|
||||
reddit = "https://www.reddit.com/r/graphite/comments/1jplm6t/internships_for_a_rust_graphics_engine_gsoc_2025/"
|
||||
|
|
@ -25,12 +25,12 @@ Do you love Rust and focus on computer graphics, compiler development, or algori
|
|||
Hear from our mentoring team about Graphite's tech stack and engineering vision by listening to last month's episode of the Developer Voices podcast:
|
||||
|
||||
<div class="youtube-embed aspect-16x9">
|
||||
<img data-youtube-embed="ZUbcwUC5lxA" src="https://static.graphite.rs/content/blog/2025-04-02-internships-for-a-rust-graphics-engine-gsoc-2025/developer-voices-podcast-youtube.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graphite: Image Editing as a Syntax Tree (with Keavon Chambers & Dennis Kobert)" />
|
||||
<img data-youtube-embed="ZUbcwUC5lxA" src="https://static.graphite.art/content/blog/2025-04-02-internships-for-a-rust-graphics-engine-gsoc-2025/developer-voices-podcast-youtube.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graphite: Image Editing as a Syntax Tree (with Keavon Chambers & Dennis Kobert)" />
|
||||
</div>
|
||||
|
||||
For GSoC 2025, our priority focus is mentoring projects revolving around advanced graphics techniques and compiler development, meeting our goal of extending Graphite into the domain of raster image manipulation. Demonstrated experience in these areas is highly advantageous.
|
||||
|
||||
Outstanding applicants tend to be competent, self-directed, productive, and confidence-inspiring. If you're driven to learn and explore cutting-edge engineering challenges, please [get in touch](https://discord.graphite.rs) and we will help you get up to speed and assist in submitting a timely application.
|
||||
Outstanding applicants tend to be competent, self-directed, productive, and confidence-inspiring. If you're driven to learn and explore cutting-edge engineering challenges, please [get in touch](https://discord.graphite.art) and we will help you get up to speed and assist in submitting a timely application.
|
||||
|
||||
Out of the [full list of project opportunities](/volunteer/guide/student-projects/#project-idea-list), some interesting high-priority projects include:
|
||||
|
||||
|
|
@ -43,6 +43,6 @@ Out of the [full list of project opportunities](/volunteer/guide/student-project
|
|||
- Researching an assortment of algorithms for image processing operations
|
||||
- Engineering solutions for combining our web-based editor GUI and native WGPU renderer in the same window across Windows, Mac, and Linux desktop applications
|
||||
|
||||
These recently added projects are pending an extended description, but we'll be happy to discuss the details if you pop into our [Discord server](https://discord.graphite.rs) and introduce yourself with links to related experience and projects.
|
||||
These recently added projects are pending an extended description, but we'll be happy to discuss the details if you pop into our [Discord server](https://discord.graphite.art) and introduce yourself with links to related experience and projects.
|
||||
|
||||
Outside GSoC, additional year-round opportunities are available for student capstone or independent research projects. These are run similarly, but are also available to multi-person groups. They provide academic credit instead of a stipend. Reach out anytime if interested.
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
title = "Graphite community meetup in Germany"
|
||||
date = 2025-09-19
|
||||
[extra]
|
||||
banner = "https://static.graphite.rs/content/blog/2025-09-19-graphite-community-meetup-in-germany.avif"
|
||||
banner_png = "https://static.graphite.rs/content/blog/2025-09-19-graphite-community-meetup-in-germany.png"
|
||||
banner = "https://static.graphite.art/content/blog/2025-09-19-graphite-community-meetup-in-germany.avif"
|
||||
banner_png = "https://static.graphite.art/content/blog/2025-09-19-graphite-community-meetup-in-germany.png"
|
||||
author = "Keavon Chambers"
|
||||
summary = "Join us for a Graphite community meetup on October 10th, 2025 in Karlsruhe, Germany. Meet the core team and connect with fellow enthusiasts."
|
||||
reddit = "https://www.reddit.com/r/graphite/comments/1nlt64g/graphite_community_meetup_in_germany_october_10/"
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ Latest news and articles from the Graphite team.
|
|||
|
||||
<p class="feed">
|
||||
<a href="/blog/rss.xml">
|
||||
<img class="icon" src="https://static.graphite.rs/icons/feed.svg" alt="RSS" />
|
||||
<img class="icon" src="https://static.graphite.art/icons/feed.svg" alt="RSS" />
|
||||
<span class="link arrow">RSS Feed</span>
|
||||
</a>
|
||||
</p>
|
||||
|
|
|
|||
|
|
@ -13,9 +13,9 @@ css = ["/layout/reading-material.css"]
|
|||
<article>
|
||||
|
||||
- Members of the press, please see the [press resources](/press) page.
|
||||
- For general discussions, reach out on [Discord](https://discord.graphite.rs) or [Reddit](https://www.reddit.com/r/graphite/).
|
||||
- For general discussions, reach out on [Discord](https://discord.graphite.art) or [Reddit](https://www.reddit.com/r/graphite/).
|
||||
- To report a bug or request a feature, please [file an issue](https://github.com/GraphiteEditor/Graphite/issues/new) on GitHub.
|
||||
- For other inquiries, get in touch by email at [contact<wbr>@graphite<wbr>.rs](mailto:contact@graphite.rs).
|
||||
- For other inquiries, get in touch by email at [contact<wbr>@graphite<wbr>.art](mailto:contact@graphite.art).
|
||||
|
||||
</article>
|
||||
|
||||
|
|
|
|||
|
|
@ -28,15 +28,15 @@ css = ["/page/donate.css", "/component/feature-box.css", "/component/feature-ico
|
|||
|
||||
<div class="feature-icons three-wide statistics" data-statistics>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 34" src="https://static.graphite.rs/icons/icon-atlas-roadmap__3.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 34" src="https://static.graphite.art/icons/icon-atlas-roadmap__3.png" alt="" />
|
||||
<span data-statistics-dollars></span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 3" src="https://static.graphite.rs/icons/icon-atlas-features__2.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 3" src="https://static.graphite.art/icons/icon-atlas-features__2.png" alt="" />
|
||||
<span data-statistics-members></span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 47" src="https://static.graphite.rs/icons/icon-atlas-roadmap__3.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 47" src="https://static.graphite.art/icons/icon-atlas-roadmap__3.png" alt="" />
|
||||
<span data-statistics-donors></span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -49,7 +49,7 @@ css = ["/page/donate.css", "/component/feature-box.css", "/component/feature-ico
|
|||
const donorsElement = document.querySelector("[data-statistics-donors]");
|
||||
if (!dollarsElement || !membersElement || !donorsElement) return;
|
||||
try {
|
||||
const response = await fetch("https://graphite.rs/sponsorship-stats");
|
||||
const response = await fetch("https://graphite.art/sponsorship-stats");
|
||||
const json = await response.json();
|
||||
if (!json || !json.recurring || !json.one_time_prior_3_month_sum) throw new Error();
|
||||
const recurringDollars = parseInt(json.recurring.cents) / 100;
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ In 2025, stay tuned for performance improvements, a native multiplatform desktop
|
|||
<div class="block video-container">
|
||||
<div>
|
||||
<div class="youtube-embed aspect-16x9">
|
||||
<img data-youtube-embed="ZUbcwUC5lxA" loading="lazy" src="https://static.graphite.rs/content/features/podcast-interview-youtube.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Rust-Powered Graphics Editor: How Graphite's Syntax Trees Revolutionize Image Editing" />
|
||||
<img data-youtube-embed="ZUbcwUC5lxA" loading="lazy" src="https://static.graphite.art/content/features/podcast-interview-youtube.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Rust-Powered Graphics Editor: How Graphite's Syntax Trees Revolutionize Image Editing" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -77,7 +77,7 @@ Marrying vector and raster under one roof enables both art forms to complement e
|
|||
<h3>— Pre-Alpha —</h3>
|
||||
</div>
|
||||
<div class="feature-icon complete" title="Development Complete">
|
||||
<img class="atlas" style="--atlas-index: 1" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 1" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Editor systems; basic vector art tools</span>
|
||||
</div>
|
||||
<!-- Alpha 1 -->
|
||||
|
|
@ -85,7 +85,7 @@ Marrying vector and raster under one roof enables both art forms to complement e
|
|||
<h3>— Alpha 1 —</h3>
|
||||
</div>
|
||||
<div class="feature-icon complete" title="Development Complete">
|
||||
<img class="atlas" style="--atlas-index: 2" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 2" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Better tools; node graph prototyping</span>
|
||||
</div>
|
||||
<!-- Alpha 2 -->
|
||||
|
|
@ -93,7 +93,7 @@ Marrying vector and raster under one roof enables both art forms to complement e
|
|||
<h3>— Alpha 2 —</h3>
|
||||
</div>
|
||||
<div class="feature-icon complete" title="Development Complete">
|
||||
<img class="atlas" style="--atlas-index: 6" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 6" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Node graph integration in documents</span>
|
||||
</div>
|
||||
<!-- Alpha 3 -->
|
||||
|
|
@ -101,7 +101,7 @@ Marrying vector and raster under one roof enables both art forms to complement e
|
|||
<h3>— Alpha 3 —</h3>
|
||||
</div>
|
||||
<div class="feature-icon complete" title="Development Complete">
|
||||
<img class="atlas" style="--atlas-index: 8" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 8" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Procedural vector editing and usability</span>
|
||||
</div>
|
||||
<!-- Alpha 4 -->
|
||||
|
|
@ -109,63 +109,63 @@ Marrying vector and raster under one roof enables both art forms to complement e
|
|||
<h3>— Alpha 4 —</h3>
|
||||
</div>
|
||||
<div class="feature-icon complete" title="Development Complete">
|
||||
<img class="atlas" style="--atlas-index: 46" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 46" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Parametric animation</span>
|
||||
</div>
|
||||
<div class="feature-icon complete" title="Development Complete">
|
||||
<img class="atlas" style="--atlas-index: 58" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 58" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Instancer nodes for looped generation</span>
|
||||
</div>
|
||||
<div class="feature-icon complete" title="Development Complete">
|
||||
<img class="atlas" style="--atlas-index: 59" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 59" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Enhanced Pen, Path, and Shape tools</span>
|
||||
</div>
|
||||
<div class="feature-icon complete" title="Development Complete">
|
||||
<img class="atlas" style="--atlas-index: 63" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 63" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Table-based graphical data format</span>
|
||||
</div>
|
||||
<div class="feature-icon complete" title="Development Complete">
|
||||
<img class="atlas" style="--atlas-index: 67" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 67" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Data panel for graphical introspection</span>
|
||||
</div>
|
||||
<div class="feature-icon complete" title="Development Complete">
|
||||
<img class="atlas" style="--atlas-index: 13" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 13" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Layer clipping masks</span>
|
||||
</div>
|
||||
<div class="feature-icon complete" title="Development Complete">
|
||||
<img class="atlas" style="--atlas-index: 66" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 66" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>All-around performance optimizations</span>
|
||||
</div>
|
||||
<div class="feature-icon ongoing" title="Development Ongoing">
|
||||
<img class="atlas" style="--atlas-index: 73" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 73" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Blend tool to morph between shapes</span>
|
||||
</div>
|
||||
<div class="feature-icon ongoing" title="Development Ongoing">
|
||||
<img class="atlas" style="--atlas-index: 7" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 7" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Desktop app (Windows, Mac, Linux)</span>
|
||||
</div>
|
||||
<div class="feature-icon ongoing" title="Development Ongoing">
|
||||
<img class="atlas" style="--atlas-index: 12" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 12" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>GPU-accelerated raster rendering</span>
|
||||
</div>
|
||||
<div class="feature-icon ongoing" title="Development Ongoing">
|
||||
<img class="atlas" style="--atlas-index: 10" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 10" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Expanded imaging model data format</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 51" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 51" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Context menus throughout the editor</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 40" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 40" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Simplified main properties panel</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 64" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 64" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Node version management</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 17" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 17" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Stable document format</span>
|
||||
</div>
|
||||
<!-- Beta 1 -->
|
||||
|
|
@ -173,71 +173,71 @@ Marrying vector and raster under one roof enables both art forms to complement e
|
|||
<h3>— Beta 1 —</h3>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 53" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 53" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Local fonts access</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 54" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 54" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Saving over local files (web version)</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 41" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 41" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Timeline panel for animation curves</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 62" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 62" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Nested documents as custom nodes</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 56" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 56" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Variables and color swatches</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 9" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 9" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Custom attributes for table data</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 28" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 28" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Physical measurement units</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 65" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 65" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Text-on-path tool support</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 3" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 3" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Per-glyph text style controls</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 48" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 48" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Robust vector mesh editing/rendering</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 50" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 50" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Nondestructive shape builder tool</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 71" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 71" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Automatic image trace vectorization</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 11" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 11" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Broader SVG support including filters</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 45" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 45" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Parametric art standalone export</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 5" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 5" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>New and improved brush tool</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 43" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 43" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Stylus and touch interaction</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 70" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 70" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>MIDI and audio-reactive visualization</span>
|
||||
</div>
|
||||
<!-- Beta 2 -->
|
||||
|
|
@ -245,59 +245,59 @@ Marrying vector and raster under one roof enables both art forms to complement e
|
|||
<h3>— Beta 2 —</h3>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 24" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 24" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Dockable and multi-window panels</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 52" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 52" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Command palette</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 68" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 68" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Onion skinning mode for animation</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 69" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 69" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Animatable deformation meshes/rigs</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 72" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 72" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Simulation domains</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 57" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 57" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Signed distance field rendering</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 14" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 14" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Procedural PBR material generation</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 16" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 16" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Code editor for custom nodes</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 34" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 34" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Asset libraries and node marketplace</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 27" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 27" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Automation/batch processing tools</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 21" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 21" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Select mode (marquee masking)</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 0" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 0" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Raster adjustments, filters, and effects</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 25" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 25" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Liquify and warp transforms</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 19" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 19" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Raw photo processing</span>
|
||||
</div>
|
||||
<!-- LTS Releases -->
|
||||
|
|
@ -305,99 +305,99 @@ Marrying vector and raster under one roof enables both art forms to complement e
|
|||
<h3>— LTS Releases —</h3>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 31" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 31" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Advanced typesetting features</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 32" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 32" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>PDF, EPS, AI, DXF, PSD, and TIFF</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 55" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 55" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>CMYK, spot color, and ICC profiles</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 33" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 33" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>HDR and WCG color handling</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 4" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 4" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Outliner panel (node graph tree view)</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 18" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 18" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Document history management</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 39" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 39" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Offline edit resolution with CRDTs</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 22" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 22" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>History brush and clone stamp tools</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 23" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 23" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Internationalization and accessibility</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 49" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 49" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>AI nodes and tools (e.g. magic wand)</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 20" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 20" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Procedural styling of paint brushes</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 60" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 60" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Infinite generative vector patterns</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 29" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 29" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Geometric constraint system solver</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 30" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 30" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Responsive design layout solver</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 61" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 61" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Authoring animated SVGs, Lottie, etc.</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 42" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 42" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Live video stream compositing</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 44" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 44" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Tablet app and keyboard-free controls</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 26" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 26" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Media collection manager/browser</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 37" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 37" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Cloud document storage/device sync</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 38" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 38" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Multiplayer collaborative editing</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 35" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 35" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Predictive graph rendering/caching</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 36" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 36" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Multi-device distributed rendering</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 15" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 15" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span>Hosted rendering accelerator service</span>
|
||||
</div>
|
||||
<div class="feature-icon">
|
||||
<img class="atlas" style="--atlas-index: 47" src="https://static.graphite.rs/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<img class="atlas" style="--atlas-index: 47" src="https://static.graphite.art/icons/icon-atlas-roadmap__5.png" alt="" />
|
||||
<span><em>…and that's all just the beginning…</em></span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -420,7 +420,7 @@ The panel will enable users to scrub through time with the playhead and choose b
|
|||
|
||||
Work-in-progress design mockup:
|
||||
|
||||
<img src="https://static.graphite.rs/content/features/mockup-timeline-panel.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" />
|
||||
<img src="https://static.graphite.art/content/features/mockup-timeline-panel.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" />
|
||||
|
||||
</div>
|
||||
|
||||
|
|
@ -440,9 +440,9 @@ Brushes, selection tools, masks, filters, effects, adjustment layers, and other
|
|||
|
||||
Work-in-progress design mockup:
|
||||
|
||||
<img src="https://static.graphite.rs/content/features/mockup-viewport.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" />
|
||||
<img src="https://static.graphite.art/content/features/mockup-viewport.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" />
|
||||
|
||||
<img src="https://static.graphite.rs/content/features/mockup-node-graph.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" />
|
||||
<img src="https://static.graphite.art/content/features/mockup-node-graph.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" />
|
||||
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ Additional manual chapters are being added over time. Check back every so often.
|
|||
|
||||
## Need help?
|
||||
|
||||
If you're ever stuck or confused, ask your questions in the `#🧭user-help` channel of the [Graphite Discord server](https://discord.graphite.rs) or post a thread in the [discussion board](https://github.com/GraphiteEditor/Graphite/discussions) on GitHub.
|
||||
If you're ever stuck or confused, ask your questions in the `#🧭user-help` channel of the [Graphite Discord server](https://discord.graphite.art) or post a thread in the [discussion board](https://github.com/GraphiteEditor/Graphite/discussions) on GitHub.
|
||||
|
||||
## Jump right in
|
||||
|
||||
|
|
@ -26,5 +26,5 @@ If you're ever stuck or confused, ask your questions in the `#🧭user-help` cha
|
|||
The fastest way to get started is to watch and follow along steps-by-step in the hands-on quickstart tutorial:
|
||||
|
||||
<div class="youtube-embed aspect-16x9">
|
||||
<img data-youtube-embed="7gjUhl_3X10" src="https://static.graphite.rs/content/learn/introduction/tutorial-1-vector-art-quickstart-youtube__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector Art Quickstart - Graphite, the Open Source 2D Graphics Suite" />
|
||||
<img data-youtube-embed="7gjUhl_3X10" src="https://static.graphite.art/content/learn/introduction/tutorial-1-vector-art-quickstart-youtube__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector Art Quickstart - Graphite, the Open Source 2D Graphics Suite" />
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ Layers and nodes are wired together using **links** which send data between the
|
|||
|
||||
When a layer or node is selected, these buttons will show up on the left side of the control bar:
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/learn/interface/document-panel/node-controls-buttons.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="The node/layer controls" /></p>
|
||||
<p><img src="https://static.graphite.art/content/learn/interface/document-panel/node-controls-buttons.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="The node/layer controls" /></p>
|
||||
|
||||
| | |
|
||||
|-|-|
|
||||
|
|
|
|||
|
|
@ -13,13 +13,13 @@ This chapter formally introduces the concepts and terminology for the user inter
|
|||
|
||||
The bar running across the top of the editor is called the **title bar**. In the (forthcoming) desktop release of Graphite, this acts as the draggable window frame.
|
||||
|
||||
<!-- <p><img src="https://static.graphite.rs/content/learn/interface/title-bar.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The title bar" /></p> -->
|
||||
<!-- <p><img src="https://static.graphite.art/content/learn/interface/title-bar.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The title bar" /></p> -->
|
||||
|
||||
### Menu bar
|
||||
|
||||
On the left, the [**menu bar**](./menu-bar) provides quick access to many editor, document, and artwork related controls. Its functions are covered in detail on the next page.
|
||||
|
||||
<!-- <p><img src="https://static.graphite.rs/content/learn/interface/menu-bar.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The menu bar" /></p> -->
|
||||
<!-- <p><img src="https://static.graphite.art/content/learn/interface/menu-bar.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The menu bar" /></p> -->
|
||||
|
||||
<!-- In the (forthcoming) macOS desktop release, the menu bar is absent from the editor window; its functions are instead located in macOS menu bar. -->
|
||||
|
||||
|
|
@ -31,16 +31,16 @@ On the right (and on Mac, the left), the **window buttons** provide platform-spe
|
|||
|
||||
| | |
|
||||
|-|-|
|
||||
| **Web** | <p>Fullscreen:</p><p><img src="https://static.graphite.rs/content/learn/interface/window-buttons-web__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Fullscreen button" /></p> |
|
||||
| **Windows** | <p>Minimize, maximize/restore down, close:</p><p><img src="https://static.graphite.rs/content/learn/interface/window-buttons-windows.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Minimize/maximize/close window buttons" /></p> |
|
||||
| **Linux** | <p>Minimize, maximize/unmaximize, close:</p><p><img src="https://static.graphite.rs/content/learn/interface/window-buttons-linux.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Minimize/maximize/close window buttons" /></p> |
|
||||
| **macOS** | <p>Close, minimize, fullscreen:</p><p><img src="https://static.graphite.rs/content/learn/interface/window-buttons-macos.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Close/minimize/fullscreen window buttons" /></p> |
|
||||
| **Web** | <p>Fullscreen:</p><p><img src="https://static.graphite.art/content/learn/interface/window-buttons-web__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Fullscreen button" /></p> |
|
||||
| **Windows** | <p>Minimize, maximize/restore down, close:</p><p><img src="https://static.graphite.art/content/learn/interface/window-buttons-windows.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Minimize/maximize/close window buttons" /></p> |
|
||||
| **Linux** | <p>Minimize, maximize/unmaximize, close:</p><p><img src="https://static.graphite.art/content/learn/interface/window-buttons-linux.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Minimize/maximize/close window buttons" /></p> |
|
||||
| **macOS** | <p>Close, minimize, fullscreen:</p><p><img src="https://static.graphite.art/content/learn/interface/window-buttons-macos.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Close/minimize/fullscreen window buttons" /></p> |
|
||||
|
||||
## Workspace
|
||||
|
||||
The **workspace** is the editor's main content area, filled with **panels** arranged next to one another. The **gutter** lines, located between neighboring panels, may be dragged to resize them.
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/learn/interface/workspace__3.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The workspace" /></p>
|
||||
<p><img src="https://static.graphite.art/content/learn/interface/workspace__3.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The workspace" /></p>
|
||||
|
||||
### Panels
|
||||
|
||||
|
|
@ -56,7 +56,7 @@ Beneath the panel header, the **panel content** displays the content for its pan
|
|||
|
||||
The bar running across the bottom of the editor is called the **status bar**.
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/learn/interface/status-bar__2.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Status bar" /></p>
|
||||
<p><img src="https://static.graphite.art/content/learn/interface/status-bar__2.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Status bar" /></p>
|
||||
|
||||
### Input hints
|
||||
|
||||
|
|
@ -64,17 +64,17 @@ The **input hints** are presently the only occupant of the status bar. They indi
|
|||
|
||||
Hints with a **`+`** mean that adding the indicated modifier key will change the base action. For example: in the following action, dragging with left-click held down will zoom the canvas; then additionally holding the <kbd>Ctrl</kbd> key will make the zoom action snap to whole increments.
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/learn/interface/input-hints-plus.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Example hint" /></p>
|
||||
<p><img src="https://static.graphite.art/content/learn/interface/input-hints-plus.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Example hint" /></p>
|
||||
|
||||
Hints with a **`/`** mean that either indicated input combination can be used to trigger the same action. For example: in the following action, either holding the space bar while dragging with the left mouse button held down, or just dragging with the middle mouse button held down, will both pan around the document in the viewport.
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/learn/interface/input-hints-slash.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Example hint" /></p>
|
||||
<p><img src="https://static.graphite.art/content/learn/interface/input-hints-slash.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Example hint" /></p>
|
||||
|
||||
The following chart describes each icon representing the mouse inputs you can perform so a hint's prescribed action occurs.
|
||||
|
||||
| | Clicks | Drags | Others |
|
||||
|-|:-:|:-:|:-:|
|
||||
| **Left<br />mouse<br />button** | <img src="https://static.graphite.rs/content/learn/interface/mouse-icon-left-click.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Left click icon" /><br /><br />Left click | <img src="https://static.graphite.rs/content/learn/interface/mouse-icon-left-click-drag.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Left click drag icon" /><br /><br />Left click drag | <img src="https://static.graphite.rs/content/learn/interface/mouse-icon-left-double-click.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Left double-click icon" /><br /><br />Left double-click |
|
||||
| **Right<br />mouse<br />button** | <img src="https://static.graphite.rs/content/learn/interface/mouse-icon-right-click.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Right click icon" /><br /><br />Right click | <img src="https://static.graphite.rs/content/learn/interface/mouse-icon-right-click-drag.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Right click drag icon" /><br /><br />Right click drag | <img src="https://static.graphite.rs/content/learn/interface/mouse-icon-right-double-click.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Right double-click icon" /><br /><br />Right double-click |
|
||||
| **Middle<br />mouse<br />button** | <img src="https://static.graphite.rs/content/learn/interface/mouse-icon-middle-click.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Middle click icon" /><br /><br />Middle click | <img src="https://static.graphite.rs/content/learn/interface/mouse-icon-middle-click-drag.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Middle click drag icon" /><br /><br />Middle click drag | <img src="https://static.graphite.rs/content/learn/interface/mouse-icon-scroll.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Scroll up/down icons" /><br /><br />Scroll up/down |
|
||||
| **No<br />mouse<br />button** | | <img src="https://static.graphite.rs/content/learn/interface/mouse-icon-drag.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Drag icon" /><br /><br />Drag | |
|
||||
| **Left<br />mouse<br />button** | <img src="https://static.graphite.art/content/learn/interface/mouse-icon-left-click.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Left click icon" /><br /><br />Left click | <img src="https://static.graphite.art/content/learn/interface/mouse-icon-left-click-drag.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Left click drag icon" /><br /><br />Left click drag | <img src="https://static.graphite.art/content/learn/interface/mouse-icon-left-double-click.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Left double-click icon" /><br /><br />Left double-click |
|
||||
| **Right<br />mouse<br />button** | <img src="https://static.graphite.art/content/learn/interface/mouse-icon-right-click.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Right click icon" /><br /><br />Right click | <img src="https://static.graphite.art/content/learn/interface/mouse-icon-right-click-drag.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Right click drag icon" /><br /><br />Right click drag | <img src="https://static.graphite.art/content/learn/interface/mouse-icon-right-double-click.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Right double-click icon" /><br /><br />Right double-click |
|
||||
| **Middle<br />mouse<br />button** | <img src="https://static.graphite.art/content/learn/interface/mouse-icon-middle-click.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Middle click icon" /><br /><br />Middle click | <img src="https://static.graphite.art/content/learn/interface/mouse-icon-middle-click-drag.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Middle click drag icon" /><br /><br />Middle click drag | <img src="https://static.graphite.art/content/learn/interface/mouse-icon-scroll.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Scroll up/down icons" /><br /><br />Scroll up/down |
|
||||
| **No<br />mouse<br />button** | | <img src="https://static.graphite.art/content/learn/interface/mouse-icon-drag.avif" onload="this.width = this.naturalWidth / 2" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Drag icon" /><br /><br />Drag | |
|
||||
|
|
|
|||
|
|
@ -28,14 +28,14 @@ Only the default mode is currently implemented. Others will be added in the futu
|
|||
|
||||
| | |
|
||||
|-|-|
|
||||
| <img src="https://static.graphite.rs/content/learn/interface/document-panel/editing-modes__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="The editing modes dropdown menu" /> | The default, **Design Mode**, is for directly editing the artwork.<br /><br />Once implemented, **Select Mode** will be where marquee selections are made to constrain the active tool's edits to a masked area of choice.<br /><br />Once implemented, **Guide Mode** will be for creating guides and constraint systems used for alignment and constraint-based layout. |
|
||||
| <img src="https://static.graphite.art/content/learn/interface/document-panel/editing-modes__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="The editing modes dropdown menu" /> | The default, **Design Mode**, is for directly editing the artwork.<br /><br />Once implemented, **Select Mode** will be where marquee selections are made to constrain the active tool's edits to a masked area of choice.<br /><br />Once implemented, **Guide Mode** will be for creating guides and constraint systems used for alignment and constraint-based layout. |
|
||||
-->
|
||||
|
||||
### Tool controls
|
||||
|
||||
The left side of the control bar has controls pertaining to the active tool. It's empty for some tools.
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/learn/interface/document-panel/tool-options__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Example of the tool controls for the Select tool" /></p>
|
||||
<p><img src="https://static.graphite.art/content/learn/interface/document-panel/tool-options__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Example of the tool controls for the Select tool" /></p>
|
||||
|
||||
The example above shows the Select tool controls. Because the Select tool deals with selecting and transforming layers, its controls include:
|
||||
- The selection mode to determine if the deepest or shallowest layer in a nested hierarchy is selected when clicked.
|
||||
|
|
@ -50,13 +50,13 @@ Depending on which tool is active, these will change to reflect the pertinent op
|
|||
|
||||
The right side of the control bar has controls related to the active document and viewport.
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/learn/interface/document-panel/viewport-options__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The viewport controls" /></p>
|
||||
<p><img src="https://static.graphite.art/content/learn/interface/document-panel/viewport-options__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The viewport controls" /></p>
|
||||
|
||||
| | |
|
||||
|-|-|
|
||||
| Overlays | <p>When checked (default), overlays are shown. When unchecked, they are hidden. Overlays are the temporary contextual visualizations (like bounding boxes and vector manipulators) that are usually blue and appear atop the viewport when using tools.</p> |
|
||||
| Snapping | <p>When checked (default), drawing and dragging shapes and vector points means they will snap to other areas of geometric interest like corners or anchor points. When unchecked, the selection moves freely.<br /><br />Fine-grained options are available by clicking the overflow button to access its options popover menu. Each option has a tooltip explaining what it does by hovering the cursor over it.</p><p><img src="https://static.graphite.rs/content/learn/interface/document-panel/snapping-popover__5.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="Snapping options popover menu" /></p><p>Snapping options relating to **Bounding Boxes**:</p><p><ul><li>**Align with Edges**: Snaps to horizontal/vertical alignment with the edges of any layer's bounding box.</li><li>**Corner Points**: Snaps to the four corners of any layer's bounding box.</li><li>**Center Points**: Snaps to the center point of any layer's bounding box.</li><li>**Edge Midpoints**: Snaps to any of the four points at the middle of the edges of any layer's bounding box.</li><li>**Distribute Evenly**: Snaps to a consistent distance offset established by the bounding boxes of nearby layers (due to a bug, **Corner Points** and **Center Points** must be enabled).</li></ul></p><p>Snapping options relating to **Paths**:</p><p><ul><li>**Align with Anchor Points**: Snaps to horizontal/vertical alignment with the anchor points of any vector path.</li><li>**Anchor Points**: Snaps to the anchor point of any vector path.</li><li>**Line Midpoints**: Snaps to the point at the middle of any straight line segment of a vector path.</li><li>**Path Intersection Points**: Snaps to any points where vector paths intersect.</li><li>**Along Paths**: Snaps along the length of any vector path.</li><li>**Normal to Paths**: Snaps a line to a point perpendicular to a vector path (due to a bug, **Intersections of Paths** must be enabled).</li><li>**Tangent to Paths**: Snaps a line to a point tangent to a vector path (due to a bug, **Intersections of Paths** must be enabled).</li></ul></p> |
|
||||
| Grid | <p>When checked (off by default), grid lines are shown and snapping to them becomes active. The initial grid scale is 1 document unit, helping you draw pixel-perfect artwork.</p><ul><li><p>**Type** sets whether the grid pattern is made of squares or triangles.</p><p>**Rectangular** is a pattern of horizontal and vertical lines:</p><p><img src="https://static.graphite.rs/content/learn/interface/document-panel/grid-rectangular-popover__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="Snapping options popover menu" /></p><p>It has one option unique to this mode:</p><ul><li>**Spacing** is the width and height of the rectangle grid cells.</li></ul><p>**Isometric** is a pattern of triangles:</p><p><img src="https://static.graphite.rs/content/learn/interface/document-panel/grid-isometric-popover__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="Snapping options popover menu" /></p><p>It has two options unique to this mode:</p><ul><li>**Y Spacing** is the height between vertical repetitions of the grid.</li><li>**Angles** is the slant of the upward and downward sloped grid lines.</li></ul></li><li>**Display** gives control over the appearance of the grid. The **Display as dotted grid** checkbox (off by default) replaces the solid lines with dots at their intersection points.</li><li>**Origin** is the position in the canvas where the repeating grid pattern begins from. If you need an offset for the grid where an intersection occurs at a specific location, set those coordinates.</li></ul> |
|
||||
| Snapping | <p>When checked (default), drawing and dragging shapes and vector points means they will snap to other areas of geometric interest like corners or anchor points. When unchecked, the selection moves freely.<br /><br />Fine-grained options are available by clicking the overflow button to access its options popover menu. Each option has a tooltip explaining what it does by hovering the cursor over it.</p><p><img src="https://static.graphite.art/content/learn/interface/document-panel/snapping-popover__5.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="Snapping options popover menu" /></p><p>Snapping options relating to **Bounding Boxes**:</p><p><ul><li>**Align with Edges**: Snaps to horizontal/vertical alignment with the edges of any layer's bounding box.</li><li>**Corner Points**: Snaps to the four corners of any layer's bounding box.</li><li>**Center Points**: Snaps to the center point of any layer's bounding box.</li><li>**Edge Midpoints**: Snaps to any of the four points at the middle of the edges of any layer's bounding box.</li><li>**Distribute Evenly**: Snaps to a consistent distance offset established by the bounding boxes of nearby layers (due to a bug, **Corner Points** and **Center Points** must be enabled).</li></ul></p><p>Snapping options relating to **Paths**:</p><p><ul><li>**Align with Anchor Points**: Snaps to horizontal/vertical alignment with the anchor points of any vector path.</li><li>**Anchor Points**: Snaps to the anchor point of any vector path.</li><li>**Line Midpoints**: Snaps to the point at the middle of any straight line segment of a vector path.</li><li>**Path Intersection Points**: Snaps to any points where vector paths intersect.</li><li>**Along Paths**: Snaps along the length of any vector path.</li><li>**Normal to Paths**: Snaps a line to a point perpendicular to a vector path (due to a bug, **Intersections of Paths** must be enabled).</li><li>**Tangent to Paths**: Snaps a line to a point tangent to a vector path (due to a bug, **Intersections of Paths** must be enabled).</li></ul></p> |
|
||||
| Grid | <p>When checked (off by default), grid lines are shown and snapping to them becomes active. The initial grid scale is 1 document unit, helping you draw pixel-perfect artwork.</p><ul><li><p>**Type** sets whether the grid pattern is made of squares or triangles.</p><p>**Rectangular** is a pattern of horizontal and vertical lines:</p><p><img src="https://static.graphite.art/content/learn/interface/document-panel/grid-rectangular-popover__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="Snapping options popover menu" /></p><p>It has one option unique to this mode:</p><ul><li>**Spacing** is the width and height of the rectangle grid cells.</li></ul><p>**Isometric** is a pattern of triangles:</p><p><img src="https://static.graphite.art/content/learn/interface/document-panel/grid-isometric-popover__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="Snapping options popover menu" /></p><p>It has two options unique to this mode:</p><ul><li>**Y Spacing** is the height between vertical repetitions of the grid.</li><li>**Angles** is the slant of the upward and downward sloped grid lines.</li></ul></li><li>**Display** gives control over the appearance of the grid. The **Display as dotted grid** checkbox (off by default) replaces the solid lines with dots at their intersection points.</li><li>**Origin** is the position in the canvas where the repeating grid pattern begins from. If you need an offset for the grid where an intersection occurs at a specific location, set those coordinates.</li></ul> |
|
||||
| Render Mode | <p>**Normal** (default): The artwork is rendered normally.</p><p>**Outline**: The artwork is rendered as a wireframe.</p><p>**Pixel Preview**: **Not implemented yet.** The artwork is rendered as it would appear when exported as a bitmap image at 100% scale regardless of the viewport zoom level.</p><p>**SVG Preview**: **Not implemented yet.** The artwork is rendered as it would appear when exported as an SVG image.</p> |
|
||||
| Zoom In | <p>Zooms the viewport in to the next whole increment.</p> |
|
||||
| Zoom Out | <p>Zooms the viewport out to the next whole increment.</p> |
|
||||
|
|
@ -71,7 +71,7 @@ This narrow bar runs vertically down the left side of the Document panel beside
|
|||
|
||||
### Tools
|
||||
|
||||
<img src="https://static.graphite.rs/content/learn/interface/document-panel/tool-shelf__2.avif" style="float: left; width: 64px; padding-right: 40px" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="The tool shelf" />
|
||||
<img src="https://static.graphite.art/content/learn/interface/document-panel/tool-shelf__2.avif" style="float: left; width: 64px; padding-right: 40px" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="The tool shelf" />
|
||||
|
||||
Located at the top of the tool shelf area, the **tool shelf** provides a selection of **tools** for interactively editing the artwork. It is composed of three sections:
|
||||
|
||||
|
|
@ -89,7 +89,7 @@ Located at the top of the tool shelf area, the **tool shelf** provides a selecti
|
|||
|
||||
### Working colors
|
||||
|
||||
<img src="https://static.graphite.rs/content/learn/interface/document-panel/working-colors.avif" style="float: left; width: 64px; padding-right: 40px;" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The working colors" />
|
||||
<img src="https://static.graphite.art/content/learn/interface/document-panel/working-colors.avif" style="float: left; width: 64px; padding-right: 40px;" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The working colors" />
|
||||
|
||||
The **working colors** are the two colors used by the active tool. The upper circle is the **primary color**. The lower circle is the **secondary color**.
|
||||
|
||||
|
|
@ -97,7 +97,7 @@ There are two buttons located underneath: **Swap** which reverses the current co
|
|||
|
||||
The tool controls (above the viewport) for some of the tools offer choices for using the primary and secondary colors. For example, the vector drawing tools have **Fill** and **Stroke** options that use the current secondary and primary colors, respectively, as defaults:
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/learn/interface/document-panel/tool-options-fill-stroke-colors__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="The Fill and Stroke controls for a vector tool's controls" /></p>
|
||||
<p><img src="https://static.graphite.art/content/learn/interface/document-panel/tool-options-fill-stroke-colors__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="The Fill and Stroke controls for a vector tool's controls" /></p>
|
||||
|
||||
These options each allow choices of being driven by the primary working color, secondary working color, or a custom color set just for that tool.
|
||||
|
||||
|
|
|
|||
|
|
@ -23,15 +23,15 @@ The **File menu** lists actions related to file handling:
|
|||
|
||||
| | |
|
||||
|-|-|
|
||||
| **New…** | <p>Opens the **New Document** dialog for creating a blank canvas in a new editor tab.</p><p><img src="https://static.graphite.rs/content/learn/interface/menu-bar/dialog-new-document.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The 'New Document' dialog" /></p><p><ul><li><strong>Name</strong> determines the initial filename of the new document.</li><li><strong>Infinite Canvas</strong>, if set, skips adding an artboard and thereby starts with a boundless white canvas extending in all directions.</li><li><strong>Dimensions</strong> sets the width and height, in pixels, of the initial artboard. Ignored if *Infinite Canvas* is ticked.</li></ul></p> |
|
||||
| **New…** | <p>Opens the **New Document** dialog for creating a blank canvas in a new editor tab.</p><p><img src="https://static.graphite.art/content/learn/interface/menu-bar/dialog-new-document.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The 'New Document' dialog" /></p><p><ul><li><strong>Name</strong> determines the initial filename of the new document.</li><li><strong>Infinite Canvas</strong>, if set, skips adding an artboard and thereby starts with a boundless white canvas extending in all directions.</li><li><strong>Dimensions</strong> sets the width and height, in pixels, of the initial artboard. Ignored if *Infinite Canvas* is ticked.</li></ul></p> |
|
||||
| **Open…** | <p>Opens the operating system file picker dialog for selecting a `.graphite` file from disk to be opened in a new editor tab.</p> |
|
||||
| **Open Demo Artwork…** | <p>Opens the **Demo Artwork** dialog for loading a choice of premade sample artwork files provided for you to explore. Click the button below each image to open it.</p><p><img src="https://static.graphite.rs/content/learn/interface/menu-bar/dialog-demo-artwork__3.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The 'Demo Artwork' dialog" /></p> |
|
||||
| **Open Demo Artwork…** | <p>Opens the **Demo Artwork** dialog for loading a choice of premade sample artwork files provided for you to explore. Click the button below each image to open it.</p><p><img src="https://static.graphite.art/content/learn/interface/menu-bar/dialog-demo-artwork__3.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The 'Demo Artwork' dialog" /></p> |
|
||||
| **Close** | <p>Closes the active document. If it has unsaved changes (denoted by the `*` after the file name), you will be asked to save or discard the changes.</p> |
|
||||
| **Close All** | <p>Closes all open documents. To avoid accidentally losing unsaved work, you will be asked to confirm that you want to proceed which will discard the unsaved changes in all open documents.</p> |
|
||||
| **Save** | <p>Saves the active document by writing the `.graphite` file to disk. An operating system file download dialog may appear asking where to place it. That dialog will provide an opportunity to save over a previous version of the file, if you wish, by picking the identical name instead of saving another instance with a number after it.</p> |
|
||||
| **Import…** | <p>Opens the operating system file picker dialog for selecting an image file from disk to be placed as a new bitmap image layer or SVG content into the active document.</p> |
|
||||
| **Export…** | <p>Opens the **Export** dialog for saving the artwork as a *File Type* of *PNG*, *JPG*, or *SVG*. *Scale Factor* multiplies the content's document scale, so a value of 2 would export 300x400 content as 600x800 pixels. *Bounds* picks what area to render: *All Artwork* uses the bounding box of all layers, *Selection* uses the bounding box of the currently selected layers, and an *Artboard: \[Name\]* uses the bounds of that artboard. *Transparency* exports PNG or SVG files with transparency instead of the artboard background color.<br /><br /><img src="https://static.graphite.rs/content/learn/interface/menu-bar/dialog-export.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The 'Export' dialog" /></p> |
|
||||
| **Preferences…** | <p>Opens the **Editor Preferences** dialog for configuring Graphite's settings.<br /><br /><img src="https://static.graphite.rs/content/learn/interface/menu-bar/dialog-editor-preferences__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The 'Editor Preferences' dialog" /></p> |
|
||||
| **Export…** | <p>Opens the **Export** dialog for saving the artwork as a *File Type* of *PNG*, *JPG*, or *SVG*. *Scale Factor* multiplies the content's document scale, so a value of 2 would export 300x400 content as 600x800 pixels. *Bounds* picks what area to render: *All Artwork* uses the bounding box of all layers, *Selection* uses the bounding box of the currently selected layers, and an *Artboard: \[Name\]* uses the bounds of that artboard. *Transparency* exports PNG or SVG files with transparency instead of the artboard background color.<br /><br /><img src="https://static.graphite.art/content/learn/interface/menu-bar/dialog-export.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The 'Export' dialog" /></p> |
|
||||
| **Preferences…** | <p>Opens the **Editor Preferences** dialog for configuring Graphite's settings.<br /><br /><img src="https://static.graphite.art/content/learn/interface/menu-bar/dialog-editor-preferences__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="The 'Editor Preferences' dialog" /></p> |
|
||||
|
||||
### Edit
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ One is available now, and more will be released on a regular basis throughout ea
|
|||
<!-- You can follow along with this starter project either by watching the tutorial video or referencing the step-by-step breakdown. -->
|
||||
|
||||
<div class="youtube-embed aspect-16x9">
|
||||
<img data-youtube-embed="7gjUhl_3X10" src="https://static.graphite.rs/content/learn/introduction/tutorial-1-vector-art-quickstart-youtube__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector Art Quickstart - Graphite, the Open Source 2D Graphics Suite" />
|
||||
<img data-youtube-embed="7gjUhl_3X10" src="https://static.graphite.art/content/learn/introduction/tutorial-1-vector-art-quickstart-youtube__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Vector Art Quickstart - Graphite, the Open Source 2D Graphics Suite" />
|
||||
</div>
|
||||
|
||||
### Video 2
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ A lot is planned on the future [roadmap](/features#roadmap), but here's an overv
|
|||
|
||||
### Vector illustration and graphic design
|
||||
|
||||
<img src="https://static.graphite.rs/content/learn/introduction/features-and-limitations/cactus-vector-art.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Example vector artwork of a potted cactus" style="max-width: unset; float: right; margin-left: 40px" />
|
||||
<img src="https://static.graphite.art/content/learn/introduction/features-and-limitations/cactus-vector-art.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Example vector artwork of a potted cactus" style="max-width: unset; float: right; margin-left: 40px" />
|
||||
|
||||
Vector editing is the core competency of the Graphite editor at this stage in its development. That means you can create shape-based vector artwork and designs with the available tools.</p><p>Primitive geometry like rectangles and ellipses can be drawn and, as desired, modified into more complex shapes using the Path tool. Fully organic shapes may also be created from scratch with the Pen tool. They can then be given colors and gradients to add visual style. This cactus is an example of the style of artwork you can create with vector graphics.
|
||||
|
||||
|
|
@ -21,15 +21,15 @@ Vector editing is the core competency of the Graphite editor at this stage in it
|
|||
|
||||
A procedural content generation workflow lets you describe *how* a creative decision becomes a visual outcome rather than doing it all yourself. For example, copying a shape 25 times around the inside of a circle would be tedious work if done by hand but it's easy for the computer to do it. And if you decide 10 instances may look better than 25, or you want to change the copied shape, or you opt for a different radial separation, it's easy to just update a numerical parameter. That saves you from laboriously placing every shape all over again. You're able to build a *procedure* that the computer carries out on your behalf.
|
||||
|
||||
The aforementioned example takes the form of the <img src="https://static.graphite.rs/content/learn/introduction/features-and-limitations/circular-repeat-node__3.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" style="vertical-align: middle" alt="Circular Repeat" /> node which is represented as this box-shaped entity with colored *connectors* on either end. *Nodes* encode certain operations (or functions) in the procedure that generates your artwork. Once you've drawn some content, you can see the nodes which generate it by opening the *node graph* with the <img src="https://static.graphite.rs/content/learn/introduction/features-and-limitations/node-graph-button.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" style="vertical-align: middle" alt="'Node Graph' button" /> button located to the top right of the viewport. This example may have a node setup which looks like this:
|
||||
The aforementioned example takes the form of the <img src="https://static.graphite.art/content/learn/introduction/features-and-limitations/circular-repeat-node__3.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" style="vertical-align: middle" alt="Circular Repeat" /> node which is represented as this box-shaped entity with colored *connectors* on either end. *Nodes* encode certain operations (or functions) in the procedure that generates your artwork. Once you've drawn some content, you can see the nodes which generate it by opening the *node graph* with the <img src="https://static.graphite.art/content/learn/introduction/features-and-limitations/node-graph-button.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" style="vertical-align: middle" alt="'Node Graph' button" /> button located to the top right of the viewport. This example may have a node setup which looks like this:
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/learn/introduction/features-and-limitations/path-fill-circular-repeat-layer.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Path node, Fill node, Circular Repeat node in a sequence feeding into the Untitled Layer" /></p>
|
||||
<p><img src="https://static.graphite.art/content/learn/introduction/features-and-limitations/path-fill-circular-repeat-layer.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Path node, Fill node, Circular Repeat node in a sequence feeding into the Untitled Layer" /></p>
|
||||
|
||||
Starting from the left, the <img src="https://static.graphite.rs/content/learn/introduction/features-and-limitations/path-node.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" style="vertical-align: middle" alt="Path" /> node generates some geometry (in this case, drawn using the *Pen* tool). Next, the vector path data feeds through the <img src="https://static.graphite.rs/content/learn/introduction/features-and-limitations/fill-node__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" style="vertical-align: middle" alt="Fill" /> node to apply a blue color. At this point, the path data looks like so:
|
||||
Starting from the left, the <img src="https://static.graphite.art/content/learn/introduction/features-and-limitations/path-node.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" style="vertical-align: middle" alt="Path" /> node generates some geometry (in this case, drawn using the *Pen* tool). Next, the vector path data feeds through the <img src="https://static.graphite.art/content/learn/introduction/features-and-limitations/fill-node__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" style="vertical-align: middle" alt="Fill" /> node to apply a blue color. At this point, the path data looks like so:
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/learn/introduction/features-and-limitations/blue-arch-shape.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /></p>
|
||||
<p><img src="https://static.graphite.art/content/learn/introduction/features-and-limitations/blue-arch-shape.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /></p>
|
||||
|
||||
Next, that is fed into the <img src="https://static.graphite.rs/content/learn/introduction/features-and-limitations/circular-repeat-node__3.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" style="vertical-align: middle" alt="Circular Repeat" /> node which has several parameters you can modify and get different output data based on your choices, like in these examples:
|
||||
Next, that is fed into the <img src="https://static.graphite.art/content/learn/introduction/features-and-limitations/circular-repeat-node__3.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" style="vertical-align: middle" alt="Circular Repeat" /> node which has several parameters you can modify and get different output data based on your choices, like in these examples:
|
||||
|
||||
<style class="table-1-style">
|
||||
.table-1-style + table td {
|
||||
|
|
@ -39,10 +39,10 @@ Next, that is fed into the <img src="https://static.graphite.rs/content/learn/in
|
|||
|
||||
| | |
|
||||
|:-:|:-:|
|
||||
| <img src="https://static.graphite.rs/content/learn/introduction/features-and-limitations/circular-repeat-node-parameters-1__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /> | <img src="https://static.graphite.rs/content/learn/introduction/features-and-limitations/circular-repeat-node-output-1.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /> |
|
||||
| <img src="https://static.graphite.rs/content/learn/introduction/features-and-limitations/circular-repeat-node-parameters-2__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /> | <img src="https://static.graphite.rs/content/learn/introduction/features-and-limitations/circular-repeat-node-output-2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /> |
|
||||
| <img src="https://static.graphite.rs/content/learn/introduction/features-and-limitations/circular-repeat-node-parameters-3__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /> | <img src="https://static.graphite.rs/content/learn/introduction/features-and-limitations/circular-repeat-node-output-3.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /> |
|
||||
| <img src="https://static.graphite.rs/content/learn/introduction/features-and-limitations/circular-repeat-node-parameters-4__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /> | <img src="https://static.graphite.rs/content/learn/introduction/features-and-limitations/circular-repeat-node-output-4.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /> |
|
||||
| <img src="https://static.graphite.art/content/learn/introduction/features-and-limitations/circular-repeat-node-parameters-1__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /> | <img src="https://static.graphite.art/content/learn/introduction/features-and-limitations/circular-repeat-node-output-1.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /> |
|
||||
| <img src="https://static.graphite.art/content/learn/introduction/features-and-limitations/circular-repeat-node-parameters-2__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /> | <img src="https://static.graphite.art/content/learn/introduction/features-and-limitations/circular-repeat-node-output-2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /> |
|
||||
| <img src="https://static.graphite.art/content/learn/introduction/features-and-limitations/circular-repeat-node-parameters-3__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /> | <img src="https://static.graphite.art/content/learn/introduction/features-and-limitations/circular-repeat-node-output-3.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /> |
|
||||
| <img src="https://static.graphite.art/content/learn/introduction/features-and-limitations/circular-repeat-node-parameters-4__2.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /> | <img src="https://static.graphite.art/content/learn/introduction/features-and-limitations/circular-repeat-node-output-4.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" /> |
|
||||
|
||||
<!-- TODO: Rename "Angle Offset" to "Start Angle" and redo the screenshots which show that -->
|
||||
The node's properties offer controls over settings like *Angle Offset* (what angle to start at), *Radius* (distance from the center), and *Instances* (how many copies to distribute). These parameters can also be exposed into the graph so they are driven by the calculated numerical outputs of other nodes instead of values you pick by hand.
|
||||
|
|
@ -51,4 +51,4 @@ The node's properties offer controls over settings like *Angle Offset* (what ang
|
|||
|
||||
Raster image editing is a growing capability that will develop over time into the central focus of Graphite. Raster imagery is composed of pixels which are grids of color that can represent anything visual, like paintings and photographs. The current feature set lets you import images, manipulate them using the node-based compositor, and apply nondestructive global effects like color adjustment filters.
|
||||
|
||||
A prototype <img src="https://static.graphite.rs/content/learn/introduction/features-and-limitations/brush-tool-icon.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" style="vertical-align: bottom" /> Brush tool exists letting you draw simple doodles and sketches. However it is very limited in its capabilities and there are multiple bugs and performance issues with the feature. It can be used in a basic capacity, but don't expect to paint anything too impressive using raster brushes quite yet. The tool will be fully rewritten in the future.
|
||||
A prototype <img src="https://static.graphite.art/content/learn/introduction/features-and-limitations/brush-tool-icon.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="" style="vertical-align: bottom" /> Brush tool exists letting you draw simple doodles and sketches. However it is very limited in its capabilities and there are multiple bugs and performance issues with the feature. It can be used in a basic capacity, but don't expect to paint anything too impressive using raster brushes quite yet. The tool will be fully rewritten in the future.
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ Please be advised that the logo is not part of the software's Apache 2.0 [licens
|
|||
|
||||
1. Do not use the Graphite logo as your own. It should not be used as your primary—or most visually prominent—branding, and may never be incorporated into your own logo. Your usage should not imply that it's a part of the official Graphite project, nor that it's endorsed or affiliated.
|
||||
2. Your (product, service, website, company, channel, etc.) brand name should not begin with "Graphite", or use it as the most prominent word in the name. It may only be used as a secondary or descriptive word that comes after your own unique name. For example: "XYZ for Graphite" is acceptable, but "Graphite XYZ" is not since it implies affiliation.
|
||||
3. Only use the logo when talking about, describing, referencing, or crediting the official Graphite project or software. If used as a hyperlink, it should point only to <https://graphite.rs>.
|
||||
3. Only use the logo when talking about, describing, referencing, or crediting the official Graphite project or software. If used as a hyperlink, it should point only to <https://graphite.art>.
|
||||
4. Do not modify the logo. The solid-colored version may only be recolored with another substitute solid color if doing so is necessary for visual consistency when presented alongside other logos of the same color. Sufficient blank space should be preserved around the logo so it does not overlap or compete with impinging design elements.
|
||||
5. Commercial use of the logo (for example, merchandise sales) is not allowed without express written permission.
|
||||
|
||||
|
|
@ -34,7 +34,7 @@ If in doubt, please <a href="/contact">get in touch</a> by email to request clar
|
|||
|
||||
## Download
|
||||
|
||||
Download the complete [logo kit](https://static.graphite.rs/logos/graphite-logo-kit.zip) or a specific version in PNG or SVG format below.
|
||||
Download the complete [logo kit](https://static.graphite.art/logos/graphite-logo-kit.zip) or a specific version in PNG or SVG format below.
|
||||
|
||||
</article>
|
||||
|
||||
|
|
@ -44,18 +44,18 @@ Download the complete [logo kit](https://static.graphite.rs/logos/graphite-logo-
|
|||
<section class="feature-box-outer logo-view color">
|
||||
<div class="feature-box-inner">
|
||||
<div>
|
||||
<img src="https://static.graphite.rs/logos/graphite-logotype-color.svg" height="160" />
|
||||
<img src="https://static.graphite.art/logos/graphite-logotype-color.svg" height="160" />
|
||||
<span>Graphite Logotype (Color)</span>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logotype-color.svg" download>Download (SVG)</a>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logotype-color-240x937.png" download>Download (PNG 240x937)</a>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logotype-color-480x1874.png" download>Download (PNG 480x1874)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logotype-color.svg" download>Download (SVG)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logotype-color-240x937.png" download>Download (PNG 240x937)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logotype-color-480x1874.png" download>Download (PNG 480x1874)</a>
|
||||
</div>
|
||||
<div>
|
||||
<img src="https://static.graphite.rs/logos/graphite-logo-color.svg" width="160" height="160" />
|
||||
<img src="https://static.graphite.art/logos/graphite-logo-color.svg" width="160" height="160" />
|
||||
<span>Graphite Icon (Color)</span>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logo-color.svg" download>Download (SVG)</a>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logo-color-240x240.png" download>Download (PNG 240x240)</a>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logo-color-480x480.png" download>Download (PNG 480x480)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logo-color.svg" download>Download (SVG)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logo-color-240x240.png" download>Download (PNG 240x240)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logo-color-480x480.png" download>Download (PNG 480x480)</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -63,18 +63,18 @@ Download the complete [logo kit](https://static.graphite.rs/logos/graphite-logo-
|
|||
<section class="feature-box-outer logo-view light">
|
||||
<div class="feature-box-inner">
|
||||
<div>
|
||||
<img src="https://static.graphite.rs/logos/graphite-logotype-solid.svg" height="160" />
|
||||
<img src="https://static.graphite.art/logos/graphite-logotype-solid.svg" height="160" />
|
||||
<span>Graphite Logotype (Solid)</span>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logotype-solid.svg" download>Download (SVG)</a>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logotype-solid-240x937.png" download>Download (PNG 240x937)</a>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logotype-solid-480x1874.png" download>Download (PNG 480x1874)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logotype-solid.svg" download>Download (SVG)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logotype-solid-240x937.png" download>Download (PNG 240x937)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logotype-solid-480x1874.png" download>Download (PNG 480x1874)</a>
|
||||
</div>
|
||||
<div>
|
||||
<img src="https://static.graphite.rs/logos/graphite-logo-solid.svg" width="160" height="160" />
|
||||
<img src="https://static.graphite.art/logos/graphite-logo-solid.svg" width="160" height="160" />
|
||||
<span>Graphite Icon (Solid)</span>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logo-solid.svg" download>Download (SVG)</a>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logo-solid-240x240.png" download>Download (PNG 240x240)</a>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logo-solid-480x480.png" download>Download (PNG 480x480)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logo-solid.svg" download>Download (SVG)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logo-solid-240x240.png" download>Download (PNG 240x240)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logo-solid-480x480.png" download>Download (PNG 480x480)</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -82,18 +82,18 @@ Download the complete [logo kit](https://static.graphite.rs/logos/graphite-logo-
|
|||
<section class="feature-box-outer logo-view dark">
|
||||
<div class="feature-box-inner">
|
||||
<div>
|
||||
<img src="https://static.graphite.rs/logos/graphite-logotype-solid-white.svg" height="160" />
|
||||
<img src="https://static.graphite.art/logos/graphite-logotype-solid-white.svg" height="160" />
|
||||
<span>Graphite Logotype (Solid, White)</span>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logotype-solid-white.svg" download>Download (SVG)</a>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logotype-solid-white-240x937.png" download>Download (PNG 240x937)</a>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logotype-solid-white-480x1874.png" download>Download (PNG 480x1874)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logotype-solid-white.svg" download>Download (SVG)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logotype-solid-white-240x937.png" download>Download (PNG 240x937)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logotype-solid-white-480x1874.png" download>Download (PNG 480x1874)</a>
|
||||
</div>
|
||||
<div>
|
||||
<img src="https://static.graphite.rs/logos/graphite-logo-solid-white.svg" width="160" height="160" />
|
||||
<img src="https://static.graphite.art/logos/graphite-logo-solid-white.svg" width="160" height="160" />
|
||||
<span>Graphite Icon (Solid, White)</span>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logo-solid-white.svg" download>Download (SVG)</a>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logo-solid-white-240x240.png" download>Download (PNG 240x240)</a>
|
||||
<a href="https://static.graphite.rs/logos/graphite-logo-solid-white-480x480.png" download>Download (PNG 480x480)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logo-solid-white.svg" download>Download (SVG)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logo-solid-white-240x240.png" download>Download (PNG 240x240)</a>
|
||||
<a href="https://static.graphite.art/logos/graphite-logo-solid-white-480x480.png" download>Download (PNG 480x480)</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ Materials for journalists and creators looking to share Graphite with their audi
|
|||
|
||||
Please get in touch if you'd like to conduct an interview or have questions answered.
|
||||
|
||||
Send an email to [contact<wbr>@graphite<wbr>.rs](mailto:contact@graphite.rs) and you can usually expect a quick reply.
|
||||
Send an email to [contact<wbr>@graphite<wbr>.art](mailto:contact@graphite.art) and you can usually expect a quick reply.
|
||||
|
||||
## Logo
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ css = ["/page/volunteer.css", "/component/feature-box.css"]
|
|||
<div class="feature-box-narrow">
|
||||
|
||||
<a href="/volunteer/guide">
|
||||
<img src="https://static.graphite.rs/content/volunteer/code-contributions.avif" class="feature-box-full-image" style="aspect-ratio: 3/1 auto; background: var(--color-seaside)" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Flavor graphic depicting a library of knowledge in a digital realm" />
|
||||
<img src="https://static.graphite.art/content/volunteer/code-contributions.avif" class="feature-box-full-image" style="aspect-ratio: 3/1 auto; background: var(--color-seaside)" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Flavor graphic depicting a library of knowledge in a digital realm" />
|
||||
</a>
|
||||
|
||||
Get started by reading the contributor guide:
|
||||
|
|
@ -58,12 +58,12 @@ The Graphite editor is built much like a game engine, split across user interfac
|
|||
|
||||
<div class="feature-box-narrow">
|
||||
|
||||
<img src="https://static.graphite.rs/content/volunteer/creative-contributions.avif" class="feature-box-full-image" style="aspect-ratio: 3/1 auto; background: var(--color-lemon)" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Flavor graphic depicting a fountain pen, ink pots, and a book" />
|
||||
<img src="https://static.graphite.art/content/volunteer/creative-contributions.avif" class="feature-box-full-image" style="aspect-ratio: 3/1 auto; background: var(--color-lemon)" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Flavor graphic depicting a fountain pen, ink pots, and a book" />
|
||||
</a>
|
||||
|
||||
Assign yourself the *"🙌 Interested in helping with art or marketing"* role in the *#welcome* Discord channel. Then mention your experience and how you'd like to help in the *#introductions* channel.
|
||||
|
||||
<a href="https://discord.graphite.rs" class="button arrow">Volunteer on Discord</a>
|
||||
<a href="https://discord.graphite.art" class="button arrow">Volunteer on Discord</a>
|
||||
|
||||
</div>
|
||||
|
||||
|
|
@ -94,11 +94,11 @@ Help write, edit, and design content for this website, social media, newsletters
|
|||
|
||||
<div class="feature-box-narrow">
|
||||
|
||||
<img src="https://static.graphite.rs/content/volunteer/user-contributions.avif" class="feature-box-full-image" style="aspect-ratio: 3/1 auto; background: var(--color-lilac)" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Flavor graphic depicting a magnifying glass on the search for a software bug" />
|
||||
<img src="https://static.graphite.art/content/volunteer/user-contributions.avif" class="feature-box-full-image" style="aspect-ratio: 3/1 auto; background: var(--color-lilac)" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Flavor graphic depicting a magnifying glass on the search for a software bug" />
|
||||
|
||||
Assign yourself the *"🐒 Volunteer to get pinged regularly for QA testing"* or *"🤖 Interested in contributing code"* roles in the *#welcome* Discord channel. In the latter case, drop by the *#development* channel to get advice writing your first node.
|
||||
|
||||
<a href="https://discord.graphite.rs" class="button arrow">Volunteer on Discord</a>
|
||||
<a href="https://discord.graphite.art" class="button arrow">Volunteer on Discord</a>
|
||||
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -10,8 +10,8 @@ book = true
|
|||
|
||||
Welcome, potential contributor! We're excited to have you join the Graphite project and it's our goal to make the process as smooth as possible. This guide will serve as your library of knowledge to help you get started contributing to the project. If you find any information missing or unclear, please let us know through Discord or submit a pull request to help document the process for future contributors.
|
||||
|
||||
The next page will cover how to compile the Graphite source code. But first, make sure you've joined our [Discord server](https://discord.graphite.rs) and assigned yourself the *"🤖 Interested in contributing code"* role from the `#🙂welcome` channel. Done that? Alright, proceed!
|
||||
The next page will cover how to compile the Graphite source code. But first, make sure you've joined our [Discord server](https://discord.graphite.art) and assigned yourself the *"🤖 Interested in contributing code"* role from the `#🙂welcome` channel. Done that? Alright, proceed!
|
||||
|
||||
<p>
|
||||
<img src="https://static.graphite.rs/content/volunteer/code-contributions.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Flavor graphic depicting a library of knowledge in a digital realm" />
|
||||
<img src="https://static.graphite.art/content/volunteer/code-contributions.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.jpg')" alt="Flavor graphic depicting a library of knowledge in a digital realm" />
|
||||
</p>
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ css = ["/component/youtube-embed.css"]
|
|||
The best introduction for getting up-to-speed with Graphite contribution comes from watching this webcast recording. Before asking questions in Discord, please watch the full video because it gives a comprehensive overview of most things you will need to know.
|
||||
|
||||
<div class="youtube-embed aspect-16x9">
|
||||
<img data-youtube-embed="vUzIeg8frh4" src="https://static.graphite.rs/content/volunteer/guide/workshop-intro-to-coding-for-graphite-youtube.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Workshop: Intro to Coding for Graphite" />
|
||||
<img data-youtube-embed="vUzIeg8frh4" src="https://static.graphite.art/content/volunteer/guide/workshop-intro-to-coding-for-graphite-youtube.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Workshop: Intro to Coding for Graphite" />
|
||||
</div>
|
||||
|
||||
## Codebase structure
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ The Wasm-based editor has some unique limitations about how you are able to debu
|
|||
|
||||
## Comparing with deployed builds
|
||||
|
||||
When tracking down a bug, first check if the issue you are noticing also exists in `master` or just your branch. Open up [dev.graphite.rs](https://dev.graphite.rs) which always deploys the lastest commit, compared to [editor.graphite.rs](https://editor.graphite.rs) which is manually deployed from time to time for the sake of stability.
|
||||
When tracking down a bug, first check if the issue you are noticing also exists in `master` or just your branch. Open up [dev.graphite.art](https://dev.graphite.art) which always deploys the lastest commit, compared to [editor.graphite.art](https://editor.graphite.art) which is manually deployed from time to time for the sake of stability.
|
||||
|
||||
Use *Help* > *About Graphite* in the editor to view any build's Git commit hash.
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ Any (sub)graph can import/export data from/to the outside world. For example, a
|
|||
|
||||
In the Graphite editor UI, here is an example graph of artwork that imports no data but exports its content to the canvas:
|
||||
|
||||
<img src="https://static.graphite.rs/content/features/mockup-node-graph.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Node graph UI mockup" />
|
||||
<img src="https://static.graphite.art/content/features/mockup-node-graph.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Node graph UI mockup" />
|
||||
|
||||
The graph shown above represents the full artwork, meaning it's the root-level graph in its document. But there is nothing special about that graph compared to any subgraph. To avoid the confusion of calling it a graph or subgraph which comes with implications about user-facing concepts in the context of a document, we will use the less-ambiguous term **network** in the context of Graphene's internal concepts and codebase.
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ page_template = "book.html"
|
|||
order = 3 # Chapter number
|
||||
+++
|
||||
|
||||
There are two places to look for beginner-friendly development tasks. Usually, the best option is to select one of the many bite-sized task descriptions marked with a ‼️ reaction in the `#✅code-todo-list` channel of the [Discord server](https://discord.graphite.rs). You may also browse the [task board](https://github.com/orgs/GraphiteEditor/projects/1/views/1), which lists [beginner issues](https://github.com/orgs/GraphiteEditor/projects/1/views/6) to pick from. The Discord option usually has the more approachable tasks compared to the GitHub issues, which tend to have more variability in complexity.
|
||||
There are two places to look for beginner-friendly development tasks. Usually, the best option is to select one of the many bite-sized task descriptions marked with a ‼️ reaction in the `#✅code-todo-list` channel of the [Discord server](https://discord.graphite.art). You may also browse the [task board](https://github.com/orgs/GraphiteEditor/projects/1/views/1), which lists [beginner issues](https://github.com/orgs/GraphiteEditor/projects/1/views/6) to pick from. The Discord option usually has the more approachable tasks compared to the GitHub issues, which tend to have more variability in complexity.
|
||||
|
||||
If you're unsure about which task to pick, feel free to ask in the `#📄development` channel.
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ Later on when you are building larger features, a PR should be opened once you h
|
|||
|
||||
Here's the important part: when you open a PR, it should be marked as a draft unless it is currently ready for review. The left image shows how to open a new PR as a draft, and the right image shows how to convert an existing PR to a draft.
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/volunteer/guide/draft-pr.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Screenhots showing GitHub's "Create pull request (arrow) > Create draft pull request" and "Still in progress? Convert to draft" buttons" /></p>
|
||||
<p><img src="https://static.graphite.art/content/volunteer/guide/draft-pr.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Screenhots showing GitHub's "Create pull request (arrow) > Create draft pull request" and "Still in progress? Convert to draft" buttons" /></p>
|
||||
|
||||
<center><em>Open a new PR as a draft / convert an existing PR to a draft</em></center>
|
||||
|
||||
|
|
@ -81,7 +81,7 @@ As time goes on and `master` accumulates new commits, your branch will become ou
|
|||
|
||||
When your branch can be updated with `master` without conflicts, you can click the "Update branch" button below the CI status. If you click the dropdown button beside it, you can choose instead to update with a rebase. If this can be done without conflicts, this is preferred because it maintains a clean, linear history for your branch.
|
||||
|
||||
<p><img src="https://static.graphite.rs/content/volunteer/guide/update-branch-with-rebase.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="Screenhots showing GitHub's "Update with rebase" button" /></p>
|
||||
<p><img src="https://static.graphite.art/content/volunteer/guide/update-branch-with-rebase.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" onload="this.width = this.naturalWidth / 2" alt="Screenhots showing GitHub's "Update with rebase" button" /></p>
|
||||
|
||||
Be sure to pull the rebased, or updated-with-a-merge-commit, branch after you or a maintainer updates it (or pushes other commits to it) to ensure you are working on the latest code.
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ Graphite offers a number of opportunities for students to contribute by building
|
|||
|
||||
Student projects require adherence to a set schedule with regular check-ins, milestones, and evaluations. The structured setting is designed to provide a supportive environment for students to learn and grow as developers while gaining real-world industry experience from collaborating on a sizable software product and remaining accountable to stakeholders. It's our goal to make sure you succeed!
|
||||
|
||||
Use this [contributor guide](..) to start out with the code. Then when you're ready, reach out through [Discord](https://discord.graphite.rs) and use the `#🎓student-projects` channel to discuss and work towards proposing a project with the Graphite core team.
|
||||
Use this [contributor guide](..) to start out with the code. Then when you're ready, reach out through [Discord](https://discord.graphite.art) and use the `#🎓student-projects` channel to discuss and work towards proposing a project with the Graphite core team.
|
||||
|
||||
## Google Summer of Code
|
||||
|
||||
|
|
|
|||
|
|
@ -6,9 +6,9 @@
|
|||
"type": "git",
|
||||
"url": "git+https://github.com/GraphiteEditor/Graphite.git"
|
||||
},
|
||||
"author": "Graphite Authors <contact@graphite.rs>",
|
||||
"author": "Graphite Authors <contact@graphite.art>",
|
||||
"license": "Apache-2.0",
|
||||
"homepage": "https://graphite.rs",
|
||||
"homepage": "https://graphite.art",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"postinstall": "node .build-scripts/install-fonts.ts",
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@
|
|||
&.left {
|
||||
padding-left: 160px;
|
||||
margin-left: -160px;
|
||||
-webkit-mask-image: url("https://static.graphite.rs/textures/torn-edge-left__2.png");
|
||||
mask-image: url("https://static.graphite.rs/textures/torn-edge-left__2.png");
|
||||
-webkit-mask-image: url("https://static.graphite.art/textures/torn-edge-left__2.png");
|
||||
mask-image: url("https://static.graphite.art/textures/torn-edge-left__2.png");
|
||||
-webkit-mask-position: top left;
|
||||
mask-position: top left;
|
||||
}
|
||||
|
|
@ -63,8 +63,8 @@
|
|||
&.right {
|
||||
padding-right: 160px;
|
||||
margin-right: -160px;
|
||||
-webkit-mask-image: url("https://static.graphite.rs/textures/torn-edge-right__2.png");
|
||||
mask-image: url("https://static.graphite.rs/textures/torn-edge-right__2.png");
|
||||
-webkit-mask-image: url("https://static.graphite.art/textures/torn-edge-right__2.png");
|
||||
mask-image: url("https://static.graphite.art/textures/torn-edge-right__2.png");
|
||||
-webkit-mask-position: top right;
|
||||
mask-position: top right;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
.feature-box-narrow,
|
||||
.feature-box-outer {
|
||||
padding: calc(var(--feature-box-padding) * var(--variable-px));
|
||||
background-image: url("https://static.graphite.rs/textures/noise.png");
|
||||
background-image: url("https://static.graphite.art/textures/noise.png");
|
||||
background-blend-mode: overlay;
|
||||
background-position: center;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
// Dimensions: 480x40
|
||||
height: 100%;
|
||||
margin-top: -0.2em;
|
||||
background: url("https://static.graphite.rs/textures/text-sketch-underline.png");
|
||||
background: url("https://static.graphite.art/textures/text-sketch-underline.png");
|
||||
background-repeat: no-repeat;
|
||||
background-size: contain;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ function initializeFundraisingBar() {
|
|||
if (!(fundraising instanceof HTMLElement && bar instanceof HTMLElement && dynamicPercent instanceof HTMLElement && dynamicGoal instanceof HTMLElement)) return;
|
||||
|
||||
const setFundraisingGoal = async () => {
|
||||
const request = await fetch("https://graphite.rs/fundraising-goal");
|
||||
const request = await fetch("https://graphite.art/fundraising-goal");
|
||||
/** @type {{ percentComplete: number, targetValue: number }} */
|
||||
const data = await request.json();
|
||||
|
||||
|
|
|
|||
|
|
@ -25,17 +25,17 @@
|
|||
<div class="social">
|
||||
{% if page.extra.reddit %}
|
||||
<a href="{{ page.extra.reddit | safe }}" target="_blank" class="button arrow">
|
||||
<img src="https://static.graphite.rs/icons/reddit__2.svg" /><span>Discuss on Reddit</span>
|
||||
<img src="https://static.graphite.art/icons/reddit__2.svg" /><span>Discuss on Reddit</span>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if page.extra.twitter %}
|
||||
<a href="{{ page.extra.twitter | safe }}" target="_blank" class="button arrow">
|
||||
<img src="https://static.graphite.rs/icons/twitter.svg" /><span>Twitter</span>
|
||||
<img src="https://static.graphite.art/icons/twitter.svg" /><span>Twitter</span>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if page.extra.bluesky %}
|
||||
<a href="{{ page.extra.bluesky | safe }}" target="_blank" class="button arrow">
|
||||
<img src="https://static.graphite.rs/icons/bluesky.svg" /><span>Bluesky</span>
|
||||
<img src="https://static.graphite.art/icons/bluesky.svg" /><span>Bluesky</span>
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
<title>Graphite | {{ title | safe }}</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5, minimum-scale=1" />
|
||||
{% if current_path -%}
|
||||
<meta property="og:url" content="https://graphite.rs{{ current_path | safe }}" />
|
||||
<meta property="og:url" content="https://graphite.art{{ current_path | safe }}" />
|
||||
{%- endif %}
|
||||
{%- set meta_description = page.extra.meta_description | default(value = meta_description | default(value = false)) -%}
|
||||
{% if meta_description %}
|
||||
|
|
@ -16,8 +16,8 @@
|
|||
<meta property="og:description" content="{{ meta_description | safe }}" />
|
||||
<meta name="twitter:description" content="{{ meta_description | safe }}" />
|
||||
{%- endif %}
|
||||
<meta property="og:image" content="{{ meta_image | default(value = 'https://static.graphite.rs/logos/splash.png' | safe) | safe }}" />
|
||||
<meta name="twitter:image" content="{{ meta_image | default(value = 'https://static.graphite.rs/logos/splash.png' | safe) | safe }}" />
|
||||
<meta property="og:image" content="{{ meta_image | default(value = 'https://static.graphite.art/logos/splash.png' | safe) | safe }}" />
|
||||
<meta name="twitter:image" content="{{ meta_image | default(value = 'https://static.graphite.art/logos/splash.png' | safe) | safe }}" />
|
||||
<meta property="og:title" content="{{ meta_title | default(value = title | safe) | safe }}" />
|
||||
<meta name="twitter:title" content="{{ meta_title | default(value = title | safe) | safe }}" />
|
||||
<meta property="og:type" content="{% if meta_article_type %}article{% else %}website{% endif %}" />
|
||||
|
|
@ -103,7 +103,7 @@
|
|||
<div class="row">
|
||||
<div class="left">
|
||||
<a href="/">
|
||||
<img src="https://static.graphite.rs/logos/graphite-logo-solid.svg" alt="Graphite Logo" />
|
||||
<img src="https://static.graphite.art/logos/graphite-logo-solid.svg" alt="Graphite Logo" />
|
||||
</a>
|
||||
</div>
|
||||
<div class="right">
|
||||
|
|
@ -113,7 +113,7 @@
|
|||
<a href="/blog">Blog</a>
|
||||
<a href="/volunteer">Volunteer</a>
|
||||
<a href="/donate" class="heart">Donate</a>
|
||||
<a href="https://editor.graphite.rs" class="button arrow">Launch</a>
|
||||
<a href="https://editor.graphite.art" class="button arrow">Launch</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue