Skip to content

Commit 74c7113

Browse files
committed
First native render
1 parent ea4bbd1 commit 74c7113

31 files changed

+485
-355
lines changed

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

editor/src/application.rs

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use crate::dispatcher::Dispatcher;
22
use crate::messages::prelude::*;
3-
use crate::node_graph_ui_executor::EvaluationRequest;
43
pub use graphene_std::uuid::*;
54

65
// TODO: serialize with serde to save the current editor state
@@ -27,34 +26,6 @@ impl Editor {
2726

2827
std::mem::take(&mut self.dispatcher.responses)
2928
}
30-
31-
pub fn poll_node_graph_ui_evaluation(&self) -> impl Iterator<Item = FrontendMessage> {
32-
if let Some(active_document) = self.dispatcher.message_handlers.portfolio_message_handler.active_document() {
33-
let Some(network_metadata) = active_document.network_interface.network_metadata(active_document.breadcrumb_network_path) else {
34-
return;
35-
};
36-
37-
let transform = active_document.navigation_handler.calculate_offset_transform(
38-
self.dispatcher.message_handlers.input_preprocessor_message_handler.viewport_bounds.center(),
39-
&network_metadata.persistent_metadata.navigation_metadata.node_graph_ptz,
40-
);
41-
42-
let transfrom = NodeGraphTransform {
43-
scale: transform.matrix2.x_axis.x,
44-
x: transform.translation.x,
45-
y: transform.translation.y,
46-
};
47-
let resolution = self.dispatcher.message_handlers.input_preprocessor_message_handler.viewport_bounds.size().as_uvec2();
48-
let evaluation_request = EvaluationRequest { transform, resolution };
49-
let responses = self
50-
.dispatcher
51-
.message_handlers
52-
.portfolio_message_handler
53-
.node_graph_ui_executor
54-
.poll_node_graph_ui_evaluation(evaluation_request);
55-
responses.into_iter().flat_map(|message| self.handle_message(message))
56-
}
57-
}
5829
}
5930

6031
impl Default for Editor {

editor/src/dispatcher.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,19 @@ pub struct Dispatcher {
1313

1414
#[derive(Debug, Default)]
1515
pub struct DispatcherMessageHandlers {
16-
animation_message_handler: AnimationMessageHandler,
17-
app_window_message_handler: AppWindowMessageHandler,
18-
broadcast_message_handler: BroadcastMessageHandler,
19-
debug_message_handler: DebugMessageHandler,
20-
defer_message_handler: DeferMessageHandler,
21-
dialog_message_handler: DialogMessageHandler,
22-
globals_message_handler: GlobalsMessageHandler,
16+
pub animation_message_handler: AnimationMessageHandler,
17+
pub app_window_message_handler: AppWindowMessageHandler,
18+
pub broadcast_message_handler: BroadcastMessageHandler,
19+
pub debug_message_handler: DebugMessageHandler,
20+
pub defer_message_handler: DeferMessageHandler,
21+
pub dialog_message_handler: DialogMessageHandler,
22+
pub globals_message_handler: GlobalsMessageHandler,
2323
pub input_preprocessor_message_handler: InputPreprocessorMessageHandler,
24-
key_mapping_message_handler: KeyMappingMessageHandler,
25-
layout_message_handler: LayoutMessageHandler,
24+
pub key_mapping_message_handler: KeyMappingMessageHandler,
25+
pub layout_message_handler: LayoutMessageHandler,
2626
pub portfolio_message_handler: PortfolioMessageHandler,
27-
preferences_message_handler: PreferencesMessageHandler,
28-
tool_message_handler: ToolMessageHandler,
27+
pub preferences_message_handler: PreferencesMessageHandler,
28+
pub tool_message_handler: ToolMessageHandler,
2929
}
3030

3131
impl DispatcherMessageHandlers {
@@ -150,7 +150,10 @@ impl Dispatcher {
150150
Message::Frontend(message) => {
151151
// Handle these messages immediately by returning early
152152
if let FrontendMessage::TriggerFontLoad { .. } = message {
153-
self.responses.push(message);
153+
// Deduplicate the render native node graph messages. TODO: Replace responses with hashset
154+
if !(message == FrontendMessage::UpdateNodeGraphNativeRender && self.responses.contains(&FrontendMessage::UpdateNodeGraphNativeRender)) {
155+
self.responses.push(message);
156+
}
154157
self.cleanup_queues(false);
155158

156159
// Return early to avoid running the code after the match block

editor/src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ pub mod consts;
1212
pub mod dispatcher;
1313
pub mod messages;
1414
pub mod node_graph_executor;
15-
pub mod node_graph_ui_executor;
1615
#[cfg(test)]
1716
pub mod test_utils;
1817
pub mod utility_traits;

editor/src/messages/frontend/frontend_message.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use super::utility_types::{FrontendDocumentDetails, MouseCursorIcon};
22
use crate::messages::app_window::app_window_message_handler::AppWindowPlatform;
33
use crate::messages::layout::utility_types::widget_prelude::*;
4-
use crate::messages::portfolio::document::node_graph::utility_types::{BoxSelection, ContextMenuInformation, FrontendClickTargets, FrontendNodeType, NodeGraphTransform};
4+
use crate::messages::portfolio::document::node_graph::utility_types::{BoxSelection, ContextMenuInformation, FrontendClickTargets, FrontendNodeType};
55
use crate::messages::portfolio::document::utility_types::nodes::{JsRawBuffer, LayerPanelEntry, RawBuffer};
66
use crate::messages::portfolio::document::utility_types::wires::WirePathInProgress;
77
use crate::messages::prelude::*;
88
use crate::messages::tool::utility_types::HintData;
99
use graph_craft::document::NodeId;
10-
use graphene_std::node_graph_overlay::types::{FrontendExports, FrontendImport, FrontendNodeToRender, FrontendXY};
10+
use graphene_std::node_graph_overlay::types::{FrontendExports, FrontendImport, FrontendNodeToRender, FrontendXY, NodeGraphTransform};
1111
use graphene_std::raster::Image;
1212
use graphene_std::raster::color::Color;
1313
use graphene_std::text::{Font, TextAlign};
@@ -267,7 +267,8 @@ pub enum FrontendMessage {
267267
UpdateMouseCursor {
268268
cursor: MouseCursorIcon,
269269
},
270-
UpdateNodeGraphRender {
270+
UpdateNodeGraphNativeRender,
271+
UpdateNodeGraphSvelteRender {
271272
#[serde(rename = "nodesToRender")]
272273
nodes_to_render: Vec<FrontendNodeToRender>,
273274
open: bool,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use super::node_graph::document_node_definitions;
2-
use super::node_graph::utility_types::NodeGraphTransform;
32
use super::overlays::utility_types::Pivot;
43
use super::utility_types::error::EditorError;
54
use super::utility_types::misc::{GroupFolderType, SNAP_FUNCTIONS_FOR_BOUNDING_BOXES, SNAP_FUNCTIONS_FOR_PATHS, SnappingOptions, SnappingState};
@@ -31,6 +30,7 @@ use glam::{DAffine2, DVec2, IVec2};
3130
use graph_craft::document::value::TaggedValue;
3231
use graph_craft::document::{NodeId, NodeInput, NodeNetwork, OldNodeNetwork};
3332
use graphene_std::math::quad::Quad;
33+
use graphene_std::node_graph_overlay::types::NodeGraphTransform;
3434
use graphene_std::path_bool::{boolean_intersect, path_bool_lib};
3535
use graphene_std::raster::BlendMode;
3636
use graphene_std::raster_types::Raster;
@@ -122,7 +122,7 @@ pub struct DocumentMessageHandler {
122122
pub breadcrumb_network_path: Vec<NodeId>,
123123
/// Path to network that is currently selected. Updated based on the most recently clicked panel.
124124
#[serde(skip)]
125-
selection_network_path: Vec<NodeId>,
125+
pub selection_network_path: Vec<NodeId>,
126126
/// Stack of document network snapshots for previous history states.
127127
#[serde(skip)]
128128
document_undo_history: VecDeque<NodeNetworkInterface>,

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

Lines changed: 71 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -3,108 +3,133 @@ use graph_craft::{
33
document::{DocumentNode, DocumentNodeImplementation, NodeInput, NodeNetwork, value::TaggedValue},
44
};
55
use graphene_std::{
6-
Context, graphic, memo,
7-
node_graph_overlay::{self, types::NodeGraphOverlayData},
6+
node_graph_overlay::{types::NodeGraphOverlayData, ui_context::UIContext},
7+
table::Table,
88
uuid::NodeId,
99
};
1010

11+
/// https://excalidraw.com/#json=LgKS6I4lQvGPmke06ZJyp,D9aON9vVZJAjNnZWfwy_SQ
1112
pub fn generate_node_graph_overlay(node_graph_overlay_data: NodeGraphOverlayData, opacity: f64) -> DocumentNode {
12-
// TODO: Implement as Network and implement finer grained caching for the background, nodes, and exports
13+
let generate_nodes_id = NodeId::new();
14+
let cache_nodes_id = NodeId::new();
15+
let transform_nodes_id = NodeId::new();
16+
17+
let generate_node_graph_bg = NodeId::new();
18+
let cache_node_graph_bg = NodeId::new();
19+
20+
let merge_nodes_and_bg_id = NodeId::new();
21+
let render_overlay_id = NodeId::new();
22+
let send_overlay_id = NodeId::new();
23+
let _cache_output_id = NodeId::new();
24+
// TODO: Replace with new cache node
25+
let memo_implementation = DocumentNodeImplementation::ProtoNode(graphene_std::ops::identity::IDENTIFIER);
26+
1327
DocumentNode {
1428
inputs: vec![
15-
NodeInput::value(TaggedValue::None, true),
29+
NodeInput::value(TaggedValue::Vector(Table::new()), true),
1630
NodeInput::value(TaggedValue::NodeGraphOverlayData(node_graph_overlay_data), true),
1731
NodeInput::value(TaggedValue::F64(opacity), true),
1832
],
33+
1934
implementation: DocumentNodeImplementation::Network(NodeNetwork {
20-
exports: vec![NodeInput::node(NodeId(0), 0)],
35+
exports: vec![NodeInput::node(send_overlay_id, 0)],
2136
nodes: vec![
22-
// Merge the overlay on top of the artwork
37+
// Create the nodes
2338
(
24-
NodeId(0),
39+
generate_nodes_id,
2540
DocumentNode {
26-
call_argument: concrete!(Context),
27-
inputs: vec![NodeInput::node(NodeId(2), 0), NodeInput::node(NodeId(1), 0)],
28-
implementation: DocumentNodeImplementation::ProtoNode(graphic::extend::IDENTIFIER),
41+
call_argument: concrete!(UIContext),
42+
inputs: vec![NodeInput::network(concrete!(UIContext), 1)],
43+
implementation: DocumentNodeImplementation::ProtoNode("graphene_core::node_graph_overlay::GenerateNodesNode".into()),
2944
..Default::default()
3045
},
3146
),
32-
//Wrap Artwork in a table
47+
// Cache the nodes
3348
(
34-
NodeId(1),
49+
cache_nodes_id,
3550
DocumentNode {
36-
inputs: vec![NodeInput::network(concrete!(Context), 0)],
37-
implementation: DocumentNodeImplementation::ProtoNode(graphic::wrap_graphic::IDENTIFIER),
38-
call_argument: concrete!(Context),
51+
call_argument: concrete!(UIContext),
52+
inputs: vec![NodeInput::node(generate_nodes_id, 0)],
53+
implementation: memo_implementation.clone(),
3954
..Default::default()
4055
},
4156
),
42-
// Cache the full node graph so its not rerendered when the artwork changes
57+
// Transform the nodes based on the Context
4358
(
44-
NodeId(2),
59+
transform_nodes_id,
4560
DocumentNode {
46-
call_argument: concrete!(Context),
47-
inputs: vec![NodeInput::node(NodeId(3), 0)],
48-
implementation: DocumentNodeImplementation::ProtoNode(memo::memo::IDENTIFIER),
61+
call_argument: concrete!(UIContext),
62+
inputs: vec![NodeInput::node(cache_nodes_id, 0)],
63+
implementation: DocumentNodeImplementation::ProtoNode("graphene_core::node_graph_overlay::TransformNodesNode".into()),
4964
..Default::default()
5065
},
5166
),
52-
// Merge the nodes on top of the dot grid background
67+
// Generate the dot grid background
5368
(
54-
NodeId(3),
69+
generate_node_graph_bg,
5570
DocumentNode {
56-
call_argument: concrete!(Context),
57-
inputs: vec![NodeInput::node(NodeId(5), 0), NodeInput::node(NodeId(4), 0)],
58-
implementation: DocumentNodeImplementation::ProtoNode(graphic::extend::IDENTIFIER),
71+
inputs: vec![NodeInput::network(concrete!(UIContext), 2)],
72+
implementation: DocumentNodeImplementation::ProtoNode("graphene_core::node_graph_overlay::DotGridBackgroundNode".into()),
73+
call_argument: concrete!(UIContext),
5974
..Default::default()
6075
},
6176
),
62-
// Generate the dot grid background
77+
// Cache the dot grid background
6378
(
64-
NodeId(4),
79+
cache_node_graph_bg,
6580
DocumentNode {
66-
inputs: vec![NodeInput::network(concrete!(Context), 2)],
67-
implementation: DocumentNodeImplementation::ProtoNode(node_graph_overlay::dot_grid_background::IDENTIFIER),
68-
call_argument: concrete!(Context),
81+
call_argument: concrete!(UIContext),
82+
inputs: vec![NodeInput::node(generate_node_graph_bg, 0)],
83+
implementation: memo_implementation.clone(),
6984
..Default::default()
7085
},
7186
),
72-
// Transform the nodes based on the Context
87+
// Merge the nodes on top of the dot grid background
7388
(
74-
NodeId(5),
89+
merge_nodes_and_bg_id,
7590
DocumentNode {
76-
call_argument: concrete!(Context),
77-
inputs: vec![NodeInput::node(NodeId(6), 0)],
78-
implementation: DocumentNodeImplementation::ProtoNode(node_graph_overlay::transform_nodes::IDENTIFIER),
91+
call_argument: concrete!(UIContext),
92+
inputs: vec![NodeInput::node(transform_nodes_id, 0), NodeInput::node(cache_node_graph_bg, 0)],
93+
implementation: DocumentNodeImplementation::ProtoNode("graphene_core::node_graph_overlay::NodeGraphUiExtendNode".into()),
7994
..Default::default()
8095
},
8196
),
82-
// Cache the nodes
97+
// Render the node graph UI graphic to an SVG
8398
(
84-
NodeId(6),
99+
render_overlay_id,
85100
DocumentNode {
86-
call_argument: concrete!(Context),
87-
inputs: vec![NodeInput::node(NodeId(7), 0)],
88-
implementation: DocumentNodeImplementation::ProtoNode(memo::memo::IDENTIFIER),
101+
call_argument: concrete!(UIContext),
102+
inputs: vec![NodeInput::node(merge_nodes_and_bg_id, 0)],
103+
implementation: DocumentNodeImplementation::ProtoNode("graphene_std::wasm_application_io::RenderNodeGraphUiNode".into()),
89104
..Default::default()
90105
},
91106
),
92-
// Create the nodes
107+
// Send the overlay to the frontend
93108
(
94-
NodeId(7),
109+
send_overlay_id,
95110
DocumentNode {
96-
call_argument: concrete!(Context),
97-
inputs: vec![NodeInput::network(concrete!(Context), 1)],
98-
implementation: DocumentNodeImplementation::ProtoNode(node_graph_overlay::generate_nodes::IDENTIFIER),
111+
call_argument: concrete!(UIContext),
112+
inputs: vec![NodeInput::node(render_overlay_id, 0)],
113+
implementation: DocumentNodeImplementation::ProtoNode("graphene_core::node_graph_overlay::SendRenderNode".into()),
99114
..Default::default()
100115
},
101116
),
117+
// Cache the full node graph so its not rerendered when the artwork changes
118+
// (
119+
// cache_nodes_id,
120+
// DocumentNode {
121+
// call_argument: concrete!(UIContext),
122+
// inputs: vec![NodeInput::node(send_overlay_id, 0)],
123+
// implementation: memo_implementation.clone(),
124+
// ..Default::default()
125+
// },
126+
// ),
102127
]
103128
.into_iter()
104129
.collect(),
105130
..Default::default()
106131
}),
107-
call_argument: concrete!(Context),
132+
call_argument: concrete!(UIContext),
108133
..Default::default()
109134
}
110135
}

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

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use crate::messages::tool::common_functionality::utility_functions::make_path_ed
2121
use crate::messages::tool::tool_messages::tool_prelude::{Key, MouseMotion};
2222
use crate::messages::tool::utility_types::{HintData, HintGroup, HintInfo};
2323
use glam::{DAffine2, DVec2, IVec2};
24-
use graph_craft::document::{DocumentNode, DocumentNodeImplementation, NodeId, NodeInput};
24+
use graph_craft::document::{DocumentNodeImplementation, NodeId, NodeInput};
2525
use graph_craft::proto::GraphErrors;
2626
use graphene_std::math::math_ext::QuadExt;
2727
use graphene_std::node_graph_overlay::types::{FrontendGraphDataType, FrontendXY};
@@ -96,8 +96,6 @@ pub struct NodeGraphMessageHandler {
9696
frontend_nodes: Vec<NodeId>,
9797
/// Disables rendering nodes in Svelte
9898
native_node_graph_render: bool,
99-
/// The node which renders the node graph overlay. Inserted after the root export
100-
pub node_graph_overlay: Option<DocumentNode>,
10199
}
102100

103101
/// NodeGraphMessageHandler always modifies the network which the selected nodes are in. No GraphOperationMessages should be added here, since those messages will always affect the document network.
@@ -1626,20 +1624,14 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphMessageContext<'a>> for NodeG
16261624
responses.add(DocumentMessage::DocumentStructureChanged);
16271625
responses.add(PropertiesPanelMessage::Refresh);
16281626
responses.add(NodeGraphMessage::UpdateActionButtons);
1629-
let nodes_to_render = network_interface.collect_nodes(&self.node_graph_errors, preferences.graph_wire_style, breadcrumb_network_path);
1630-
self.frontend_nodes = nodes_to_render.iter().map(|node| node.metadata.node_id).collect();
1631-
let previewed_node = network_interface.previewed_node(breadcrumb_network_path);
1627+
16321628
if self.native_node_graph_render {
1633-
let node_graph_render_data = node_graph_overlay::types::NodeGraphOverlayData {
1634-
nodes_to_render,
1635-
open: graph_view_overlay_open,
1636-
in_selected_network: selection_network_path == breadcrumb_network_path,
1637-
previewed_node,
1638-
};
1639-
self.node_graph_overlay = Some(super::generate_node_graph_overlay::generate_node_graph_overlay(node_graph_render_data, graph_fade_artwork_percentage));
1640-
responses.add(PortfolioMessage::SubmitActiveGraphRender);
1629+
responses.add(FrontendMessage::UpdateNodeGraphNativeRender);
16411630
} else {
1642-
responses.add(FrontendMessage::UpdateNodeGraphRender {
1631+
let nodes_to_render = network_interface.collect_nodes(&self.node_graph_errors, preferences.graph_wire_style, breadcrumb_network_path);
1632+
self.frontend_nodes = nodes_to_render.iter().map(|node| node.metadata.node_id).collect();
1633+
let previewed_node = network_interface.previewed_node(breadcrumb_network_path);
1634+
responses.add(FrontendMessage::UpdateNodeGraphSvelteRender {
16431635
nodes_to_render,
16441636
open: graph_view_overlay_open,
16451637
opacity: graph_fade_artwork_percentage,
@@ -1799,7 +1791,9 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphMessageContext<'a>> for NodeG
17991791
}
18001792
NodeGraphMessage::ToggleNativeNodeGraphRender => {
18011793
self.native_node_graph_render = !self.native_node_graph_render;
1802-
self.node_graph_overlay = None;
1794+
responses.add(FrontendMessage::UpdateNativeNodeGraphRender {
1795+
native_node_graph_render: self.native_node_graph_render,
1796+
});
18031797
responses.add(NodeGraphMessage::SendGraph);
18041798
}
18051799
NodeGraphMessage::ToggleSelectedLocked => {
@@ -2634,7 +2628,6 @@ impl Default for NodeGraphMessageHandler {
26342628
end_index: None,
26352629
frontend_nodes: Vec::new(),
26362630
native_node_graph_render: false,
2637-
node_graph_overlay: None,
26382631
}
26392632
}
26402633
}

0 commit comments

Comments
 (0)