aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2026-01-17 23:28:08 +0000
committers-ol <s+removethis@s-ol.nu>2026-01-17 23:28:08 +0000
commiteed80488715138514ae33ef050cc9fa08c1ee595 (patch)
tree609eded20f9d39b3389e52ca446cdba49022c0ef
parentfix init on load, resizable preview (diff)
downloadnodetoy-eed80488715138514ae33ef050cc9fa08c1ee595.tar.gz
nodetoy-eed80488715138514ae33ef050cc9fa08c1ee595.zip
better node picker UX
-rw-r--r--src/examples/circle.nt.json2
-rw-r--r--src/examples/grid.nt.json2
-rw-r--r--src/examples/shadertoy_plasma.nt.json2
-rw-r--r--src/library.rs81
-rw-r--r--src/node.rs19
-rw-r--r--src/preview.rs2
-rw-r--r--src/types.rs50
7 files changed, 125 insertions, 33 deletions
diff --git a/src/examples/circle.nt.json b/src/examples/circle.nt.json
index 7b23fd6..091aa59 100644
--- a/src/examples/circle.nt.json
+++ b/src/examples/circle.nt.json
@@ -1 +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
+{"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":{"Arithmetic":"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}}]}
diff --git a/src/examples/grid.nt.json b/src/examples/grid.nt.json
index bce2f2f..552a6d4 100644
--- a/src/examples/grid.nt.json
+++ b/src/examples/grid.nt.json
@@ -1 +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
+{"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":{"Arithmetic":"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":{"Arithmetic":"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":{"Arithmetic":"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":{"Arithmetic":"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}}]}
diff --git a/src/examples/shadertoy_plasma.nt.json b/src/examples/shadertoy_plasma.nt.json
index bc7a97a..0df1b75 100644
--- a/src/examples/shadertoy_plasma.nt.json
+++ b/src/examples/shadertoy_plasma.nt.json
@@ -1 +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
+{"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":{"Arithmetic":"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":{"Arithmetic":"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":{"Arithmetic":"Add"},"pos":{"x":761.3871,"y":255.3878},"open":true},"11":{"value":{"Arithmetic":"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}}]}
diff --git a/src/library.rs b/src/library.rs
index 9764ad5..a45ff24 100644
--- a/src/library.rs
+++ b/src/library.rs
@@ -56,7 +56,6 @@ pub trait NodeIndex: Sized + fmt::Display {
}
}
});
-
res
}
}
@@ -170,11 +169,7 @@ pub enum BinArithmetic {
Multiply,
Divide,
}
-impl BinArithmetic {
- pub fn all() -> impl Iterator<Item = Self> {
- [Self::Add, Self::Subtract, Self::Multiply, Self::Divide].into_iter()
- }
-}
+
impl FixedNode for BinArithmetic {
fn all_signatures(&self) -> Box<dyn Iterator<Item = TypeSignature>> {
// @TODO: matrix and matrix/vector operations
@@ -215,6 +210,25 @@ impl FixedNode for BinArithmetic {
}
}
+impl NodeIndex for BinArithmetic {
+ const TITLE: &'static str = "Arithmetic";
+
+ fn all() -> impl Iterator<Item = Self> {
+ [Self::Add, Self::Subtract, Self::Multiply, Self::Divide].into_iter()
+ }
+}
+
+impl fmt::Display for BinArithmetic {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ Self::Add => write!(f, "+ Add"),
+ Self::Subtract => write!(f, "- Subtract"),
+ Self::Multiply => write!(f, "* Multiply"),
+ Self::Divide => write!(f, "/ Divide"),
+ }
+ }
+}
+
/// 1-1 thru operations
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum Thru1 {
@@ -586,7 +600,6 @@ impl FixedNode for Cross {
#[enum_dispatch(ConcreteNode)]
#[derive(Copy, Clone, PartialEq, Serialize, Deserialize)]
pub enum BuiltinFunction {
- BinArithmetic(BinArithmetic),
Thru1(Thru1),
Mod(Mod),
Modf(Modf),
@@ -605,8 +618,7 @@ impl NodeIndex for BuiltinFunction {
const TITLE: &'static str = "Builtin Functions";
fn all() -> impl Iterator<Item = Self> {
- BinArithmetic::all()
- .map(Self::from)
+ std::iter::empty()
.chain(Thru1::all().map(Self::from))
.chain(Mod::all().map(Self::from))
.chain(Modf::all().map(Self::from))
@@ -625,7 +637,6 @@ impl NodeIndex for BuiltinFunction {
let mut res: Option<Self> = None;
ui.menu_button(Self::TITLE, |ui| {
for (title, nodes) in [
- ("Operators", BinArithmetic::all().map(Self::from).collect()),
(
"Trigonometry",
vec![
@@ -703,7 +714,6 @@ impl NodeIndex for BuiltinFunction {
impl fmt::Display for BuiltinFunction {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
- Self::BinArithmetic(x) => fmt::Debug::fmt(x, f),
Self::Thru1(x) => fmt::Debug::fmt(x, f),
Self::Mod(x) => fmt::Debug::fmt(x, f),
Self::Modf(x) => fmt::Debug::fmt(x, f),
@@ -869,17 +879,16 @@ where
T: fmt::Display,
{
fn show_editor(&mut self, ui: &mut egui::Ui) -> egui::Response {
- let mut response = ui.response();
- ui.vertical(|ui| {
- for (val, label) in self.0.iter_mut().zip(COMPONENT_LABELS) {
- ui.horizontal(|ui| {
+ egui::Grid::new("grid")
+ .num_columns(2)
+ .show(ui, |ui| {
+ for (val, label) in self.0.iter_mut().zip(COMPONENT_LABELS) {
ui.label(label);
- response |= ui.add(Constant::<T>::make_widget(val));
- });
- }
- });
-
- response
+ ui.add(Constant::<T>::make_widget(val));
+ ui.end_row();
+ }
+ })
+ .response
}
}
@@ -984,6 +993,36 @@ impl NodeIndex for AnyConstant {
]
.into_iter()
}
+
+ fn pick_node(ui: &mut egui::Ui) -> Option<Self> {
+ ui.menu_button(Self::TITLE, |ui| {
+ Type::pick(ui).map(|t| match t {
+ Scalar(Float(Single)) => Self::Float(Default::default()),
+ Vector(Float(Single), D2) => Self::Vec2(Default::default()),
+ Vector(Float(Single), D3) => Self::Vec3(Default::default()),
+ Vector(Float(Single), D4) => Self::Vec4(Default::default()),
+ Scalar(Float(Double)) => Self::Double(Default::default()),
+ Vector(Float(Double), D2) => Self::DVec2(Default::default()),
+ Vector(Float(Double), D3) => Self::DVec3(Default::default()),
+ Vector(Float(Double), D4) => Self::DVec4(Default::default()),
+ Scalar(Int) => Self::Int(Default::default()),
+ Vector(Int, D2) => Self::IVec2(Default::default()),
+ Vector(Int, D3) => Self::IVec3(Default::default()),
+ Vector(Int, D4) => Self::IVec4(Default::default()),
+ Scalar(UInt) => Self::UInt(Default::default()),
+ Vector(UInt, D2) => Self::UVec2(Default::default()),
+ Vector(UInt, D3) => Self::UVec3(Default::default()),
+ Vector(UInt, D4) => Self::UVec4(Default::default()),
+ Scalar(Bool) => Self::Bool(Default::default()),
+ Vector(Bool, D2) => Self::BVec2(Default::default()),
+ Vector(Bool, D3) => Self::BVec3(Default::default()),
+ Vector(Bool, D4) => Self::BVec4(Default::default()),
+ Matrix(_, _, _) => unreachable!(),
+ })
+ })
+ .inner
+ .flatten()
+ }
}
impl fmt::Display for AnyConstant {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
diff --git a/src/node.rs b/src/node.rs
index 859799b..659d67f 100644
--- a/src/node.rs
+++ b/src/node.rs
@@ -34,6 +34,7 @@ pub enum AnyNode {
Constant(library::AnyConstant),
Conversion(library::Conversion),
Input(library::Input),
+ Arithmetic(library::BinArithmetic),
Builtin(library::BuiltinFunction),
Output(library::Output),
}
@@ -52,13 +53,16 @@ impl NodeIndex for AnyNode {
fn pick_node(ui: &mut egui::Ui) -> Option<Self> {
ui.label("Add node");
- let a = library::AnyConstant::pick_node(ui).map(AnyNode::from);
- let b = library::Conversion::pick_node(ui).map(AnyNode::from);
- let c = library::Input::pick_node(ui).map(AnyNode::from);
- let d = library::Output::pick_node(ui).map(AnyNode::from);
- let e = library::BuiltinFunction::pick_node(ui).map(AnyNode::from);
-
- a.or(b).or(c).or(d).or(e)
+ None.or(library::AnyConstant::pick_node(ui).map(AnyNode::from))
+ .or(library::Input::pick_node(ui).map(AnyNode::from))
+ .or(library::Output::pick_node(ui).map(AnyNode::from))
+ .or({
+ ui.separator();
+ None
+ })
+ .or(library::BinArithmetic::pick_node(ui).map(AnyNode::from))
+ .or(library::Conversion::pick_node(ui).map(AnyNode::from))
+ .or(library::BuiltinFunction::pick_node(ui).map(AnyNode::from))
}
}
@@ -68,6 +72,7 @@ impl fmt::Display for AnyNode {
Self::Constant(x) => fmt::Display::fmt(x, f),
Self::Conversion(x) => fmt::Display::fmt(x, f),
Self::Input(x) => fmt::Display::fmt(x, f),
+ Self::Arithmetic(x) => fmt::Display::fmt(x, f),
Self::Builtin(x) => fmt::Display::fmt(x, f),
Self::Output(x) => fmt::Display::fmt(x, f),
}
diff --git a/src/preview.rs b/src/preview.rs
index 5b27144..b4109ce 100644
--- a/src/preview.rs
+++ b/src/preview.rs
@@ -48,7 +48,7 @@ void main() {
self.ready = true;
false
} else {
- have_shader
+ have_shader && !ui.ctx().will_discard()
}
}
}
diff --git a/src/types.rs b/src/types.rs
index b1ed2fb..5614ab7 100644
--- a/src/types.rs
+++ b/src/types.rs
@@ -14,6 +14,37 @@ pub enum ScalarType {
Bool,
}
+impl ScalarType {
+ const SCALARS: [Self; 5] = [
+ ScalarType::Float(FloatPrecision::Single),
+ ScalarType::Float(FloatPrecision::Double),
+ ScalarType::Int,
+ ScalarType::UInt,
+ ScalarType::Bool,
+ ];
+
+ pub fn pick(ui: &mut egui::Ui) -> Option<Self> {
+ for value in Self::SCALARS {
+ if ui.button(format!("{}", value)).clicked() {
+ return Some(value);
+ }
+ }
+
+ None
+ }
+}
+impl fmt::Display for ScalarType {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ ScalarType::Float(FloatPrecision::Single) => write!(f, "float"),
+ ScalarType::Float(FloatPrecision::Double) => write!(f, "double"),
+ ScalarType::Int => write!(f, "int"),
+ ScalarType::UInt => write!(f, "uint"),
+ ScalarType::Bool => write!(f, "bool"),
+ }
+ }
+}
+
#[derive(Copy, Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
#[repr(u8)]
pub enum Dimension {
@@ -23,7 +54,7 @@ pub enum Dimension {
}
impl fmt::Display for Dimension {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- write!(f, "{}", *self as u8)
+ write!(f, "{:?}", *self as u8)
}
}
impl Dimension {
@@ -59,6 +90,23 @@ impl Type {
Type::Matrix(p, _, _) => ScalarType::Float(*p),
}
}
+
+ pub fn pick(ui: &mut egui::Ui) -> Option<Self> {
+ let mut result: Option<Self> = ScalarType::pick(ui).map(Self::Scalar);
+
+ ui.separator();
+
+ for dim in [Dimension::D2, Dimension::D3, Dimension::D4] {
+ result = result.or(ui
+ .menu_button(format!("Vector {dim}"), |ui| {
+ ScalarType::pick(ui).map(|s| Self::Vector(s, dim))
+ })
+ .inner
+ .flatten());
+ }
+
+ result
+ }
}
impl fmt::Display for Type {