Skip to content

Commit 876a14a

Browse files
committed
Reduce rendered nodes
1 parent 2d4173f commit 876a14a

File tree

3 files changed

+36
-24
lines changed

3 files changed

+36
-24
lines changed

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

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,21 +1321,7 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphHandlerData<'a>> for NodeGrap
13211321
responses.add(FrontendMessage::UpdateNodeGraphWires { wires });
13221322
}
13231323
NodeGraphMessage::UpdateVisibleNodes => {
1324-
let Some(network_metadata) = network_interface.network_metadata(breadcrumb_network_path) else {
1325-
return;
1326-
};
1327-
let document_bbox = ipp.document_bounds(network_metadata.persistent_metadata.navigation_metadata.node_graph_to_viewport.inverse());
1328-
let mut nodes = Vec::new();
1329-
for node_id in &self.frontend_nodes {
1330-
let Some(node_bbox) = network_interface.node_bounding_box(node_id, breadcrumb_network_path) else {
1331-
log::error!("Could not get bbox for node: {:?}", node_id);
1332-
continue;
1333-
};
1334-
if node_bbox[1].x >= document_bbox[0].x && node_bbox[0].x <= document_bbox[1].x && node_bbox[1].y >= document_bbox[0].y && node_bbox[0].y <= document_bbox[1].y {
1335-
nodes.push(*node_id);
1336-
}
1337-
}
1338-
1324+
let nodes = self.visible_nodes(network_interface, breadcrumb_network_path, ipp);
13391325
responses.add(FrontendMessage::UpdateVisibleNodes { nodes });
13401326
}
13411327
NodeGraphMessage::SendGraph => {
@@ -2365,6 +2351,24 @@ impl NodeGraphMessageHandler {
23652351
nodes
23662352
}
23672353

2354+
pub fn visible_nodes(&self, network_interface: &mut NodeNetworkInterface, breadcrumb_network_path: &[NodeId], ipp: &InputPreprocessorMessageHandler) -> Vec<NodeId> {
2355+
let Some(network_metadata) = network_interface.network_metadata(breadcrumb_network_path) else {
2356+
return Vec::new();
2357+
};
2358+
let document_bbox = ipp.document_bounds(network_metadata.persistent_metadata.navigation_metadata.node_graph_to_viewport.inverse());
2359+
let mut nodes = Vec::new();
2360+
for node_id in &self.frontend_nodes {
2361+
let Some(node_bbox) = network_interface.node_bounding_box(node_id, breadcrumb_network_path) else {
2362+
log::error!("Could not get bbox for node: {:?}", node_id);
2363+
continue;
2364+
};
2365+
if node_bbox[1].x >= document_bbox[0].x && node_bbox[0].x <= document_bbox[1].x && node_bbox[1].y >= document_bbox[0].y && node_bbox[0].y <= document_bbox[1].y {
2366+
nodes.push(*node_id);
2367+
}
2368+
}
2369+
nodes
2370+
}
2371+
23682372
fn collect_subgraph_names(network_interface: &mut NodeNetworkInterface, breadcrumb_network_path: &[NodeId]) -> Option<Vec<String>> {
23692373
let mut current_network_path = vec![];
23702374
let mut current_network = network_interface.nested_network(&current_network_path).unwrap();

editor/src/messages/portfolio/portfolio_message_handler.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -802,7 +802,7 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageData<'_>> for PortfolioMes
802802
}
803803
PortfolioMessage::EvaluateActiveDocumentWithThumbnails => {
804804
responses.add(PortfolioMessage::EvaluateActiveDocument {
805-
nodes_to_introspect: self.nodes_to_try_render(ipp.viewport_bounds()[1], &preferences.graph_wire_style),
805+
nodes_to_introspect: self.visible_nodes_to_try_render(ipp, &preferences.graph_wire_style),
806806
});
807807
responses.add(Message::StartEvaluationQueue);
808808
responses.add(PortfolioMessage::ProcessThumbnails);
@@ -830,7 +830,7 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageData<'_>> for PortfolioMes
830830
context.real_time = Some(ipp.time);
831831
context.downstream_transform = Some(DAffine2::IDENTITY);
832832

833-
let nodes_to_try_render = self.nodes_to_try_render(ipp.viewport_bounds()[1], &preferences.graph_wire_style);
833+
let nodes_to_try_render = self.visible_nodes_to_try_render(ipp, &preferences.graph_wire_style);
834834

835835
self.executor.submit_node_graph_evaluation(context, None, None, nodes_to_try_render);
836836
}
@@ -1225,7 +1225,7 @@ impl PortfolioMessageHandler {
12251225
result
12261226
}
12271227

1228-
pub fn nodes_to_try_render(&mut self, viewport_size: DVec2, graph_wire_style: &GraphWireStyle) -> HashSet<SNI> {
1228+
pub fn visible_nodes_to_try_render(&mut self, ipp: &InputPreprocessorMessageHandler, graph_wire_style: &GraphWireStyle) -> HashSet<SNI> {
12291229
let Some(document) = self.active_document_id.and_then(|document_id| self.documents.get_mut(&document_id)) else {
12301230
log::error!("Tried to render non-existent document: {:?}", self.active_document_id);
12311231
return HashSet::new();
@@ -1267,7 +1267,8 @@ impl PortfolioMessageHandler {
12671267
.viewport_loaded_thumbnail_position(&input_connector, graph_wire_style, &document.breadcrumb_network_path)
12681268
{
12691269
log::debug!("viewport position: {:?}, input: {:?}", viewport_position, input_connector);
1270-
let in_view = viewport_position.x < 0.0 || viewport_position.y < 0.0 || viewport_position.x > viewport_size.x || viewport_position.y > viewport_size.y;
1270+
1271+
let in_view = viewport_position.x > 0.0 && viewport_position.y > 0.0 && viewport_position.x < ipp.viewport_bounds()[1].x && viewport_position.y < ipp.viewport_bounds()[1].y;
12711272
if in_view {
12721273
let Some(protonode) = document.network_interface.protonode_from_input(&input_connector, &document.breadcrumb_network_path) else {
12731274
// The input is not connected to the export, which occurs if inside a disconnected node
@@ -1282,21 +1283,27 @@ impl PortfolioMessageHandler {
12821283
};
12831284

12841285
// Get thumbnails for all visible layer
1285-
for visible_node in &document.node_graph_handler.frontend_nodes {
1286+
for visible_node in &document.node_graph_handler.visible_nodes(&mut document.network_interface, &document.breadcrumb_network_path, ipp) {
12861287
if document.network_interface.is_layer(&visible_node, &document.breadcrumb_network_path) {
1287-
log::debug!("visible_node: {:?}", visible_node);
12881288
let Some(protonode) = document
12891289
.network_interface
1290-
.protonode_from_output(&OutputConnector::node(*visible_node, 1), &document.breadcrumb_network_path)
1290+
.protonode_from_output(&OutputConnector::node(*visible_node, 0), &document.breadcrumb_network_path)
12911291
else {
12921292
continue;
12931293
};
12941294
nodes_to_render.insert(protonode);
12951295
}
12961296
}
12971297

1298-
// Get all protonodes for all connected side layer inputs connected to the export in the document network
1298+
// Get all protonodes for all connected side layer inputs visible in the layer panel
12991299
for layer in document.network_interface.document_metadata().all_layers() {
1300+
if layer
1301+
.ancestors(document.network_interface.document_metadata())
1302+
.skip(1)
1303+
.any(|ancestor| document.collapsed.0.contains(&ancestor))
1304+
{
1305+
continue;
1306+
};
13001307
let connector = InputConnector::Node {
13011308
node_id: layer.to_node(),
13021309
input_index: 1,

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,8 @@ impl BorrowTree {
419419
let nullify_when_calling = node_construction_args.context_dependencies.inverse();
420420

421421
let cached_protonode = if let Some(cache_constructor) = typing_context.cache_constructor(&types.return_value.nested_type()) {
422-
let cache = cache_constructor(protonode, MonitorMemoNodeState::Disabled);
422+
// Every cache stores its first evaluation, because if it acts as a pass through on the first evaluation, it can become cached and it wont be possible to know its value for its thumbnail
423+
let cache = cache_constructor(protonode, MonitorMemoNodeState::StoreFirstEvaluation);
423424
let cache_node_container = NodeContainer::new(cache);
424425
if node_construction_args.cache_output {
425426
cache_node_container.permanently_enable_cache();

0 commit comments

Comments
 (0)