diff options
| author | s-ol <s+removethis@s-ol.nu> | 2026-01-17 23:28:08 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2026-01-17 23:28:08 +0000 |
| commit | eed80488715138514ae33ef050cc9fa08c1ee595 (patch) | |
| tree | 609eded20f9d39b3389e52ca446cdba49022c0ef | |
| parent | fix init on load, resizable preview (diff) | |
| download | nodetoy-eed80488715138514ae33ef050cc9fa08c1ee595.tar.gz nodetoy-eed80488715138514ae33ef050cc9fa08c1ee595.zip | |
better node picker UX
| -rw-r--r-- | src/examples/circle.nt.json | 2 | ||||
| -rw-r--r-- | src/examples/grid.nt.json | 2 | ||||
| -rw-r--r-- | src/examples/shadertoy_plasma.nt.json | 2 | ||||
| -rw-r--r-- | src/library.rs | 81 | ||||
| -rw-r--r-- | src/node.rs | 19 | ||||
| -rw-r--r-- | src/preview.rs | 2 | ||||
| -rw-r--r-- | src/types.rs | 50 |
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 { |
