Skip to content

Commit 12e5a47

Browse files
committed
Migrate ArtboardGroup to ArtboardGroupTable (not yet flattened)
1 parent dc02d9a commit 12e5a47

File tree

10 files changed

+81
-25
lines changed

10 files changed

+81
-25
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2408,7 +2408,7 @@ impl DocumentMessageHandler {
24082408
/// Create a network interface with a single export
24092409
fn default_document_network_interface() -> NodeNetworkInterface {
24102410
let mut network_interface = NodeNetworkInterface::default();
2411-
network_interface.add_export(TaggedValue::ArtboardGroup(graphene_core::ArtboardGroup::default()), -1, "", &[]);
2411+
network_interface.add_export(TaggedValue::ArtboardGroup(graphene_core::ArtboardGroupTable::default()), -1, "", &[]);
24122412
network_interface
24132413
}
24142414

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ impl<'a> ModifyInputsContext<'a> {
126126
/// Creates an artboard as the primary export for the document network
127127
pub fn create_artboard(&mut self, new_id: NodeId, artboard: Artboard) -> LayerNodeIdentifier {
128128
let artboard_node_template = resolve_document_node_type("Artboard").expect("Node").node_template_input_override([
129-
Some(NodeInput::value(TaggedValue::ArtboardGroup(graphene_std::ArtboardGroup::default()), true)),
129+
Some(NodeInput::value(TaggedValue::ArtboardGroup(graphene_std::ArtboardGroupTable::default()), true)),
130130
Some(NodeInput::value(TaggedValue::GraphicGroup(graphene_core::GraphicGroupTable::default()), true)),
131131
Some(NodeInput::value(TaggedValue::IVec2(artboard.location), false)),
132132
Some(NodeInput::value(TaggedValue::IVec2(artboard.dimensions), false)),

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
295295
DocumentNode {
296296
manual_composition: Some(concrete!(Context)),
297297
inputs: vec![
298-
NodeInput::network(graphene_core::Type::Fn(Box::new(concrete!(Context)), Box::new(concrete!(ArtboardGroup))), 0),
298+
NodeInput::network(graphene_core::Type::Fn(Box::new(concrete!(Context)), Box::new(concrete!(ArtboardGroupTable))), 0),
299299
NodeInput::node(NodeId(1), 0),
300300
NodeInput::Reflection(graph_craft::document::DocumentNodeMetadata::DocumentNodePath),
301301
],
@@ -310,7 +310,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
310310
..Default::default()
311311
}),
312312
inputs: vec![
313-
NodeInput::value(TaggedValue::ArtboardGroup(ArtboardGroup::default()), true),
313+
NodeInput::value(TaggedValue::ArtboardGroup(ArtboardGroupTable::default()), true),
314314
NodeInput::value(TaggedValue::GraphicGroup(GraphicGroupTable::default()), true),
315315
NodeInput::value(TaggedValue::IVec2(glam::IVec2::ZERO), false),
316316
NodeInput::value(TaggedValue::IVec2(glam::IVec2::new(1920, 1080)), false),
@@ -544,7 +544,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
544544
nodes: [
545545
DocumentNode {
546546
inputs: vec![NodeInput::network(concrete!(ImageFrameTable<Color>), 0)],
547-
implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::ops::IntoNode<_, ImageFrame>")), // TODO: Possibly change `ImageFrame` to something else
547+
implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::ops::IntoNode<_, ImageFrameTable>")),
548548
..Default::default()
549549
},
550550
DocumentNode {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -468,8 +468,8 @@ impl NodeNetworkInterface {
468468
InputConnector::Node { node_id, input_index } => (node_id, input_index),
469469
InputConnector::Export(export_index) => {
470470
let Some((encapsulating_node_id, encapsulating_node_id_path)) = network_path.split_last() else {
471-
// The outermost network export defaults to an ArtboardGroup.
472-
return Some((concrete!(graphene_core::ArtboardGroup), TypeSource::OuterMostExportDefault));
471+
// The outermost network export defaults to an ArtboardGroupTable.
472+
return Some((concrete!(graphene_core::ArtboardGroupTable), TypeSource::OuterMostExportDefault));
473473
};
474474

475475
let output_type = self.output_types(encapsulating_node_id, encapsulating_node_id_path).into_iter().nth(export_index).flatten();

node-graph/gcore/src/graphic_element.rs

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,25 @@ impl ArtboardGroup {
268268
}
269269
}
270270

271+
// TODO: Eventually remove this migration document upgrade code
272+
pub fn migrate_artboard_group<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Result<ArtboardGroupTable, D::Error> {
273+
use serde::Deserialize;
274+
275+
#[derive(serde::Serialize, serde::Deserialize)]
276+
#[serde(untagged)]
277+
enum EitherFormat {
278+
ArtboardGroup(ArtboardGroup),
279+
ArtboardGroupTable(ArtboardGroupTable),
280+
}
281+
282+
Ok(match EitherFormat::deserialize(deserializer)? {
283+
EitherFormat::ArtboardGroup(artboard_group) => ArtboardGroupTable::new(artboard_group),
284+
EitherFormat::ArtboardGroupTable(artboard_group_table) => artboard_group_table,
285+
})
286+
}
287+
288+
pub type ArtboardGroupTable = Instances<ArtboardGroup>;
289+
271290
#[node_macro::node(category(""))]
272291
async fn layer(_: impl Ctx, stack: GraphicGroupTable, mut element: GraphicElement, node_path: Vec<NodeId>) -> GraphicGroupTable {
273292
let mut stack = stack;
@@ -385,15 +404,15 @@ async fn to_artboard<Data: Into<GraphicGroupTable> + 'n>(
385404
}
386405

387406
#[node_macro::node(category(""))]
388-
async fn append_artboard(_ctx: impl Ctx, mut artboards: ArtboardGroup, artboard: Artboard, node_path: Vec<NodeId>) -> ArtboardGroup {
389-
// let mut artboards = artboards.eval(ctx.clone()).await;
390-
// let artboard = artboard.eval(ctx).await;
407+
async fn append_artboard(_ctx: impl Ctx, mut artboards: ArtboardGroupTable, artboard: Artboard, node_path: Vec<NodeId>) -> ArtboardGroupTable {
408+
let artboard_group = artboards.one_instance_mut().instance;
409+
391410
// let foot = ctx.footprint();
392411
// log::debug!("{:?}", foot);
393412
// Get the penultimate element of the node path, or None if the path is too short.
394413
// This is used to get the ID of the user-facing "Artboard" node (which encapsulates this internal "Append Artboard" node).
395414
let encapsulating_node_id = node_path.get(node_path.len().wrapping_sub(2)).copied();
396-
artboards.append_artboard(artboard, encapsulating_node_id);
415+
artboard_group.append_artboard(artboard, encapsulating_node_id);
397416

398417
artboards
399418
}

node-graph/gcore/src/graphic_element/renderer.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::transform::{Footprint, Transform};
99
use crate::uuid::{generate_uuid, NodeId};
1010
use crate::vector::style::{Fill, Stroke, ViewMode};
1111
use crate::vector::{PointId, VectorDataTable};
12-
use crate::{Artboard, ArtboardGroup, Color, GraphicElement, GraphicGroupTable, RasterFrame};
12+
use crate::{Artboard, ArtboardGroupTable, Color, GraphicElement, GraphicGroupTable, RasterFrame};
1313

1414
use bezier_rs::Subpath;
1515
use dyn_any::DynAny;
@@ -790,38 +790,43 @@ impl GraphicElementRendered for Artboard {
790790
}
791791
}
792792

793-
impl GraphicElementRendered for ArtboardGroup {
793+
impl GraphicElementRendered for ArtboardGroupTable {
794794
fn render_svg(&self, render: &mut SvgRender, render_params: &RenderParams) {
795-
for (artboard, _) in &self.artboards {
795+
for (artboard, _) in &self.one_instance().instance.artboards {
796796
artboard.render_svg(render, render_params);
797797
}
798798
}
799799

800800
fn bounding_box(&self, transform: DAffine2) -> Option<[DVec2; 2]> {
801-
self.artboards.iter().filter_map(|(element, _)| element.bounding_box(transform)).reduce(Quad::combine_bounds)
801+
self.one_instance()
802+
.instance
803+
.artboards
804+
.iter()
805+
.filter_map(|(element, _)| element.bounding_box(transform))
806+
.reduce(Quad::combine_bounds)
802807
}
803808

804809
fn collect_metadata(&self, metadata: &mut RenderMetadata, footprint: Footprint, _element_id: Option<NodeId>) {
805-
for (artboard, element_id) in &self.artboards {
810+
for (artboard, element_id) in &self.one_instance().instance.artboards {
806811
artboard.collect_metadata(metadata, footprint, *element_id);
807812
}
808813
}
809814

810815
fn add_upstream_click_targets(&self, click_targets: &mut Vec<ClickTarget>) {
811-
for (artboard, _) in &self.artboards {
816+
for (artboard, _) in &self.one_instance().instance.artboards {
812817
artboard.add_upstream_click_targets(click_targets);
813818
}
814819
}
815820

816821
#[cfg(feature = "vello")]
817822
fn render_to_vello(&self, scene: &mut Scene, transform: DAffine2, context: &mut RenderContext) {
818-
for (artboard, _) in &self.artboards {
823+
for (artboard, _) in &self.one_instance().instance.artboards {
819824
artboard.render_to_vello(scene, transform, context)
820825
}
821826
}
822827

823828
fn contains_artboard(&self) -> bool {
824-
!self.artboards.is_empty()
829+
!self.one_instance().instance.artboards.is_empty()
825830
}
826831
}
827832

node-graph/gcore/src/instances.rs

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::application_io::{ImageTexture, TextureFrameTable};
22
use crate::raster::image::{Image, ImageFrameTable};
33
use crate::raster::Pixel;
44
use crate::transform::{Transform, TransformMut};
5+
use crate::uuid::NodeId;
56
use crate::vector::{InstanceId, VectorData, VectorDataTable};
67
use crate::{AlphaBlending, GraphicElement, GraphicGroup, GraphicGroupTable, RasterFrame};
78

@@ -19,6 +20,8 @@ pub struct Instances<T> {
1920
transform: Vec<DAffine2>,
2021
#[serde(default = "one_alpha_blending_default")]
2122
alpha_blending: Vec<AlphaBlending>,
23+
#[serde(default = "one_source_node_id_default")]
24+
source_node_id: Vec<Option<NodeId>>,
2225
}
2326

2427
impl<T> Instances<T> {
@@ -28,6 +31,23 @@ impl<T> Instances<T> {
2831
instance: vec![instance],
2932
transform: vec![DAffine2::IDENTITY],
3033
alpha_blending: vec![AlphaBlending::default()],
34+
source_node_id: vec![None],
35+
}
36+
}
37+
38+
pub fn push(&mut self, instance: T) -> InstanceMut<T> {
39+
self.id.push(InstanceId::generate());
40+
self.instance.push(instance);
41+
self.transform.push(DAffine2::IDENTITY);
42+
self.alpha_blending.push(AlphaBlending::default());
43+
self.source_node_id.push(None);
44+
45+
InstanceMut {
46+
id: self.id.last_mut().expect("Shouldn't be empty"),
47+
instance: self.instance.last_mut().expect("Shouldn't be empty"),
48+
transform: self.transform.last_mut().expect("Shouldn't be empty"),
49+
alpha_blending: self.alpha_blending.last_mut().expect("Shouldn't be empty"),
50+
source_node_id: self.source_node_id.last_mut().expect("Shouldn't be empty"),
3151
}
3252
}
3353

@@ -37,6 +57,7 @@ impl<T> Instances<T> {
3757
instance: self.instance.first().unwrap_or_else(|| panic!("ONE INSTANCE EXPECTED, FOUND {}", self.instance.len())),
3858
transform: self.transform.first().unwrap_or_else(|| panic!("ONE INSTANCE EXPECTED, FOUND {}", self.instance.len())),
3959
alpha_blending: self.alpha_blending.first().unwrap_or_else(|| panic!("ONE INSTANCE EXPECTED, FOUND {}", self.instance.len())),
60+
source_node_id: self.source_node_id.first().unwrap_or_else(|| panic!("ONE INSTANCE EXPECTED, FOUND {}", self.instance.len())),
4061
}
4162
}
4263

@@ -48,6 +69,7 @@ impl<T> Instances<T> {
4869
instance: self.instance.first_mut().unwrap_or_else(|| panic!("ONE INSTANCE EXPECTED, FOUND {}", length)),
4970
transform: self.transform.first_mut().unwrap_or_else(|| panic!("ONE INSTANCE EXPECTED, FOUND {}", length)),
5071
alpha_blending: self.alpha_blending.first_mut().unwrap_or_else(|| panic!("ONE INSTANCE EXPECTED, FOUND {}", length)),
72+
source_node_id: self.source_node_id.first_mut().unwrap_or_else(|| panic!("ONE INSTANCE EXPECTED, FOUND {}", length)),
5173
}
5274
}
5375

@@ -58,11 +80,13 @@ impl<T> Instances<T> {
5880
.zip(self.instance.iter())
5981
.zip(self.transform.iter())
6082
.zip(self.alpha_blending.iter())
61-
.map(|(((id, instance), transform), alpha_blending)| Instance {
83+
.zip(self.source_node_id.iter())
84+
.map(|((((id, instance), transform), alpha_blending), source_node_id)| Instance {
6285
id,
6386
instance,
6487
transform,
6588
alpha_blending,
89+
source_node_id,
6690
})
6791
}
6892

@@ -73,11 +97,13 @@ impl<T> Instances<T> {
7397
.zip(self.instance.iter_mut())
7498
.zip(self.transform.iter_mut())
7599
.zip(self.alpha_blending.iter_mut())
76-
.map(|(((id, instance), transform), alpha_blending)| InstanceMut {
100+
.zip(self.source_node_id.iter_mut())
101+
.map(|((((id, instance), transform), alpha_blending), source_node_id)| InstanceMut {
77102
id,
78103
instance,
79104
transform,
80105
alpha_blending,
106+
source_node_id,
81107
})
82108
}
83109
}
@@ -114,20 +140,25 @@ fn one_daffine2_default() -> Vec<DAffine2> {
114140
fn one_alpha_blending_default() -> Vec<AlphaBlending> {
115141
vec![AlphaBlending::default()]
116142
}
143+
fn one_source_node_id_default() -> Vec<Option<NodeId>> {
144+
vec![None]
145+
}
117146

118147
#[derive(Copy, Clone, Debug)]
119148
pub struct Instance<'a, T> {
120149
pub id: &'a InstanceId,
121150
pub instance: &'a T,
122151
pub transform: &'a DAffine2,
123152
pub alpha_blending: &'a AlphaBlending,
153+
pub source_node_id: &'a Option<NodeId>,
124154
}
125155
#[derive(Debug)]
126156
pub struct InstanceMut<'a, T> {
127157
pub id: &'a mut InstanceId,
128158
pub instance: &'a mut T,
129159
pub transform: &'a mut DAffine2,
130160
pub alpha_blending: &'a mut AlphaBlending,
161+
pub source_node_id: &'a mut Option<NodeId>,
131162
}
132163

133164
// GRAPHIC ELEMENT

node-graph/gcore/src/transform.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::application_io::TextureFrameTable;
22
use crate::raster::bbox::AxisAlignedBbox;
33
use crate::raster::image::ImageFrameTable;
44
use crate::vector::VectorDataTable;
5-
use crate::{Artboard, ArtboardGroup, CloneVarArgs, Color, Context, Ctx, ExtractAll, GraphicGroupTable, OwnedContextImpl};
5+
use crate::{Artboard, ArtboardGroupTable, CloneVarArgs, Color, Context, Ctx, ExtractAll, GraphicGroupTable, OwnedContextImpl};
66

77
use glam::{DAffine2, DVec2};
88

@@ -132,7 +132,7 @@ impl From<()> for Footprint {
132132
}
133133

134134
#[node_macro::node(category("Debug"))]
135-
fn cull<T>(_: impl Ctx, #[implementations(VectorDataTable, GraphicGroupTable, Artboard, ImageFrameTable<Color>, ArtboardGroup)] data: T) -> T {
135+
fn cull<T>(_: impl Ctx, #[implementations(VectorDataTable, GraphicGroupTable, Artboard, ImageFrameTable<Color>, ArtboardGroupTable)] data: T) -> T {
136136
data
137137
}
138138

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,8 @@ tagged_value! {
182182
#[cfg_attr(feature = "serde", serde(deserialize_with = "graphene_core::migrate_graphic_group"))]
183183
GraphicGroup(graphene_core::GraphicGroupTable),
184184
GraphicElement(graphene_core::GraphicElement),
185-
ArtboardGroup(graphene_core::ArtboardGroup),
185+
#[cfg_attr(feature = "serde", serde(deserialize_with = "graphene_core::migrate_artboard_group"))] // TODO: Eventually remove this migration document upgrade code
186+
ArtboardGroup(graphene_core::ArtboardGroupTable),
186187
Curve(graphene_core::raster::curve::Curve),
187188
Footprint(graphene_core::transform::Footprint),
188189
Palette(Vec<Color>),

node-graph/gstd/src/wasm_application_io.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ async fn render<'a: 'n, T: 'n + GraphicElementRendered + WasmNotSend>(
212212
Context -> ImageFrameTable<Color>,
213213
Context -> GraphicGroupTable,
214214
Context -> graphene_core::Artboard,
215-
Context -> graphene_core::ArtboardGroup,
215+
Context -> graphene_core::ArtboardGroupTable,
216216
Context -> Option<Color>,
217217
Context -> Vec<Color>,
218218
Context -> bool,

0 commit comments

Comments
 (0)