From 945e7128b4b8b02db3e325dc6bdacd0408f778e0 Mon Sep 17 00:00:00 2001 From: Tyooughtul Date: Wed, 25 Feb 2026 10:10:58 +0800 Subject: [PATCH 1/5] fix: replace hardcoded input indices with ::INDEX constants Fixes #1490 --- .../graph_operation/transform_utils.rs | 43 +++++++++++++++---- .../document/graph_operation/utility_types.rs | 8 ++-- .../shape_gizmos/circle_arc_radius_handle.rs | 3 +- .../shape_gizmos/number_of_points_dial.rs | 3 +- .../gizmos/shape_gizmos/sweep_angle_gizmo.rs | 6 ++- .../common_functionality/shapes/arc_shape.rs | 4 +- .../shapes/arrow_shape.rs | 6 ++- .../shapes/circle_shape.rs | 3 +- .../shapes/ellipse_shape.rs | 6 ++- .../common_functionality/shapes/line_shape.rs | 6 ++- .../shapes/polygon_shape.rs | 6 ++- .../shapes/rectangle_shape.rs | 6 ++- .../shapes/shape_utility.rs | 6 +-- .../common_functionality/shapes/star_shape.rs | 6 ++- 14 files changed, 78 insertions(+), 34 deletions(-) diff --git a/editor/src/messages/portfolio/document/graph_operation/transform_utils.rs b/editor/src/messages/portfolio/document/graph_operation/transform_utils.rs index db4e110e77..ca3976cea0 100644 --- a/editor/src/messages/portfolio/document/graph_operation/transform_utils.rs +++ b/editor/src/messages/portfolio/document/graph_operation/transform_utils.rs @@ -2,7 +2,9 @@ use crate::messages::portfolio::document::utility_types::network_interface::{Inp use glam::{DAffine2, DVec2}; use graph_craft::document::value::TaggedValue; use graph_craft::document::{NodeId, NodeInput}; +use graphene_std::NodeInputDecleration; use graphene_std::subpath::Subpath; +use graphene_std::transform_nodes::transform::*; use graphene_std::vector::PointId; /// Convert an affine transform into the tuple `(scale, angle, translation, shear)` assuming `shear.y = 0`. @@ -37,10 +39,10 @@ pub fn update_transform(network_interface: &mut NodeNetworkInterface, node_id: & let rotation = rotation.to_degrees(); let shear = DVec2::new(shear.x.atan().to_degrees(), shear.y.atan().to_degrees()); - network_interface.set_input(&InputConnector::node(*node_id, 1), NodeInput::value(TaggedValue::DVec2(translation), false), &[]); - network_interface.set_input(&InputConnector::node(*node_id, 2), NodeInput::value(TaggedValue::F64(rotation), false), &[]); - network_interface.set_input(&InputConnector::node(*node_id, 3), NodeInput::value(TaggedValue::DVec2(scale), false), &[]); - network_interface.set_input(&InputConnector::node(*node_id, 4), NodeInput::value(TaggedValue::DVec2(shear), false), &[]); + network_interface.set_input(&InputConnector::node(*node_id, TranslationInput::INDEX), NodeInput::value(TaggedValue::DVec2(translation), false), &[]); + network_interface.set_input(&InputConnector::node(*node_id, RotationInput::INDEX), NodeInput::value(TaggedValue::F64(rotation), false), &[]); + network_interface.set_input(&InputConnector::node(*node_id, ScaleInput::INDEX), NodeInput::value(TaggedValue::DVec2(scale), false), &[]); + network_interface.set_input(&InputConnector::node(*node_id, SkewInput::INDEX), NodeInput::value(TaggedValue::DVec2(shear), false), &[]); } // TODO: This should be extracted from the graph at the location of the transform node. @@ -74,14 +76,31 @@ impl LayerBounds { /// Get the current affine transform from the transform node's inputs pub fn get_current_transform(inputs: &[NodeInput]) -> DAffine2 { - let translation = if let Some(&TaggedValue::DVec2(translation)) = inputs[1].as_value() { + const TRANSLATION_INDEX: usize = 1; + const ROTATION_INDEX: usize = 2; + const SCALE_INDEX: usize = 3; + const SKEW_INDEX: usize = 4; + + let translation = if let Some(&TaggedValue::DVec2(translation)) = inputs[TRANSLATION_INDEX].as_value() { translation } else { DVec2::ZERO }; - let rotation = if let Some(&TaggedValue::F64(rotation)) = inputs[2].as_value() { rotation } else { 0. }; - let scale = if let Some(&TaggedValue::DVec2(scale)) = inputs[3].as_value() { scale } else { DVec2::ONE }; - let shear = if let Some(&TaggedValue::DVec2(shear)) = inputs[4].as_value() { shear } else { DVec2::ZERO }; + let rotation = if let Some(&TaggedValue::F64(rotation)) = inputs[ROTATION_INDEX].as_value() { + rotation + } else { + 0. + }; + let scale = if let Some(&TaggedValue::DVec2(scale)) = inputs[SCALE_INDEX].as_value() { + scale + } else { + DVec2::ONE + }; + let shear = if let Some(&TaggedValue::DVec2(shear)) = inputs[SKEW_INDEX].as_value() { + shear + } else { + DVec2::ZERO + }; let rotation = rotation.to_radians(); let shear = DVec2::new(shear.x.to_radians().tan(), shear.y.to_radians().tan()); @@ -91,7 +110,13 @@ pub fn get_current_transform(inputs: &[NodeInput]) -> DAffine2 { /// Extract the current normalized pivot from the layer pub fn get_current_normalized_pivot(inputs: &[NodeInput]) -> DVec2 { - if let Some(&TaggedValue::DVec2(pivot)) = inputs[5].as_value() { pivot } else { DVec2::splat(0.5) } + const ORIGIN_OFFSET_INDEX: usize = 5; + + if let Some(&TaggedValue::DVec2(pivot)) = inputs[ORIGIN_OFFSET_INDEX].as_value() { + pivot + } else { + DVec2::splat(0.5) + } } /// Expand a bounds to avoid div zero errors diff --git a/editor/src/messages/portfolio/document/graph_operation/utility_types.rs b/editor/src/messages/portfolio/document/graph_operation/utility_types.rs index cb8c4608c0..9b5d24cde2 100644 --- a/editor/src/messages/portfolio/document/graph_operation/utility_types.rs +++ b/editor/src/messages/portfolio/document/graph_operation/utility_types.rs @@ -367,7 +367,7 @@ impl<'a> ModifyInputsContext<'a> { let Some(blend_node_id) = self.existing_proto_node_id(graphene_std::blending_nodes::blending::IDENTIFIER, true) else { return; }; - let input_connector = InputConnector::node(blend_node_id, 1); + let input_connector = InputConnector::node(blend_node_id, graphene_std::blending_nodes::blending::BlendModeInput::INDEX); self.set_input_with_refresh(input_connector, NodeInput::value(TaggedValue::BlendMode(blend_mode), false), false); } @@ -375,7 +375,7 @@ impl<'a> ModifyInputsContext<'a> { let Some(blend_node_id) = self.existing_proto_node_id(graphene_std::blending_nodes::blending::IDENTIFIER, true) else { return; }; - let input_connector = InputConnector::node(blend_node_id, 2); + let input_connector = InputConnector::node(blend_node_id, graphene_std::blending_nodes::blending::OpacityInput::INDEX); self.set_input_with_refresh(input_connector, NodeInput::value(TaggedValue::F64(opacity * 100.), false), false); } @@ -383,7 +383,7 @@ impl<'a> ModifyInputsContext<'a> { let Some(blend_node_id) = self.existing_proto_node_id(graphene_std::blending_nodes::blending::IDENTIFIER, true) else { return; }; - let input_connector = InputConnector::node(blend_node_id, 3); + let input_connector = InputConnector::node(blend_node_id, graphene_std::blending_nodes::blending::FillInput::INDEX); self.set_input_with_refresh(input_connector, NodeInput::value(TaggedValue::F64(fill * 100.), false), false); } @@ -392,7 +392,7 @@ impl<'a> ModifyInputsContext<'a> { let Some(clip_node_id) = self.existing_proto_node_id(graphene_std::blending_nodes::blending::IDENTIFIER, true) else { return; }; - let input_connector = InputConnector::node(clip_node_id, 4); + let input_connector = InputConnector::node(clip_node_id, graphene_std::blending_nodes::blending::ClipInput::INDEX); self.set_input_with_refresh(input_connector, NodeInput::value(TaggedValue::Bool(clip), false), false); } diff --git a/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/circle_arc_radius_handle.rs b/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/circle_arc_radius_handle.rs index 6152a6a5dd..9a50889ffc 100644 --- a/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/circle_arc_radius_handle.rs +++ b/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/circle_arc_radius_handle.rs @@ -11,6 +11,7 @@ use crate::messages::tool::common_functionality::shapes::shape_utility::{extract use glam::{DAffine2, DVec2}; use graph_craft::document::NodeInput; use graph_craft::document::value::TaggedValue; +use graphene_std::NodeInputDecleration; use std::collections::VecDeque; use std::f64::consts::FRAC_PI_2; @@ -165,7 +166,7 @@ impl RadiusHandle { self.previous_mouse_position = input.mouse.position; responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 1), + input_connector: InputConnector::node(node_id, graphene_std::vector::generator_nodes::circle::RadiusInput::INDEX), input: NodeInput::value(TaggedValue::F64(current_radius + net_delta), false), }); responses.add(NodeGraphMessage::RunDocumentGraph); diff --git a/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/number_of_points_dial.rs b/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/number_of_points_dial.rs index c6fef1fbda..679da36244 100644 --- a/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/number_of_points_dial.rs +++ b/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/number_of_points_dial.rs @@ -13,6 +13,7 @@ use crate::messages::tool::common_functionality::shapes::shape_utility::{extract use glam::{DAffine2, DVec2}; use graph_craft::document::NodeInput; use graph_craft::document::value::TaggedValue; +use graphene_std::NodeInputDecleration; use std::collections::VecDeque; use std::f64::consts::TAU; @@ -201,7 +202,7 @@ impl NumberOfPointsDial { let new_point_count = ((self.initial_points as i32) + (net_delta as i32)).max(3); responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 1), + input_connector: InputConnector::node(node_id, graphene_std::vector::generator_nodes::star::SidesInput::::INDEX), input: NodeInput::value(TaggedValue::U32(new_point_count as u32), false), }); responses.add(NodeGraphMessage::RunDocumentGraph); diff --git a/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/sweep_angle_gizmo.rs b/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/sweep_angle_gizmo.rs index efa4b18351..6b03b6f8ac 100644 --- a/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/sweep_angle_gizmo.rs +++ b/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/sweep_angle_gizmo.rs @@ -11,6 +11,8 @@ use crate::messages::tool::tool_messages::tool_prelude::*; use glam::DVec2; use graph_craft::document::value::TaggedValue; use graph_craft::document::{NodeId, NodeInput}; +use graphene_std::NodeInputDecleration; +use graphene_std::vector::generator_nodes::arc::*; use std::collections::VecDeque; use std::f64::consts::FRAC_PI_4; @@ -332,11 +334,11 @@ impl SweepAngleGizmo { self.snap_angles = Self::calculate_snap_angles(); responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 2), + input_connector: InputConnector::node(node_id, StartAngleInput::INDEX), input: NodeInput::value(TaggedValue::F64(start_angle), false), }); responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 3), + input_connector: InputConnector::node(node_id, SweepAngleInput::INDEX), input: NodeInput::value(TaggedValue::F64(sweep_angle), false), }); diff --git a/editor/src/messages/tool/common_functionality/shapes/arc_shape.rs b/editor/src/messages/tool/common_functionality/shapes/arc_shape.rs index 7eabb3c619..027a58fe30 100644 --- a/editor/src/messages/tool/common_functionality/shapes/arc_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/arc_shape.rs @@ -12,6 +12,8 @@ use crate::messages::tool::tool_messages::tool_prelude::*; use glam::DAffine2; use graph_craft::document::NodeInput; use graph_craft::document::value::TaggedValue; +use graphene_std::NodeInputDecleration; +use graphene_std::vector::generator_nodes::arc::*; use graphene_std::vector::misc::ArcType; use std::collections::VecDeque; @@ -172,7 +174,7 @@ impl Arc { } responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 1), + input_connector: InputConnector::node(node_id, RadiusInput::INDEX), input: NodeInput::value(TaggedValue::F64(radius), false), }); diff --git a/editor/src/messages/tool/common_functionality/shapes/arrow_shape.rs b/editor/src/messages/tool/common_functionality/shapes/arrow_shape.rs index 0858eddf59..6d07d2b821 100644 --- a/editor/src/messages/tool/common_functionality/shapes/arrow_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/arrow_shape.rs @@ -9,6 +9,8 @@ use crate::messages::tool::common_functionality::graph_modification_utils; use glam::DVec2; use graph_craft::document::NodeInput; use graph_craft::document::value::TaggedValue; +use graphene_std::NodeInputDecleration; +use graphene_std::vector::generator_nodes::arrow::*; use std::collections::VecDeque; #[derive(Default)] @@ -58,11 +60,11 @@ impl Arrow { // Update Arrow node start and end points with document space coordinates responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 1), + input_connector: InputConnector::node(node_id, StartInput::INDEX), input: NodeInput::value(TaggedValue::DVec2(start_document), false), }); responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 2), + input_connector: InputConnector::node(node_id, EndInput::INDEX), input: NodeInput::value(TaggedValue::DVec2(end_document), false), }); diff --git a/editor/src/messages/tool/common_functionality/shapes/circle_shape.rs b/editor/src/messages/tool/common_functionality/shapes/circle_shape.rs index 836f50f9e6..466d293a43 100644 --- a/editor/src/messages/tool/common_functionality/shapes/circle_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/circle_shape.rs @@ -12,6 +12,7 @@ use crate::messages::tool::tool_messages::tool_prelude::*; use glam::DAffine2; use graph_craft::document::NodeInput; use graph_craft::document::value::TaggedValue; +use graphene_std::NodeInputDecleration; #[derive(Clone, Debug, Default)] pub struct CircleGizmoHandler { @@ -107,7 +108,7 @@ impl Circle { let radius: f64 = if dimensions.x > dimensions.y { dimensions.y / 2. } else { dimensions.x / 2. }; responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 1), + input_connector: InputConnector::node(node_id, graphene_std::vector::generator_nodes::circle::RadiusInput::INDEX), input: NodeInput::value(TaggedValue::F64(radius), false), }); diff --git a/editor/src/messages/tool/common_functionality/shapes/ellipse_shape.rs b/editor/src/messages/tool/common_functionality/shapes/ellipse_shape.rs index eb33a08427..be796a3bce 100644 --- a/editor/src/messages/tool/common_functionality/shapes/ellipse_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/ellipse_shape.rs @@ -9,6 +9,8 @@ use crate::messages::tool::tool_messages::tool_prelude::*; use glam::DAffine2; use graph_craft::document::NodeInput; use graph_craft::document::value::TaggedValue; +use graphene_std::NodeInputDecleration; +use graphene_std::vector::generator_nodes::ellipse::*; use std::collections::VecDeque; #[derive(Default)] @@ -37,11 +39,11 @@ impl Ellipse { }; responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 1), + input_connector: InputConnector::node(node_id, RadiusXInput::INDEX), input: NodeInput::value(TaggedValue::F64(((start.x - end.x) / 2.).abs()), false), }); responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 2), + input_connector: InputConnector::node(node_id, RadiusYInput::INDEX), input: NodeInput::value(TaggedValue::F64(((start.y - end.y) / 2.).abs()), false), }); responses.add(GraphOperationMessage::TransformSet { diff --git a/editor/src/messages/tool/common_functionality/shapes/line_shape.rs b/editor/src/messages/tool/common_functionality/shapes/line_shape.rs index d05b0bb361..8f0a661285 100644 --- a/editor/src/messages/tool/common_functionality/shapes/line_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/line_shape.rs @@ -12,6 +12,8 @@ use crate::messages::tool::tool_messages::tool_prelude::*; use glam::DVec2; use graph_craft::document::NodeInput; use graph_craft::document::value::TaggedValue; +use graphene_std::NodeInputDecleration; +use graphene_std::vector::generator_nodes::line::*; use std::collections::VecDeque; #[derive(Clone, PartialEq, Debug, Default)] @@ -73,11 +75,11 @@ impl Line { }; responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 1), + input_connector: InputConnector::node(node_id, StartInput::INDEX), input: NodeInput::value(TaggedValue::DVec2(document_points[0]), false), }); responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 2), + input_connector: InputConnector::node(node_id, EndInput::INDEX), input: NodeInput::value(TaggedValue::DVec2(document_points[1]), false), }); responses.add(NodeGraphMessage::RunDocumentGraph); diff --git a/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs b/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs index 7b22144a71..47b42a38a6 100644 --- a/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs @@ -15,6 +15,8 @@ use crate::messages::tool::tool_messages::tool_prelude::*; use glam::DAffine2; use graph_craft::document::NodeInput; use graph_craft::document::value::TaggedValue; +use graphene_std::NodeInputDecleration; +use graphene_std::vector::generator_nodes::regular_polygon::*; use std::collections::VecDeque; #[derive(Clone, Debug, Default)] @@ -147,7 +149,7 @@ impl Polygon { }; responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 2), + input_connector: InputConnector::node(node_id, RadiusInput::INDEX), input: NodeInput::value(TaggedValue::F64(radius), false), }); @@ -185,7 +187,7 @@ impl Polygon { }); responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 1), + input_connector: InputConnector::node(node_id, SidesInput::::INDEX), input: NodeInput::value(TaggedValue::U32(new_dimension), false), }); responses.add(NodeGraphMessage::RunDocumentGraph); diff --git a/editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs b/editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs index 787684a8fa..a98efd2216 100644 --- a/editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs @@ -9,6 +9,8 @@ use crate::messages::tool::tool_messages::tool_prelude::*; use glam::DAffine2; use graph_craft::document::NodeInput; use graph_craft::document::value::TaggedValue; +use graphene_std::NodeInputDecleration; +use graphene_std::vector::generator_nodes::rectangle::*; use std::collections::VecDeque; #[derive(Default)] @@ -37,11 +39,11 @@ impl Rectangle { }; responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 1), + input_connector: InputConnector::node(node_id, WidthInput::INDEX), input: NodeInput::value(TaggedValue::F64((start.x - end.x).abs()), false), }); responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 2), + input_connector: InputConnector::node(node_id, HeightInput::INDEX), input: NodeInput::value(TaggedValue::F64((start.y - end.y).abs()), false), }); responses.add(GraphOperationMessage::TransformSet { diff --git a/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs b/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs index 46baf0f1d4..a62786f721 100644 --- a/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs +++ b/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs @@ -169,7 +169,7 @@ pub fn update_radius_sign(end: DVec2, start: DVec2, layer: LayerNodeIdentifier, }; responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(polygon_node_id, 2), + input_connector: InputConnector::node(polygon_node_id, graphene_std::vector::generator_nodes::regular_polygon::RadiusInput::INDEX), input: NodeInput::value(TaggedValue::F64(sign_num * 0.5), false), }); return; @@ -186,11 +186,11 @@ pub fn update_radius_sign(end: DVec2, start: DVec2, layer: LayerNodeIdentifier, }; responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(star_node_id, 2), + input_connector: InputConnector::node(star_node_id, graphene_std::vector::generator_nodes::star::Radius1Input::INDEX), input: NodeInput::value(TaggedValue::F64(sign_num * 0.5), false), }); responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(star_node_id, 3), + input_connector: InputConnector::node(star_node_id, graphene_std::vector::generator_nodes::star::Radius2Input::INDEX), input: NodeInput::value(TaggedValue::F64(sign_num * 0.25), false), }); } diff --git a/editor/src/messages/tool/common_functionality/shapes/star_shape.rs b/editor/src/messages/tool/common_functionality/shapes/star_shape.rs index acdde2c286..85bf964e34 100644 --- a/editor/src/messages/tool/common_functionality/shapes/star_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/star_shape.rs @@ -15,6 +15,8 @@ use core::f64; use glam::DAffine2; use graph_craft::document::NodeInput; use graph_craft::document::value::TaggedValue; +use graphene_std::NodeInputDecleration; +use graphene_std::vector::generator_nodes::star::*; use std::collections::VecDeque; #[derive(Clone, Debug, Default)] @@ -152,12 +154,12 @@ impl Star { }; responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 2), + input_connector: InputConnector::node(node_id, Radius1Input::INDEX), input: NodeInput::value(TaggedValue::F64(radius), false), }); responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 3), + input_connector: InputConnector::node(node_id, Radius2Input::INDEX), input: NodeInput::value(TaggedValue::F64(radius / 2.), false), }); From d4ae26e142d4598eff6993b6d57cba5c6af6aa6d Mon Sep 17 00:00:00 2001 From: Tyooughtul Date: Wed, 25 Feb 2026 13:34:06 +0800 Subject: [PATCH 2/5] fix: restore the debug information of the master branch --- .../document/graph_operation/transform_utils.rs | 13 ++++--------- .../no-std-types/src/color/discrete_srgb.rs | 5 +++++ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/editor/src/messages/portfolio/document/graph_operation/transform_utils.rs b/editor/src/messages/portfolio/document/graph_operation/transform_utils.rs index ca3976cea0..0db30b675f 100644 --- a/editor/src/messages/portfolio/document/graph_operation/transform_utils.rs +++ b/editor/src/messages/portfolio/document/graph_operation/transform_utils.rs @@ -76,27 +76,22 @@ impl LayerBounds { /// Get the current affine transform from the transform node's inputs pub fn get_current_transform(inputs: &[NodeInput]) -> DAffine2 { - const TRANSLATION_INDEX: usize = 1; - const ROTATION_INDEX: usize = 2; - const SCALE_INDEX: usize = 3; - const SKEW_INDEX: usize = 4; - - let translation = if let Some(&TaggedValue::DVec2(translation)) = inputs[TRANSLATION_INDEX].as_value() { + let translation = if let Some(&TaggedValue::DVec2(translation)) = inputs[TranslationInput::INDEX].as_value() { translation } else { DVec2::ZERO }; - let rotation = if let Some(&TaggedValue::F64(rotation)) = inputs[ROTATION_INDEX].as_value() { + let rotation = if let Some(&TaggedValue::F64(rotation)) = inputs[RotationInput::INDEX].as_value() { rotation } else { 0. }; - let scale = if let Some(&TaggedValue::DVec2(scale)) = inputs[SCALE_INDEX].as_value() { + let scale = if let Some(&TaggedValue::DVec2(scale)) = inputs[ScaleInput::INDEX].as_value() { scale } else { DVec2::ONE }; - let shear = if let Some(&TaggedValue::DVec2(shear)) = inputs[SKEW_INDEX].as_value() { + let shear = if let Some(&TaggedValue::DVec2(shear)) = inputs[SkewInput::INDEX].as_value() { shear } else { DVec2::ZERO diff --git a/node-graph/libraries/no-std-types/src/color/discrete_srgb.rs b/node-graph/libraries/no-std-types/src/color/discrete_srgb.rs index 13a06e30ab..2cf6dbb32b 100644 --- a/node-graph/libraries/no-std-types/src/color/discrete_srgb.rs +++ b/node-graph/libraries/no-std-types/src/color/discrete_srgb.rs @@ -162,6 +162,11 @@ mod tests { #[test] fn test_float_to_srgb_u8() { for u in 0..=u8::MAX { + // let a = srgb_u8_to_float(u); + // let b = srgb_u8_to_float_ref(u); + // if a != b { + // panic!("Mismatch at u={}: {} != {}", u, a, b); + // } assert!(srgb_u8_to_float(u) == srgb_u8_to_float_ref(u)); } } From 8ea25ac6bb0250ebca15c12e80b00ba7b1ef4276 Mon Sep 17 00:00:00 2001 From: Tyooughtul Date: Tue, 3 Mar 2026 23:41:25 +0800 Subject: [PATCH 3/5] fix: - replace remaining hardcoded input indices with named constants - resolve the errors caused by the accuracy issue --- .../document/document_message_handler.rs | 10 +- .../graph_operation_message_handler.rs | 31 +++-- .../document/graph_operation/utility_types.rs | 28 ++++- .../node_graph/node_graph_message_handler.rs | 6 +- .../utility_types/network_interface.rs | 22 ++-- .../network_interface/resolved_types.rs | 5 +- .../shape_gizmos/point_radius_handle.rs | 7 +- .../graph_modification_utils.rs | 18 +-- .../common_functionality/shapes/line_shape.rs | 6 +- .../shapes/polygon_shape.rs | 2 +- .../shapes/shape_utility.rs | 26 +++-- .../messages/tool/tool_messages/brush_tool.rs | 3 +- .../no-std-types/src/color/discrete_srgb.rs | 107 +++++++++++------- 13 files changed, 179 insertions(+), 92 deletions(-) diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index 76fbfa4828..6df87e6fda 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -1900,7 +1900,12 @@ impl DocumentMessageHandler { // If there's already a boolean operation on the selected layer, update it with the new operation if let (Some(upstream_boolean_op), Some(only_selected_layer)) = (upstream_boolean_op, only_selected_layer) { - network_interface.set_input(&InputConnector::node(upstream_boolean_op, 1), NodeInput::value(TaggedValue::BooleanOperation(operation), false), &[]); + const BOOLEAN_OPERATION_INDEX: usize = 1; + network_interface.set_input( + &InputConnector::node(upstream_boolean_op, BOOLEAN_OPERATION_INDEX), + NodeInput::value(TaggedValue::BooleanOperation(operation), false), + &[], + ); responses.add(NodeGraphMessage::RunDocumentGraph); @@ -2828,8 +2833,9 @@ impl DocumentMessageHandler { .popover_layout({ // Showing only compatible types for the layer based on the output type of the node upstream from its horizontal input let compatible_type = selected_layer.and_then(|layer| { + const LAYER_SECONDARY_INPUT_INDEX: usize = 1; self.network_interface - .upstream_output_connector(&InputConnector::node(layer.to_node(), 1), &[]) + .upstream_output_connector(&InputConnector::node(layer.to_node(), LAYER_SECONDARY_INPUT_INDEX), &[]) .and_then(|upstream_output| self.network_interface.output_type(&upstream_output, &[]).add_node_string()) }); diff --git a/editor/src/messages/portfolio/document/graph_operation/graph_operation_message_handler.rs b/editor/src/messages/portfolio/document/graph_operation/graph_operation_message_handler.rs index 1f6ed6fad1..4620efed78 100644 --- a/editor/src/messages/portfolio/document/graph_operation/graph_operation_message_handler.rs +++ b/editor/src/messages/portfolio/document/graph_operation/graph_operation_message_handler.rs @@ -101,7 +101,8 @@ impl MessageHandler> for } } GraphOperationMessage::SetUpstreamToChain { layer } => { - let Some(OutputConnector::Node { node_id: first_chain_node, .. }) = network_interface.upstream_output_connector(&InputConnector::node(layer.to_node(), 1), &[]) else { + const LAYER_SECONDARY_INPUT_INDEX: usize = 1; + let Some(OutputConnector::Node { node_id: first_chain_node, .. }) = network_interface.upstream_output_connector(&InputConnector::node(layer.to_node(), LAYER_SECONDARY_INPUT_INDEX), &[]) else { return; }; @@ -145,15 +146,18 @@ impl MessageHandler> for // Set the bottom input of the artboard back to artboard let bottom_input = NodeInput::value(TaggedValue::Artboard(Table::new()), true); - network_interface.set_input(&InputConnector::node(artboard_layer.to_node(), 0), bottom_input, &[]); + const ARTBOARD_BASE_INDEX: usize = 0; + network_interface.set_input(&InputConnector::node(artboard_layer.to_node(), ARTBOARD_BASE_INDEX), bottom_input, &[]); } else { // We have some non layers (e.g. just a rectangle node). We disconnect the bottom input and connect it to the left input. - network_interface.disconnect_input(&InputConnector::node(artboard_layer.to_node(), 0), &[]); - network_interface.set_input(&InputConnector::node(artboard_layer.to_node(), 1), primary_input, &[]); + const ARTBOARD_BASE_INDEX: usize = 0; + const ARTBOARD_CONTENT_INDEX: usize = 1; + network_interface.disconnect_input(&InputConnector::node(artboard_layer.to_node(), ARTBOARD_BASE_INDEX), &[]); + network_interface.set_input(&InputConnector::node(artboard_layer.to_node(), ARTBOARD_CONTENT_INDEX), primary_input, &[]); // Set the bottom input of the artboard back to artboard let bottom_input = NodeInput::value(TaggedValue::Artboard(Table::new()), true); - network_interface.set_input(&InputConnector::node(artboard_layer.to_node(), 0), bottom_input, &[]); + network_interface.set_input(&InputConnector::node(artboard_layer.to_node(), ARTBOARD_BASE_INDEX), bottom_input, &[]); } } responses.add_front(NodeGraphMessage::SelectedNodesSet { nodes: vec![id] }); @@ -193,8 +197,9 @@ impl MessageHandler> for let first_new_node_id = new_ids[&NodeId(0)]; responses.add(NodeGraphMessage::AddNodes { nodes, new_ids }); + const LAYER_SECONDARY_INPUT_INDEX: usize = 1; responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(layer.to_node(), 1), + input_connector: InputConnector::node(layer.to_node(), LAYER_SECONDARY_INPUT_INDEX), input: NodeInput::node(first_new_node_id, 0), }); } @@ -251,10 +256,11 @@ impl MessageHandler> for return; }; - artboard_data.insert( - artboard.to_node(), - ArtboardInfo { - input_node: NodeInput::node(document_node.inputs[1].as_node().unwrap_or_default(), 0), + const ARTBOARD_CONTENT_INDEX: usize = 1; + artboard_data.insert( + artboard.to_node(), + ArtboardInfo { + input_node: NodeInput::node(document_node.inputs[ARTBOARD_CONTENT_INDEX].as_node().unwrap_or_default(), 0), output_nodes: network_interface .outward_wires(&[]) .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(artboard.to_node(), 0))) @@ -281,8 +287,9 @@ impl MessageHandler> for // Go through all artboards and connect them to the merge nodes for artboard in &artboard_data { // Modify downstream connections - responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(artboard.1.merge_node, 1), + const MERGE_CONTENT_INDEX: usize = 1; + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(artboard.1.merge_node, MERGE_CONTENT_INDEX), input: NodeInput::node(artboard.1.input_node.as_node().unwrap_or_default(), 0), }); diff --git a/editor/src/messages/portfolio/document/graph_operation/utility_types.rs b/editor/src/messages/portfolio/document/graph_operation/utility_types.rs index 9b5d24cde2..5998f00c4d 100644 --- a/editor/src/messages/portfolio/document/graph_operation/utility_types.rs +++ b/editor/src/messages/portfolio/document/graph_operation/utility_types.rs @@ -71,7 +71,8 @@ impl<'a> ModifyInputsContext<'a> { let mut post_node_input_connector = if parent == LayerNodeIdentifier::ROOT_PARENT { InputConnector::Export(0) } else { - InputConnector::node(parent.to_node(), 1) + const LAYER_SECONDARY_INPUT_INDEX: usize = 1; + InputConnector::node(parent.to_node(), LAYER_SECONDARY_INPUT_INDEX) }; // Skip layers based on skip_layer_nodes, which inserts the new layer at a certain index of the layer stack. let mut current_index = 0; @@ -320,7 +321,8 @@ impl<'a> ModifyInputsContext<'a> { // If inserting a 'Path' node, insert a 'Flatten Path' node if the type is `Graphic`. // TODO: Allow the 'Path' node to operate on table data by utilizing the reference (index or ID?) for each row. if node_definition.identifier == "Path" { - let layer_input_type = self.network_interface.input_type(&InputConnector::node(output_layer.to_node(), 1), &[]); + const LAYER_SECONDARY_INPUT_INDEX: usize = 1; + let layer_input_type = self.network_interface.input_type(&InputConnector::node(output_layer.to_node(), LAYER_SECONDARY_INPUT_INDEX), &[]); if layer_input_type.compiled_nested_type() == Some(&concrete!(Table)) { let Some(flatten_path_definition) = resolve_proto_node_type(graphene_std::vector_nodes::flatten_path::IDENTIFIER) else { log::error!("Flatten Path does not exist in ModifyInputsContext::existing_node_id"); @@ -505,10 +507,18 @@ impl<'a> ModifyInputsContext<'a> { let Some(brush_node_id) = self.existing_network_node_id("Brush", true) else { return; }; - self.set_input_with_refresh(InputConnector::node(brush_node_id, 1), NodeInput::value(TaggedValue::BrushStrokes(strokes), false), false); + const BRUSH_STROKES_INDEX: usize = 1; + self.set_input_with_refresh( + InputConnector::node(brush_node_id, BRUSH_STROKES_INDEX), + NodeInput::value(TaggedValue::BrushStrokes(strokes), false), + false, + ); } pub fn resize_artboard(&mut self, location: IVec2, dimensions: IVec2) { + const ARTBOARD_LOCATION_INDEX: usize = 2; + const ARTBOARD_DIMENSIONS_INDEX: usize = 3; + let Some(artboard_node_id) = self.existing_network_node_id("Artboard", true) else { return; }; @@ -524,8 +534,16 @@ impl<'a> ModifyInputsContext<'a> { dimensions.y *= -1; location.y -= dimensions.y; } - self.set_input_with_refresh(InputConnector::node(artboard_node_id, 2), NodeInput::value(TaggedValue::DVec2(location.into()), false), false); - self.set_input_with_refresh(InputConnector::node(artboard_node_id, 3), NodeInput::value(TaggedValue::DVec2(dimensions.into()), false), false); + self.set_input_with_refresh( + InputConnector::node(artboard_node_id, ARTBOARD_LOCATION_INDEX), + NodeInput::value(TaggedValue::DVec2(location.into()), false), + false, + ); + self.set_input_with_refresh( + InputConnector::node(artboard_node_id, ARTBOARD_DIMENSIONS_INDEX), + NodeInput::value(TaggedValue::DVec2(dimensions.into()), false), + false, + ); } /// Set the input, refresh the properties panel, and run the document graph if skip_rerender is false diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs index d9ff37381f..e6dca6448a 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs @@ -1324,7 +1324,8 @@ impl<'a> MessageHandler> for NodeG .cloned() .collect::>() { - network_interface.try_set_upstream_to_chain(&InputConnector::node(layer, 1), selection_network_path); + const LAYER_SECONDARY_INPUT_INDEX: usize = 1; + network_interface.try_set_upstream_to_chain(&InputConnector::node(layer, LAYER_SECONDARY_INPUT_INDEX), selection_network_path); } responses.add(NodeGraphMessage::SendGraph); @@ -2503,9 +2504,10 @@ impl NodeGraphMessageHandler { .icon(Some("Node".to_string())) .tooltip_description("Add an operation to the end of this layer's chain of nodes.") .popover_layout({ + const LAYER_SECONDARY_INPUT_INDEX: usize = 1; let compatible_type = context .network_interface - .upstream_output_connector(&InputConnector::node(layer, 1), &[]) + .upstream_output_connector(&InputConnector::node(layer, LAYER_SECONDARY_INPUT_INDEX), &[]) .and_then(|upstream_output| context.network_interface.output_type(&upstream_output, &[]).add_node_string()); let mut node_chooser = NodeCatalog::new(); diff --git a/editor/src/messages/portfolio/document/utility_types/network_interface.rs b/editor/src/messages/portfolio/document/utility_types/network_interface.rs index 5a1722d53d..bdc0e178c6 100644 --- a/editor/src/messages/portfolio/document/utility_types/network_interface.rs +++ b/editor/src/messages/portfolio/document/utility_types/network_interface.rs @@ -419,7 +419,8 @@ impl NodeNetworkInterface { for old_id in new_nodes.iter().map(|(_, old_id, _)| *old_id).collect::>() { // Try set all selected nodes upstream of a layer to be chain nodes if self.is_layer(&old_id, network_path) { - for valid_upstream_chain_node in self.valid_upstream_chain_nodes(&InputConnector::node(old_id, 1), network_path) { + const LAYER_SECONDARY_INPUT_INDEX: usize = 1; + for valid_upstream_chain_node in self.valid_upstream_chain_nodes(&InputConnector::node(old_id, LAYER_SECONDARY_INPUT_INDEX), network_path) { if let Some(node_template) = new_nodes.iter_mut().find_map(|(_, old_id, template)| (*old_id == valid_upstream_chain_node).then_some(template)) { match &mut node_template.persistent_node_metadata.node_type_metadata { NodeTypePersistentMetadata::Node(node_metadata) => node_metadata.position = NodePosition::Chain, @@ -1195,7 +1196,8 @@ impl NodeNetworkInterface { .find(|ancestor| *ancestor != LayerNodeIdentifier::ROOT_PARENT && self.is_artboard(&ancestor.to_node(), &[])) { let artboard = self.document_node(&artboard_node_identifier.to_node(), &[]); - let clip_input = artboard.unwrap().inputs.get(5).unwrap(); + const ARTBOARD_CLIP_INDEX: usize = 5; + let clip_input = artboard.unwrap().inputs.get(ARTBOARD_CLIP_INDEX).unwrap(); if let NodeInput::Value { tagged_value, .. } = clip_input && tagged_value.clone().deref() == &TaggedValue::Bool(true) { @@ -1312,7 +1314,8 @@ impl NodeNetworkInterface { .iter() .filter_map(move |node_id| { if self.is_layer(node_id, network_path) { - network.nodes.get(node_id).and_then(|node| node.inputs.get(1)).and_then(|input| input.as_node()) + const LAYER_SECONDARY_INPUT_INDEX: usize = 1; + network.nodes.get(node_id).and_then(|node| node.inputs.get(LAYER_SECONDARY_INPUT_INDEX)).and_then(|input| input.as_node()) } else { Some(*node_id) } @@ -3097,7 +3100,8 @@ impl NodeNetworkInterface { let mut modified = vector.clone(); let path_node = self.document_network().nodes.get(&path_node); - let modification_input = path_node.and_then(|node: &DocumentNode| node.inputs.get(1)).and_then(|input| input.as_value()); + const PATH_MODIFICATION_INDEX: usize = 1; + let modification_input = path_node.and_then(|node: &DocumentNode| node.inputs.get(PATH_MODIFICATION_INDEX)).and_then(|input| input.as_value()); if let Some(TaggedValue::VectorModification(modification)) = modification_input { modification.apply(&mut modified); } @@ -4604,7 +4608,8 @@ impl NodeNetworkInterface { // Try build the chain if is_layer { - self.try_set_upstream_to_chain(&InputConnector::node(*node_id, 1), network_path); + const LAYER_SECONDARY_INPUT_INDEX: usize = 1; + self.try_set_upstream_to_chain(&InputConnector::node(*node_id, LAYER_SECONDARY_INPUT_INDEX), network_path); } else { self.try_set_node_to_chain(node_id, network_path); } @@ -5655,16 +5660,17 @@ impl NodeNetworkInterface { // Moves a node and to the start of a layer chain (feeding into the secondary input of the layer) pub fn move_node_to_chain_start(&mut self, node_id: &NodeId, parent: LayerNodeIdentifier, network_path: &[NodeId]) { - let Some(current_input) = self.input_from_connector(&InputConnector::node(parent.to_node(), 1), network_path) else { + const LAYER_SECONDARY_INPUT_INDEX: usize = 1; + let Some(current_input) = self.input_from_connector(&InputConnector::node(parent.to_node(), LAYER_SECONDARY_INPUT_INDEX), network_path) else { log::error!("Could not get input for node {node_id}"); return; }; if matches!(current_input, NodeInput::Value { .. }) { - self.create_wire(&OutputConnector::node(*node_id, 0), &InputConnector::node(parent.to_node(), 1), network_path); + self.create_wire(&OutputConnector::node(*node_id, 0), &InputConnector::node(parent.to_node(), LAYER_SECONDARY_INPUT_INDEX), network_path); self.set_chain_position(node_id, network_path); } else { // Insert the node in the gap and set the upstream to a chain - self.insert_node_between(node_id, &InputConnector::node(parent.to_node(), 1), 0, network_path); + self.insert_node_between(node_id, &InputConnector::node(parent.to_node(), LAYER_SECONDARY_INPUT_INDEX), 0, network_path); self.force_set_upstream_to_chain(node_id, network_path); } } diff --git a/editor/src/messages/portfolio/document/utility_types/network_interface/resolved_types.rs b/editor/src/messages/portfolio/document/utility_types/network_interface/resolved_types.rs index 2d285f7e89..e7d724d76b 100644 --- a/editor/src/messages/portfolio/document/utility_types/network_interface/resolved_types.rs +++ b/editor/src/messages/portfolio/document/utility_types/network_interface/resolved_types.rs @@ -12,6 +12,9 @@ use crate::messages::portfolio::document::node_graph::utility_types::FrontendGra use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, NodeNetworkInterface, OutputConnector}; // This file contains utility methods for interfacing with the resolved types returned from the compiler + +/// Index of the `editor_api` parameter in the render node (second parameter after the primary context input). +const RENDER_NODE_EDITOR_API_INDEX: usize = 1; #[derive(Debug, Default)] pub struct ResolvedDocumentNodeTypes { pub types: HashMap, NodeTypes>, @@ -317,7 +320,7 @@ impl NodeNetworkInterface { log::error!("Protonode {render_node:?} not found in registry"); return Vec::new(); }; - implementations.keys().map(|types| types.inputs[1].clone()).collect() + implementations.keys().map(|types| types.inputs[RENDER_NODE_EDITOR_API_INDEX].clone()).collect() } } } diff --git a/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/point_radius_handle.rs b/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/point_radius_handle.rs index d72414f48a..b09817600a 100644 --- a/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/point_radius_handle.rs +++ b/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/point_radius_handle.rs @@ -14,6 +14,7 @@ use crate::messages::tool::common_functionality::shapes::shape_utility::{extract use glam::DVec2; use graph_craft::document::NodeInput; use graph_craft::document::value::TaggedValue; +use graphene_std::vector::generator_nodes::star::*; use std::collections::VecDeque; use std::f64::consts::{FRAC_1_SQRT_2, FRAC_PI_4, PI, SQRT_2}; @@ -337,13 +338,13 @@ impl PointRadiusHandle { return snap_radii; }; - let (Some(&TaggedValue::F64(radius_1)), Some(&TaggedValue::F64(radius_2))) = (node_inputs[2].as_value(), node_inputs[3].as_value()) else { + let (Some(&TaggedValue::F64(radius_1)), Some(&TaggedValue::F64(radius_2))) = (node_inputs[Radius1Input::INDEX].as_value(), node_inputs[Radius2Input::INDEX].as_value()) else { return snap_radii; }; let other_radius = if radius_index == 3 { radius_1 } else { radius_2 }; - let Some(&TaggedValue::U32(sides)) = node_inputs[1].as_value() else { + let Some(&TaggedValue::U32(sides)) = node_inputs[SidesInput::::INDEX].as_value() else { return snap_radii; }; @@ -456,7 +457,7 @@ impl PointRadiusHandle { return; }; - let (Some(&TaggedValue::F64(radius_1)), Some(&TaggedValue::F64(radius_2))) = (node_inputs[2].as_value(), node_inputs[3].as_value()) else { + let (Some(&TaggedValue::F64(radius_1)), Some(&TaggedValue::F64(radius_2))) = (node_inputs[Radius1Input::INDEX].as_value(), node_inputs[Radius2Input::INDEX].as_value()) else { return; }; diff --git a/editor/src/messages/tool/common_functionality/graph_modification_utils.rs b/editor/src/messages/tool/common_functionality/graph_modification_utils.rs index a0d4cf1dbd..085757b164 100644 --- a/editor/src/messages/tool/common_functionality/graph_modification_utils.rs +++ b/editor/src/messages/tool/common_functionality/graph_modification_utils.rs @@ -9,6 +9,7 @@ use graph_craft::document::{NodeId, NodeInput}; use graph_craft::{ProtoNodeIdentifier, concrete}; use graphene_std::Color; use graphene_std::NodeInputDecleration; +use graphene_std::blending_nodes::blending::*; use graphene_std::raster::BlendMode; use graphene_std::raster_types::{CPU, GPU, Raster}; use graphene_std::subpath::Subpath; @@ -92,9 +93,11 @@ pub fn merge_layers(document: &DocumentMessageHandler, first_layer: LayerNodeIde node_id: merge_node_id, parent: first_layer, }); + const LAYER_SECONDARY_INPUT_INDEX: usize = 1; + const MERGE_CONTENT_INDEX: usize = 1; responses.add(NodeGraphMessage::ConnectUpstreamOutputToInput { - downstream_input: InputConnector::node(second_layer.to_node(), 1), - input_connector: InputConnector::node(merge_node_id, 1), + downstream_input: InputConnector::node(second_layer.to_node(), LAYER_SECONDARY_INPUT_INDEX), + input_connector: InputConnector::node(merge_node_id, MERGE_CONTENT_INDEX), }); responses.add(NodeGraphMessage::DeleteNodes { node_ids: vec![second_layer.to_node()], @@ -298,7 +301,7 @@ pub fn get_fill_color(layer: LayerNodeIdentifier, network_interface: &NodeNetwor /// Get the current blend mode of a layer from the closest "Blending" node. pub fn get_blend_mode(layer: LayerNodeIdentifier, network_interface: &NodeNetworkInterface) -> Option { let inputs = NodeGraphLayer::new(layer, network_interface).find_node_inputs(&DefinitionIdentifier::ProtoNode(graphene_std::blending_nodes::blending::IDENTIFIER))?; - let TaggedValue::BlendMode(blend_mode) = inputs.get(1)?.as_value()? else { + let TaggedValue::BlendMode(blend_mode) = inputs.get(BlendModeInput::INDEX)?.as_value()? else { return None; }; Some(*blend_mode) @@ -314,7 +317,7 @@ pub fn get_blend_mode(layer: LayerNodeIdentifier, network_interface: &NodeNetwor /// With those limitations in mind, the intention of this function is to show just the value already present in an upstream Opacity node so that value can be directly edited. pub fn get_opacity(layer: LayerNodeIdentifier, network_interface: &NodeNetworkInterface) -> Option { let inputs = NodeGraphLayer::new(layer, network_interface).find_node_inputs(&DefinitionIdentifier::ProtoNode(graphene_std::blending_nodes::blending::IDENTIFIER))?; - let TaggedValue::F64(opacity) = inputs.get(2)?.as_value()? else { + let TaggedValue::F64(opacity) = inputs.get(OpacityInput::INDEX)?.as_value()? else { return None; }; Some(*opacity) @@ -322,7 +325,7 @@ pub fn get_opacity(layer: LayerNodeIdentifier, network_interface: &NodeNetworkIn pub fn get_clip_mode(layer: LayerNodeIdentifier, network_interface: &NodeNetworkInterface) -> Option { let inputs = NodeGraphLayer::new(layer, network_interface).find_node_inputs(&DefinitionIdentifier::ProtoNode(graphene_std::blending_nodes::blending::IDENTIFIER))?; - let TaggedValue::Bool(clip) = inputs.get(4)?.as_value()? else { + let TaggedValue::Bool(clip) = inputs.get(ClipInput::INDEX)?.as_value()? else { return None; }; Some(*clip) @@ -330,7 +333,7 @@ pub fn get_clip_mode(layer: LayerNodeIdentifier, network_interface: &NodeNetwork pub fn get_fill(layer: LayerNodeIdentifier, network_interface: &NodeNetworkInterface) -> Option { let inputs = NodeGraphLayer::new(layer, network_interface).find_node_inputs(&DefinitionIdentifier::ProtoNode(graphene_std::blending_nodes::blending::IDENTIFIER))?; - let TaggedValue::F64(fill) = inputs.get(3)?.as_value()? else { + let TaggedValue::F64(fill) = inputs.get(FillInput::INDEX)?.as_value()? else { return None; }; Some(*fill) @@ -518,7 +521,8 @@ impl<'a> NodeGraphLayer<'a> { /// Check if a layer is a raster layer pub fn is_raster_layer(layer: LayerNodeIdentifier, network_interface: &mut NodeNetworkInterface) -> bool { - let layer_input_type = network_interface.input_type(&InputConnector::node(layer.to_node(), 1), &[]); + const LAYER_SECONDARY_INPUT_INDEX: usize = 1; + let layer_input_type = network_interface.input_type(&InputConnector::node(layer.to_node(), LAYER_SECONDARY_INPUT_INDEX), &[]); layer_input_type.compiled_nested_type() == Some(&concrete!(Table>)) || layer_input_type.compiled_nested_type() == Some(&concrete!(Table>)) } diff --git a/editor/src/messages/tool/common_functionality/shapes/line_shape.rs b/editor/src/messages/tool/common_functionality/shapes/line_shape.rs index 8f0a661285..663d604da8 100644 --- a/editor/src/messages/tool/common_functionality/shapes/line_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/line_shape.rs @@ -94,7 +94,7 @@ impl Line { let node_inputs = NodeGraphLayer::new(layer, &document.network_interface).find_node_inputs(&DefinitionIdentifier::ProtoNode(graphene_std::vector::generator_nodes::line::IDENTIFIER))?; - let (Some(&TaggedValue::DVec2(start)), Some(&TaggedValue::DVec2(end))) = (node_inputs[1].as_value(), node_inputs[2].as_value()) else { + let (Some(&TaggedValue::DVec2(start)), Some(&TaggedValue::DVec2(end))) = (node_inputs[StartInput::INDEX].as_value(), node_inputs[EndInput::INDEX].as_value()) else { return None; }; @@ -179,7 +179,7 @@ pub fn clicked_on_line_endpoints(layer: LayerNodeIdentifier, document: &Document return false; }; - let (Some(&TaggedValue::DVec2(document_start)), Some(&TaggedValue::DVec2(document_end))) = (node_inputs[1].as_value(), node_inputs[2].as_value()) else { + let (Some(&TaggedValue::DVec2(document_start)), Some(&TaggedValue::DVec2(document_end))) = (node_inputs[StartInput::INDEX].as_value(), node_inputs[EndInput::INDEX].as_value()) else { return false; }; @@ -221,7 +221,7 @@ mod test_line_tool { .selected_visible_and_unlocked_layers(network_interface) .filter_map(|layer| { let node_inputs = NodeGraphLayer::new(layer, network_interface).find_node_inputs(&DefinitionIdentifier::ProtoNode(graphene_std::vector::generator_nodes::line::IDENTIFIER))?; - let (Some(&TaggedValue::DVec2(start)), Some(&TaggedValue::DVec2(end))) = (node_inputs[1].as_value(), node_inputs[2].as_value()) else { + let (Some(&TaggedValue::DVec2(start)), Some(&TaggedValue::DVec2(end))) = (node_inputs[StartInput::INDEX].as_value(), node_inputs[EndInput::INDEX].as_value()) else { return None; }; Some((start, end)) diff --git a/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs b/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs index 47b42a38a6..24808e37e2 100644 --- a/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs @@ -176,7 +176,7 @@ impl Polygon { return; }; - let Some(&TaggedValue::U32(n)) = node_inputs.get(1).unwrap().as_value() else { + let Some(&TaggedValue::U32(n)) = node_inputs.get(SidesInput::::INDEX).unwrap().as_value() else { return; }; diff --git a/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs b/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs index a62786f721..c92d8a0605 100644 --- a/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs +++ b/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs @@ -252,11 +252,15 @@ pub fn anchor_overlays(document: &DocumentMessageHandler, overlay_context: &mut /// Extract the node input values of Star. /// Returns an option of (sides, radius1, radius2). pub fn extract_star_parameters(layer: Option, document: &DocumentMessageHandler) -> Option<(u32, f64, f64)> { + use graphene_std::vector::generator_nodes::star::*; + let node_inputs = NodeGraphLayer::new(layer?, &document.network_interface).find_node_inputs(&DefinitionIdentifier::ProtoNode(graphene_std::vector::generator_nodes::star::IDENTIFIER))?; - let (Some(&TaggedValue::U32(sides)), Some(&TaggedValue::F64(radius_1)), Some(&TaggedValue::F64(radius_2))) = - (node_inputs.get(1)?.as_value(), node_inputs.get(2)?.as_value(), node_inputs.get(3)?.as_value()) - else { + let (Some(&TaggedValue::U32(sides)), Some(&TaggedValue::F64(radius_1)), Some(&TaggedValue::F64(radius_2))) = ( + node_inputs.get(SidesInput::::INDEX)?.as_value(), + node_inputs.get(Radius1Input::INDEX)?.as_value(), + node_inputs.get(Radius2Input::INDEX)?.as_value(), + ) else { return None; }; @@ -266,10 +270,12 @@ pub fn extract_star_parameters(layer: Option, document: &Do /// Extract the node input values of Polygon. /// Returns an option of (sides, radius). pub fn extract_polygon_parameters(layer: Option, document: &DocumentMessageHandler) -> Option<(u32, f64)> { + use graphene_std::vector::generator_nodes::regular_polygon::*; + let node_inputs = NodeGraphLayer::new(layer?, &document.network_interface).find_node_inputs(&DefinitionIdentifier::ProtoNode(graphene_std::vector::generator_nodes::regular_polygon::IDENTIFIER))?; - let (Some(&TaggedValue::U32(n)), Some(&TaggedValue::F64(radius))) = (node_inputs.get(1)?.as_value(), node_inputs.get(2)?.as_value()) else { + let (Some(&TaggedValue::U32(n)), Some(&TaggedValue::F64(radius))) = (node_inputs.get(SidesInput::::INDEX)?.as_value(), node_inputs.get(RadiusInput::INDEX)?.as_value()) else { return None; }; @@ -279,13 +285,15 @@ pub fn extract_polygon_parameters(layer: Option, document: /// Extract the node input values of an arc. /// Returns an option of (radius, start angle, sweep angle, arc type). pub fn extract_arc_parameters(layer: Option, document: &DocumentMessageHandler) -> Option<(f64, f64, f64, ArcType)> { + use graphene_std::vector::generator_nodes::arc::*; + let node_inputs = NodeGraphLayer::new(layer?, &document.network_interface).find_node_inputs(&DefinitionIdentifier::ProtoNode(graphene_std::vector::generator_nodes::arc::IDENTIFIER))?; let (Some(&TaggedValue::F64(radius)), Some(&TaggedValue::F64(start_angle)), Some(&TaggedValue::F64(sweep_angle)), Some(&TaggedValue::ArcType(arc_type))) = ( - node_inputs.get(1)?.as_value(), - node_inputs.get(2)?.as_value(), - node_inputs.get(3)?.as_value(), - node_inputs.get(4)?.as_value(), + node_inputs.get(RadiusInput::INDEX)?.as_value(), + node_inputs.get(StartAngleInput::INDEX)?.as_value(), + node_inputs.get(SweepAngleInput::INDEX)?.as_value(), + node_inputs.get(ArcTypeInput::INDEX)?.as_value(), ) else { return None; }; @@ -350,7 +358,7 @@ pub fn arc_end_points_ignore_layer(radius: f64, start_angle: f64, sweep_angle: f pub fn extract_circle_radius(layer: LayerNodeIdentifier, document: &DocumentMessageHandler) -> Option { let node_inputs = NodeGraphLayer::new(layer, &document.network_interface).find_node_inputs(&DefinitionIdentifier::ProtoNode(graphene_std::vector::generator_nodes::circle::IDENTIFIER))?; - let Some(&TaggedValue::F64(radius)) = node_inputs.get(1)?.as_value() else { + let Some(&TaggedValue::F64(radius)) = node_inputs.get(graphene_std::vector::generator_nodes::circle::RadiusInput::INDEX)?.as_value() else { return None; }; diff --git a/editor/src/messages/tool/tool_messages/brush_tool.rs b/editor/src/messages/tool/tool_messages/brush_tool.rs index d1b84b49a4..b52d7fde69 100644 --- a/editor/src/messages/tool/tool_messages/brush_tool.rs +++ b/editor/src/messages/tool/tool_messages/brush_tool.rs @@ -317,7 +317,8 @@ impl BrushToolData { }; if reference == DefinitionIdentifier::Network("Brush".into()) && node_id != layer.to_node() { - let points_input = node.inputs.get(1)?; + const BRUSH_STROKES_INDEX: usize = 1; + let points_input = node.inputs.get(BRUSH_STROKES_INDEX)?; let Some(TaggedValue::BrushStrokes(strokes)) = points_input.as_value() else { continue }; self.strokes.clone_from(strokes); diff --git a/node-graph/libraries/no-std-types/src/color/discrete_srgb.rs b/node-graph/libraries/no-std-types/src/color/discrete_srgb.rs index 2cf6dbb32b..1a31683c6a 100644 --- a/node-graph/libraries/no-std-types/src/color/discrete_srgb.rs +++ b/node-graph/libraries/no-std-types/src/color/discrete_srgb.rs @@ -90,38 +90,70 @@ pub fn float_to_srgb_u8(mut f: f32) -> u8 { #[rustfmt::skip] const FROM_SRGB_U8: [f32; 256] = [ - 0., 0.000303527, 0.000607054, 0.00091058103, 0.001214108, 0.001517635, 0.0018211621, 0.002124689, - 0.002428216, 0.002731743, 0.00303527, 0.0033465356, 0.003676507, 0.004024717, 0.004391442, - 0.0047769533, 0.005181517, 0.0056053917, 0.0060488326, 0.006512091, 0.00699541, 0.0074990317, - 0.008023192, 0.008568125, 0.009134057, 0.009721218, 0.010329823, 0.010960094, 0.011612245, - 0.012286487, 0.012983031, 0.013702081, 0.014443844, 0.015208514, 0.015996292, 0.016807375, - 0.017641952, 0.018500218, 0.019382361, 0.020288562, 0.02121901, 0.022173883, 0.023153365, - 0.02415763, 0.025186857, 0.026241222, 0.027320892, 0.028426038, 0.029556843, 0.03071345, 0.03189604, - 0.033104774, 0.03433981, 0.035601325, 0.036889452, 0.038204376, 0.039546248, 0.04091521, 0.042311423, - 0.043735042, 0.045186214, 0.046665095, 0.048171833, 0.049706575, 0.051269468, 0.052860655, 0.05448028, - 0.056128494, 0.057805434, 0.05951124, 0.06124607, 0.06301003, 0.06480328, 0.06662595, 0.06847818, - 0.07036011, 0.07227186, 0.07421358, 0.07618539, 0.07818743, 0.08021983, 0.082282715, 0.084376216, - 0.086500466, 0.088655606, 0.09084173, 0.09305898, 0.095307484, 0.09758736, 0.09989874, 0.10224175, - 0.10461649, 0.10702311, 0.10946172, 0.111932434, 0.11443538, 0.116970696, 0.11953845, 0.12213881, - 0.12477186, 0.12743773, 0.13013652, 0.13286836, 0.13563336, 0.13843165, 0.14126332, 0.1441285, - 0.1470273, 0.14995982, 0.15292618, 0.1559265, 0.15896086, 0.16202943, 0.16513224, 0.16826946, - 0.17144115, 0.17464745, 0.17788847, 0.1811643, 0.18447503, 0.1878208, 0.19120172, 0.19461787, - 0.19806935, 0.2015563, 0.20507877, 0.2086369, 0.21223079, 0.21586053, 0.21952623, 0.22322798, - 0.22696589, 0.23074007, 0.23455065, 0.23839766, 0.2422812, 0.2462014, 0.25015837, 0.25415218, - 0.2581829, 0.26225072, 0.26635566, 0.27049786, 0.27467737, 0.27889434, 0.2831488, 0.2874409, - 0.2917707, 0.29613832, 0.30054384, 0.30498737, 0.30946895, 0.31398875, 0.31854683, 0.32314324, - 0.32777813, 0.33245158, 0.33716366, 0.34191445, 0.3467041, 0.3515327, 0.35640025, 0.36130688, - 0.3662527, 0.37123778, 0.37626222, 0.3813261, 0.38642952, 0.39157256, 0.3967553, 0.40197787, - 0.4072403, 0.4125427, 0.41788515, 0.42326775, 0.42869055, 0.4341537, 0.43965724, 0.44520125, - 0.45078585, 0.45641106, 0.46207705, 0.46778384, 0.47353154, 0.47932023, 0.48514998, 0.4910209, - 0.49693304, 0.5028866, 0.50888145, 0.5149178, 0.5209957, 0.52711535, 0.5332766, 0.5394797, - 0.5457247, 0.5520116, 0.5583406, 0.5647117, 0.57112503, 0.57758063, 0.5840786, 0.590619, 0.597202, - 0.60382754, 0.61049575, 0.61720675, 0.62396055, 0.63075733, 0.637597, 0.6444799, 0.6514058, - 0.65837497, 0.66538745, 0.67244333, 0.6795426, 0.68668544, 0.69387203, 0.70110214, 0.70837605, - 0.7156938, 0.72305536, 0.730461, 0.7379107, 0.7454045, 0.75294244, 0.76052475, 0.7681514, 0.77582246, - 0.78353804, 0.79129815, 0.79910296, 0.8069525, 0.8148468, 0.822786, 0.8307701, 0.83879924, 0.84687346, - 0.8549928, 0.8631574, 0.87136734, 0.8796226, 0.8879232, 0.89626956, 0.90466136, 0.913099, 0.92158204, - 0.93011117, 0.9386859, 0.9473069, 0.9559735, 0.9646866, 0.9734455, 0.98225087, 0.9911022, 1., + f32::from_bits(0x00000000), f32::from_bits(0x399f22b4), f32::from_bits(0x3a1f22b4), f32::from_bits(0x3a6eb40f), + f32::from_bits(0x3a9f22b4), f32::from_bits(0x3ac6eb61), f32::from_bits(0x3aeeb40f), f32::from_bits(0x3b0b3e5e), + f32::from_bits(0x3b1f22b4), f32::from_bits(0x3b33070b), f32::from_bits(0x3b46eb61), f32::from_bits(0x3b5b518d), + f32::from_bits(0x3b70f18d), f32::from_bits(0x3b83e1c6), f32::from_bits(0x3b8fe616), f32::from_bits(0x3b9c87fd), + f32::from_bits(0x3ba9c9b7), f32::from_bits(0x3bb7ad6f), f32::from_bits(0x3bc63549), f32::from_bits(0x3bd56361), + f32::from_bits(0x3be539c1), f32::from_bits(0x3bf5ba70), f32::from_bits(0x3c0373b5), f32::from_bits(0x3c0c6152), + f32::from_bits(0x3c15a703), f32::from_bits(0x3c1f45be), f32::from_bits(0x3c293e6b), f32::from_bits(0x3c3391f7), + f32::from_bits(0x3c3e4149), f32::from_bits(0x3c494d43), f32::from_bits(0x3c54b6c7), f32::from_bits(0x3c607eb1), + f32::from_bits(0x3c6ca5df), f32::from_bits(0x3c792d22), f32::from_bits(0x3c830aa8), f32::from_bits(0x3c89af9f), + f32::from_bits(0x3c9085db), f32::from_bits(0x3c978dc5), f32::from_bits(0x3c9ec7c2), f32::from_bits(0x3ca63433), + f32::from_bits(0x3cadd37d), f32::from_bits(0x3cb5a601), f32::from_bits(0x3cbdac20), f32::from_bits(0x3cc5e639), + f32::from_bits(0x3cce54ab), f32::from_bits(0x3cd6f7d5), f32::from_bits(0x3cdfd010), f32::from_bits(0x3ce8ddb9), + f32::from_bits(0x3cf22131), f32::from_bits(0x3cfb9ac6), f32::from_bits(0x3d02a56c), f32::from_bits(0x3d0798df), + f32::from_bits(0x3d0ca7e7), f32::from_bits(0x3d11d2b2), f32::from_bits(0x3d171965), f32::from_bits(0x3d1c7c31), + f32::from_bits(0x3d21fb3f), f32::from_bits(0x3d2796b5), f32::from_bits(0x3d2d4ebe), f32::from_bits(0x3d332384), + f32::from_bits(0x3d39152e), f32::from_bits(0x3d3f23e6), f32::from_bits(0x3d454fd4), f32::from_bits(0x3d4b991f), + f32::from_bits(0x3d51ffef), f32::from_bits(0x3d58846a), f32::from_bits(0x3d5f26b7), f32::from_bits(0x3d65e6fe), + f32::from_bits(0x3d6cc564), f32::from_bits(0x3d73c20f), f32::from_bits(0x3d7add29), f32::from_bits(0x3d810b68), + f32::from_bits(0x3d84b795), f32::from_bits(0x3d887330), f32::from_bits(0x3d8c3e4a), f32::from_bits(0x3d9018f6), + f32::from_bits(0x3d940345), f32::from_bits(0x3d97fd4a), f32::from_bits(0x3d9c0716), f32::from_bits(0x3da020bb), + f32::from_bits(0x3da44a4b), f32::from_bits(0x3da883d7), f32::from_bits(0x3daccd70), f32::from_bits(0x3db12728), f32::from_bits(0x3db59112), + f32::from_bits(0x3dba0b3b), f32::from_bits(0x3dbe95b5), f32::from_bits(0x3dc33092), f32::from_bits(0x3dc7dbe2), + f32::from_bits(0x3dcc97b6), f32::from_bits(0x3dd1641f), f32::from_bits(0x3dd6412c), f32::from_bits(0x3ddb2eef), + f32::from_bits(0x3de02d77), f32::from_bits(0x3de53cd5), f32::from_bits(0x3dea5d19), f32::from_bits(0x3def8e55), + f32::from_bits(0x3df4d093), f32::from_bits(0x3dfa23ea), f32::from_bits(0x3dff8864), f32::from_bits(0x3e027f09), + f32::from_bits(0x3e054282), f32::from_bits(0x3e080ea5), f32::from_bits(0x3e0ae379), f32::from_bits(0x3e0dc107), + f32::from_bits(0x3e10a755), f32::from_bits(0x3e13966c), f32::from_bits(0x3e168e53), f32::from_bits(0x3e198f11), + f32::from_bits(0x3e1c98ae), f32::from_bits(0x3e1fab32), f32::from_bits(0x3e22c6a3), f32::from_bits(0x3e25eb0b), + f32::from_bits(0x3e29186d), f32::from_bits(0x3e2c4ed4), f32::from_bits(0x3e2f8e45), f32::from_bits(0x3e32d6c8), + f32::from_bits(0x3e362865), f32::from_bits(0x3e398322), f32::from_bits(0x3e3ce706), f32::from_bits(0x3e405419), + f32::from_bits(0x3e43ca62), f32::from_bits(0x3e4749e8), f32::from_bits(0x3e4ad2b1), f32::from_bits(0x3e4e64c6), + f32::from_bits(0x3e52002b), f32::from_bits(0x3e55a4e9), f32::from_bits(0x3e595307), f32::from_bits(0x3e5d0a8b), + f32::from_bits(0x3e60cb7c), f32::from_bits(0x3e6495e0), f32::from_bits(0x3e6869bf), f32::from_bits(0x3e6c4720), + f32::from_bits(0x3e702e0c), f32::from_bits(0x3e741e84), f32::from_bits(0x3e781890), f32::from_bits(0x3e7c1c38), + f32::from_bits(0x3e8014c2), f32::from_bits(0x3e82203c), f32::from_bits(0x3e84308d), f32::from_bits(0x3e8645ba), + f32::from_bits(0x3e885fc5), f32::from_bits(0x3e8a7eb2), f32::from_bits(0x3e8ca283), f32::from_bits(0x3e8ecb3d), + f32::from_bits(0x3e90f8e1), f32::from_bits(0x3e932b74), f32::from_bits(0x3e9562f8), f32::from_bits(0x3e979f71), + f32::from_bits(0x3e99e0e2), f32::from_bits(0x3e9c274e), f32::from_bits(0x3e9e72b7), f32::from_bits(0x3ea0c322), + f32::from_bits(0x3ea31892), f32::from_bits(0x3ea57308), f32::from_bits(0x3ea7d289), f32::from_bits(0x3eaa3718), + f32::from_bits(0x3eaca0b7), f32::from_bits(0x3eaf0f69), f32::from_bits(0x3eb18333), f32::from_bits(0x3eb3fc18), + f32::from_bits(0x3eb67a18), f32::from_bits(0x3eb8fd37), f32::from_bits(0x3ebb8579), f32::from_bits(0x3ebe12e1), + f32::from_bits(0x3ec0a571), f32::from_bits(0x3ec33d2d), f32::from_bits(0x3ec5da17), f32::from_bits(0x3ec87c33), + f32::from_bits(0x3ecb2383), f32::from_bits(0x3ecdd00b), f32::from_bits(0x3ed081cd), f32::from_bits(0x3ed338cc), + f32::from_bits(0x3ed5f50b), f32::from_bits(0x3ed8b68d), f32::from_bits(0x3edb7d54), f32::from_bits(0x3ede4965), + f32::from_bits(0x3ee11ac1), f32::from_bits(0x3ee3f16b), f32::from_bits(0x3ee6cd67), f32::from_bits(0x3ee9aeb7), + f32::from_bits(0x3eec955d), f32::from_bits(0x3eef815d), f32::from_bits(0x3ef272ba), f32::from_bits(0x3ef56976), + f32::from_bits(0x3ef86594), f32::from_bits(0x3efb6717), f32::from_bits(0x3efe6e02), f32::from_bits(0x3f00bd2d), + f32::from_bits(0x3f02460e), f32::from_bits(0x3f03d1a7), f32::from_bits(0x3f055ff9), f32::from_bits(0x3f06f108), + f32::from_bits(0x3f0884d1), f32::from_bits(0x3f0a1b57), f32::from_bits(0x3f0bb49d), f32::from_bits(0x3f0d50a2), + f32::from_bits(0x3f0eef69), f32::from_bits(0x3f1090f2), f32::from_bits(0x3f123540), f32::from_bits(0x3f13dc53), + f32::from_bits(0x3f15862d), f32::from_bits(0x3f1732cf), f32::from_bits(0x3f18e23b), f32::from_bits(0x3f1a9471), + f32::from_bits(0x3f1c4973), f32::from_bits(0x3f1e0143), f32::from_bits(0x3f1fbbe1), f32::from_bits(0x3f217950), + f32::from_bits(0x3f23398f), f32::from_bits(0x3f24fca2), f32::from_bits(0x3f26c288), f32::from_bits(0x3f288b43), + f32::from_bits(0x3f2a56d5), f32::from_bits(0x3f2c253f), f32::from_bits(0x3f2df681), f32::from_bits(0x3f2fca9e), + f32::from_bits(0x3f31a199), f32::from_bits(0x3f337b6e), f32::from_bits(0x3f355822), f32::from_bits(0x3f3737b5), + f32::from_bits(0x3f391a28), f32::from_bits(0x3f3aff7e), f32::from_bits(0x3f3ce7b7), f32::from_bits(0x3f3ed2d4), f32::from_bits(0x3f40c0d6), + f32::from_bits(0x3f42b1c0), f32::from_bits(0x3f44a592), f32::from_bits(0x3f469c4d), f32::from_bits(0x3f4895f3), + f32::from_bits(0x3f4a9284), f32::from_bits(0x3f4c9203), f32::from_bits(0x3f4e9470), f32::from_bits(0x3f5099cd), + f32::from_bits(0x3f52a21a), f32::from_bits(0x3f54ad59), f32::from_bits(0x3f56bb8c), f32::from_bits(0x3f58ccb3), + f32::from_bits(0x3f5ae0cf), f32::from_bits(0x3f5cf7e2), f32::from_bits(0x3f5f11ee), f32::from_bits(0x3f612ef2), f32::from_bits(0x3f634eef), + f32::from_bits(0x3f6571ec), f32::from_bits(0x3f6797e3), f32::from_bits(0x3f69c0db), f32::from_bits(0x3f6beccd), + f32::from_bits(0x3f6e1bc4), f32::from_bits(0x3f704db8), f32::from_bits(0x3f7282b4), f32::from_bits(0x3f74baae), + f32::from_bits(0x3f76f5b3), f32::from_bits(0x3f7933b9), f32::from_bits(0x3f7b74cb), f32::from_bits(0x3f7db8e0), + f32::from_bits(0x3f800000), ]; #[inline] @@ -162,12 +194,11 @@ mod tests { #[test] fn test_float_to_srgb_u8() { for u in 0..=u8::MAX { - // let a = srgb_u8_to_float(u); - // let b = srgb_u8_to_float_ref(u); - // if a != b { - // panic!("Mismatch at u={}: {} != {}", u, a, b); - // } - assert!(srgb_u8_to_float(u) == srgb_u8_to_float_ref(u)); + let a = srgb_u8_to_float(u); + let b = srgb_u8_to_float_ref(u); + if a != b { + panic!("Mismatch at u={}: {} != {}", u, a, b); + } } } From c0d60b7b8a11bbea5713fbceedf728d503307cdf Mon Sep 17 00:00:00 2001 From: Tyooughtul Date: Wed, 4 Mar 2026 14:38:25 +0800 Subject: [PATCH 4/5] fix: - replace hardcoded primary input/output indices with named constants - adds PRIMARY_INPUT_INDEX and PRIMARY_OUTPUT_INDEX constants to InputConnector, OutputConnector, and NodeInput, replaces hardcoded 0 indices with these constants. --- .../graph_operation_message_handler.rs | 10 +-- .../document/graph_operation/utility_types.rs | 4 +- .../node_graph/node_graph_message_handler.rs | 20 +++--- .../utility_types/network_interface.rs | 66 ++++++++++--------- .../network_interface/resolved_types.rs | 2 +- .../portfolio/portfolio_message_handler.rs | 2 +- .../shape_gizmos/point_radius_handle.rs | 1 + .../common_functionality/utility_functions.rs | 2 +- .../tool/tool_messages/spline_tool.rs | 2 +- .../messages/tool/tool_messages/text_tool.rs | 10 ++- editor/src/node_graph_executor.rs | 2 +- editor/src/node_graph_executor/runtime.rs | 2 +- node-graph/graph-craft/src/document.rs | 38 ++++++----- node-graph/interpreted-executor/src/lib.rs | 4 +- node-graph/interpreted-executor/src/util.rs | 16 ++--- node-graph/preprocessor/src/lib.rs | 4 +- 16 files changed, 99 insertions(+), 86 deletions(-) diff --git a/editor/src/messages/portfolio/document/graph_operation/graph_operation_message_handler.rs b/editor/src/messages/portfolio/document/graph_operation/graph_operation_message_handler.rs index 4620efed78..726d58ee4d 100644 --- a/editor/src/messages/portfolio/document/graph_operation/graph_operation_message_handler.rs +++ b/editor/src/messages/portfolio/document/graph_operation/graph_operation_message_handler.rs @@ -200,7 +200,7 @@ impl MessageHandler> for const LAYER_SECONDARY_INPUT_INDEX: usize = 1; responses.add(NodeGraphMessage::SetInput { input_connector: InputConnector::node(layer.to_node(), LAYER_SECONDARY_INPUT_INDEX), - input: NodeInput::node(first_new_node_id, 0), + input: NodeInput::node(first_new_node_id, NodeInput::PRIMARY_OUTPUT_INDEX), }); } // Move the layer and all nodes to the correct position in the network @@ -260,10 +260,10 @@ impl MessageHandler> for artboard_data.insert( artboard.to_node(), ArtboardInfo { - input_node: NodeInput::node(document_node.inputs[ARTBOARD_CONTENT_INDEX].as_node().unwrap_or_default(), 0), + input_node: NodeInput::node(document_node.inputs[ARTBOARD_CONTENT_INDEX].as_node().unwrap_or_default(), NodeInput::PRIMARY_OUTPUT_INDEX), output_nodes: network_interface .outward_wires(&[]) - .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(artboard.to_node(), 0))) + .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(artboard.to_node(), OutputConnector::PRIMARY_OUTPUT_INDEX))) .cloned() .unwrap_or_default(), merge_node: node_id, @@ -290,12 +290,12 @@ impl MessageHandler> for const MERGE_CONTENT_INDEX: usize = 1; responses.add(NodeGraphMessage::SetInput { input_connector: InputConnector::node(artboard.1.merge_node, MERGE_CONTENT_INDEX), - input: NodeInput::node(artboard.1.input_node.as_node().unwrap_or_default(), 0), + input: NodeInput::node(artboard.1.input_node.as_node().unwrap_or_default(), NodeInput::PRIMARY_OUTPUT_INDEX), }); // Modify upstream connections for outward_wire in &artboard.1.output_nodes { - let input = NodeInput::node(artboard_data[artboard.0].merge_node, 0); + let input = NodeInput::node(artboard_data[artboard.0].merge_node, NodeInput::PRIMARY_OUTPUT_INDEX); let input_connector = match artboard_data.get(&outward_wire.node_id().unwrap_or_default()) { Some(artboard_info) => InputConnector::node(artboard_info.merge_node, outward_wire.input_index()), _ => *outward_wire, diff --git a/editor/src/messages/portfolio/document/graph_operation/utility_types.rs b/editor/src/messages/portfolio/document/graph_operation/utility_types.rs index 5998f00c4d..6f2d75f41d 100644 --- a/editor/src/messages/portfolio/document/graph_operation/utility_types.rs +++ b/editor/src/messages/portfolio/document/graph_operation/utility_types.rs @@ -92,7 +92,7 @@ impl<'a> ModifyInputsContext<'a> { current_index += 1; } // Input as a sibling to the Layer node above - post_node_input_connector = InputConnector::node(*next_node_in_stack_id, 0); + post_node_input_connector = InputConnector::node(*next_node_in_stack_id, InputConnector::PRIMARY_INPUT_INDEX); } else { log::error!("Error getting post node: insert_index out of bounds"); break; @@ -108,7 +108,7 @@ impl<'a> ModifyInputsContext<'a> { match pre_node_output_connector { Some(OutputConnector::Node { node_id: pre_node_id, .. }) if !network_interface.is_layer(&pre_node_id, &[]) => { // Update post_node_input_connector for the next iteration - post_node_input_connector = InputConnector::node(pre_node_id, 0); + post_node_input_connector = InputConnector::node(pre_node_id, InputConnector::PRIMARY_INPUT_INDEX); // Insert directly under layer if moving to the end of a layer stack that ends with a non layer node that does not have an exposed primary input let primary_is_exposed = network_interface.input_from_connector(&post_node_input_connector, &[]).is_some_and(|input| input.is_exposed()); if !primary_is_exposed { diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs index e6dca6448a..363be1d18d 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs @@ -223,8 +223,8 @@ impl<'a> MessageHandler> for NodeG x: (mid_point.x / 24.) as i32, y: (mid_point.y / 24.) as i32, }); - let node_input_connector = InputConnector::node(node_id, 0); - let node_output_connector = OutputConnector::node(node_id, 0); + let node_input_connector = InputConnector::node(node_id, InputConnector::PRIMARY_INPUT_INDEX); + let node_output_connector = OutputConnector::node(node_id, OutputConnector::PRIMARY_OUTPUT_INDEX); responses.add(NodeGraphMessage::CreateWire { output_connector, input_connector: node_input_connector, @@ -473,7 +473,7 @@ impl<'a> MessageHandler> for NodeG return; }; - let encapsulating_connector = InputConnector::node(*node_id, 0); + let encapsulating_connector = InputConnector::node(*node_id, InputConnector::PRIMARY_INPUT_INDEX); if !exposed { network_interface.disconnect_input(&encapsulating_connector, network_path); } @@ -527,7 +527,7 @@ impl<'a> MessageHandler> for NodeG log::error!("Could not get outward wires in remove_import"); return; }; - let Some(downstream_connections) = outward_wires.get(&OutputConnector::node(*encapsulating_node, 0)).cloned() else { + let Some(downstream_connections) = outward_wires.get(&OutputConnector::node(*encapsulating_node, OutputConnector::PRIMARY_OUTPUT_INDEX)).cloned() else { log::error!("Could not get outward wires for import in remove_import"); return; }; @@ -1338,7 +1338,7 @@ impl<'a> MessageHandler> for NodeG let selected_node_id = selected_nodes.selected_nodes_ref()[0]; let has_primary_output_connection = network_interface .outward_wires(selection_network_path) - .is_some_and(|outward_wires| outward_wires.get(&OutputConnector::node(selected_node_id, 0)).is_some_and(|outward_wires| !outward_wires.is_empty())); + .is_some_and(|outward_wires| outward_wires.get(&OutputConnector::node(selected_node_id, OutputConnector::PRIMARY_OUTPUT_INDEX)).is_some_and(|outward_wires| !outward_wires.is_empty())); if !has_primary_output_connection { let Some(network) = network_interface.nested_network(selection_network_path) else { return; @@ -1532,13 +1532,13 @@ impl<'a> MessageHandler> for NodeG } let number_of_outputs = network_interface.number_of_outputs(selected_node, selection_network_path); - let mut first_deselected_upstream_output = network_interface.upstream_output_connector(&InputConnector::node(*selected_node, 0), selection_network_path); + let mut first_deselected_upstream_output = network_interface.upstream_output_connector(&InputConnector::node(*selected_node, InputConnector::PRIMARY_INPUT_INDEX), selection_network_path); while let Some(OutputConnector::Node { node_id, .. }) = &first_deselected_upstream_output { if !all_selected_nodes.contains(node_id) { break; } - first_deselected_upstream_output = network_interface.upstream_output_connector(&InputConnector::node(*node_id, 0), selection_network_path); + first_deselected_upstream_output = network_interface.upstream_output_connector(&InputConnector::node(*node_id, InputConnector::PRIMARY_INPUT_INDEX), selection_network_path); } let Some(outward_wires) = network_interface.outward_wires(selection_network_path) else { @@ -1561,7 +1561,7 @@ impl<'a> MessageHandler> for NodeG // Handle reconnection // Find first non selected upstream node by primary flow if let Some(first_deselected_upstream_output) = first_deselected_upstream_output { - let Some(downstream_connections_to_first_output) = outward_wires.get(&OutputConnector::node(*selected_node, 0)).cloned() else { + let Some(downstream_connections_to_first_output) = outward_wires.get(&OutputConnector::node(*selected_node, OutputConnector::PRIMARY_OUTPUT_INDEX)).cloned() else { log::error!("Could not get downstream_connections_to_first_output in shake node"); return; }; @@ -2597,7 +2597,7 @@ impl NodeGraphMessageHandler { }; let mut nodes = Vec::new(); for (node_id, visible) in network.nodes.iter().map(|(node_id, node)| (*node_id, node.visible)).collect::>() { - let primary_input_connector = InputConnector::node(node_id, 0); + let primary_input_connector = InputConnector::node(node_id, InputConnector::PRIMARY_INPUT_INDEX); let primary_input = if network_interface .input_from_connector(&primary_input_connector, breadcrumb_network_path) @@ -2611,7 +2611,7 @@ impl NodeGraphMessageHandler { .filter_map(|input_index| network_interface.frontend_input_from_connector(&InputConnector::node(node_id, input_index), breadcrumb_network_path)) .collect(); - let primary_output = network_interface.frontend_output_from_connector(&OutputConnector::node(node_id, 0), breadcrumb_network_path); + let primary_output = network_interface.frontend_output_from_connector(&OutputConnector::node(node_id, OutputConnector::PRIMARY_OUTPUT_INDEX), breadcrumb_network_path); let exposed_outputs = (1..network_interface.number_of_outputs(&node_id, breadcrumb_network_path)) .filter_map(|output_index| network_interface.frontend_output_from_connector(&OutputConnector::node(node_id, output_index), breadcrumb_network_path)) diff --git a/editor/src/messages/portfolio/document/utility_types/network_interface.rs b/editor/src/messages/portfolio/document/utility_types/network_interface.rs index bdc0e178c6..f3c2aec9c6 100644 --- a/editor/src/messages/portfolio/document/utility_types/network_interface.rs +++ b/editor/src/messages/portfolio/document/utility_types/network_interface.rs @@ -216,7 +216,7 @@ impl NodeNetworkInterface { pub fn downstream_layer_for_chain_node(&mut self, node_id: &NodeId, network_path: &[NodeId]) -> Option { let mut id = *node_id; while !self.is_layer(&id, network_path) { - id = self.outward_wires(network_path)?.get(&OutputConnector::node(id, 0))?.first()?.node_id()?; + id = self.outward_wires(network_path)?.get(&OutputConnector::node(id, OutputConnector::PRIMARY_OUTPUT_INDEX))?.first()?.node_id()?; } Some(id) } @@ -229,7 +229,7 @@ impl NodeNetworkInterface { if self.is_layer(¤t_node, network_path) { layers.push(current_node); } else { - let Some(outward_wires) = self.outward_wires(network_path).and_then(|outward_wires| outward_wires.get(&OutputConnector::node(current_node, 0))) else { + let Some(outward_wires) = self.outward_wires(network_path).and_then(|outward_wires| outward_wires.get(&OutputConnector::node(current_node, OutputConnector::PRIMARY_OUTPUT_INDEX))) else { log::error!("Could not get outward wires in downstream_layer"); return Vec::new(); }; @@ -370,7 +370,7 @@ impl NodeNetworkInterface { return None; }; // TODO: Get downstream connections from all outputs - let mut downstream_connections = outward_wires.get(&OutputConnector::node(*node_id, 0)).map_or([].iter(), |outputs| outputs.iter()); + let mut downstream_connections = outward_wires.get(&OutputConnector::node(*node_id, OutputConnector::PRIMARY_OUTPUT_INDEX)).map_or([].iter(), |outputs| outputs.iter()); let has_selected_node_downstream = downstream_connections.any(|input_connector| input_connector.node_id().is_some_and(|upstream_id| new_ids.keys().any(|key| *key == upstream_id))); // If the copied node does not have a downstream connection to another copied node, then set the position to absolute if !has_selected_node_downstream { @@ -1066,7 +1066,7 @@ impl NodeNetworkInterface { log::error!("Could not get outward_wires in primary_output_connected_to_layer"); return false; }; - let Some(downstream_connectors) = outward_wires.get(&OutputConnector::node(*node_id, 0)) else { + let Some(downstream_connectors) = outward_wires.get(&OutputConnector::node(*node_id, OutputConnector::PRIMARY_OUTPUT_INDEX)) else { log::error!("Could not get downstream_connectors in primary_output_connected_to_layer"); return false; }; @@ -1079,7 +1079,7 @@ impl NodeNetworkInterface { } pub fn primary_input_connected_to_layer(&mut self, node_id: &NodeId, network_path: &[NodeId]) -> bool { - self.input_from_connector(&InputConnector::node(*node_id, 0), network_path) + self.input_from_connector(&InputConnector::node(*node_id, InputConnector::PRIMARY_INPUT_INDEX), network_path) .and_then(|input| input.as_node()) .is_some_and(|node_id| self.is_layer(&node_id, network_path)) } @@ -1103,7 +1103,7 @@ impl NodeNetworkInterface { let Some((encapsulating_node_id, encapsulating_path)) = network_path.split_last() else { return false; }; - self.input_from_connector(&InputConnector::node(*encapsulating_node_id, 0), encapsulating_path) + self.input_from_connector(&InputConnector::node(*encapsulating_node_id, InputConnector::PRIMARY_INPUT_INDEX), encapsulating_path) .is_some_and(|input| !input.is_exposed()) } @@ -1616,7 +1616,7 @@ impl NodeNetworkInterface { log::error!("Cannot load outward wires in load_stack_dependents"); return; }; - let Some(layer_outward_wires) = outward_wires.get(&OutputConnector::node(current_node, 0)) else { + let Some(layer_outward_wires) = outward_wires.get(&OutputConnector::node(current_node, OutputConnector::PRIMARY_OUTPUT_INDEX)) else { log::error!("Could not get outward_wires for layer {current_node}"); break; }; @@ -2613,7 +2613,7 @@ impl NodeNetworkInterface { LayerPosition::Stack(y_offset) => { let Some(downstream_node_connectors) = self .outward_wires(network_path) - .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(*node_id, 0))) + .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(*node_id, OutputConnector::PRIMARY_OUTPUT_INDEX))) .cloned() else { log::error!("Could not get downstream node in position_from_downstream_node"); @@ -2648,7 +2648,7 @@ impl NodeNetworkInterface { // TODO: Use root node to restore if previewing let Some(downstream_node_connectors) = self .outward_wires(network_path) - .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(current_node_id, 0))) + .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(current_node_id, OutputConnector::PRIMARY_OUTPUT_INDEX))) .cloned() else { log::error!("Could not get downstream node for node {node_id} with Position::Chain"); @@ -3985,7 +3985,7 @@ impl NodeNetworkInterface { // If the layer feeds into the bottom input of layer, and has no other outputs, set its position to stack at its previous y position let multiple_outward_wires = self .outward_wires(network_path) - .and_then(|all_outward_wires| all_outward_wires.get(&OutputConnector::node(*upstream_node_id, 0))) + .and_then(|all_outward_wires| all_outward_wires.get(&OutputConnector::node(*upstream_node_id, OutputConnector::PRIMARY_OUTPUT_INDEX))) .is_some_and(|outward_wires| outward_wires.len() > 1); if *input_index == 0 && !multiple_outward_wires { self.set_stack_position_calculated_offset(upstream_node_id, downstream_node_id, network_path); @@ -4026,7 +4026,7 @@ impl NodeNetworkInterface { let old_upstream_node_is_layer = self.is_layer(&old_upstream_node_id, network_path); let Some(outward_wires) = self .outward_wires(network_path) - .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(old_upstream_node_id, 0))) + .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(old_upstream_node_id, OutputConnector::PRIMARY_OUTPUT_INDEX))) else { log::error!("Could not get outward wires in set_input"); return; @@ -4347,7 +4347,7 @@ impl NodeNetworkInterface { && let Some(reconnect_input) = &reconnect_to_input { reconnect_node = reconnect_input.as_node().and_then(|node_id| if self.is_stack(&node_id, network_path) { Some(node_id) } else { None }); - self.disconnect_input(&InputConnector::node(*node_id, 0), network_path); + self.disconnect_input(&InputConnector::node(*node_id, InputConnector::PRIMARY_INPUT_INDEX), network_path); self.set_input(downstream_input, reconnect_input.clone(), network_path); } } @@ -4561,7 +4561,7 @@ impl NodeNetworkInterface { if self.is_layer(&upstream_sibling_id, network_path) && self .outward_wires(network_path) - .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(upstream_sibling_id, 0))) + .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(upstream_sibling_id, OutputConnector::PRIMARY_OUTPUT_INDEX))) .is_some_and(|outward_wires| outward_wires.len() == 1) { self.set_stack_position_calculated_offset(&upstream_sibling_id, node_id, network_path); @@ -4582,7 +4582,7 @@ impl NodeNetworkInterface { .outward_wires(network_path) .and_then(|outward_wires| { outward_wires - .get(&OutputConnector::node(*node_id, 0)) + .get(&OutputConnector::node(*node_id, OutputConnector::PRIMARY_OUTPUT_INDEX)) .and_then(|outward_wires| (outward_wires.len() == 1).then(|| outward_wires[0])) .and_then(|downstream_connector| if downstream_connector.input_index() == 0 { downstream_connector.node_id() } else { None }) }) @@ -4673,7 +4673,7 @@ impl NodeNetworkInterface { } // The export is not clicked else { - new_export = Some(OutputConnector::node(toggle_id, 0)); + new_export = Some(OutputConnector::node(toggle_id, OutputConnector::PRIMARY_OUTPUT_INDEX)); // There is currently a dashed line being drawn if let Previewing::Yes { root_node_to_restore } = self.previewing(network_path) { @@ -4681,7 +4681,7 @@ impl NodeNetworkInterface { if let Some(root_node_to_restore) = root_node_to_restore { // If the node with the solid line is clicked, then start previewing that node without restore if root_node_to_restore.node_id == toggle_id { - new_export = Some(OutputConnector::node(toggle_id, 0)); + new_export = Some(OutputConnector::node(toggle_id, OutputConnector::PRIMARY_OUTPUT_INDEX)); new_previewing_state = Previewing::Yes { root_node_to_restore: None }; } else { // Root node to restore does not change @@ -4697,7 +4697,7 @@ impl NodeNetworkInterface { } // Not previewing, there is no dashed line being drawn else { - new_export = Some(OutputConnector::node(toggle_id, 0)); + new_export = Some(OutputConnector::node(toggle_id, OutputConnector::PRIMARY_OUTPUT_INDEX)); new_previewing_state = Previewing::Yes { root_node_to_restore: Some(RootNode { node_id: previous_export_id, @@ -4710,7 +4710,7 @@ impl NodeNetworkInterface { // The primary export is disconnected else { // Set node as export and cancel any preview - new_export = Some(OutputConnector::node(toggle_id, 0)); + new_export = Some(OutputConnector::node(toggle_id, OutputConnector::PRIMARY_OUTPUT_INDEX)); self.start_previewing_without_restore(network_path); } } @@ -4803,7 +4803,7 @@ impl NodeNetworkInterface { else { log::error!("Could not set chain position for layer node {node_id}"); } - // let previous_upstream_node = self.upstream_output_connector(&InputConnector::node(*node_id, 0), network_path).and_then(|output| output.node_id()); + // let previous_upstream_node = self.upstream_output_connector(&InputConnector::node(*node_id, InputConnector::PRIMARY_INPUT_INDEX), network_path).and_then(|output| output.node_id()); // let Some(previous_upstream_node_position) = previous_upstream_node.and_then(|upstream| self.position_from_downstream_node(&upstream, network_path)) else { // log::error!("Could not get previous_upstream_node_position"); // return; @@ -4863,7 +4863,7 @@ impl NodeNetworkInterface { if self.is_layer(&upstream_node, network_path) || self.hidden_primary_output(&upstream_node, network_path) { break; } - let Some(outward_wires) = self.outward_wires(network_path).and_then(|outward_wires| outward_wires.get(&OutputConnector::node(upstream_node, 0))) else { + let Some(outward_wires) = self.outward_wires(network_path).and_then(|outward_wires| outward_wires.get(&OutputConnector::node(upstream_node, OutputConnector::PRIMARY_OUTPUT_INDEX))) else { log::error!("Could not get outward wires in try_set_upstream_to_chain"); break; }; @@ -4910,7 +4910,7 @@ impl NodeNetworkInterface { break; }; downstream_layer = outward_wires - .get(&OutputConnector::node(downstream_layer_id, 0)) + .get(&OutputConnector::node(downstream_layer_id, OutputConnector::PRIMARY_OUTPUT_INDEX)) .and_then(|outward_wires| if outward_wires.len() == 1 { outward_wires[0].node_id() } else { None }); } else { break; @@ -4925,7 +4925,7 @@ impl NodeNetworkInterface { fn try_set_node_to_chain(&mut self, node_id: &NodeId, network_path: &[NodeId]) { if let Some(outward_wires) = self .outward_wires(network_path) - .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(*node_id, 0))) + .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(*node_id, OutputConnector::PRIMARY_OUTPUT_INDEX))) .cloned() && outward_wires.len() == 1 { self.try_set_upstream_to_chain(&outward_wires[0], network_path) @@ -4937,7 +4937,7 @@ impl NodeNetworkInterface { if !self.is_layer(upstream_id, network_path) && self .outward_wires(network_path) - .is_some_and(|outward_wires| outward_wires.get(&OutputConnector::node(*upstream_id, 0)).is_some_and(|outward_wires| outward_wires.len() == 1)) + .is_some_and(|outward_wires| outward_wires.get(&OutputConnector::node(*upstream_id, OutputConnector::PRIMARY_OUTPUT_INDEX)).is_some_and(|outward_wires| outward_wires.len() == 1)) { self.set_chain_position(upstream_id, network_path); } @@ -5060,7 +5060,7 @@ impl NodeNetworkInterface { && let LayerPosition::Stack(offset) = layer_metadata.position { // If the upstream layer is selected, then skip - let Some(outward_wires) = self.outward_wires(network_path).and_then(|outward_wires| outward_wires.get(&OutputConnector::node(*node_id, 0))) else { + let Some(outward_wires) = self.outward_wires(network_path).and_then(|outward_wires| outward_wires.get(&OutputConnector::node(*node_id, OutputConnector::PRIMARY_OUTPUT_INDEX))) else { log::error!("Could not get outward wires in shift_selected_nodes"); return; }; @@ -5113,7 +5113,7 @@ impl NodeNetworkInterface { } let Some(downstream_node) = self .outward_wires(network_path) - .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(downstream_absolute_layer, 0))) + .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(downstream_absolute_layer, OutputConnector::PRIMARY_OUTPUT_INDEX))) .and_then(|downstream_nodes| downstream_nodes.first()) .and_then(|downstream_node| downstream_node.node_id()) else { @@ -5567,7 +5567,7 @@ impl NodeNetworkInterface { match post_node_input { // Create a new stack NodeInput::Value { .. } | NodeInput::Scope(_) | NodeInput::Inline(_) | NodeInput::Reflection(_) => { - self.create_wire(&OutputConnector::node(layer.to_node(), 0), &post_node, network_path); + self.create_wire(&OutputConnector::node(layer.to_node(), OutputConnector::PRIMARY_OUTPUT_INDEX), &post_node, network_path); let final_layer_position = after_move_post_layer_position + IVec2::new(-8, 3); let shift = final_layer_position - previous_layer_position; @@ -5595,7 +5595,7 @@ impl NodeNetworkInterface { NodeInput::Value { .. } | NodeInput::Scope(_) | NodeInput::Inline(_) | NodeInput::Reflection(_) => { let offset = after_move_post_layer_position - previous_layer_position + IVec2::new(0, 3 + height_above_layer); self.shift_absolute_node_position(&layer.to_node(), offset, network_path); - self.create_wire(&OutputConnector::node(layer.to_node(), 0), &post_node, network_path); + self.create_wire(&OutputConnector::node(layer.to_node(), OutputConnector::PRIMARY_OUTPUT_INDEX), &post_node, network_path); } // Insert into the stack NodeInput::Node { .. } => { @@ -5614,7 +5614,7 @@ impl NodeNetworkInterface { self.insert_node_between(&layer.to_node(), &post_node, 0, network_path); // Get the other wires which need to be moved to the output of the moved layer - let layer_input_connector = InputConnector::node(layer.to_node(), 0); + let layer_input_connector = InputConnector::node(layer.to_node(), InputConnector::PRIMARY_INPUT_INDEX); let other_outward_wires = self .upstream_output_connector(&layer_input_connector, network_path) .and_then(|pre_node_output| self.outward_wires(network_path).and_then(|wires| wires.get(&pre_node_output))) @@ -5630,7 +5630,7 @@ impl NodeNetworkInterface { // Disconnect and reconnect for other_outward_wire in &other_outward_wires { self.disconnect_input(other_outward_wire, network_path); - self.create_wire(&OutputConnector::node(layer.to_node(), 0), other_outward_wire, network_path); + self.create_wire(&OutputConnector::node(layer.to_node(), OutputConnector::PRIMARY_OUTPUT_INDEX), other_outward_wire, network_path); } } self.unload_upstream_node_click_targets(vec![layer.to_node()], network_path); @@ -5652,7 +5652,7 @@ impl NodeNetworkInterface { self.disconnect_input(input_connector, network_path); // Connect the input connector to the new node - self.create_wire(&OutputConnector::node(*node_id, 0), input_connector, network_path); + self.create_wire(&OutputConnector::node(*node_id, OutputConnector::PRIMARY_OUTPUT_INDEX), input_connector, network_path); // Connect the new node to the previous node self.create_wire(&upstream_output, &InputConnector::node(*node_id, insert_node_input_index), network_path); @@ -5666,7 +5666,7 @@ impl NodeNetworkInterface { return; }; if matches!(current_input, NodeInput::Value { .. }) { - self.create_wire(&OutputConnector::node(*node_id, 0), &InputConnector::node(parent.to_node(), LAYER_SECONDARY_INPUT_INDEX), network_path); + self.create_wire(&OutputConnector::node(*node_id, OutputConnector::PRIMARY_OUTPUT_INDEX), &InputConnector::node(parent.to_node(), LAYER_SECONDARY_INPUT_INDEX), network_path); self.set_chain_position(node_id, network_path); } else { // Insert the node in the gap and set the upstream to a chain @@ -5756,6 +5756,8 @@ impl Default for InputConnector { } impl InputConnector { + pub const PRIMARY_INPUT_INDEX: usize = 0; + pub fn node(node_id: NodeId, input_index: usize) -> Self { InputConnector::Node { node_id, input_index } } @@ -5796,6 +5798,8 @@ impl Default for OutputConnector { } impl OutputConnector { + pub const PRIMARY_OUTPUT_INDEX: usize = 0; + pub fn node(node_id: NodeId, output_index: usize) -> Self { OutputConnector::Node { node_id, output_index } } diff --git a/editor/src/messages/portfolio/document/utility_types/network_interface/resolved_types.rs b/editor/src/messages/portfolio/document/utility_types/network_interface/resolved_types.rs index e7d724d76b..c2e1646579 100644 --- a/editor/src/messages/portfolio/document/utility_types/network_interface/resolved_types.rs +++ b/editor/src/messages/portfolio/document/utility_types/network_interface/resolved_types.rs @@ -287,7 +287,7 @@ impl NodeNetworkInterface { log::error!("Protonode {proto_node_identifier:?} not found in registry in complete_valid_input_types"); return Vec::new(); }; - let valid_output_types = self.valid_output_types(&OutputConnector::node(*node_id, 0), network_path); + let valid_output_types = self.valid_output_types(&OutputConnector::node(*node_id, OutputConnector::PRIMARY_OUTPUT_INDEX), network_path); implementations .iter() diff --git a/editor/src/messages/portfolio/portfolio_message_handler.rs b/editor/src/messages/portfolio/portfolio_message_handler.rs index e73eb4ef98..c610ea41cb 100644 --- a/editor/src/messages/portfolio/portfolio_message_handler.rs +++ b/editor/src/messages/portfolio/portfolio_message_handler.rs @@ -612,7 +612,7 @@ impl MessageHandler> for Portfolio let Some((downstream_node, input_index)) = document .network_interface .outward_wires(&[]) - .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(layer.to_node(), 0))) + .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(layer.to_node(), OutputConnector::PRIMARY_OUTPUT_INDEX))) .and_then(|outward_wires| outward_wires.first()) .and_then(|input_connector| input_connector.node_id().map(|node_id| (node_id, input_connector.input_index()))) else { diff --git a/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/point_radius_handle.rs b/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/point_radius_handle.rs index b09817600a..daf91a0cba 100644 --- a/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/point_radius_handle.rs +++ b/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/point_radius_handle.rs @@ -14,6 +14,7 @@ use crate::messages::tool::common_functionality::shapes::shape_utility::{extract use glam::DVec2; use graph_craft::document::NodeInput; use graph_craft::document::value::TaggedValue; +use graphene_std::NodeInputDecleration; use graphene_std::vector::generator_nodes::star::*; use std::collections::VecDeque; use std::f64::consts::{FRAC_1_SQRT_2, FRAC_PI_4, PI, SQRT_2}; diff --git a/editor/src/messages/tool/common_functionality/utility_functions.rs b/editor/src/messages/tool/common_functionality/utility_functions.rs index e8d4293721..accf27dc96 100644 --- a/editor/src/messages/tool/common_functionality/utility_functions.rs +++ b/editor/src/messages/tool/common_functionality/utility_functions.rs @@ -575,7 +575,7 @@ pub fn make_path_editable_is_allowed(network_interface: &mut NodeNetworkInterfac // Must be a layer of type Table let node_id = NodeGraphLayer::new(first_layer, network_interface).horizontal_layer_flow().nth(1)?; - let output_type = network_interface.output_type(&OutputConnector::node(node_id, 0), &[]); + let output_type = network_interface.output_type(&OutputConnector::node(node_id, OutputConnector::PRIMARY_OUTPUT_INDEX), &[]); if output_type.compiled_nested_type() != Some(&concrete!(Table)) { return None; } diff --git a/editor/src/messages/tool/tool_messages/spline_tool.rs b/editor/src/messages/tool/tool_messages/spline_tool.rs index 345b5a058e..fca3bd901d 100644 --- a/editor/src/messages/tool/tool_messages/spline_tool.rs +++ b/editor/src/messages/tool/tool_messages/spline_tool.rs @@ -391,7 +391,7 @@ impl Fsm for SplineToolFsmState { let path_node_type = resolve_network_node_type("Path").expect("Path node does not exist"); let path_node = path_node_type.default_node_template(); let spline_node_type = resolve_proto_node_type(graphene_std::vector::spline::IDENTIFIER).expect("Spline node does not exist"); - let spline_node = spline_node_type.node_template_input_override([Some(NodeInput::node(NodeId(1), 0))]); + let spline_node = spline_node_type.node_template_input_override([Some(NodeInput::node(NodeId(1), NodeInput::PRIMARY_OUTPUT_INDEX))]); let nodes = vec![(NodeId(1), path_node), (NodeId(0), spline_node)]; let layer = graph_modification_utils::new_custom(NodeId::new(), nodes, parent, responses); diff --git a/editor/src/messages/tool/tool_messages/text_tool.rs b/editor/src/messages/tool/tool_messages/text_tool.rs index 69593190e4..5825ff30fa 100644 --- a/editor/src/messages/tool/tool_messages/text_tool.rs +++ b/editor/src/messages/tool/tool_messages/text_tool.rs @@ -463,7 +463,10 @@ impl TextToolData { responses.add(NodeGraphMessage::SelectedNodesSet { nodes: vec![self.layer.to_node()] }); // Make the rendered text invisible while editing responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(graph_modification_utils::get_text_id(self.layer, &document.network_interface).unwrap(), 1), + input_connector: InputConnector::node( + graph_modification_utils::get_text_id(self.layer, &document.network_interface).unwrap(), + graphene_std::text::text::TextInput::INDEX, + ), input: NodeInput::value(TaggedValue::String("".to_string()), false), }); responses.add(NodeGraphMessage::RunDocumentGraph); @@ -937,7 +940,10 @@ impl Fsm for TextToolFsmState { tool_data.set_editing(false, font_cache, responses); responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(graph_modification_utils::get_text_id(tool_data.layer, &document.network_interface).unwrap(), 1), + input_connector: InputConnector::node( + graph_modification_utils::get_text_id(tool_data.layer, &document.network_interface).unwrap(), + graphene_std::text::text::TextInput::INDEX, + ), input: NodeInput::value(TaggedValue::String(tool_data.new_text.clone()), false), }); responses.add(NodeGraphMessage::RunDocumentGraph); diff --git a/editor/src/node_graph_executor.rs b/editor/src/node_graph_executor.rs index b325bfd2ab..64dcab946f 100644 --- a/editor/src/node_graph_executor.rs +++ b/editor/src/node_graph_executor.rs @@ -555,7 +555,7 @@ mod test { let mut monitor_node_ids = Vec::with_capacity(node.inputs.len()); for input in &mut node.inputs { let node_id = NodeId::new(); - let old_input = std::mem::replace(input, NodeInput::node(node_id, 0)); + let old_input = std::mem::replace(input, NodeInput::node(node_id, NodeInput::PRIMARY_OUTPUT_INDEX)); monitor_nodes.push((old_input, node_id)); path.push(node_id); monitor_node_ids.push(path.clone()); diff --git a/editor/src/node_graph_executor/runtime.rs b/editor/src/node_graph_executor/runtime.rs index 60b04c13e3..7125b6c6b9 100644 --- a/editor/src/node_graph_executor/runtime.rs +++ b/editor/src/node_graph_executor/runtime.rs @@ -630,7 +630,7 @@ impl InspectState { } let monitor_node = DocumentNode { - inputs: vec![NodeInput::node(inspect_node, 0)], // Connect to the primary output of the inspect node + inputs: vec![NodeInput::node(inspect_node, NodeInput::PRIMARY_OUTPUT_INDEX)], // Connect to the primary output of the inspect node implementation: DocumentNodeImplementation::ProtoNode(graphene_std::memo::monitor::IDENTIFIER), call_argument: graph_craft::generic!(T), skip_deduplication: true, diff --git a/node-graph/graph-craft/src/document.rs b/node-graph/graph-craft/src/document.rs index b54d56780d..a359bd1320 100644 --- a/node-graph/graph-craft/src/document.rs +++ b/node-graph/graph-craft/src/document.rs @@ -222,6 +222,8 @@ impl DocumentNodeMetadata { } impl NodeInput { + pub const PRIMARY_OUTPUT_INDEX: usize = 0; + pub const fn node(node_id: NodeId, output_index: usize) -> Self { Self::Node { node_id, output_index } } @@ -573,7 +575,7 @@ impl NodeNetwork { pub fn value_network(node: DocumentNode) -> Self { Self { - exports: vec![NodeInput::node(NodeId(0), 0)], + exports: vec![NodeInput::node(NodeId(0), NodeInput::PRIMARY_OUTPUT_INDEX)], nodes: [(NodeId(0), node)].into_iter().collect(), ..Default::default() } @@ -767,7 +769,7 @@ impl NodeNetwork { if let NodeInput::Scope(key) = input { let (import_id, _ty) = self.scope_injections.get(key.as_ref()).expect("Tried to import a non existent key from scope"); // TODO use correct output index - *input = NodeInput::node(*import_id, 0); + *input = NodeInput::node(*import_id, NodeInput::PRIMARY_OUTPUT_INDEX); } } } @@ -866,7 +868,7 @@ impl NodeNetwork { NodeInput::Scope(ref key) => { let (import_id, _ty) = self.scope_injections.get(key.as_ref()).expect("Tried to import a non existent key from scope"); // TODO use correct output index - nested_node.inputs[nested_input_index] = NodeInput::node(*import_id, 0); + nested_node.inputs[nested_input_index] = NodeInput::node(*import_id, NodeInput::PRIMARY_OUTPUT_INDEX); } NodeInput::Reflection(_) => unreachable!("Reflection inputs should have been replaced with value nodes"), } @@ -946,7 +948,7 @@ impl NodeNetwork { ); *export = NodeInput::Node { node_id: merged_node_id, - output_index: 0, + output_index: NodeInput::PRIMARY_OUTPUT_INDEX, }; } } @@ -1149,7 +1151,7 @@ mod test { fn add_network() -> NodeNetwork { NodeNetwork { - exports: vec![NodeInput::node(NodeId(1), 0)], + exports: vec![NodeInput::node(NodeId(1), NodeInput::PRIMARY_OUTPUT_INDEX)], nodes: [ ( NodeId(0), @@ -1162,7 +1164,7 @@ mod test { ( NodeId(1), DocumentNode { - inputs: vec![NodeInput::node(NodeId(0), 0)], + inputs: vec![NodeInput::node(NodeId(0), NodeInput::PRIMARY_OUTPUT_INDEX)], implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("core_types::ops::AddPairNode")), ..Default::default() }, @@ -1179,7 +1181,7 @@ mod test { let mut network = add_network(); network.map_ids(|id| NodeId(id.0 + 1)); let mapped_add = NodeNetwork { - exports: vec![NodeInput::node(NodeId(2), 0)], + exports: vec![NodeInput::node(NodeId(2), NodeInput::PRIMARY_OUTPUT_INDEX)], nodes: [ ( NodeId(1), @@ -1192,7 +1194,7 @@ mod test { ( NodeId(2), DocumentNode { - inputs: vec![NodeInput::node(NodeId(1), 0)], + inputs: vec![NodeInput::node(NodeId(1), NodeInput::PRIMARY_OUTPUT_INDEX)], implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("core_types::ops::AddPairNode")), ..Default::default() }, @@ -1214,11 +1216,11 @@ mod test { }; // TODO: Extend test cases to test nested network let mut extraction_network = NodeNetwork { - exports: vec![NodeInput::node(NodeId(1), 0)], + exports: vec![NodeInput::node(NodeId(1), NodeInput::PRIMARY_OUTPUT_INDEX)], nodes: [ id_node.clone(), DocumentNode { - inputs: vec![NodeInput::node(NodeId(0), 0)], + inputs: vec![NodeInput::node(NodeId(0), NodeInput::PRIMARY_OUTPUT_INDEX)], implementation: DocumentNodeImplementation::Extract, ..Default::default() }, @@ -1239,7 +1241,7 @@ mod test { #[test] fn flatten_add() { let mut network = NodeNetwork { - exports: vec![NodeInput::node(NodeId(1), 0)], + exports: vec![NodeInput::node(NodeId(1), NodeInput::PRIMARY_OUTPUT_INDEX)], nodes: [( NodeId(1), DocumentNode { @@ -1264,7 +1266,7 @@ mod test { #[test] fn resolve_proto_node_add() { let document_node = DocumentNode { - inputs: vec![NodeInput::node(NodeId(0), 0)], + inputs: vec![NodeInput::node(NodeId(0), NodeInput::PRIMARY_OUTPUT_INDEX)], call_argument: concrete!(u32), implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("core_types::structural::ConsNode")), ..Default::default() @@ -1347,12 +1349,12 @@ mod test { fn flat_network() -> NodeNetwork { NodeNetwork { - exports: vec![NodeInput::node(NodeId(11), 0)], + exports: vec![NodeInput::node(NodeId(11), NodeInput::PRIMARY_OUTPUT_INDEX)], nodes: [ ( NodeId(10), DocumentNode { - inputs: vec![NodeInput::node(NodeId(14), 0)], + inputs: vec![NodeInput::node(NodeId(14), NodeInput::PRIMARY_OUTPUT_INDEX)], call_argument: concrete!(u32), implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("core_types::structural::ConsNode")), original_location: OriginalLocation { @@ -1381,7 +1383,7 @@ mod test { ( NodeId(11), DocumentNode { - inputs: vec![NodeInput::node(NodeId(10), 0)], + inputs: vec![NodeInput::node(NodeId(10), NodeInput::PRIMARY_OUTPUT_INDEX)], implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("core_types::ops::AddPairNode")), original_location: OriginalLocation { path: Some(vec![NodeId(1), NodeId(1)]), @@ -1401,7 +1403,7 @@ mod test { fn two_node_identity() -> NodeNetwork { NodeNetwork { - exports: vec![NodeInput::node(NodeId(1), 0), NodeInput::node(NodeId(2), 0)], + exports: vec![NodeInput::node(NodeId(1), NodeInput::PRIMARY_OUTPUT_INDEX), NodeInput::node(NodeId(2), NodeInput::PRIMARY_OUTPUT_INDEX)], nodes: [ ( NodeId(1), @@ -1461,10 +1463,10 @@ mod test { #[test] fn simple_duplicate() { - let result = output_duplicate(vec![NodeInput::node(NodeId(1), 0)], NodeInput::node(NodeId(1), 0)); + let result = output_duplicate(vec![NodeInput::node(NodeId(1), NodeInput::PRIMARY_OUTPUT_INDEX)], NodeInput::node(NodeId(1), NodeInput::PRIMARY_OUTPUT_INDEX)); println!("{result:#?}"); assert_eq!(result.exports.len(), 1, "The number of outputs should remain as 1"); - assert_eq!(result.exports[0], NodeInput::node(NodeId(11), 0), "The outer network output should be from a duplicated inner network"); + assert_eq!(result.exports[0], NodeInput::node(NodeId(11), NodeInput::PRIMARY_OUTPUT_INDEX), "The outer network output should be from a duplicated inner network"); let mut ids = result.nodes.keys().copied().collect::>(); ids.sort(); assert_eq!(ids, vec![NodeId(11), NodeId(10010)], "Should only contain identity and values"); diff --git a/node-graph/interpreted-executor/src/lib.rs b/node-graph/interpreted-executor/src/lib.rs index be3c3a7d6a..a0683431ba 100644 --- a/node-graph/interpreted-executor/src/lib.rs +++ b/node-graph/interpreted-executor/src/lib.rs @@ -14,7 +14,7 @@ mod tests { use graph_craft::*; let network = NodeNetwork { - exports: vec![NodeInput::node(NodeId(1), 0)], + exports: vec![NodeInput::node(NodeId(1), NodeInput::PRIMARY_OUTPUT_INDEX)], nodes: [ // Simple identity node taking a number as input from outside the graph ( @@ -30,7 +30,7 @@ mod tests { ( NodeId(1), DocumentNode { - inputs: vec![NodeInput::node(NodeId(0), 0), NodeInput::node(NodeId(0), 0)], + inputs: vec![NodeInput::node(NodeId(0), NodeInput::PRIMARY_OUTPUT_INDEX), NodeInput::node(NodeId(0), NodeInput::PRIMARY_OUTPUT_INDEX)], implementation: DocumentNodeImplementation::ProtoNode(graphene_std::math_nodes::add::IDENTIFIER), ..Default::default() }, diff --git a/node-graph/interpreted-executor/src/util.rs b/node-graph/interpreted-executor/src/util.rs index 8ecf5bf18e..20302379e3 100644 --- a/node-graph/interpreted-executor/src/util.rs +++ b/node-graph/interpreted-executor/src/util.rs @@ -22,13 +22,13 @@ pub fn wrap_network_in_scope(mut network: NodeNetwork, editor_api: Arc")), - inputs: vec![NodeInput::node(NodeId(2), 0)], + inputs: vec![NodeInput::node(NodeId(2), NodeInput::PRIMARY_OUTPUT_INDEX)], ..Default::default() }); scope_injections.push(("wgpu-executor".to_string(), (NodeId(3), concrete!(&WgpuExecutor)))); } NodeNetwork { - exports: vec![NodeInput::node(NodeId(1), 0)], + exports: vec![NodeInput::node(NodeId(1), NodeInput::PRIMARY_OUTPUT_INDEX)], nodes: nodes.into_iter().enumerate().map(|(id, node)| (NodeId(id as u64), node)).collect(), scope_injections: scope_injections.into_iter().collect(), // TODO(TrueDoctor): check if it makes sense to set `generated` to `true` diff --git a/node-graph/preprocessor/src/lib.rs b/node-graph/preprocessor/src/lib.rs index 0f9bf398e4..7db2a23acd 100644 --- a/node-graph/preprocessor/src/lib.rs +++ b/node-graph/preprocessor/src/lib.rs @@ -52,7 +52,7 @@ pub fn generate_node_substitutions() -> HashMap = node_inputs(fields, first_node_io); let input_count = inputs.len(); - let network_inputs = (0..input_count).map(|i| NodeInput::node(NodeId(i as u64), 0)).collect(); + let network_inputs = (0..input_count).map(|i| NodeInput::node(NodeId(i as u64), NodeInput::PRIMARY_OUTPUT_INDEX)).collect(); let identity_node = ops::identity::IDENTIFIER; @@ -125,7 +125,7 @@ pub fn generate_node_substitutions() -> HashMap Date: Thu, 5 Mar 2026 15:46:35 +0800 Subject: [PATCH 5/5] fix: revert unrelated float constant changes --- .../no-std-types/src/color/discrete_srgb.rs | 102 ++++++------------ 1 file changed, 33 insertions(+), 69 deletions(-) diff --git a/node-graph/libraries/no-std-types/src/color/discrete_srgb.rs b/node-graph/libraries/no-std-types/src/color/discrete_srgb.rs index 1a31683c6a..13a06e30ab 100644 --- a/node-graph/libraries/no-std-types/src/color/discrete_srgb.rs +++ b/node-graph/libraries/no-std-types/src/color/discrete_srgb.rs @@ -90,70 +90,38 @@ pub fn float_to_srgb_u8(mut f: f32) -> u8 { #[rustfmt::skip] const FROM_SRGB_U8: [f32; 256] = [ - f32::from_bits(0x00000000), f32::from_bits(0x399f22b4), f32::from_bits(0x3a1f22b4), f32::from_bits(0x3a6eb40f), - f32::from_bits(0x3a9f22b4), f32::from_bits(0x3ac6eb61), f32::from_bits(0x3aeeb40f), f32::from_bits(0x3b0b3e5e), - f32::from_bits(0x3b1f22b4), f32::from_bits(0x3b33070b), f32::from_bits(0x3b46eb61), f32::from_bits(0x3b5b518d), - f32::from_bits(0x3b70f18d), f32::from_bits(0x3b83e1c6), f32::from_bits(0x3b8fe616), f32::from_bits(0x3b9c87fd), - f32::from_bits(0x3ba9c9b7), f32::from_bits(0x3bb7ad6f), f32::from_bits(0x3bc63549), f32::from_bits(0x3bd56361), - f32::from_bits(0x3be539c1), f32::from_bits(0x3bf5ba70), f32::from_bits(0x3c0373b5), f32::from_bits(0x3c0c6152), - f32::from_bits(0x3c15a703), f32::from_bits(0x3c1f45be), f32::from_bits(0x3c293e6b), f32::from_bits(0x3c3391f7), - f32::from_bits(0x3c3e4149), f32::from_bits(0x3c494d43), f32::from_bits(0x3c54b6c7), f32::from_bits(0x3c607eb1), - f32::from_bits(0x3c6ca5df), f32::from_bits(0x3c792d22), f32::from_bits(0x3c830aa8), f32::from_bits(0x3c89af9f), - f32::from_bits(0x3c9085db), f32::from_bits(0x3c978dc5), f32::from_bits(0x3c9ec7c2), f32::from_bits(0x3ca63433), - f32::from_bits(0x3cadd37d), f32::from_bits(0x3cb5a601), f32::from_bits(0x3cbdac20), f32::from_bits(0x3cc5e639), - f32::from_bits(0x3cce54ab), f32::from_bits(0x3cd6f7d5), f32::from_bits(0x3cdfd010), f32::from_bits(0x3ce8ddb9), - f32::from_bits(0x3cf22131), f32::from_bits(0x3cfb9ac6), f32::from_bits(0x3d02a56c), f32::from_bits(0x3d0798df), - f32::from_bits(0x3d0ca7e7), f32::from_bits(0x3d11d2b2), f32::from_bits(0x3d171965), f32::from_bits(0x3d1c7c31), - f32::from_bits(0x3d21fb3f), f32::from_bits(0x3d2796b5), f32::from_bits(0x3d2d4ebe), f32::from_bits(0x3d332384), - f32::from_bits(0x3d39152e), f32::from_bits(0x3d3f23e6), f32::from_bits(0x3d454fd4), f32::from_bits(0x3d4b991f), - f32::from_bits(0x3d51ffef), f32::from_bits(0x3d58846a), f32::from_bits(0x3d5f26b7), f32::from_bits(0x3d65e6fe), - f32::from_bits(0x3d6cc564), f32::from_bits(0x3d73c20f), f32::from_bits(0x3d7add29), f32::from_bits(0x3d810b68), - f32::from_bits(0x3d84b795), f32::from_bits(0x3d887330), f32::from_bits(0x3d8c3e4a), f32::from_bits(0x3d9018f6), - f32::from_bits(0x3d940345), f32::from_bits(0x3d97fd4a), f32::from_bits(0x3d9c0716), f32::from_bits(0x3da020bb), - f32::from_bits(0x3da44a4b), f32::from_bits(0x3da883d7), f32::from_bits(0x3daccd70), f32::from_bits(0x3db12728), f32::from_bits(0x3db59112), - f32::from_bits(0x3dba0b3b), f32::from_bits(0x3dbe95b5), f32::from_bits(0x3dc33092), f32::from_bits(0x3dc7dbe2), - f32::from_bits(0x3dcc97b6), f32::from_bits(0x3dd1641f), f32::from_bits(0x3dd6412c), f32::from_bits(0x3ddb2eef), - f32::from_bits(0x3de02d77), f32::from_bits(0x3de53cd5), f32::from_bits(0x3dea5d19), f32::from_bits(0x3def8e55), - f32::from_bits(0x3df4d093), f32::from_bits(0x3dfa23ea), f32::from_bits(0x3dff8864), f32::from_bits(0x3e027f09), - f32::from_bits(0x3e054282), f32::from_bits(0x3e080ea5), f32::from_bits(0x3e0ae379), f32::from_bits(0x3e0dc107), - f32::from_bits(0x3e10a755), f32::from_bits(0x3e13966c), f32::from_bits(0x3e168e53), f32::from_bits(0x3e198f11), - f32::from_bits(0x3e1c98ae), f32::from_bits(0x3e1fab32), f32::from_bits(0x3e22c6a3), f32::from_bits(0x3e25eb0b), - f32::from_bits(0x3e29186d), f32::from_bits(0x3e2c4ed4), f32::from_bits(0x3e2f8e45), f32::from_bits(0x3e32d6c8), - f32::from_bits(0x3e362865), f32::from_bits(0x3e398322), f32::from_bits(0x3e3ce706), f32::from_bits(0x3e405419), - f32::from_bits(0x3e43ca62), f32::from_bits(0x3e4749e8), f32::from_bits(0x3e4ad2b1), f32::from_bits(0x3e4e64c6), - f32::from_bits(0x3e52002b), f32::from_bits(0x3e55a4e9), f32::from_bits(0x3e595307), f32::from_bits(0x3e5d0a8b), - f32::from_bits(0x3e60cb7c), f32::from_bits(0x3e6495e0), f32::from_bits(0x3e6869bf), f32::from_bits(0x3e6c4720), - f32::from_bits(0x3e702e0c), f32::from_bits(0x3e741e84), f32::from_bits(0x3e781890), f32::from_bits(0x3e7c1c38), - f32::from_bits(0x3e8014c2), f32::from_bits(0x3e82203c), f32::from_bits(0x3e84308d), f32::from_bits(0x3e8645ba), - f32::from_bits(0x3e885fc5), f32::from_bits(0x3e8a7eb2), f32::from_bits(0x3e8ca283), f32::from_bits(0x3e8ecb3d), - f32::from_bits(0x3e90f8e1), f32::from_bits(0x3e932b74), f32::from_bits(0x3e9562f8), f32::from_bits(0x3e979f71), - f32::from_bits(0x3e99e0e2), f32::from_bits(0x3e9c274e), f32::from_bits(0x3e9e72b7), f32::from_bits(0x3ea0c322), - f32::from_bits(0x3ea31892), f32::from_bits(0x3ea57308), f32::from_bits(0x3ea7d289), f32::from_bits(0x3eaa3718), - f32::from_bits(0x3eaca0b7), f32::from_bits(0x3eaf0f69), f32::from_bits(0x3eb18333), f32::from_bits(0x3eb3fc18), - f32::from_bits(0x3eb67a18), f32::from_bits(0x3eb8fd37), f32::from_bits(0x3ebb8579), f32::from_bits(0x3ebe12e1), - f32::from_bits(0x3ec0a571), f32::from_bits(0x3ec33d2d), f32::from_bits(0x3ec5da17), f32::from_bits(0x3ec87c33), - f32::from_bits(0x3ecb2383), f32::from_bits(0x3ecdd00b), f32::from_bits(0x3ed081cd), f32::from_bits(0x3ed338cc), - f32::from_bits(0x3ed5f50b), f32::from_bits(0x3ed8b68d), f32::from_bits(0x3edb7d54), f32::from_bits(0x3ede4965), - f32::from_bits(0x3ee11ac1), f32::from_bits(0x3ee3f16b), f32::from_bits(0x3ee6cd67), f32::from_bits(0x3ee9aeb7), - f32::from_bits(0x3eec955d), f32::from_bits(0x3eef815d), f32::from_bits(0x3ef272ba), f32::from_bits(0x3ef56976), - f32::from_bits(0x3ef86594), f32::from_bits(0x3efb6717), f32::from_bits(0x3efe6e02), f32::from_bits(0x3f00bd2d), - f32::from_bits(0x3f02460e), f32::from_bits(0x3f03d1a7), f32::from_bits(0x3f055ff9), f32::from_bits(0x3f06f108), - f32::from_bits(0x3f0884d1), f32::from_bits(0x3f0a1b57), f32::from_bits(0x3f0bb49d), f32::from_bits(0x3f0d50a2), - f32::from_bits(0x3f0eef69), f32::from_bits(0x3f1090f2), f32::from_bits(0x3f123540), f32::from_bits(0x3f13dc53), - f32::from_bits(0x3f15862d), f32::from_bits(0x3f1732cf), f32::from_bits(0x3f18e23b), f32::from_bits(0x3f1a9471), - f32::from_bits(0x3f1c4973), f32::from_bits(0x3f1e0143), f32::from_bits(0x3f1fbbe1), f32::from_bits(0x3f217950), - f32::from_bits(0x3f23398f), f32::from_bits(0x3f24fca2), f32::from_bits(0x3f26c288), f32::from_bits(0x3f288b43), - f32::from_bits(0x3f2a56d5), f32::from_bits(0x3f2c253f), f32::from_bits(0x3f2df681), f32::from_bits(0x3f2fca9e), - f32::from_bits(0x3f31a199), f32::from_bits(0x3f337b6e), f32::from_bits(0x3f355822), f32::from_bits(0x3f3737b5), - f32::from_bits(0x3f391a28), f32::from_bits(0x3f3aff7e), f32::from_bits(0x3f3ce7b7), f32::from_bits(0x3f3ed2d4), f32::from_bits(0x3f40c0d6), - f32::from_bits(0x3f42b1c0), f32::from_bits(0x3f44a592), f32::from_bits(0x3f469c4d), f32::from_bits(0x3f4895f3), - f32::from_bits(0x3f4a9284), f32::from_bits(0x3f4c9203), f32::from_bits(0x3f4e9470), f32::from_bits(0x3f5099cd), - f32::from_bits(0x3f52a21a), f32::from_bits(0x3f54ad59), f32::from_bits(0x3f56bb8c), f32::from_bits(0x3f58ccb3), - f32::from_bits(0x3f5ae0cf), f32::from_bits(0x3f5cf7e2), f32::from_bits(0x3f5f11ee), f32::from_bits(0x3f612ef2), f32::from_bits(0x3f634eef), - f32::from_bits(0x3f6571ec), f32::from_bits(0x3f6797e3), f32::from_bits(0x3f69c0db), f32::from_bits(0x3f6beccd), - f32::from_bits(0x3f6e1bc4), f32::from_bits(0x3f704db8), f32::from_bits(0x3f7282b4), f32::from_bits(0x3f74baae), - f32::from_bits(0x3f76f5b3), f32::from_bits(0x3f7933b9), f32::from_bits(0x3f7b74cb), f32::from_bits(0x3f7db8e0), - f32::from_bits(0x3f800000), + 0., 0.000303527, 0.000607054, 0.00091058103, 0.001214108, 0.001517635, 0.0018211621, 0.002124689, + 0.002428216, 0.002731743, 0.00303527, 0.0033465356, 0.003676507, 0.004024717, 0.004391442, + 0.0047769533, 0.005181517, 0.0056053917, 0.0060488326, 0.006512091, 0.00699541, 0.0074990317, + 0.008023192, 0.008568125, 0.009134057, 0.009721218, 0.010329823, 0.010960094, 0.011612245, + 0.012286487, 0.012983031, 0.013702081, 0.014443844, 0.015208514, 0.015996292, 0.016807375, + 0.017641952, 0.018500218, 0.019382361, 0.020288562, 0.02121901, 0.022173883, 0.023153365, + 0.02415763, 0.025186857, 0.026241222, 0.027320892, 0.028426038, 0.029556843, 0.03071345, 0.03189604, + 0.033104774, 0.03433981, 0.035601325, 0.036889452, 0.038204376, 0.039546248, 0.04091521, 0.042311423, + 0.043735042, 0.045186214, 0.046665095, 0.048171833, 0.049706575, 0.051269468, 0.052860655, 0.05448028, + 0.056128494, 0.057805434, 0.05951124, 0.06124607, 0.06301003, 0.06480328, 0.06662595, 0.06847818, + 0.07036011, 0.07227186, 0.07421358, 0.07618539, 0.07818743, 0.08021983, 0.082282715, 0.084376216, + 0.086500466, 0.088655606, 0.09084173, 0.09305898, 0.095307484, 0.09758736, 0.09989874, 0.10224175, + 0.10461649, 0.10702311, 0.10946172, 0.111932434, 0.11443538, 0.116970696, 0.11953845, 0.12213881, + 0.12477186, 0.12743773, 0.13013652, 0.13286836, 0.13563336, 0.13843165, 0.14126332, 0.1441285, + 0.1470273, 0.14995982, 0.15292618, 0.1559265, 0.15896086, 0.16202943, 0.16513224, 0.16826946, + 0.17144115, 0.17464745, 0.17788847, 0.1811643, 0.18447503, 0.1878208, 0.19120172, 0.19461787, + 0.19806935, 0.2015563, 0.20507877, 0.2086369, 0.21223079, 0.21586053, 0.21952623, 0.22322798, + 0.22696589, 0.23074007, 0.23455065, 0.23839766, 0.2422812, 0.2462014, 0.25015837, 0.25415218, + 0.2581829, 0.26225072, 0.26635566, 0.27049786, 0.27467737, 0.27889434, 0.2831488, 0.2874409, + 0.2917707, 0.29613832, 0.30054384, 0.30498737, 0.30946895, 0.31398875, 0.31854683, 0.32314324, + 0.32777813, 0.33245158, 0.33716366, 0.34191445, 0.3467041, 0.3515327, 0.35640025, 0.36130688, + 0.3662527, 0.37123778, 0.37626222, 0.3813261, 0.38642952, 0.39157256, 0.3967553, 0.40197787, + 0.4072403, 0.4125427, 0.41788515, 0.42326775, 0.42869055, 0.4341537, 0.43965724, 0.44520125, + 0.45078585, 0.45641106, 0.46207705, 0.46778384, 0.47353154, 0.47932023, 0.48514998, 0.4910209, + 0.49693304, 0.5028866, 0.50888145, 0.5149178, 0.5209957, 0.52711535, 0.5332766, 0.5394797, + 0.5457247, 0.5520116, 0.5583406, 0.5647117, 0.57112503, 0.57758063, 0.5840786, 0.590619, 0.597202, + 0.60382754, 0.61049575, 0.61720675, 0.62396055, 0.63075733, 0.637597, 0.6444799, 0.6514058, + 0.65837497, 0.66538745, 0.67244333, 0.6795426, 0.68668544, 0.69387203, 0.70110214, 0.70837605, + 0.7156938, 0.72305536, 0.730461, 0.7379107, 0.7454045, 0.75294244, 0.76052475, 0.7681514, 0.77582246, + 0.78353804, 0.79129815, 0.79910296, 0.8069525, 0.8148468, 0.822786, 0.8307701, 0.83879924, 0.84687346, + 0.8549928, 0.8631574, 0.87136734, 0.8796226, 0.8879232, 0.89626956, 0.90466136, 0.913099, 0.92158204, + 0.93011117, 0.9386859, 0.9473069, 0.9559735, 0.9646866, 0.9734455, 0.98225087, 0.9911022, 1., ]; #[inline] @@ -194,11 +162,7 @@ mod tests { #[test] fn test_float_to_srgb_u8() { for u in 0..=u8::MAX { - let a = srgb_u8_to_float(u); - let b = srgb_u8_to_float_ref(u); - if a != b { - panic!("Mismatch at u={}: {} != {}", u, a, b); - } + assert!(srgb_u8_to_float(u) == srgb_u8_to_float_ref(u)); } }