Skip to content

Commit d3f36a9

Browse files
authored
Rename 'Image Value' node to 'Image' and have its input value be an image not a raster table (#4037)
* Rename 'Image Value' node to 'Image' and have its input value be Image<Color> not Table<Raster<CPU>> * Add a Properties panel widget labeling "width x height" for images in the Image node * Add Image<Color> node registry entry for MonitorNode * Code review
1 parent c2e1208 commit d3f36a9

11 files changed

Lines changed: 57 additions & 34 deletions

File tree

editor/src/messages/portfolio/document/data_panel/data_panel_message_handler.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ impl TableRowLayout for Raster<CPU> {
497497
"Raster"
498498
}
499499
fn identifier(&self) -> String {
500-
format!("Raster ({}x{})", self.width, self.height)
500+
format!("Raster ({} x {})", self.width, self.height)
501501
}
502502
fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
503503
let raster = self.data();
@@ -528,7 +528,7 @@ impl TableRowLayout for Raster<GPU> {
528528
"Raster"
529529
}
530530
fn identifier(&self) -> String {
531-
format!("Raster ({}x{})", self.data().width(), self.data().height())
531+
format!("Raster ({} x {})", self.data().width(), self.data().height())
532532
}
533533
fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
534534
let widgets = vec![TextLabel::new("Raster is a texture on the GPU and cannot currently be displayed here").widget_instance()];

editor/src/messages/portfolio/document/document_message_handler.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,8 @@ use graph_craft::document::{NodeId, NodeInput, NodeNetwork, OldNodeNetwork};
3434
use graphene_std::math::quad::Quad;
3535
use graphene_std::path_bool_nodes::boolean_intersect;
3636
use graphene_std::raster::BlendMode;
37-
use graphene_std::raster_types::Raster;
3837
use graphene_std::render_node::wgpu_available;
3938
use graphene_std::subpath::Subpath;
40-
use graphene_std::table::Table;
4139
use graphene_std::vector::PointId;
4240
use graphene_std::vector::click_target::{ClickTarget, ClickTargetType};
4341
use graphene_std::vector::misc::dvec2_to_point;
@@ -696,7 +694,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
696694

697695
responses.add(DocumentMessage::AddTransaction);
698696

699-
let layer = graph_modification_utils::new_image_layer(Table::new_from_element(Raster::new_cpu(image)), layer_node_id, layer_parent, responses);
697+
let layer = graph_modification_utils::new_image_layer(image, layer_node_id, layer_parent, responses);
700698

701699
if let Some(name) = name {
702700
responses.add(NodeGraphMessage::SetDisplayName {

editor/src/messages/portfolio/document/graph_operation/graph_operation_message.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ use crate::messages::portfolio::document::utility_types::network_interface::Node
44
use crate::messages::prelude::*;
55
use glam::{DAffine2, IVec2};
66
use graph_craft::document::NodeId;
7+
use graphene_std::Artboard;
78
use graphene_std::brush::brush_stroke::BrushStroke;
9+
use graphene_std::color::Color;
810
use graphene_std::raster::BlendMode;
9-
use graphene_std::raster_types::{CPU, Raster};
11+
use graphene_std::raster_types::Image;
1012
use graphene_std::subpath::Subpath;
11-
use graphene_std::table::Table;
1213
use graphene_std::text::{Font, TypesettingConfig};
1314
use graphene_std::vector::PointId;
1415
use graphene_std::vector::VectorModificationType;
1516
use graphene_std::vector::style::{Fill, Stroke};
16-
use graphene_std::{Artboard, Color};
1717

1818
#[impl_message(Message, DocumentMessage, GraphOperation)]
1919
#[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize)]
@@ -70,7 +70,7 @@ pub enum GraphOperationMessage {
7070
},
7171
NewBitmapLayer {
7272
id: NodeId,
73-
image_frame: Table<Raster<CPU>>,
73+
image: Image<Color>,
7474
parent: LayerNodeIdentifier,
7575
insert_index: usize,
7676
},

editor/src/messages/portfolio/document/graph_operation/graph_operation_message_handler.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -160,15 +160,10 @@ impl MessageHandler<GraphOperationMessage, GraphOperationMessageContext<'_>> for
160160
responses.add_front(NodeGraphMessage::SelectedNodesSet { nodes: vec![id] });
161161
responses.add(NodeGraphMessage::RunDocumentGraph);
162162
}
163-
GraphOperationMessage::NewBitmapLayer {
164-
id,
165-
image_frame,
166-
parent,
167-
insert_index,
168-
} => {
163+
GraphOperationMessage::NewBitmapLayer { id, image, parent, insert_index } => {
169164
let mut modify_inputs = ModifyInputsContext::new(network_interface, responses);
170165
let layer = modify_inputs.create_layer(id);
171-
modify_inputs.insert_image_data(image_frame, layer);
166+
modify_inputs.insert_image_data(image, layer);
172167
network_interface.move_layer_to_stack(layer, parent, insert_index, &[]);
173168
responses.add(NodeGraphMessage::RunDocumentGraph);
174169
}

editor/src/messages/portfolio/document/graph_operation/utility_types.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use graph_craft::document::{NodeId, NodeInput};
99
use graph_craft::{ProtoNodeIdentifier, concrete};
1010
use graphene_std::brush::brush_stroke::BrushStroke;
1111
use graphene_std::raster::BlendMode;
12-
use graphene_std::raster_types::{CPU, Raster};
12+
use graphene_std::raster_types::Image;
1313
use graphene_std::subpath::Subpath;
1414
use graphene_std::table::Table;
1515
use graphene_std::text::{Font, TypesettingConfig};
@@ -303,14 +303,14 @@ impl<'a> ModifyInputsContext<'a> {
303303
self.network_interface.move_node_to_chain_start(&color_value_id, layer, &[], self.import);
304304
}
305305

306-
pub fn insert_image_data(&mut self, image_frame: Table<Raster<CPU>>, layer: LayerNodeIdentifier) {
306+
pub fn insert_image_data(&mut self, image: Image<Color>, layer: LayerNodeIdentifier) {
307307
let transform = resolve_network_node_type("Transform").expect("Transform node does not exist").default_node_template();
308-
let image = resolve_proto_node_type(graphene_std::raster_nodes::std_nodes::image_value::IDENTIFIER)
309-
.expect("ImageValue node does not exist")
310-
.node_template_input_override([Some(NodeInput::value(TaggedValue::None, false)), Some(NodeInput::value(TaggedValue::Raster(image_frame), false))]);
308+
let image_node = resolve_proto_node_type(graphene_std::raster_nodes::std_nodes::image::IDENTIFIER)
309+
.expect("Image node does not exist")
310+
.node_template_input_override([Some(NodeInput::value(TaggedValue::None, false)), Some(NodeInput::value(TaggedValue::ImageData(image), false))]);
311311

312312
let image_id = NodeId::new();
313-
self.network_interface.insert_node(image_id, image, &[]);
313+
self.network_interface.insert_node(image_id, image_node, &[]);
314314
self.network_interface.move_node_to_chain_start(&image_id, layer, &[], self.import);
315315

316316
let transform_id = NodeId::new();

editor/src/messages/portfolio/document/node_graph/node_properties.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use graphene_std::raster::{
2121
BlendMode, CellularDistanceFunction, CellularReturnType, Color, DomainWarpType, FractalType, LuminanceCalculation, NoiseType, RedGreenBlue, RedGreenBlueAlpha, RelativeAbsolute,
2222
SelectiveColorChoice,
2323
};
24+
use graphene_std::raster_types::Image;
2425
use graphene_std::table::{Table, TableRow};
2526
use graphene_std::text::{Font, TextAlign};
2627
use graphene_std::transform::{Footprint, ReferencePoint, ScaleType, Transform};
@@ -231,6 +232,7 @@ pub(crate) fn property_from_type(
231232
Some(x) if x == TypeId::of::<Curve>() => curve_widget(default_info),
232233
Some(x) if x == TypeId::of::<Footprint>() => footprint_widget(default_info, &mut extra_widgets),
233234
Some(x) if x == TypeId::of::<Box<VectorModification>>() => vector_modification_widget(default_info).into(),
235+
Some(x) if x == TypeId::of::<Image<Color>>() => image_data_widget(default_info).into(),
234236
// ===============================
235237
// MANUALLY IMPLEMENTED ENUM TYPES
236238
// ===============================
@@ -420,6 +422,23 @@ pub fn vector_modification_widget(parameter_widgets_info: ParameterWidgetsInfo)
420422
widgets
421423
}
422424

425+
pub fn image_data_widget(parameter_widgets_info: ParameterWidgetsInfo) -> Vec<WidgetInstance> {
426+
let ParameterWidgetsInfo { document_node, node_id: _, index, .. } = parameter_widgets_info;
427+
428+
let mut widgets = start_widgets(parameter_widgets_info);
429+
430+
let Some(document_node) = document_node else { return widgets };
431+
let Some(input) = document_node.inputs.get(index) else { return widgets };
432+
433+
if let Some(TaggedValue::ImageData(image)) = input.as_non_exposed_value() {
434+
let label = format!("{} x {}", image.width, image.height);
435+
436+
widgets.extend_from_slice(&[Separator::new(SeparatorStyle::Unrelated).widget_instance(), TextLabel::new(label).widget_instance()]);
437+
}
438+
439+
widgets
440+
}
441+
423442
pub fn footprint_widget(parameter_widgets_info: ParameterWidgetsInfo, extra_widgets: &mut Vec<LayoutGroup>) -> LayoutGroup {
424443
let ParameterWidgetsInfo { document_node, node_id, index, .. } = parameter_widgets_info;
425444

editor/src/messages/portfolio/document_migration.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -584,8 +584,9 @@ const NODE_REPLACEMENTS: &[NodeReplacement<'static>] = &[
584584
],
585585
},
586586
NodeReplacement {
587-
node: graphene_std::raster_nodes::std_nodes::image_value::IDENTIFIER,
587+
node: graphene_std::raster_nodes::std_nodes::image::IDENTIFIER,
588588
aliases: &[
589+
"raster_nodes::std_nodes::ImageValueNode",
589590
"graphene_raster_nodes::std_nodes::ImageValueNode",
590591
"graphene_std::raster::ImageValueNode",
591592
"graphene_std::raster::ImageNode",
@@ -1384,7 +1385,7 @@ fn migrate_node(node_id: &NodeId, node: &DocumentNode, network_path: &[NodeId],
13841385
.set_input(&InputConnector::node(NodeId(0), 1), NodeInput::value(TaggedValue::String(label), false), &[*node_id]);
13851386
}
13861387

1387-
if reference == DefinitionIdentifier::ProtoNode(graphene_std::raster_nodes::std_nodes::image_value::IDENTIFIER) && inputs_count == 1 {
1388+
if reference == DefinitionIdentifier::ProtoNode(graphene_std::raster_nodes::std_nodes::image::IDENTIFIER) && inputs_count == 1 {
13881389
let mut node_template = resolve_document_node_type(&reference)?.default_node_template();
13891390
document.network_interface.replace_implementation(node_id, network_path, &mut node_template);
13901391

@@ -1972,6 +1973,19 @@ fn migrate_node(node_id: &NodeId, node: &DocumentNode, network_path: &[NodeId],
19721973
}
19731974
}
19741975

1976+
// Migrate Image nodes that stored a Table<Raster<CPU>> in input 1 to instead use bare Image<Color> via TaggedValue::ImageData
1977+
if reference == DefinitionIdentifier::ProtoNode(graphene_std::raster_nodes::std_nodes::image::IDENTIFIER)
1978+
&& let Some(NodeInput::Value { tagged_value, .. }) = node.inputs.get(1)
1979+
&& let TaggedValue::Raster(raster_table) = &**tagged_value
1980+
&& let Some(row) = raster_table.iter().next()
1981+
{
1982+
let image = row.element.data().clone();
1983+
1984+
document
1985+
.network_interface
1986+
.set_input(&InputConnector::node(*node_id, 1), NodeInput::value(TaggedValue::ImageData(image), false), network_path);
1987+
}
1988+
19751989
// ==================================
19761990
// PUT ALL MIGRATIONS ABOVE THIS LINE
19771991
// ==================================

editor/src/messages/tool/common_functionality/graph_modification_utils.rs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use graph_craft::{ProtoNodeIdentifier, concrete};
1010
use graphene_std::Color;
1111
use graphene_std::NodeInputDecleration;
1212
use graphene_std::raster::BlendMode;
13-
use graphene_std::raster_types::{CPU, GPU, Raster};
13+
use graphene_std::raster_types::{CPU, GPU, Image, Raster};
1414
use graphene_std::subpath::Subpath;
1515
use graphene_std::table::Table;
1616
use graphene_std::text::{Font, TypesettingConfig};
@@ -218,14 +218,9 @@ pub fn new_vector_layer(subpaths: Vec<Subpath<PointId>>, id: NodeId, parent: Lay
218218
}
219219

220220
/// Create a new bitmap layer.
221-
pub fn new_image_layer(image_frame: Table<Raster<CPU>>, id: NodeId, parent: LayerNodeIdentifier, responses: &mut VecDeque<Message>) -> LayerNodeIdentifier {
221+
pub fn new_image_layer(image: Image<Color>, id: NodeId, parent: LayerNodeIdentifier, responses: &mut VecDeque<Message>) -> LayerNodeIdentifier {
222222
let insert_index = 0;
223-
responses.add(GraphOperationMessage::NewBitmapLayer {
224-
id,
225-
image_frame,
226-
parent,
227-
insert_index,
228-
});
223+
responses.add(GraphOperationMessage::NewBitmapLayer { id, image, parent, insert_index });
229224
LayerNodeIdentifier::new_unchecked(id)
230225
}
231226

node-graph/graph-craft/src/document/value.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ tagged_value! {
225225
Curve(raster_nodes::curve::Curve),
226226
Footprint(core_types::transform::Footprint),
227227
VectorModification(Box<vector::VectorModification>),
228+
ImageData(Image<Color>),
228229
// ==========
229230
// ENUM TYPES
230231
// ==========

node-graph/interpreted-executor/src/node_registry.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ fn node_registry() -> HashMap<ProtoNodeIdentifier, HashMap<NodeIOTypes, NodeCons
7171
async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => Table<Raster<GPU>>]),
7272
async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => Table<Color>]),
7373
async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => Table<GradientStops>]),
74+
async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => Image<Color>]),
7475
async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => String]),
7576
async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => IVec2]),
7677
async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => DVec2]),

0 commit comments

Comments
 (0)