diff options
| author | s-ol <s+removethis@s-ol.nu> | 2026-01-17 21:15:58 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2026-01-17 21:45:04 +0000 |
| commit | 80a09fa39b8971bf8aa5f5300558d8bae097675f (patch) | |
| tree | f2baad41c091a8f6ac532d2ca5f0d1a23faab2e8 | |
| parent | file I/O (diff) | |
| download | nodetoy-80a09fa39b8971bf8aa5f5300558d8bae097675f.tar.gz nodetoy-80a09fa39b8971bf8aa5f5300558d8bae097675f.zip | |
add examples
| -rw-r--r-- | Cargo.lock | 7 | ||||
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | src/examples/circle.nt.json | 1 | ||||
| -rw-r--r-- | src/examples/grid.nt.json | 1 | ||||
| -rw-r--r-- | src/examples/shadertoy_plasma.nt.json | 1 | ||||
| -rw-r--r-- | src/examples/uv_ramp.nt.json | 1 | ||||
| -rw-r--r-- | src/main.rs | 46 |
7 files changed, 50 insertions, 8 deletions
@@ -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", @@ -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(); } |
