From 2377240d07cb8c6cd8c910cc3b7b405d159e782e Mon Sep 17 00:00:00 2001 From: isiko Date: Fri, 11 Aug 2023 11:11:36 +0200 Subject: [PATCH] Add more math nodes (#1378) * Adds Max, Min and Equal Nodes * Add LogToConsoleNode Logs the data given as the input to the browser console and returns it as the output --- .../document_node_types.rs | 45 +++++++++++++++++++ .../node_properties.rs | 27 +++++++++++ node-graph/gcore/src/lib.rs | 1 + node-graph/gcore/src/logic.rs | 9 ++++ node-graph/gcore/src/ops.rs | 36 +++++++++++++++ .../interpreted-executor/src/node_registry.rs | 16 ++++++- 6 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 node-graph/gcore/src/logic.rs diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/document_node_types.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/document_node_types.rs index 7eabcd68..8b0a340e 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/document_node_types.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/document_node_types.rs @@ -1745,6 +1745,42 @@ fn static_nodes() -> Vec { properties: node_properties::exponent_properties, ..Default::default() }, + DocumentNodeType { + name: "Max", + category: "Math", + identifier: NodeImplementation::proto("graphene_core::ops::MaxParameterNode<_>"), + inputs: vec![ + DocumentInputType::value("First", TaggedValue::F32(0.), true), + DocumentInputType::value("Second", TaggedValue::F32(0.), true), + ], + outputs: vec![DocumentOutputType::new("Output", FrontendGraphDataType::Number)], + properties: node_properties::max_properties, + ..Default::default() + }, + DocumentNodeType { + name: "Min", + category: "Math", + identifier: NodeImplementation::proto("graphene_core::ops::MinParameterNode<_>"), + inputs: vec![ + DocumentInputType::value("First", TaggedValue::F32(0.), true), + DocumentInputType::value("Second", TaggedValue::F32(0.), true), + ], + outputs: vec![DocumentOutputType::new("Output", FrontendGraphDataType::Number)], + properties: node_properties::min_properties, + ..Default::default() + }, + DocumentNodeType { + name: "Equality", + category: "Math", + identifier: NodeImplementation::proto("graphene_core::ops::EqParameterNode<_>"), + inputs: vec![ + DocumentInputType::value("First", TaggedValue::F32(0.), true), + DocumentInputType::value("Second", TaggedValue::F32(0.), true), + ], + outputs: vec![DocumentOutputType::new("Output", FrontendGraphDataType::Number)], + properties: node_properties::eq_properties, + ..Default::default() + }, DocumentNodeType { name: "Modulo", category: "Math", @@ -1757,6 +1793,15 @@ fn static_nodes() -> Vec { properties: node_properties::modulo_properties, ..Default::default() }, + DocumentNodeType { + name: "Log to Console", + category: "Logic", + identifier: NodeImplementation::proto("graphene_core::logic::LogToConsoleNode"), + inputs: vec![DocumentInputType::value("First", TaggedValue::String("Not Connected to a value yet".into()), true)], + outputs: vec![DocumentOutputType::new("Output", FrontendGraphDataType::General)], + properties: node_properties::no_properties, + ..Default::default() + }, (*IMAGINATE_NODE).clone(), DocumentNodeType { name: "Unit Circle Generator", diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs index 31d0566b..0a7bcd8c 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs @@ -1022,6 +1022,33 @@ pub fn exponent_properties(document_node: &DocumentNode, node_id: NodeId, _conte vec![operand("Power", 1)] } +pub fn max_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { + let operand = |name: &str, index| { + let widgets = number_widget(document_node, node_id, index, name, NumberInput::default(), true); + + LayoutGroup::Row { widgets } + }; + vec![operand("Maximum", 1)] +} + +pub fn min_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { + let operand = |name: &str, index| { + let widgets = number_widget(document_node, node_id, index, name, NumberInput::default(), true); + + LayoutGroup::Row { widgets } + }; + vec![operand("Minimum", 1)] +} + +pub fn eq_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { + let operand = |name: &str, index| { + let widgets = number_widget(document_node, node_id, index, name, NumberInput::default(), true); + + LayoutGroup::Row { widgets } + }; + vec![operand("Equality", 1)] +} + pub fn modulo_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { let operand = |name: &str, index| { let widgets = number_widget(document_node, node_id, index, name, NumberInput::default(), true); diff --git a/node-graph/gcore/src/lib.rs b/node-graph/gcore/src/lib.rs index 1c2fdd31..3f2b35b5 100644 --- a/node-graph/gcore/src/lib.rs +++ b/node-graph/gcore/src/lib.rs @@ -9,6 +9,7 @@ extern crate log; pub mod consts; pub mod generic; +pub mod logic; pub mod ops; pub mod structural; #[cfg(feature = "std")] diff --git a/node-graph/gcore/src/logic.rs b/node-graph/gcore/src/logic.rs new file mode 100644 index 00000000..2d56e313 --- /dev/null +++ b/node-graph/gcore/src/logic.rs @@ -0,0 +1,9 @@ +use crate::Node; + +pub struct LogToConsoleNode; + +#[node_macro::node_fn(LogToConsoleNode)] +fn log_to_console(value: T) -> T { + debug!("{:#?}", value); + value +} diff --git a/node-graph/gcore/src/ops.rs b/node-graph/gcore/src/ops.rs index 600aed6c..5e510f00 100644 --- a/node-graph/gcore/src/ops.rs +++ b/node-graph/gcore/src/ops.rs @@ -83,6 +83,42 @@ where first.pow(second) } +// Minimum +pub struct MinParameterNode { + second: Second, +} + +#[node_macro::node_fn(MinParameterNode)] +fn min(first: T, second: T) -> T { + match first < second { + true => first, + false => second, + } +} + +// Maximum +pub struct MaxParameterNode { + second: Second, +} + +#[node_macro::node_fn(MaxParameterNode)] +fn max(first: T, second: T) -> T { + match first > second { + true => first, + false => second, + } +} + +// Equality +pub struct EqParameterNode { + second: Second, +} + +#[node_macro::node_fn(EqParameterNode)] +fn eq(first: T, second: T) -> bool { + first == second +} + // Modulo pub struct ModuloParameterNode { second: Second, diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index e3e2d200..7b019cbe 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -227,7 +227,12 @@ fn node_registry() -> HashMap, input: f32, params: [f32]), register_node!(graphene_core::ops::ExponentParameterNode<_>, input: &f32, params: [f32]), register_node!(graphene_core::ops::ExponentParameterNode<_>, input: f32, params: [&f32]), - register_node!(graphene_core::ops::ExponentParameterNode<_>, input: &f32, params: [&f32]), + register_node!(graphene_core::ops::MaxParameterNode<_>, input: u32, params: [u32]), + register_node!(graphene_core::ops::MaxParameterNode<_>, input: f32, params: [f32]), + register_node!(graphene_core::ops::MinParameterNode<_>, input: u32, params: [u32]), + register_node!(graphene_core::ops::MinParameterNode<_>, input: f32, params: [f32]), + register_node!(graphene_core::ops::EqParameterNode<_>, input: u32, params: [u32]), + register_node!(graphene_core::ops::EqParameterNode<_>, input: f32, params: [f32]), register_node!(graphene_core::ops::ModuloParameterNode<_>, input: u32, params: [u32]), register_node!(graphene_core::ops::ModuloParameterNode<_>, input: &u32, params: [u32]), register_node!(graphene_core::ops::ModuloParameterNode<_>, input: u32, params: [&u32]), @@ -237,6 +242,15 @@ fn node_registry() -> HashMap, input: f32, params: [&f32]), register_node!(graphene_core::ops::ModuloParameterNode<_>, input: &f32, params: [&f32]), register_node!(graphene_core::ops::SomeNode, input: WasmEditorApi, params: []), + register_node!(graphene_core::logic::LogToConsoleNode, input: bool, params: []), + register_node!(graphene_core::logic::LogToConsoleNode, input: f32, params: []), + register_node!(graphene_core::logic::LogToConsoleNode, input: f64, params: []), + register_node!(graphene_core::logic::LogToConsoleNode, input: u32, params: []), + register_node!(graphene_core::logic::LogToConsoleNode, input: u64, params: []), + register_node!(graphene_core::logic::LogToConsoleNode, input: String, params: []), + register_node!(graphene_core::logic::LogToConsoleNode, input: DVec2, params: []), + register_node!(graphene_core::logic::LogToConsoleNode, input: VectorData, params: []), + register_node!(graphene_core::logic::LogToConsoleNode, input: DAffine2, params: []), async_node!(graphene_core::ops::IntoNode<_, ImageFrame>, input: ImageFrame, output: ImageFrame, params: []), async_node!(graphene_core::ops::IntoNode<_, ImageFrame>, input: ImageFrame, output: ImageFrame, params: []), #[cfg(feature = "gpu")]