GraphiteEditor / Graphite

2D vector & raster editor that melds traditional layers & tools with a modern node-based, non-destructive, procedural workflow.
https://graphite.rs
Apache License 2.0
7.29k stars 385 forks source link

BorrowTree inconsistency when closing and opening document #1756

Closed adamgerhant closed 1 month ago

adamgerhant commented 1 month ago

When closing a newly created blank document and then creating another new document, the BorrowTree in the DynamicExecutor is not the same as the first, even though both node networks are the same. Blocks #1750

How to reproduce:

Borrow tree from new document after refreshing (Artboard node id 17505474457066797865)

tree.inputs_source_map(): [(Source { node: [], index: 0 }, (NodeId(1776386397), 2)), (Source { node: [NodeId(0)], index: 0 }, (NodeId(209454463), 1)), (Source { node: [NodeId(0), NodeId(0)], index: 0 }, (NodeId(209454463), 0)), (Source { node: [NodeId(0), NodeId(1)], index: 0 }, (NodeId(1553787294), 0)), (Source { node: [NodeId(0), NodeId(2)], index: 0 }, (NodeId(766666474), 1)), (Source { node: [NodeId(0), NodeId(3)], index: 0 }, (NodeId(209454463), 0)), (Source { node: [NodeId(0), NodeId(3)], index: 1 }, (NodeId(209454463), 2)), (Source { node: [NodeId(17505474457066797865)], index: 1 }, (NodeId(2719152001), 1)), (Source { node: [NodeId(17505474457066797865)], index: 2 }, (NodeId(2719152001), 5)), (Source { node: [NodeId(17505474457066797865)], index: 0 }, (NodeId(2290264875), 2)), (Source { node: [NodeId(17505474457066797865), NodeId(0)], index: 0 }, (NodeId(2719152001), 5)), (Source { node: [NodeId(17505474457066797865), NodeId(1)], index: 0 }, (NodeId(4128425038), 1)), (Source { node: [NodeId(17505474457066797865), NodeId(2)], index: 1 }, (NodeId(2290264875), 2)), (Source { node: [NodeId(17505474457066797865), NodeId(2)], index: 0 }, (NodeId(2290264875), 1)), (Source { node: [NodeId(17505474457066797865), NodeId(536129167933390016)], index: 0 }, (NodeId(1627101688), 0)), (Source { node: [NodeId(17505474457066797865), NodeId(536129167933390016)], index: 1 }, (NodeId(1627101688), 1)), (Source { node: [NodeId(17505474457066797865), NodeId(6416337593867558447)], index: 0 }, (NodeId(165319789), 0)), (Source { node: [NodeId(17505474457066797865), NodeId(6416337593867558447)], index: 1 }, (NodeId(165319789), 1)), (Source { node: [NodeId(17505474457066797865), NodeId(6825362522106989504)], index: 0 }, (NodeId(4255178570), 0)), (Source { node: [NodeId(17505474457066797865), NodeId(6825362522106989504)], index: 1 }, (NodeId(4255178570), 1)), (Source { node: [NodeId(17505474457066797865), NodeId(7832534103926174319)], index: 0 }, (NodeId(2542087029), 0)), (Source { node: [NodeId(17505474457066797865), NodeId(7832534103926174319)], index: 1 }, (NodeId(2542087029), 1)), (Source { node: [NodeId(17505474457066797865), NodeId(8298558591740644999)], index: 1 }, (NodeId(1175147230), 1)), (Source { node: [NodeId(17505474457066797865), NodeId(8298558591740644999)], index: 0 }, (NodeId(1175147230), 0)), (Source { node: [NodeId(17505474457066797865), NodeId(12089252423572272489)], index: 1 }, (NodeId(2801556587), 1)), (Source { node: [NodeId(17505474457066797865), NodeId(12089252423572272489)], index: 0 }, (NodeId(2801556587), 0))]

Borrow tree after refreshing (Artboard node id 648511539128895861)

tree.inputs_source_map(): [(Source { node: [], index: 0 }, (NodeId(187226068), 2)), (Source { node: [NodeId(0)], index: 0 }, (NodeId(2443952850), 1)), (Source { node: [NodeId(0), NodeId(0)], index: 0 }, (NodeId(2443952850), 0)), (Source { node: [NodeId(0), NodeId(1)], index: 0 }, (NodeId(1553787294), 0)), (Source { node: [NodeId(0), NodeId(2)], index: 0 }, (NodeId(766666474), 1)), (Source { node: [NodeId(0), NodeId(3)], index: 0 }, (NodeId(2443952850), 0)), (Source { node: [NodeId(0), NodeId(3)], index: 1 }, (NodeId(2443952850), 2)), (Source { node: [NodeId(648511539128895861)], index: 0 }, (NodeId(271972563), 2)), (Source { node: [NodeId(648511539128895861), NodeId(1)], index: 0 }, (NodeId(3802644005), 1)), (Source { node: [NodeId(648511539128895861), NodeId(2)], index: 1 }, (NodeId(271972563), 2)), (Source { node: [NodeId(648511539128895861), NodeId(2)], index: 0 }, (NodeId(271972563), 1)), (Source { node: [NodeId(17505474457066797865)], index: 2 }, (NodeId(2719152001), 5)), (Source { node: [NodeId(17505474457066797865)], index: 1 }, (NodeId(2719152001), 1)), (Source { node: [NodeId(17505474457066797865), NodeId(0)], index: 0 }, (NodeId(2719152001), 5)), (Source { node: [NodeId(17505474457066797865), NodeId(536129167933390016)], index: 0 }, (NodeId(1627101688), 0)), (Source { node: [NodeId(17505474457066797865), NodeId(536129167933390016)], index: 1 }, (NodeId(1627101688), 1)), (Source { node: [NodeId(17505474457066797865), NodeId(6416337593867558447)], index: 0 }, (NodeId(165319789), 0)), (Source { node: [NodeId(17505474457066797865), NodeId(6416337593867558447)], index: 1 }, (NodeId(165319789), 1)), (Source { node: [NodeId(17505474457066797865), NodeId(6825362522106989504)], index: 0 }, (NodeId(4255178570), 0)), (Source { node: [NodeId(17505474457066797865), NodeId(6825362522106989504)], index: 1 }, (NodeId(4255178570), 1)), (Source { node: [NodeId(17505474457066797865), NodeId(7832534103926174319)], index: 1 }, (NodeId(2542087029), 1)), (Source { node: [NodeId(17505474457066797865), NodeId(7832534103926174319)], index: 0 }, (NodeId(2542087029), 0)), (Source { node: [NodeId(17505474457066797865), NodeId(8298558591740644999)], index: 1 }, (NodeId(1175147230), 1)), (Source { node: [NodeId(17505474457066797865), NodeId(8298558591740644999)], index: 0 }, (NodeId(1175147230), 0)), (Source { node: [NodeId(17505474457066797865), NodeId(12089252423572272489)], index: 1 }, (NodeId(2801556587), 1)), (Source { node: [NodeId(17505474457066797865), NodeId(12089252423572272489)], index: 0 }, (NodeId(2801556587), 0))]

In the first borrow tree, all the sources are added properly. For example, the artboard node has sources for all inputs

(Source { node: [NodeId(17505474457066797865)], index: 1 }, (NodeId(2719152001), 1)), (Source { node: [NodeId(17505474457066797865)], index: 2 }, (NodeId(2719152001), 5)), (Source { node: [NodeId(17505474457066797865)], index: 0 }

However, in the second borrow tree, only the source for the first input is added.

Source { node: [NodeId(648511539128895861)], index: 0 }, (NodeId(271972563), 2)),

In fact, the second tree just has a total of 4 sources for the artboard node and its entire nested network, while the first tree has sources for every artboard node input and nested network input. Another observation is that the second inputs source map retains all the sources from the previous document (artboard id 17505474457066797865). It seems that the root issue is that the borrow tree is not being reset when changing networks. This means the nodes are being preserved, so nodes in the protonetwork for the new document are being skipped here:

if !self.nodes.contains_key(&id) {
    self.push_node(id, node, typing_context).await?;
}

I think a solution could be to reset the borrow tree when switching documents, but I'm not sure what other effects this would have.