aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2026-01-17 21:15:58 +0000
committers-ol <s+removethis@s-ol.nu>2026-01-17 21:45:04 +0000
commit80a09fa39b8971bf8aa5f5300558d8bae097675f (patch)
treef2baad41c091a8f6ac532d2ca5f0d1a23faab2e8
parentfile I/O (diff)
downloadnodetoy-80a09fa39b8971bf8aa5f5300558d8bae097675f.tar.gz
nodetoy-80a09fa39b8971bf8aa5f5300558d8bae097675f.zip
add examples
-rw-r--r--Cargo.lock7
-rw-r--r--Cargo.toml1
-rw-r--r--src/examples/circle.nt.json1
-rw-r--r--src/examples/grid.nt.json1
-rw-r--r--src/examples/shadertoy_plasma.nt.json1
-rw-r--r--src/examples/uv_ramp.nt.json1
-rw-r--r--src/main.rs46
7 files changed, 50 insertions, 8 deletions
diff --git a/Cargo.lock b/Cargo.lock
index e46a92d..bccfffc 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1682,6 +1682,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"
[[package]]
+name = "lazy_static"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+
+[[package]]
name = "libc"
version = "0.2.178"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1904,6 +1910,7 @@ dependencies = [
"egui-snarl",
"enum_dispatch",
"itertools",
+ "lazy_static",
"log",
"rfd",
"serde",
diff --git a/Cargo.toml b/Cargo.toml
index 3f87f95..41d3c4a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,6 +11,7 @@ egui-snarl = { version = "0.9", features = ["serde", "egui-probe"] }
# encase = "0.12.0"
enum_dispatch = "0.3.13"
itertools = "0.14.0"
+lazy_static = "1.5.0"
log = { version = "0.4.29", features = ["serde", "std"] }
rfd = "0.17.2"
serde = { version = "1.0", features = ["derive"] }
diff --git a/src/examples/circle.nt.json b/src/examples/circle.nt.json
new file mode 100644
index 0000000..7b23fd6
--- /dev/null
+++ b/src/examples/circle.nt.json
@@ -0,0 +1 @@
+{"nodes":{"0":{"value":{"Input":"UV"},"pos":{"x":23.0,"y":276.0},"open":true},"1":{"value":{"Output":null},"pos":{"x":719.9373,"y":317.1626},"open":true},"2":{"value":{"Builtin":{"BinArithmetic":"Subtract"}},"pos":{"x":262.84097,"y":291.12704},"open":true},"3":{"value":{"Constant":{"Float":0.5}},"pos":{"x":32.98228,"y":373.1446},"open":true},"4":{"value":{"Builtin":{"Length":null}},"pos":{"x":442.7501,"y":315.54358},"open":true},"5":{"value":{"Builtin":{"Step":null}},"pos":{"x":600.6585,"y":313.66373},"open":true},"6":{"value":{"Constant":{"Float":0.25}},"pos":{"x":405.15283,"y":393.55762},"open":true}},"wires":[{"out_pin":{"node":3,"output":0},"in_pin":{"node":2,"input":1}},{"out_pin":{"node":0,"output":0},"in_pin":{"node":2,"input":0}},{"out_pin":{"node":4,"output":0},"in_pin":{"node":5,"input":0}},{"out_pin":{"node":2,"output":0},"in_pin":{"node":4,"input":0}},{"out_pin":{"node":6,"output":0},"in_pin":{"node":5,"input":1}},{"out_pin":{"node":5,"output":0},"in_pin":{"node":1,"input":0}}]} \ No newline at end of file
diff --git a/src/examples/grid.nt.json b/src/examples/grid.nt.json
new file mode 100644
index 0000000..bce2f2f
--- /dev/null
+++ b/src/examples/grid.nt.json
@@ -0,0 +1 @@
+{"nodes":{"0":{"value":{"Input":"UV"},"pos":{"x":23.0,"y":276.0},"open":true},"1":{"value":{"Output":null},"pos":{"x":969.4376,"y":279.88113},"open":true},"2":{"value":{"Builtin":{"BinArithmetic":"Subtract"}},"pos":{"x":563.9617,"y":233.77068},"open":true},"3":{"value":{"Constant":{"Float":0.5}},"pos":{"x":390.50125,"y":136.68448},"open":true},"4":{"value":{"Builtin":{"Length":null}},"pos":{"x":722.36237,"y":256.75336},"open":true},"5":{"value":{"Builtin":{"Step":null}},"pos":{"x":857.32837,"y":264.91104},"open":true},"6":{"value":{"Constant":{"Float":0.3}},"pos":{"x":836.6884,"y":469.34085},"open":true},"7":{"value":{"Constant":{"Float":5.0}},"pos":{"x":85.44553,"y":179.8347},"open":true},"8":{"value":{"Builtin":{"BinArithmetic":"Multiply"}},"pos":{"x":275.5028,"y":255.55971},"open":true},"9":{"value":{"Builtin":{"Thru1":"Fract"}},"pos":{"x":437.21582,"y":241.2209},"open":true},"11":{"value":{"Builtin":{"VecVecToScalar":"Dot"}},"pos":{"x":568.6812,"y":334.2151},"open":true},"12":{"value":{"Builtin":{"BinArithmetic":"Add"}},"pos":{"x":697.3367,"y":361.72086},"open":true},"13":{"value":{"Constant":{"Vec2":[1.0,7.0]}},"pos":{"x":407.19614,"y":398.0998},"open":true},"14":{"value":{"Input":"Time"},"pos":{"x":411.6325,"y":494.81256},"open":true},"15":{"value":{"Builtin":{"Thru1":"Cos"}},"pos":{"x":807.3596,"y":375.0301},"open":true},"16":{"value":{"Builtin":{"Thru1":"Abs"}},"pos":{"x":953.7607,"y":378.5792},"open":true},"17":{"value":{"Builtin":{"BinArithmetic":"Multiply"}},"pos":{"x":1046.0377,"y":403.4229},"open":true},"18":{"value":{"Builtin":{"Thru1":"Floor"}},"pos":{"x":432.92688,"y":317.35666},"open":true}},"wires":[{"out_pin":{"node":4,"output":0},"in_pin":{"node":5,"input":0}},{"out_pin":{"node":5,"output":0},"in_pin":{"node":1,"input":0}},{"out_pin":{"node":14,"output":0},"in_pin":{"node":12,"input":1}},{"out_pin":{"node":16,"output":0},"in_pin":{"node":17,"input":0}},{"out_pin":{"node":18,"output":0},"in_pin":{"node":11,"input":0}},{"out_pin":{"node":8,"output":0},"in_pin":{"node":18,"input":0}},{"out_pin":{"node":12,"output":0},"in_pin":{"node":15,"input":0}},{"out_pin":{"node":17,"output":0},"in_pin":{"node":5,"input":1}},{"out_pin":{"node":15,"output":0},"in_pin":{"node":16,"input":0}},{"out_pin":{"node":0,"output":0},"in_pin":{"node":8,"input":1}},{"out_pin":{"node":13,"output":0},"in_pin":{"node":11,"input":1}},{"out_pin":{"node":2,"output":0},"in_pin":{"node":4,"input":0}},{"out_pin":{"node":8,"output":0},"in_pin":{"node":9,"input":0}},{"out_pin":{"node":6,"output":0},"in_pin":{"node":17,"input":1}},{"out_pin":{"node":7,"output":0},"in_pin":{"node":8,"input":0}},{"out_pin":{"node":3,"output":0},"in_pin":{"node":2,"input":0}},{"out_pin":{"node":9,"output":0},"in_pin":{"node":2,"input":1}},{"out_pin":{"node":11,"output":0},"in_pin":{"node":12,"input":0}}]} \ No newline at end of file
diff --git a/src/examples/shadertoy_plasma.nt.json b/src/examples/shadertoy_plasma.nt.json
new file mode 100644
index 0000000..bc7a97a
--- /dev/null
+++ b/src/examples/shadertoy_plasma.nt.json
@@ -0,0 +1 @@
+{"nodes":{"0":{"value":{"Input":"UV"},"pos":{"x":163.98965,"y":294.79865},"open":true},"1":{"value":{"Output":null},"pos":{"x":1357.2115,"y":327.50165},"open":true},"2":{"value":{"Builtin":{"BinArithmetic":"Multiply"}},"pos":{"x":1100.7025,"y":315.54364},"open":true},"3":{"value":{"Constant":{"Float":0.5}},"pos":{"x":922.1152,"y":389.79797},"open":true},"4":{"value":{"Builtin":{"BinArithmetic":"Add"}},"pos":{"x":1241.6924,"y":324.00272},"open":true},"7":{"value":{"Input":"Time"},"pos":{"x":549.9027,"y":214.97101},"open":true},"8":{"value":{"Conversion":{"SplitVector":null}},"pos":{"x":357.21643,"y":295.80508},"open":true},"9":{"value":{"Conversion":{"CombineVector":null}},"pos":{"x":530.1639,"y":293.92538},"open":true},"10":{"value":{"Builtin":{"BinArithmetic":"Add"}},"pos":{"x":761.3871,"y":255.3878},"open":true},"11":{"value":{"Builtin":{"BinArithmetic":"Add"}},"pos":{"x":875.119,"y":307.0838},"open":true},"12":{"value":{"Constant":{"Vec3":[0.0,2.0,4.0]}},"pos":{"x":726.6099,"y":349.38098},"open":true},"13":{"value":{"Builtin":{"Thru1":"Cos"}},"pos":{"x":988.8504,"y":308.02408},"open":true}},"wires":[{"out_pin":{"node":12,"output":0},"in_pin":{"node":11,"input":1}},{"out_pin":{"node":4,"output":0},"in_pin":{"node":1,"input":0}},{"out_pin":{"node":8,"output":1},"in_pin":{"node":9,"input":1}},{"out_pin":{"node":11,"output":0},"in_pin":{"node":13,"input":0}},{"out_pin":{"node":9,"output":0},"in_pin":{"node":10,"input":1}},{"out_pin":{"node":3,"output":0},"in_pin":{"node":2,"input":1}},{"out_pin":{"node":8,"output":0},"in_pin":{"node":9,"input":2}},{"out_pin":{"node":3,"output":0},"in_pin":{"node":4,"input":1}},{"out_pin":{"node":7,"output":0},"in_pin":{"node":10,"input":0}},{"out_pin":{"node":13,"output":0},"in_pin":{"node":2,"input":0}},{"out_pin":{"node":0,"output":0},"in_pin":{"node":8,"input":0}},{"out_pin":{"node":2,"output":0},"in_pin":{"node":4,"input":0}},{"out_pin":{"node":8,"output":0},"in_pin":{"node":9,"input":0}},{"out_pin":{"node":10,"output":0},"in_pin":{"node":11,"input":0}}]} \ No newline at end of file
diff --git a/src/examples/uv_ramp.nt.json b/src/examples/uv_ramp.nt.json
new file mode 100644
index 0000000..6a7125c
--- /dev/null
+++ b/src/examples/uv_ramp.nt.json
@@ -0,0 +1 @@
+{"nodes":{"0":{"value":{"Input":"UV"},"pos":{"x":47.4382,"y":273.1802},"open":true},"1":{"value":{"Output":null},"pos":{"x":236.81255,"y":277.68546},"open":true}},"wires":[{"out_pin":{"node":0,"output":0},"in_pin":{"node":1,"input":0}}]} \ No newline at end of file
diff --git a/src/main.rs b/src/main.rs
index 25c6062..e9eb1e1 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -5,8 +5,9 @@ use egui_snarl::{
InPin, NodeId, OutPin, Snarl,
ui::{NodeLayout, PinInfo, PinPlacement, SnarlStyle, SnarlViewer, SnarlWidget},
};
-use library::NodeIndex;
+use lazy_static::lazy_static;
use log::*;
+use std::collections::HashMap;
mod library;
mod node;
@@ -16,6 +17,7 @@ mod types;
#[cfg(target_arch = "wasm32")]
mod wasm;
+use library::NodeIndex;
use node::{AnyNode, ConcreteNode};
use snarl_ext::{Compilable, WithSignatures};
use types::{Dimension, FloatPrecision, ScalarType, Type};
@@ -160,6 +162,21 @@ pub struct App {
preview: preview::Custom3d,
}
+lazy_static! {
+ static ref EXAMPLES: HashMap<&'static str, &'static str> = {
+ let mut m = HashMap::new();
+
+ m.insert("UV Ramp", include_str!("./examples/uv_ramp.nt.json"));
+ m.insert("Circle", include_str!("./examples/circle.nt.json"));
+ m.insert(
+ "Shadertoy Plasma",
+ include_str!("./examples/shadertoy_plasma.nt.json"),
+ );
+ m.insert("Circle Grid", include_str!("./examples/grid.nt.json"));
+ m
+ };
+}
+
const fn default_style() -> SnarlStyle {
SnarlStyle {
node_layout: Some(NodeLayout::coil()),
@@ -194,13 +211,12 @@ impl App {
pub fn new(cx: &eframe::CreationContext) -> Self {
cx.egui_ctx.style_mut(|style| style.animation_time *= 10.0);
- let snarl = cx.storage.map_or_else(Snarl::new, |storage| {
- storage
- .get_string("snarl")
- .and_then(|snarl| serde_json::from_str(&snarl).ok())
- .unwrap_or_default()
- });
- // let snarl = Snarl::new();
+ let snarl: Snarl<AnyNode> = cx
+ .storage
+ .and_then(|storage| storage.get_string("snarl"))
+ .or(EXAMPLES.get("Shadertoy Plasma").map(|s| s.to_string()))
+ .and_then(|data| serde_json::from_str(&data).ok())
+ .unwrap_or_default();
App {
snarl,
@@ -238,6 +254,18 @@ impl eframe::App for App {
.unwrap();
}
+ ui.menu_button("Load Example", |ui| {
+ for label in EXAMPLES.keys() {
+ if ui.button(*label).clicked() {
+ self.snarl =
+ serde_json::from_str(EXAMPLES.get(label).unwrap()).unwrap();
+ self.viewer.dirty = true;
+ }
+ }
+ });
+
+ ui.separator();
+
#[cfg(not(target_arch = "wasm32"))]
if ui.button("Save").clicked() {
if let Some(path) = rfd::FileDialog::new()
@@ -255,6 +283,8 @@ impl eframe::App for App {
.expect("successful download");
}
+ ui.separator();
+
if ui.button("Clear All").clicked() {
self.snarl = Snarl::default();
}