diff --git a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs index 76fe7f5e..e97585a1 100644 --- a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs +++ b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs @@ -473,7 +473,7 @@ fn static_nodes() -> Vec { node_template: NodeTemplate { document_node: DocumentNode { implementation: DocumentNodeImplementation::Network(NodeNetwork { - exports: vec![NodeInput::node(NodeId(2), 0)], + exports: vec![NodeInput::node(NodeId(1), 0)], nodes: [ DocumentNode { inputs: vec![NodeInput::value(TaggedValue::None, false), NodeInput::scope("editor-api"), NodeInput::network(concrete!(String), 1)], @@ -487,12 +487,6 @@ fn static_nodes() -> Vec { implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_std::wasm_application_io::DecodeImageNode")), ..Default::default() }, - DocumentNode { - inputs: vec![NodeInput::node(NodeId(1), 0)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform::CullNode")), - manual_composition: Some(concrete!(Context)), - ..Default::default() - }, ] .into_iter() .enumerate() @@ -525,14 +519,6 @@ fn static_nodes() -> Vec { }, ..Default::default() }, - DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Cull".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(14, 0)), - ..Default::default() - }, - ..Default::default() - }, ] .into_iter() .enumerate() @@ -845,41 +831,13 @@ fn static_nodes() -> Vec { PropertiesRow::with_override("Cellular Jitter", "TODO", WidgetOverride::Custom("noise_properties_cellular_jitter".to_string())), ], output_names: vec!["Image".to_string()], - network_metadata: Some(NodeNetworkMetadata { - persistent_metadata: NodeNetworkPersistentMetadata { - node_metadata: [ - DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Noise Pattern".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(0, 0)), - ..Default::default() - }, - ..Default::default() - }, - DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Cull".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(0, 0)), - ..Default::default() - }, - ..Default::default() - }, - ] - .into_iter() - .enumerate() - .map(|(id, node)| (NodeId(id as u64), node)) - .collect(), - ..Default::default() - }, - ..Default::default() - }), ..Default::default() }, }, description: Cow::Borrowed("Generates different noise patterns."), properties: None, }, - // TODO: This needs to work with resolution-aware (raster with footprint, post-Cull node) data. + // TODO: This needs to work with resolution-aware data. // TODO: Auto-generate this from its proto node macro DocumentNodeDefinition { identifier: "Mask", @@ -906,7 +864,7 @@ fn static_nodes() -> Vec { description: Cow::Borrowed("TODO"), properties: None, }, - // TODO: This needs to work with resolution-aware (raster with footprint, post-Cull node) data. + // TODO: This needs to work with resolution-aware data. // TODO: Auto-generate this from its proto node macro DocumentNodeDefinition { identifier: "Insert Channel", @@ -934,7 +892,7 @@ fn static_nodes() -> Vec { description: Cow::Borrowed("TODO"), properties: None, }, - // TODO: This needs to work with resolution-aware (raster with footprint, post-Cull node) data. + // TODO: This needs to work with resolution-aware data. DocumentNodeDefinition { identifier: "Combine Channels", category: "Raster", @@ -1244,58 +1202,6 @@ fn static_nodes() -> Vec { description: Cow::Borrowed("TODO"), properties: None, }, - DocumentNodeDefinition { - identifier: "Image", - category: "Raster", - node_template: NodeTemplate { - document_node: DocumentNode { - implementation: DocumentNodeImplementation::Network(NodeNetwork { - exports: vec![NodeInput::node(NodeId(0), 0)], - nodes: vec![DocumentNode { - inputs: vec![NodeInput::network(concrete!(ImageFrameTable), 1)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform::CullNode")), - manual_composition: Some(concrete!(Context)), - ..Default::default() - }] - .into_iter() - .enumerate() - .map(|(id, node)| (NodeId(id as u64), node)) - .collect(), - ..Default::default() - }), - inputs: vec![ - NodeInput::value(TaggedValue::None, false), - NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::one_empty_image()), false), - ], - ..Default::default() - }, - persistent_node_metadata: DocumentNodePersistentMetadata { - input_properties: vec![("Empty", "TODO").into(), ("Image", "TODO").into()], - output_names: vec!["Image".to_string()], - network_metadata: Some(NodeNetworkMetadata { - persistent_metadata: NodeNetworkPersistentMetadata { - node_metadata: [DocumentNodeMetadata { - persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Cull".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(0, 0)), - ..Default::default() - }, - ..Default::default() - }] - .into_iter() - .enumerate() - .map(|(id, node)| (NodeId(id as u64), node)) - .collect(), - ..Default::default() - }, - ..Default::default() - }), - ..Default::default() - }, - }, - description: Cow::Borrowed("TODO"), - properties: None, - }, #[cfg(feature = "gpu")] DocumentNodeDefinition { identifier: "Uniform", diff --git a/editor/src/messages/portfolio/portfolio_message_handler.rs b/editor/src/messages/portfolio/portfolio_message_handler.rs index 6601de36..b60f5df4 100644 --- a/editor/src/messages/portfolio/portfolio_message_handler.rs +++ b/editor/src/messages/portfolio/portfolio_message_handler.rs @@ -461,7 +461,7 @@ impl MessageHandler> for PortfolioMes } }; - const REPLACEMENTS: [(&str, &str); 34] = [ + const REPLACEMENTS: [(&str, &str); 35] = [ ("graphene_core::AddArtboardNode", "graphene_core::graphic_element::AppendArtboardNode"), ("graphene_core::ConstructArtboardNode", "graphene_core::graphic_element::ToArtboardNode"), ("graphene_core::ToGraphicElementNode", "graphene_core::graphic_element::ToElementNode"), @@ -500,6 +500,7 @@ impl MessageHandler> for PortfolioMes ("graphene_core::vector::generator_nodes::StarGenerator", "graphene_core::vector::generator_nodes::StarNode"), ("graphene_std::executor::BlendGpuImageNode", "graphene_std::gpu_nodes::BlendGpuImageNode"), ("graphene_std::raster::SampleNode", "graphene_std::raster::SampleImageNode"), + ("graphene_core::transform::CullNode", "graphene_core::ops::IdentityNode"), ]; let mut network = document.network_interface.document_network().clone(); network.generate_node_paths(&[]); diff --git a/node-graph/gcore/src/transform.rs b/node-graph/gcore/src/transform.rs index ec7449ab..c37cd04d 100644 --- a/node-graph/gcore/src/transform.rs +++ b/node-graph/gcore/src/transform.rs @@ -3,7 +3,7 @@ use crate::instances::Instances; use crate::raster::bbox::AxisAlignedBbox; use crate::raster::image::ImageFrameTable; use crate::vector::VectorDataTable; -use crate::{Artboard, ArtboardGroupTable, CloneVarArgs, Color, Context, Ctx, ExtractAll, GraphicGroupTable, OwnedContextImpl}; +use crate::{Artboard, CloneVarArgs, Color, Context, Ctx, ExtractAll, GraphicGroupTable, OwnedContextImpl}; use core::f64; use glam::{DAffine2, DMat2, DVec2}; @@ -137,11 +137,6 @@ impl From<()> for Footprint { } } -#[node_macro::node(category("Debug"))] -fn cull(_: impl Ctx, #[implementations(VectorDataTable, GraphicGroupTable, Artboard, ImageFrameTable, ArtboardGroupTable)] data: T) -> T { - data -} - impl core::hash::Hash for Footprint { fn hash(&self, state: &mut H) { self.transform.to_cols_array().iter().for_each(|x| x.to_le_bytes().hash(state)); diff --git a/node-graph/gstd/src/raster.rs b/node-graph/gstd/src/raster.rs index a8f42007..0c1d6042 100644 --- a/node-graph/gstd/src/raster.rs +++ b/node-graph/gstd/src/raster.rs @@ -17,7 +17,7 @@ use std::marker::PhantomData; #[derive(Debug, DynAny)] pub enum Error { IO(std::io::Error), - Image(image::ImageError), + Image(::image::ImageError), } impl From for Error { @@ -49,9 +49,9 @@ fn sample_image(ctx: impl ExtractFootprint + Clone + Send, image_frame: ImageFra return ImageFrameTable::one_empty_image(); } - let image_buffer = image::Rgba32FImage::from_raw(image.width, image.height, data).expect("Failed to convert internal image format into image-rs data type."); + let image_buffer = ::image::Rgba32FImage::from_raw(image.width, image.height, data).expect("Failed to convert internal image format into image-rs data type."); - let dynamic_image: image::DynamicImage = image_buffer.into(); + let dynamic_image: ::image::DynamicImage = image_buffer.into(); let offset = (intersection.start - image_bounds.start).max(DVec2::ZERO); let offset_px = image_size.transform_vector2(offset).as_uvec2(); let cropped = dynamic_image.crop_imm(offset_px.x, offset_px.y, size_px.x, size_px.y); @@ -66,7 +66,7 @@ fn sample_image(ctx: impl ExtractFootprint + Clone + Send, image_frame: ImageFra new_width = viewport_resolution_x as u32; new_height = viewport_resolution_y as u32; // TODO: choose filter based on quality requirements - cropped.resize_exact(new_width, new_height, image::imageops::Triangle) + cropped.resize_exact(new_width, new_height, ::image::imageops::Triangle) } else { cropped }; @@ -375,6 +375,12 @@ fn empty_image(_: impl Ctx, transform: DAffine2, color: Color) -> ImageFrameTabl result } +/// Constructs a raster image. +#[node_macro::node(category(""))] +fn image(_: impl Ctx, _primary: (), image: ImageFrameTable) -> ImageFrameTable { + image +} + // #[cfg(feature = "serde")] // macro_rules! generate_imaginate_node { // ($($val:ident: $t:ident: $o:ty,)*) => { diff --git a/node-graph/gstd/src/wasm_application_io.rs b/node-graph/gstd/src/wasm_application_io.rs index 0427aeb7..59f76ac8 100644 --- a/node-graph/gstd/src/wasm_application_io.rs +++ b/node-graph/gstd/src/wasm_application_io.rs @@ -83,7 +83,10 @@ fn decode_image(_: impl Ctx, data: Arc<[u8]>) -> ImageFrameTable { }; let image = image.to_rgba32f(); let image = Image { - data: image.chunks(4).map(|pixel| Color::from_unassociated_alpha(pixel[0], pixel[1], pixel[2], pixel[3])).collect(), + data: image + .chunks(4) + .map(|pixel| Color::from_unassociated_alpha(pixel[0], pixel[1], pixel[2], pixel[3]).to_linear_srgb()) + .collect(), width: image.width(), height: image.height(), ..Default::default()