[Bf-blender-cvs] [97defd9cd79] master: Cryptomatte: Show Name of Object/Material Under The Cursor.

Jeroen Bakker noreply at git.blender.org
Wed Mar 17 08:59:38 CET 2021


Commit: 97defd9cd79b6e3ed0e52481a7078107dbe0522b
Author: Jeroen Bakker
Date:   Wed Mar 17 08:48:05 2021 +0100
Branches: master
https://developer.blender.org/rB97defd9cd79b6e3ed0e52481a7078107dbe0522b

Cryptomatte: Show Name of Object/Material Under The Cursor.

This change shows the object or material name with the cursor when picking for a cryptomatte node.

Reviewed By: Julian Eisel

Differential Revision: https://developer.blender.org/D10705

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

M	release/datafiles/locale
M	release/scripts/addons
M	source/blender/blenkernel/BKE_node.h
M	source/blender/editors/interface/interface_eyedropper.c
M	source/blender/editors/interface/interface_eyedropper_color.c
M	source/blender/editors/interface/interface_eyedropper_datablock.c
M	source/blender/editors/interface/interface_eyedropper_depth.c
M	source/blender/editors/interface/interface_eyedropper_intern.h
M	source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc

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

diff --git a/release/datafiles/locale b/release/datafiles/locale
index b06e7fe345e..ef74c1b861a 160000
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@ -1 +1 @@
-Subproject commit b06e7fe345e4a313eb701692e5d45033131caee1
+Subproject commit ef74c1b861a1b05c2483a2c045a6380704167491
diff --git a/release/scripts/addons b/release/scripts/addons
index ef3104dae30..6dfba915743 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit ef3104dae302dcfb08b21e32d10b548bf304bd29
+Subproject commit 6dfba915743b67aff99ddcc19c0807d339a87c96
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index f5c617c1d04..ced76e65ada 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1289,10 +1289,11 @@ void ntreeCompositCryptomatteSyncFromRemove(bNode *node);
 bNodeSocket *ntreeCompositCryptomatteAddSocket(bNodeTree *ntree, bNode *node);
 int ntreeCompositCryptomatteRemoveSocket(bNodeTree *ntree, bNode *node);
 void ntreeCompositCryptomatteLayerPrefix(const bNode *node, char *r_prefix, size_t prefix_len);
-
 /* Update the runtime layer names with the cryptomatte layer names of the references
  * render layer or image. */
 void ntreeCompositCryptomatteUpdateLayerNames(bNode *node);
+struct CryptomatteSession *ntreeCompositCryptomatteSession(bNode *node);
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
diff --git a/source/blender/editors/interface/interface_eyedropper.c b/source/blender/editors/interface/interface_eyedropper.c
index de39484bc1e..fb8d32b3b84 100644
--- a/source/blender/editors/interface/interface_eyedropper.c
+++ b/source/blender/editors/interface/interface_eyedropper.c
@@ -103,26 +103,41 @@ wmKeyMap *eyedropper_colorband_modal_keymap(wmKeyConfig *keyconf)
  */
 /** \name Generic Shared Functions
  * \{ */
-
-void eyedropper_draw_cursor_text(const struct bContext *C, const ARegion *region, const char *name)
+static void eyedropper_draw_cursor_text_ex(const int x, const int y, const char *name)
 {
   const uiFontStyle *fstyle = UI_FSTYLE_WIDGET;
-  wmWindow *win = CTX_wm_window(C);
-  int x = win->eventstate->x;
-  int y = win->eventstate->y;
+
   const float col_fg[4] = {1.0f, 1.0f, 1.0f, 1.0f};
   const float col_bg[4] = {0.0f, 0.0f, 0.0f, 0.2f};
 
-  if ((name[0] == '\0') || (BLI_rcti_isect_pt(&region->winrct, x, y) == false)) {
+  UI_fontstyle_draw_simple_backdrop(fstyle, x, y + U.widget_unit, name, col_fg, col_bg);
+}
+
+void eyedropper_draw_cursor_text_window(const struct wmWindow *window, const char *name)
+{
+  if (name[0] == '\0') {
     return;
   }
 
-  x = x - region->winrct.xmin;
-  y = y - region->winrct.ymin;
+  const int x = window->eventstate->x;
+  const int y = window->eventstate->y;
 
-  y += U.widget_unit;
+  eyedropper_draw_cursor_text_ex(x, y, name);
+}
+
+void eyedropper_draw_cursor_text_region(const struct bContext *C,
+                                        const ARegion *region,
+                                        const char *name)
+{
+  wmWindow *win = CTX_wm_window(C);
+  const int x = win->eventstate->x - region->winrct.xmin;
+  const int y = win->eventstate->y - region->winrct.ymin;
+
+  if ((name[0] == '\0') || (BLI_rcti_isect_pt(&region->winrct, x, y) == false)) {
+    return;
+  }
 
-  UI_fontstyle_draw_simple_backdrop(fstyle, x, y, name, col_fg, col_bg);
+  eyedropper_draw_cursor_text_ex(x, y, name);
 }
 
 /**
diff --git a/source/blender/editors/interface/interface_eyedropper_color.c b/source/blender/editors/interface/interface_eyedropper_color.c
index 349086132dc..4ae6f66281f 100644
--- a/source/blender/editors/interface/interface_eyedropper_color.c
+++ b/source/blender/editors/interface/interface_eyedropper_color.c
@@ -36,6 +36,7 @@
 #include "BLI_string.h"
 
 #include "BKE_context.h"
+#include "BKE_cryptomatte.h"
 #include "BKE_image.h"
 #include "BKE_main.h"
 #include "BKE_node.h"
@@ -58,6 +59,9 @@
 #include "ED_clip.h"
 #include "ED_image.h"
 #include "ED_node.h"
+#include "ED_screen.h"
+
+#include "RE_pipeline.h"
 
 #include "RE_pipeline.h"
 
@@ -78,9 +82,19 @@ typedef struct Eyedropper {
   float accum_col[3];
   int accum_tot;
 
+  void *draw_handle_sample_text;
+  char sample_text[MAX_NAME];
+
   bNode *crypto_node;
+  struct CryptomatteSession *cryptomatte_session;
 } Eyedropper;
 
+static void eyedropper_draw_cb(const wmWindow *window, void *arg)
+{
+  Eyedropper *eye = arg;
+  eyedropper_draw_cursor_text_window(window, eye->sample_text);
+}
+
 static bool eyedropper_init(bContext *C, wmOperator *op)
 {
   Eyedropper *eye = MEM_callocN(sizeof(Eyedropper), __func__);
@@ -104,6 +118,8 @@ static bool eyedropper_init(bContext *C, wmOperator *op)
   RNA_property_float_get_array(&eye->ptr, eye->prop, col);
   if (ELEM(eye->ptr.type, &RNA_CompositorNodeCryptomatteV2, &RNA_CompositorNodeCryptomatte)) {
     eye->crypto_node = (bNode *)eye->ptr.data;
+    eye->cryptomatte_session = ntreeCompositCryptomatteSession(eye->crypto_node);
+    eye->draw_handle_sample_text = WM_draw_cb_activate(CTX_wm_window(C), eyedropper_draw_cb, eye);
   }
   else {
     eye->crypto_node = NULL;
@@ -128,12 +144,21 @@ static bool eyedropper_init(bContext *C, wmOperator *op)
 
 static void eyedropper_exit(bContext *C, wmOperator *op)
 {
-  WM_cursor_modal_restore(CTX_wm_window(C));
+  Eyedropper *eye = op->customdata;
+  wmWindow *window = CTX_wm_window(C);
+  WM_cursor_modal_restore(window);
 
-  if (op->customdata) {
-    MEM_freeN(op->customdata);
-    op->customdata = NULL;
+  if (eye->draw_handle_sample_text) {
+    WM_draw_cb_exit(window, eye->draw_handle_sample_text);
+    eye->draw_handle_sample_text = NULL;
   }
+
+  if (eye->cryptomatte_session) {
+    BKE_cryptomatte_free(eye->cryptomatte_session);
+    eye->cryptomatte_session = NULL;
+  }
+
+  MEM_SAFE_FREE(op->customdata);
 }
 
 /* *** eyedropper_color_ helper functions *** */
@@ -416,6 +441,20 @@ static void eyedropper_color_sample(bContext *C, Eyedropper *eye, int mx, int my
   eyedropper_color_set(C, eye, accum_col);
 }
 
+static void eyedropper_color_sample_text_update(bContext *C, Eyedropper *eye, int mx, int my)
+{
+  float col[3];
+  eye->sample_text[0] = '\0';
+
+  if (eye->cryptomatte_session) {
+    if (eyedropper_cryptomatte_sample_fl(C, eye, mx, my, col)) {
+      BKE_cryptomatte_find_name(
+          eye->cryptomatte_session, col[0], eye->sample_text, sizeof(eye->sample_text));
+      eye->sample_text[sizeof(eye->sample_text) - 1] = '\0';
+    }
+  }
+}
+
 static void eyedropper_cancel(bContext *C, wmOperator *op)
 {
   Eyedropper *eye = op->customdata;
@@ -462,6 +501,11 @@ static int eyedropper_modal(bContext *C, wmOperator *op, const wmEvent *event)
       /* button is pressed so keep sampling */
       eyedropper_color_sample(C, eye, event->x, event->y);
     }
+
+    if (eye->draw_handle_sample_text) {
+      eyedropper_color_sample_text_update(C, eye, event->x, event->y);
+      ED_region_tag_redraw(CTX_wm_region(C));
+    }
   }
 
   return OPERATOR_RUNNING_MODAL;
diff --git a/source/blender/editors/interface/interface_eyedropper_datablock.c b/source/blender/editors/interface/interface_eyedropper_datablock.c
index 6a12f550d7c..8c605598cbc 100644
--- a/source/blender/editors/interface/interface_eyedropper_datablock.c
+++ b/source/blender/editors/interface/interface_eyedropper_datablock.c
@@ -77,7 +77,7 @@ typedef struct DataDropper {
 static void datadropper_draw_cb(const struct bContext *C, ARegion *region, void *arg)
 {
   DataDropper *ddr = arg;
-  eyedropper_draw_cursor_text(C, region, ddr->name);
+  eyedropper_draw_cursor_text_region(C, region, ddr->name);
 }
 
 static int datadropper_init(bContext *C, wmOperator *op)
diff --git a/source/blender/editors/interface/interface_eyedropper_depth.c b/source/blender/editors/interface/interface_eyedropper_depth.c
index a4adbef0b94..a64fad8c333 100644
--- a/source/blender/editors/interface/interface_eyedropper_depth.c
+++ b/source/blender/editors/interface/interface_eyedropper_depth.c
@@ -78,7 +78,7 @@ typedef struct DepthDropper {
 static void depthdropper_draw_cb(const struct bContext *C, ARegion *region, void *arg)
 {
   DepthDropper *ddr = arg;
-  eyedropper_draw_cursor_text(C, region, ddr->name);
+  eyedropper_draw_cursor_text_region(C, region, ddr->name);
 }
 
 static int depthdropper_init(bContext *C, wmOperator *op)
diff --git a/source/blender/editors/interface/interface_eyedropper_intern.h b/source/blender/editors/interface/interface_eyedropper_intern.h
index fd60dcb7c86..96a2c6ed111 100644
--- a/source/blender/editors/interface/interface_eyedropper_intern.h
+++ b/source/blender/editors/interface/interface_eyedropper_intern.h
@@ -23,9 +23,10 @@
 #pragma once
 
 /* interface_eyedropper.c */
-void eyedropper_draw_cursor_text(const struct bContext *C,
-                                 const struct ARegion *region,
-                                 const char *name);
+void eyedropper_draw_cursor_text_window(const struct wmWindow *window, const char *name);
+void eyedropper_draw_cursor_text_region(const struct bContext *C,
+                                        const struct ARegion *region,
+                                        const char *name);
 uiBut *eyedropper_get_property_button_under_mouse(bContext *C, const wmEvent *event);
 
 /* interface_eyedropper_color.c (expose for color-band picker) */
diff --git a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
index ae4d565b292..973864be7b3 100644
--- a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
@@ -216,6 +216,13 @@ void ntreeCompositCryptomatteLayerPrefix(const bNode *node, char *r_prefix, size
   BLI_strncpy(r_prefix, cstr, prefix_len);
 }
 
+CryptomatteSession *ntreeCompositCryptomatteSession(bNode *node)
+{
+  blender::bke::cryptomatte::CryptomatteSessionPtr session_ptr = cryptomatte_init_from_node(
+      *node, 0, true);
+  return session_ptr.release();
+}
+
 static void node_init_cryptomatte(bNodeTree *UNUSED(ntree), bNode *node)
 {
   NodeCryptomatte *user = static_cast<NodeCryptomatte *>

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list