Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_node/node_group.cc
| Show First 20 Lines • Show All 1,088 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| /** \} */ | /** \} */ | ||||
| /* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
| /** \name Group Insert Operator | /** \name Group Insert Operator | ||||
| * \{ */ | * \{ */ | ||||
| static bool node_tree_contains_tree_recursive(const bNodeTree &ntree_to_search_in, | |||||
| const bNodeTree &ntree_to_search_for) | |||||
| { | |||||
| if (&ntree_to_search_in == &ntree_to_search_for) { | |||||
| return true; | |||||
| } | |||||
| ntree_to_search_in.ensure_topology_cache(); | |||||
| for (const bNode *node : ntree_to_search_in.group_nodes()) { | |||||
| if (node->id) { | |||||
| if (node_tree_contains_tree_recursive(*reinterpret_cast<bNodeTree *>(node->id), | |||||
| ntree_to_search_for)) { | |||||
| return true; | |||||
| } | |||||
| } | |||||
| } | |||||
| return false; | |||||
| } | |||||
| static int node_group_insert_exec(bContext *C, wmOperator *op) | static int node_group_insert_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; | ||||
| const char *node_idname = node_group_idname(C); | const char *node_idname = node_group_idname(C); | ||||
| ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C)); | ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C)); | ||||
| bNode *gnode = node_group_get_active(C, node_idname); | bNode *gnode = node_group_get_active(C, node_idname); | ||||
| if (!gnode || !gnode->id) { | if (!gnode || !gnode->id) { | ||||
| return OPERATOR_CANCELLED; | return OPERATOR_CANCELLED; | ||||
| } | } | ||||
| bNodeTree *ngroup = reinterpret_cast<bNodeTree *>(gnode->id); | bNodeTree *ngroup = reinterpret_cast<bNodeTree *>(gnode->id); | ||||
| VectorSet<bNode *> nodes_to_group = get_nodes_to_group(*ntree, gnode); | VectorSet<bNode *> nodes_to_group = get_nodes_to_group(*ntree, gnode); | ||||
| /* Make sure that there won't be a node group containing itself afterwards. */ | /* Make sure that there won't be a node group containing itself afterwards. */ | ||||
| for (const bNode *group : nodes_to_group) { | for (const bNode *group : nodes_to_group) { | ||||
| if (!group->is_group() || group->id == nullptr) { | if (!group->is_group() || group->id == nullptr) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| if (node_tree_contains_tree_recursive(*reinterpret_cast<bNodeTree *>(group->id), *ngroup)) { | if (ntreeContainsTree(reinterpret_cast<bNodeTree *>(group->id), ngroup)) { | ||||
| BKE_reportf( | BKE_reportf( | ||||
| op->reports, RPT_WARNING, "Can not insert group '%s' in '%s'", group->name, gnode->name); | op->reports, RPT_WARNING, "Can not insert group '%s' in '%s'", group->name, gnode->name); | ||||
| return OPERATOR_CANCELLED; | return OPERATOR_CANCELLED; | ||||
| } | } | ||||
| } | } | ||||
| if (!node_group_make_test_selected(*ntree, nodes_to_group, ngroup->idname, *op->reports)) { | if (!node_group_make_test_selected(*ntree, nodes_to_group, ngroup->idname, *op->reports)) { | ||||
| return OPERATOR_CANCELLED; | return OPERATOR_CANCELLED; | ||||
| Show All 28 Lines | |||||