Skip to content

Commit cb21e59

Browse files
authored
Remove serialization from Table<T> and make TaggedValue only store tooling/widget node inputs (#4129)
* Add TaggedValue::TypeDefault to avoid baking placeholder Tables into saved documents * Add TaggedValue::TypeDefault to avoid baking placeholder Tables into saved documents * Migrate empty Vector/Raster/Graphic/Artboard placeholder values to TypeDefault on load Documents written before the TypeDefault mechanism existed have empty Table<Vector>/<Raster>/<Graphic>/<Artboard> values baked into every unwired exposed input. Walk each migrated node's inputs and rewrite any such placeholder NodeInput::Value into the equivalent NodeInput::type_default, so re-saved documents shed the placeholder payloads. Marked with a TODO for eventual removal once enough documents have been re-saved. * Re-save demo artwork * Remove Graphic and Artboard placeholder containers from TaggedValue * Remove Raster placeholder TaggedValue variant * Simplify document migration * Remove Vector placeholder TaggedValue variant * Remove NodeIdTable from the TaggedValue * Remove StringTable from the TaggedValue * Remove F64Table in place of F64Array in TaggedValue * Replace TaggedValue::Color(Table<Color>) with ::Color(Option<Color>) * Replace TaggedValue::GradientTable(Table<GradientStops>) with ::Gradient(GradientStops) * Replace TaggedValue::BrushStrokeTable(Table<BrushStroke>) with ::BrushStrokes(Vec<BrushStroke>) * Make TaggedValue::DocumentNode runtime-only with TypeDefault placeholder * Make TaggedValue::ContextFeatures runtime-only * Remove Serialize/Deserialize from Table<T> * Add a widget for TaggedValue::BrushStrokes to visualize strokes and samples * Define a reusable list of TaggedValue::TypeDefault types for its generated methods * Re-save demo artwork
1 parent d97fe83 commit cb21e59

35 files changed

Lines changed: 616 additions & 938 deletions

demo-artwork/changing-seasons.graphite

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demo-artwork/isometric-fountain.graphite

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demo-artwork/marbled-mandelbrot.graphite

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demo-artwork/painted-dreams.graphite

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demo-artwork/parametric-dunescape.graphite

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demo-artwork/procedural-string-lights.graphite

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demo-artwork/red-dress.graphite

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demo-artwork/valley-of-spires.graphite

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ use crate::messages::tool::tool_messages::tool_prelude::Key;
2929
use crate::messages::tool::utility_types::ToolType;
3030
use crate::node_graph_executor::NodeGraphExecutor;
3131
use glam::{DAffine2, DVec2};
32+
use graph_craft::descriptor;
3233
use graph_craft::document::value::TaggedValue;
3334
use graph_craft::document::{NodeId, NodeInput, NodeNetwork, OldNodeNetwork};
3435
use graphene_std::math::quad::Quad;
@@ -1760,12 +1761,7 @@ impl DocumentMessageHandler {
17601761
}
17611762

17621763
pub fn deserialize_document(serialized_content: &str) -> Result<Self, EditorError> {
1763-
// Walk the document JSON and rewrite any `TaggedValue` variants that have been removed since being released as `"None"` so the document still deserializes.
1764-
// `migrate_node` then drops the resulting orphan node inputs so the value never reaches graph execution.
1765-
let mut json_value: serde_json::Value = serde_json::from_str(serialized_content).map_err(|e| EditorError::DocumentDeserialization(e.to_string()))?;
1766-
graph_craft::document::value::TaggedValue::scrub_removed_variants_from_json(&mut json_value);
1767-
1768-
let document_message_handler = serde_json::from_value::<DocumentMessageHandler>(json_value.clone())
1764+
let document_message_handler = serde_json::from_str::<DocumentMessageHandler>(serialized_content)
17691765
.or_else(|e| {
17701766
log::warn!("Failed to directly load document with the following error: {e}. Trying old DocumentMessageHandler.");
17711767
// TODO: Eventually remove this document upgrade code
@@ -1804,7 +1800,7 @@ impl DocumentMessageHandler {
18041800
pub snapping_state: SnappingState,
18051801
}
18061802

1807-
serde_json::from_value::<OldDocumentMessageHandler>(json_value).map(|old_message_handler| DocumentMessageHandler {
1803+
serde_json::from_str::<OldDocumentMessageHandler>(serialized_content).map(|old_message_handler| DocumentMessageHandler {
18081804
network_interface: NodeNetworkInterface::from_old_network(old_message_handler.network),
18091805
collapsed: old_message_handler.collapsed,
18101806
commit_hash: old_message_handler.commit_hash,
@@ -3349,7 +3345,7 @@ impl DocumentMessageHandler {
33493345
/// Create a network interface with a single export
33503346
fn default_document_network_interface() -> NodeNetworkInterface {
33513347
let mut network_interface = NodeNetworkInterface::default();
3352-
network_interface.add_export(TaggedValue::Artboard(Default::default()), -1, "", &[]);
3348+
network_interface.add_export(TaggedValue::TypeDefault(descriptor!(graphene_std::table::Table<graphene_std::Artboard>)), -1, "", &[]);
33533349
network_interface
33543350
}
33553351

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ use crate::messages::portfolio::document::utility_types::nodes::CollapsedLayers;
88
use crate::messages::prelude::*;
99
use crate::messages::tool::common_functionality::graph_modification_utils::get_clip_mode;
1010
use glam::{DAffine2, DVec2, IVec2};
11-
use graph_craft::document::value::TaggedValue;
11+
use graph_craft::descriptor;
1212
use graph_craft::document::{NodeId, NodeInput};
13-
use graphene_std::Color;
1413
use graphene_std::renderer::Quad;
1514
use graphene_std::renderer::convert_usvg_path::convert_usvg_path;
1615
use graphene_std::table::Table;
1716
use graphene_std::text::{Font, TypesettingConfig};
1817
use graphene_std::vector::style::{Fill, Gradient, GradientSpreadMethod, GradientStop, GradientStops, GradientType, PaintOrder, Stroke, StrokeAlign, StrokeCap, StrokeJoin};
18+
use graphene_std::{Artboard, Color};
1919

2020
#[derive(ExtractField)]
2121
pub struct GraphOperationMessageContext<'a> {
@@ -170,15 +170,15 @@ impl MessageHandler<GraphOperationMessage, GraphOperationMessageContext<'_>> for
170170
}
171171

172172
// Set the bottom input of the artboard back to artboard
173-
let bottom_input = NodeInput::value(TaggedValue::Artboard(Table::new()), true);
173+
let bottom_input = NodeInput::type_default(descriptor!(Table<Artboard>), true);
174174
network_interface.set_input(&InputConnector::node(artboard_layer.to_node(), 0), bottom_input, &[]);
175175
} else {
176176
// We have some non layers (e.g. just a rectangle node). We disconnect the bottom input and connect it to the left input.
177177
network_interface.disconnect_input(&InputConnector::node(artboard_layer.to_node(), 0), &[]);
178178
network_interface.set_input(&InputConnector::node(artboard_layer.to_node(), 1), primary_input, &[]);
179179

180180
// Set the bottom input of the artboard back to artboard
181-
let bottom_input = NodeInput::value(TaggedValue::Artboard(Table::new()), true);
181+
let bottom_input = NodeInput::type_default(descriptor!(Table<Artboard>), true);
182182
network_interface.set_input(&InputConnector::node(artboard_layer.to_node(), 0), bottom_input, &[]);
183183
}
184184
}

0 commit comments

Comments
 (0)