[Bf-blender-cvs] [fe3f05bbe7e] temp-link-portals: initial link portals

Jacques Lucke noreply at git.blender.org
Mon Nov 8 18:48:48 CET 2021


Commit: fe3f05bbe7e83f3e262f02194d978396bd8c2c18
Author: Jacques Lucke
Date:   Mon Nov 8 16:31:18 2021 +0100
Branches: temp-link-portals
https://developer.blender.org/rBfe3f05bbe7e83f3e262f02194d978396bd8c2c18

initial link portals

===================================================================

M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/node.cc
M	source/blender/editors/space_node/drawnode.cc
M	source/blender/editors/space_node/node_edit.cc
M	source/blender/editors/space_node/node_intern.h
M	source/blender/editors/space_node/node_ops.c
M	source/blender/editors/space_node/node_relationships.cc
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/makesrna/intern/rna_nodetree.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 645b4410623..fb5db6fdf90 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -676,6 +676,7 @@ void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
 void nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
 void nodeMuteLinkToggle(struct bNodeTree *ntree, struct bNodeLink *link);
 bool nodeLinkIsHidden(const struct bNodeLink *link);
+bool nodeLinkIsPortal(const struct bNodeLink *link);
 void nodeInternalRelink(struct bNodeTree *ntree, struct bNode *node);
 
 void nodeToView(const struct bNode *node, float x, float y, float *rx, float *ry);
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index eb2b125e7e6..8abd61f8bf8 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -2590,6 +2590,11 @@ bool nodeLinkIsHidden(const bNodeLink *link)
   return nodeSocketIsHidden(link->fromsock) || nodeSocketIsHidden(link->tosock);
 }
 
+bool nodeLinkIsPortal(const bNodeLink *link)
+{
+  return link->flag & NODE_LINK_PORTAL;
+}
+
 /* Adjust the indices of links connected to the given multi input socket after deleting the link at
  * `deleted_index`. This function also works if the link has not yet been deleted. */
 static void adjust_multi_input_indices_after_removed_link(bNodeTree *ntree,
diff --git a/source/blender/editors/space_node/drawnode.cc b/source/blender/editors/space_node/drawnode.cc
index fe866a81f67..07a70d5d8da 100644
--- a/source/blender/editors/space_node/drawnode.cc
+++ b/source/blender/editors/space_node/drawnode.cc
@@ -4352,6 +4352,11 @@ void node_draw_link_bezier(const bContext *C,
       }
     }
 
+    if (link->flag & NODE_LINK_PORTAL) {
+      copy_v4_fl4(colors[1], 1, 1, 1, 0.3);
+      copy_v4_fl4(colors[2], 1, 1, 1, 0.3);
+    }
+
     if (g_batch_link.enabled && !highlighted) {
       /* Add link to batch. */
       nodelink_batch_add_link(snode,
diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/editors/space_node/node_edit.cc
index 030d1672a08..fb40867843a 100644
--- a/source/blender/editors/space_node/node_edit.cc
+++ b/source/blender/editors/space_node/node_edit.cc
@@ -1279,7 +1279,20 @@ float node_link_dim_factor(const View2D *v2d, const bNodeLink *link)
 
 bool node_link_is_hidden_or_dimmed(const View2D *v2d, const bNodeLink *link)
 {
-  return nodeLinkIsHidden(link) || node_link_dim_factor(v2d, link) < 0.5f;
+  if (nodeLinkIsHidden(link)) {
+    return true;
+  }
+  if (node_link_dim_factor(v2d, link) < 0.5f) {
+    return true;
+  }
+  if (nodeLinkIsPortal(link)) {
+    if ((link->fromnode == nullptr || (link->fromnode->flag & NODE_SELECT) == 0) &&
+        (link->tonode == nullptr || (link->tonode->flag & NODE_SELECT) == 0)) {
+      /* Portal is shown when node is selected. */
+      return true;
+    }
+  }
+  return false;
 }
 
 /* ****************** Duplicate *********************** */
diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h
index 383fe5afdf9..09071428a84 100644
--- a/source/blender/editors/space_node/node_intern.h
+++ b/source/blender/editors/space_node/node_intern.h
@@ -243,6 +243,7 @@ void NODE_OT_link_make(struct wmOperatorType *ot);
 void NODE_OT_links_cut(struct wmOperatorType *ot);
 void NODE_OT_links_detach(struct wmOperatorType *ot);
 void NODE_OT_links_mute(struct wmOperatorType *ot);
+void NODE_OT_make_link_portals(struct wmOperatorType *ot);
 
 void NODE_OT_parent_set(struct wmOperatorType *ot);
 void NODE_OT_join(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c
index 0c54da65e9c..36ca592eb80 100644
--- a/source/blender/editors/space_node/node_ops.c
+++ b/source/blender/editors/space_node/node_ops.c
@@ -70,6 +70,7 @@ void node_operatortypes(void)
   WM_operatortype_append(NODE_OT_links_cut);
   WM_operatortype_append(NODE_OT_links_detach);
   WM_operatortype_append(NODE_OT_links_mute);
+  WM_operatortype_append(NODE_OT_make_link_portals);
   WM_operatortype_append(NODE_OT_add_reroute);
 
   WM_operatortype_append(NODE_OT_group_make);
diff --git a/source/blender/editors/space_node/node_relationships.cc b/source/blender/editors/space_node/node_relationships.cc
index 55b547d3195..14a0941bd2e 100644
--- a/source/blender/editors/space_node/node_relationships.cc
+++ b/source/blender/editors/space_node/node_relationships.cc
@@ -1678,6 +1678,87 @@ void NODE_OT_links_mute(wmOperatorType *ot)
 
 /** \} */
 
+/* -------------------------------------------------------------------- */
+/** \name Make Portal Links Operator
+ * \{ */
+
+static int make_link_portals_exec(bContext *C, wmOperator *op)
+{
+  Main *bmain = CTX_data_main(C);
+  SpaceNode *snode = CTX_wm_space_node(C);
+  ARegion *region = CTX_wm_region(C);
+
+  int tot_coords = 0;
+  float coords[256][2];
+  RNA_BEGIN (op->ptr, itemptr, "path") {
+    float loc[2];
+
+    RNA_float_get_array(&itemptr, "loc", loc);
+    UI_view2d_region_to_view(
+        &region->v2d, (int)loc[0], (int)loc[1], &coords[tot_coords][0], &coords[tot_coords][1]);
+    tot_coords++;
+    if (tot_coords >= 256) {
+      break;
+    }
+  }
+  RNA_END;
+
+  if (tot_coords == 0) {
+    return OPERATOR_CANCELLED;
+  }
+
+  ED_preview_kill_jobs(CTX_wm_manager(C), bmain);
+
+  bool changed_link = false;
+  LISTBASE_FOREACH (bNodeLink *, link, &snode->edittree->links) {
+    if (node_link_is_hidden_or_dimmed(&region->v2d, link)) {
+      continue;
+    }
+    if (node_links_intersect(link, coords, tot_coords)) {
+      if (link->flag & NODE_LINK_PORTAL) {
+        link->flag &= ~NODE_LINK_PORTAL;
+      }
+      else {
+        link->flag |= NODE_LINK_PORTAL;
+      }
+      changed_link = true;
+    }
+  }
+
+  if (!changed_link) {
+    return OPERATOR_CANCELLED;
+  }
+  snode_notify(C, snode);
+  return OPERATOR_FINISHED;
+}
+
+void NODE_OT_make_link_portals(wmOperatorType *ot)
+{
+  ot->name = "Make Link Portals";
+  ot->idname = "NODE_OT_make_link_portals";
+  ot->description = "Use the mouse to create portals from existing links";
+
+  ot->invoke = WM_gesture_lines_invoke;
+  ot->modal = WM_gesture_lines_modal;
+  ot->exec = make_link_portals_exec;
+  ot->cancel = WM_gesture_lines_cancel;
+
+  ot->poll = ED_operator_node_editable;
+
+  /* flags */
+  ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_DEPENDS_ON_CURSOR;
+
+  /* properties */
+  PropertyRNA *prop;
+  prop = RNA_def_collection_runtime(ot->srna, "path", &RNA_OperatorMousePath, "Path", "");
+  RNA_def_property_flag(prop, (PropertyFlag)(PROP_HIDDEN | PROP_SKIP_SAVE));
+
+  /* internal */
+  RNA_def_int(ot->srna, "cursor", WM_CURSOR_MUTE, 0, INT_MAX, "Cursor", "", 0, INT_MAX);
+}
+
+/** \} */
+
 /* -------------------------------------------------------------------- */
 /** \name Detach Links Operator
  * \{ */
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index cfe34d83586..b8146e46ddb 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -459,6 +459,7 @@ typedef struct bNodeLink {
 #define NODE_LINK_TEMP_HIGHLIGHT (1 << 3) /* Link is highlighted for picking. */
 #define NODE_LINK_MUTED (1 << 4)          /* Link is muted. */
 #define NODE_LINK_DRAGGED (1 << 5)        /* Node link is being dragged by the user. */
+#define NODE_LINK_PORTAL (1 << 6)
 
 /* tree->edit_quality/tree->render_quality */
 #define NTREE_QUALITY_HIGH 0
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 53b3f07dbbc..1e12df224f1 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -12566,6 +12566,11 @@ static void rna_def_node_link(BlenderRNA *brna)
   RNA_def_struct_ui_text(srna, "Muted", "Link is muted and can be ignored");
   RNA_def_property_update(prop, NC_NODE | NA_EDITED, NULL);
 
+  prop = RNA_def_property(srna, "is_portal", PROP_BOOLEAN, PROP_NONE);
+  RNA_def_property_boolean_sdna(prop, NULL, "flag", NODE_LINK_PORTAL);
+  RNA_def_struct_ui_text(srna, "Portal", "Link is portal and is displayed differently");
+  RNA_def_property_update(prop, NC_NODE | NA_EDITED, NULL);
+
   prop = RNA_def_property(srna, "from_node", PROP_POINTER, PROP_NONE);
   RNA_def_property_pointer_sdna(prop, NULL, "fromnode");
   RNA_def_property_struct_type(prop, "Node");



More information about the Bf-blender-cvs mailing list