Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_node/node_relationships.cc
| Show First 20 Lines • Show All 992 Lines • ▼ Show 20 Lines | |||||
| }; | }; | ||||
| static void node_join_attach_recursive(bNodeTree &ntree, | static void node_join_attach_recursive(bNodeTree &ntree, | ||||
| MutableSpan<NodeJoinState> join_states, | MutableSpan<NodeJoinState> join_states, | ||||
| bNode *node, | bNode *node, | ||||
| bNode *frame, | bNode *frame, | ||||
| const VectorSet<bNode *> &selected_nodes) | const VectorSet<bNode *> &selected_nodes) | ||||
| { | { | ||||
| join_states[node->runtime->index_in_tree].done = true; | join_states[node->index()].done = true; | ||||
| if (node == frame) { | if (node == frame) { | ||||
| join_states[node->runtime->index_in_tree].descendent = true; | join_states[node->index()].descendent = true; | ||||
| } | } | ||||
| else if (node->parent) { | else if (node->parent) { | ||||
| /* call recursively */ | /* call recursively */ | ||||
| if (!join_states[node->parent->runtime->index_in_tree].done) { | if (!join_states[node->parent->index()].done) { | ||||
| node_join_attach_recursive(ntree, join_states, node->parent, frame, selected_nodes); | node_join_attach_recursive(ntree, join_states, node->parent, frame, selected_nodes); | ||||
| } | } | ||||
| /* in any case: if the parent is a descendant, so is the child */ | /* in any case: if the parent is a descendant, so is the child */ | ||||
| if (join_states[node->parent->runtime->index_in_tree].descendent) { | if (join_states[node->parent->index()].descendent) { | ||||
| join_states[node->runtime->index_in_tree].descendent = true; | join_states[node->index()].descendent = true; | ||||
| } | } | ||||
| else if (selected_nodes.contains(node)) { | else if (selected_nodes.contains(node)) { | ||||
| /* if parent is not an descendant of the frame, reattach the node */ | /* if parent is not an descendant of the frame, reattach the node */ | ||||
| nodeDetachNode(&ntree, node); | nodeDetachNode(&ntree, node); | ||||
| nodeAttachNode(&ntree, node, frame); | nodeAttachNode(&ntree, node, frame); | ||||
| join_states[node->runtime->index_in_tree].descendent = true; | join_states[node->index()].descendent = true; | ||||
| } | } | ||||
| } | } | ||||
| else if (selected_nodes.contains(node)) { | else if (selected_nodes.contains(node)) { | ||||
| nodeAttachNode(&ntree, node, frame); | nodeAttachNode(&ntree, node, frame); | ||||
| join_states[node->runtime->index_in_tree].descendent = true; | join_states[node->index()].descendent = true; | ||||
| } | } | ||||
| } | } | ||||
| static int node_join_exec(bContext *C, wmOperator * /*op*/) | static int node_join_exec(bContext *C, wmOperator * /*op*/) | ||||
| { | { | ||||
| Main &bmain = *CTX_data_main(C); | Main &bmain = *CTX_data_main(C); | ||||
| SpaceNode &snode = *CTX_wm_space_node(C); | SpaceNode &snode = *CTX_wm_space_node(C); | ||||
| bNodeTree &ntree = *snode.edittree; | bNodeTree &ntree = *snode.edittree; | ||||
| const VectorSet<bNode *> selected_nodes = get_selected_nodes(ntree); | const VectorSet<bNode *> selected_nodes = get_selected_nodes(ntree); | ||||
| bNode *frame_node = nodeAddStaticNode(C, &ntree, NODE_FRAME); | bNode *frame_node = nodeAddStaticNode(C, &ntree, NODE_FRAME); | ||||
| nodeSetActive(&ntree, frame_node); | nodeSetActive(&ntree, frame_node); | ||||
| ntree.ensure_topology_cache(); | ntree.ensure_topology_cache(); | ||||
| Array<NodeJoinState> join_states(ntree.all_nodes().size(), NodeJoinState{false, false}); | Array<NodeJoinState> join_states(ntree.all_nodes().size(), NodeJoinState{false, false}); | ||||
| for (bNode *node : ntree.all_nodes()) { | for (bNode *node : ntree.all_nodes()) { | ||||
| if (!join_states[node->runtime->index_in_tree].done) { | if (!join_states[node->index()].done) { | ||||
| node_join_attach_recursive(ntree, join_states, node, frame_node, selected_nodes); | node_join_attach_recursive(ntree, join_states, node, frame_node, selected_nodes); | ||||
| } | } | ||||
| } | } | ||||
| node_sort(ntree); | node_sort(ntree); | ||||
| ED_node_tree_propagate_change(C, &bmain, snode.edittree); | ED_node_tree_propagate_change(C, &bmain, snode.edittree); | ||||
| WM_event_add_notifier(C, NC_NODE | ND_DISPLAY, nullptr); | WM_event_add_notifier(C, NC_NODE | ND_DISPLAY, nullptr); | ||||
| ▲ Show 20 Lines • Show All 116 Lines • ▼ Show 20 Lines | |||||
| bool done; | bool done; | ||||
| bool descendent; | bool descendent; | ||||
| }; | }; | ||||
| static void node_detach_recursive(bNodeTree &ntree, | static void node_detach_recursive(bNodeTree &ntree, | ||||
| MutableSpan<NodeDetachstate> detach_states, | MutableSpan<NodeDetachstate> detach_states, | ||||
| bNode *node) | bNode *node) | ||||
| { | { | ||||
| detach_states[node->runtime->index_in_tree].done = true; | detach_states[node->index()].done = true; | ||||
| if (node->parent) { | if (node->parent) { | ||||
| /* call recursively */ | /* call recursively */ | ||||
| if (!detach_states[node->parent->runtime->index_in_tree].done) { | if (!detach_states[node->parent->index()].done) { | ||||
| node_detach_recursive(ntree, detach_states, node->parent); | node_detach_recursive(ntree, detach_states, node->parent); | ||||
| } | } | ||||
| /* in any case: if the parent is a descendant, so is the child */ | /* in any case: if the parent is a descendant, so is the child */ | ||||
| if (detach_states[node->parent->runtime->index_in_tree].descendent) { | if (detach_states[node->parent->index()].descendent) { | ||||
| detach_states[node->runtime->index_in_tree].descendent = true; | detach_states[node->index()].descendent = true; | ||||
| } | } | ||||
| else if (node->flag & NODE_SELECT) { | else if (node->flag & NODE_SELECT) { | ||||
| /* if parent is not a descendant of a selected node, detach */ | /* if parent is not a descendant of a selected node, detach */ | ||||
| nodeDetachNode(&ntree, node); | nodeDetachNode(&ntree, node); | ||||
| detach_states[node->runtime->index_in_tree].descendent = true; | detach_states[node->index()].descendent = true; | ||||
| } | } | ||||
| } | } | ||||
| else if (node->flag & NODE_SELECT) { | else if (node->flag & NODE_SELECT) { | ||||
| detach_states[node->runtime->index_in_tree].descendent = true; | detach_states[node->index()].descendent = true; | ||||
| } | } | ||||
| } | } | ||||
| /* detach the root nodes in the current selection */ | /* detach the root nodes in the current selection */ | ||||
| static int node_detach_exec(bContext *C, wmOperator * /*op*/) | static int node_detach_exec(bContext *C, wmOperator * /*op*/) | ||||
| { | { | ||||
| SpaceNode &snode = *CTX_wm_space_node(C); | SpaceNode &snode = *CTX_wm_space_node(C); | ||||
| bNodeTree &ntree = *snode.edittree; | bNodeTree &ntree = *snode.edittree; | ||||
| Array<NodeDetachstate> detach_states(ntree.all_nodes().size(), NodeDetachstate{false, false}); | Array<NodeDetachstate> detach_states(ntree.all_nodes().size(), NodeDetachstate{false, false}); | ||||
| /* detach nodes recursively | /* detach nodes recursively | ||||
| * relative order is preserved here! | * relative order is preserved here! | ||||
| */ | */ | ||||
| for (bNode *node : ntree.all_nodes()) { | for (bNode *node : ntree.all_nodes()) { | ||||
| if (!detach_states[node->runtime->index_in_tree].done) { | if (!detach_states[node->index()].done) { | ||||
| node_detach_recursive(ntree, detach_states, node); | node_detach_recursive(ntree, detach_states, node); | ||||
| } | } | ||||
| } | } | ||||
| node_sort(ntree); | node_sort(ntree); | ||||
| WM_event_add_notifier(C, NC_NODE | ND_DISPLAY, nullptr); | WM_event_add_notifier(C, NC_NODE | ND_DISPLAY, nullptr); | ||||
| return OPERATOR_FINISHED; | return OPERATOR_FINISHED; | ||||
| ▲ Show 20 Lines • Show All 608 Lines • Show Last 20 Lines | |||||