From b0ebd0bfdfc3271158e308755693f246d8e55447 Mon Sep 17 00:00:00 2001 From: Polyglot Date: Thu, 27 Nov 2025 22:01:38 +0100 Subject: [PATCH 1/4] Add tooltip documentation to web request, text, and brush nodes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add descriptive tooltips to web request nodes (GET/POST, string/image conversion, resource loading, image decoding) - Add tooltip to GPU rasterization node explaining footprint usage - Improve text node tooltip with clearer per_glyph_instances parameter explanation - Add tooltips to brush stamp generator and blit operations explaining their internal roles - Fix typos in tooltip and variable names (it's→its, perview→preview, instnace→instance) --- node-graph/nodes/brush/src/brush.rs | 4 ++++ node-graph/nodes/gstd/src/text.rs | 6 +++++- node-graph/nodes/gstd/src/wasm_application_io.rs | 9 ++++++++- node-graph/nodes/math/src/lib.rs | 2 +- node-graph/nodes/path-bool/src/lib.rs | 2 +- node-graph/nodes/text/src/font_cache.rs | 4 ++-- 6 files changed, 21 insertions(+), 6 deletions(-) diff --git a/node-graph/nodes/brush/src/brush.rs b/node-graph/nodes/brush/src/brush.rs index 0a6fdc76bc..11516cc55d 100644 --- a/node-graph/nodes/brush/src/brush.rs +++ b/node-graph/nodes/brush/src/brush.rs @@ -57,6 +57,9 @@ impl Sample for BrushStampGenerator

{ } } +/// Controls the brush shape with diameter and hardness, plus color and opacity (via flow). +/// The feather exponent is calculated from hardness to determine edge softness. +/// Used internally to create the individual brush texture before stamping it repeatedly along a stroke path. #[node_macro::node(skip_impl)] fn brush_stamp_generator(#[unit(" px")] diameter: f64, color: Color, hardness: f64, flow: f64) -> BrushStampGenerator { // Diameter @@ -76,6 +79,7 @@ fn brush_stamp_generator(#[unit(" px")] diameter: f64, color: Color, hardness: f BrushStampGenerator { color, feather_exponent, transform } } +/// Used to efficiently paint brush strokes: applies the same texture repeatedly at different positions with proper blending and boundary handling. #[node_macro::node(skip_impl)] fn blit(mut target: Table>, texture: Raster, positions: Vec, blend_mode: BlendFn) -> Table> where diff --git a/node-graph/nodes/gstd/src/text.rs b/node-graph/nodes/gstd/src/text.rs index 00d7cf3cd5..f628db7ab0 100644 --- a/node-graph/nodes/gstd/src/text.rs +++ b/node-graph/nodes/gstd/src/text.rs @@ -3,6 +3,9 @@ use graph_craft::wasm_application_io::WasmEditorApi; use graphic_types::Vector; pub use text_nodes::*; +/// Converts text into editable vector shapes with customizable styling. +/// Parameters control font, size, spacing, alignment, and layout. + #[node_macro::node(category(""))] fn text<'i: 'n>( _: impl Ctx, @@ -25,7 +28,8 @@ fn text<'i: 'n>( #[default(0.)] tilt: f64, align: TextAlign, - /// Splits each text glyph into its own row in the table of vector geometry. + /// When enabled, outputs a table with one Vector per character, allowing individual character manipulation. + /// When disabled, outputs a single Vector containing all characters combined. Default is disabled. #[default(false)] per_glyph_instances: bool, ) -> Table { diff --git a/node-graph/nodes/gstd/src/wasm_application_io.rs b/node-graph/nodes/gstd/src/wasm_application_io.rs index 53a31d4b90..db753cb066 100644 --- a/node-graph/nodes/gstd/src/wasm_application_io.rs +++ b/node-graph/nodes/gstd/src/wasm_application_io.rs @@ -27,12 +27,14 @@ use wasm_bindgen::JsCast; #[cfg(target_family = "wasm")] use web_sys::{CanvasRenderingContext2d, HtmlCanvasElement}; +/// Allocates GPU memory and rendering context for vector-to-raster conversion. Must be paired with the Rasterize node. #[cfg(feature = "wgpu")] #[node_macro::node(category("Debug: GPU"))] async fn create_surface<'a: 'n>(_: impl Ctx, editor: &'a WasmEditorApi) -> Arc { Arc::new(editor.application_io.as_ref().unwrap().create_window()) } +/// "Discard Result" runs asynchronously in the background without waiting. Useful for triggering webhooks or analytics without blocking. #[node_macro::node(category("Web Request"))] async fn get_request(_: impl Ctx, _primary: (), #[name("URL")] url: String, discard_result: bool) -> String { #[cfg(target_family = "wasm")] @@ -63,6 +65,7 @@ async fn get_request(_: impl Ctx, _primary: (), #[name("URL")] url: String, disc response.text().await.ok().unwrap_or_default() } +/// "Discard Result" runs asynchronously in the background. Useful for fire-and-forget operations like logging, webhooks, or notifications. #[node_macro::node(category("Web Request"))] async fn post_request(_: impl Ctx, _primary: (), #[name("URL")] url: String, body: Vec, discard_result: bool) -> String { #[cfg(target_family = "wasm")] @@ -97,17 +100,19 @@ async fn post_request(_: impl Ctx, _primary: (), #[name("URL")] url: String, bod response.text().await.ok().unwrap_or_default() } +/// Prepare text for transmission over HTTP or storage in binary file formats. #[node_macro::node(category("Web Request"), name("String to Bytes"))] fn string_to_bytes(_: impl Ctx, string: String) -> Vec { string.into_bytes() } +/// Extracts raw pixel data in RGBA format. Each pixel becomes 4 sequential bytes. Use before sending images over HTTP or writing to files. #[node_macro::node(category("Web Request"), name("Image to Bytes"))] fn image_to_bytes(_: impl Ctx, image: Table>) -> Vec { let Some(image) = image.iter().next() else { return vec![] }; image.element.data.iter().flat_map(|color| color.to_rgb8_srgb().into_iter()).collect::>() } - +/// Supports loading from URLs and local asset paths. Returns a transparent placeholder if the resource fails to load, allowing workflows to continue. #[node_macro::node(category("Web Request"))] async fn load_resource<'a: 'n>(_: impl Ctx, _primary: (), #[scope("editor-api")] editor: &'a WasmEditorApi, #[name("URL")] url: String) -> Arc<[u8]> { let Some(api) = editor.application_io.as_ref() else { @@ -123,6 +128,7 @@ async fn load_resource<'a: 'n>(_: impl Ctx, _primary: (), #[scope("editor-api")] data } +/// Works with any standard image format (PNG, JPEG, WebP, etc.). Automatically converts color space to linear sRGB for accurate compositing. #[node_macro::node(category("Web Request"))] fn decode_image(_: impl Ctx, data: Arc<[u8]>) -> Table> { let Some(image) = image::load_from_memory(data.as_ref()).ok() else { @@ -142,6 +148,7 @@ fn decode_image(_: impl Ctx, data: Arc<[u8]>) -> Table> { Table::new_from_element(Raster::new_cpu(image)) } +/// Renders with the resolution and transform defined by the footprint. Output respects vector strokes, gradients, and other styling details. #[cfg(target_family = "wasm")] #[node_macro::node(category(""))] async fn rasterize( diff --git a/node-graph/nodes/math/src/lib.rs b/node-graph/nodes/math/src/lib.rs index 78b213bf21..48f7c4326f 100644 --- a/node-graph/nodes/math/src/lib.rs +++ b/node-graph/nodes/math/src/lib.rs @@ -747,7 +747,7 @@ fn length(_: impl Ctx, vector: DVec2) -> f64 { vector.length() } -/// Scales the input vector to unit length while preserving it's direction. This is equivalent to dividing the input vector by it's own magnitude. +/// Scales the input vector to unit length while preserving its direction. This is equivalent to dividing the input vector by its own magnitude. /// /// Returns zero when the input vector is zero. #[node_macro::node(category("Math: Vector"))] diff --git a/node-graph/nodes/path-bool/src/lib.rs b/node-graph/nodes/path-bool/src/lib.rs index 2507673da4..5742a7db9c 100644 --- a/node-graph/nodes/path-bool/src/lib.rs +++ b/node-graph/nodes/path-bool/src/lib.rs @@ -14,7 +14,7 @@ use std::ops::Mul; // Import specta so derive macros can find it use core_types::specta; -// TODO: Fix boolean ops to work by removing .transform() and .one_instnace_*() calls, +// TODO: Fix boolean ops to work by removing .transform() and .one_instance_*() calls, // TODO: since before we used a Vec of single-row tables and now we use a single table // TODO: with multiple rows while still assuming a single row for the boolean operations. diff --git a/node-graph/nodes/text/src/font_cache.rs b/node-graph/nodes/text/src/font_cache.rs index 7cdee13c11..803875d874 100644 --- a/node-graph/nodes/text/src/font_cache.rs +++ b/node-graph/nodes/text/src/font_cache.rs @@ -70,9 +70,9 @@ impl FontCache { } /// Insert a new font into the cache - pub fn insert(&mut self, font: Font, perview_url: String, data: Vec) { + pub fn insert(&mut self, font: Font, preview_url: String, data: Vec) { self.font_file_data.insert(font.clone(), data); - self.preview_urls.insert(font, perview_url); + self.preview_urls.insert(font, preview_url); } /// Gets the preview URL for showing in text field when live editing From c7b17118c93d6e59e15b3a3c08a07e3f1f58559d Mon Sep 17 00:00:00 2001 From: Polyglot Date: Fri, 28 Nov 2025 16:03:08 +0100 Subject: [PATCH 2/4] Fixed 2 issues with previous changes. Reversed order of documentation about per_glyph_instances. Can it be 3 lines? --- node-graph/nodes/gstd/src/text.rs | 5 +++-- node-graph/nodes/gstd/src/wasm_application_io.rs | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/node-graph/nodes/gstd/src/text.rs b/node-graph/nodes/gstd/src/text.rs index f628db7ab0..8b402c11c2 100644 --- a/node-graph/nodes/gstd/src/text.rs +++ b/node-graph/nodes/gstd/src/text.rs @@ -28,8 +28,9 @@ fn text<'i: 'n>( #[default(0.)] tilt: f64, align: TextAlign, - /// When enabled, outputs a table with one Vector per character, allowing individual character manipulation. - /// When disabled, outputs a single Vector containing all characters combined. Default is disabled. + /// When disabled, outputs a single vector element containing all characters combined. + /// When enabled, outputs a table with one vector element per character, + /// allowing individual character manipulation by subsequent operations. #[default(false)] per_glyph_instances: bool, ) -> Table { diff --git a/node-graph/nodes/gstd/src/wasm_application_io.rs b/node-graph/nodes/gstd/src/wasm_application_io.rs index db753cb066..1183c14f89 100644 --- a/node-graph/nodes/gstd/src/wasm_application_io.rs +++ b/node-graph/nodes/gstd/src/wasm_application_io.rs @@ -112,6 +112,7 @@ fn image_to_bytes(_: impl Ctx, image: Table>) -> Vec { let Some(image) = image.iter().next() else { return vec![] }; image.element.data.iter().flat_map(|color| color.to_rgb8_srgb().into_iter()).collect::>() } + /// Supports loading from URLs and local asset paths. Returns a transparent placeholder if the resource fails to load, allowing workflows to continue. #[node_macro::node(category("Web Request"))] async fn load_resource<'a: 'n>(_: impl Ctx, _primary: (), #[scope("editor-api")] editor: &'a WasmEditorApi, #[name("URL")] url: String) -> Arc<[u8]> { From b189bc04efab41327455290563e5b26914de5f62 Mon Sep 17 00:00:00 2001 From: Polyglot Date: Mon, 1 Dec 2025 20:28:13 +0100 Subject: [PATCH 3/4] Improve post_request node documentation Change doc comment to describe the node's purpose rather than focusing only on the "Discard Result" parameter. Now clearly states this is an HTTP POST operation with optional async behavior. --- node-graph/nodes/gstd/src/wasm_application_io.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node-graph/nodes/gstd/src/wasm_application_io.rs b/node-graph/nodes/gstd/src/wasm_application_io.rs index 1183c14f89..7a95980cad 100644 --- a/node-graph/nodes/gstd/src/wasm_application_io.rs +++ b/node-graph/nodes/gstd/src/wasm_application_io.rs @@ -65,7 +65,7 @@ async fn get_request(_: impl Ctx, _primary: (), #[name("URL")] url: String, disc response.text().await.ok().unwrap_or_default() } -/// "Discard Result" runs asynchronously in the background. Useful for fire-and-forget operations like logging, webhooks, or notifications. +/// Fetches data from a URL via HTTP GET. When "Discard Result" is enabled, runs asynchronously without waiting for a response. #[node_macro::node(category("Web Request"))] async fn post_request(_: impl Ctx, _primary: (), #[name("URL")] url: String, body: Vec, discard_result: bool) -> String { #[cfg(target_family = "wasm")] From e32e01efdd8496b6297c02531cf2b843cd36929e Mon Sep 17 00:00:00 2001 From: Polyglot Date: Tue, 2 Dec 2025 07:42:37 +0100 Subject: [PATCH 4/4] Fix post_request documentation error Corrected doc comment to say "HTTP POST" instead of "HTTP GET" since this function performs POST requests with binary data. --- node-graph/nodes/gstd/src/wasm_application_io.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node-graph/nodes/gstd/src/wasm_application_io.rs b/node-graph/nodes/gstd/src/wasm_application_io.rs index 7a95980cad..dcf6c563e9 100644 --- a/node-graph/nodes/gstd/src/wasm_application_io.rs +++ b/node-graph/nodes/gstd/src/wasm_application_io.rs @@ -65,7 +65,7 @@ async fn get_request(_: impl Ctx, _primary: (), #[name("URL")] url: String, disc response.text().await.ok().unwrap_or_default() } -/// Fetches data from a URL via HTTP GET. When "Discard Result" is enabled, runs asynchronously without waiting for a response. +/// Sends binary data to a URL via HTTP POST. When "Discard Result" is enabled, runs asynchronously without waiting for a response. #[node_macro::node(category("Web Request"))] async fn post_request(_: impl Ctx, _primary: (), #[name("URL")] url: String, body: Vec, discard_result: bool) -> String { #[cfg(target_family = "wasm")]