[Bf-blender-cvs] [f93081a01b7] blender-v2.91-release: Fix T81673: Color picker picks up UI and Overlay

Jeroen Bakker noreply at git.blender.org
Thu Nov 12 09:09:22 CET 2020


Commit: f93081a01b7bf484f51fb7d70ac8a8fd90a59d8c
Author: Jeroen Bakker
Date:   Thu Nov 12 09:04:50 2020 +0100
Branches: blender-v2.91-release
https://developer.blender.org/rBf93081a01b7bf484f51fb7d70ac8a8fd90a59d8c

Fix T81673: Color picker picks up UI and Overlay

There are two implementations of the Sample Color operation. One is used
by the paint texture and one by the image editor. The image editor
variant sampled from the ibuf directly, but the paint texture variant
was sampling from the screen front buffer. This can lead into incorrect
samples due to color pipeline.

This patch will use the image editor variant when sampling a color for
2d texture painting

Reviewed By: Pablo Dobarro

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

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

M	source/blender/editors/sculpt_paint/paint_utils.c

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

diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c
index fa79bd8ee93..9855f8e9d40 100644
--- a/source/blender/editors/sculpt_paint/paint_utils.c
+++ b/source/blender/editors/sculpt_paint/paint_utils.c
@@ -66,6 +66,7 @@
 
 #include "RE_render_ext.h"
 
+#include "ED_image.h"
 #include "ED_screen.h"
 #include "ED_view3d.h"
 
@@ -458,8 +459,6 @@ void paint_sample_color(
   Palette *palette = BKE_paint_palette(paint);
   PaletteColor *color = NULL;
   Brush *br = BKE_paint_brush(BKE_paint_get_active_from_context(C));
-  uint col;
-  const uchar *cp;
 
   CLAMP(x, 0, region->winx);
   CLAMP(y, 0, region->winy);
@@ -474,12 +473,14 @@ void paint_sample_color(
     palette->active_color = BLI_listbase_count(&palette->colors) - 1;
   }
 
-  if (CTX_wm_view3d(C) && texpaint_proj) {
+  SpaceImage *sima = CTX_wm_space_image(C);
+  const View3D *v3d = CTX_wm_view3d(C);
+
+  if (v3d && texpaint_proj) {
     /* first try getting a color directly from the mesh faces if possible */
     ViewLayer *view_layer = CTX_data_view_layer(C);
     Object *ob = OBACT(view_layer);
     Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
-    bool sample_success = false;
     ImagePaintSettings *imapaint = &scene->toolsettings->imapaint;
     bool use_material = (imapaint->mode == IMAGEPAINT_MODE_MATERIAL);
 
@@ -539,8 +540,6 @@ void paint_sample_color(
 
             ImBuf *ibuf = BKE_image_acquire_ibuf(image, &iuser, NULL);
             if (ibuf && (ibuf->rect || ibuf->rect_float)) {
-              sample_success = true;
-
               u = u * ibuf->x;
               v = v * ibuf->y;
 
@@ -568,6 +567,8 @@ void paint_sample_color(
                   BKE_brush_color_set(scene, br, rgba_f);
                 }
               }
+              BKE_image_release_ibuf(image, ibuf, NULL);
+              return;
             }
 
             BKE_image_release_ibuf(image, ibuf, NULL);
@@ -575,28 +576,35 @@ void paint_sample_color(
         }
       }
     }
-
-    if (!sample_success) {
-      GPU_frontbuffer_read_pixels(
-          x + region->winrct.xmin, y + region->winrct.ymin, 1, 1, 4, GPU_DATA_UNSIGNED_BYTE, &col);
-    }
-    else {
+  }
+  else if (sima != NULL) {
+    /* Sample from the active image buffer. The sampled color is in
+     * Linear Scene Reference Space. */
+    float rgba_f[3];
+    if (ED_space_image_color_sample(sima, region, (int[2]){x, y}, rgba_f)) {
+      linearrgb_to_srgb_v3_v3(rgba_f, rgba_f);
+      if (use_palette) {
+        copy_v3_v3(color->rgb, rgba_f);
+      }
+      else {
+        BKE_brush_color_set(scene, br, rgba_f);
+      }
       return;
     }
   }
-  else {
+
+  /* No sample found; sample directly from the GPU front buffer. */
+  {
+    float rgba_f[4];
     GPU_frontbuffer_read_pixels(
-        x + region->winrct.xmin, y + region->winrct.ymin, 1, 1, 4, GPU_DATA_UNSIGNED_BYTE, &col);
-  }
-  cp = (uchar *)&col;
+        x + region->winrct.xmin, y + region->winrct.ymin, 1, 1, 4, GPU_DATA_FLOAT, &rgba_f);
 
-  if (use_palette) {
-    rgb_uchar_to_float(color->rgb, cp);
-  }
-  else {
-    float rgba_f[3];
-    rgb_uchar_to_float(rgba_f, cp);
-    BKE_brush_color_set(scene, br, rgba_f);
+    if (use_palette) {
+      copy_v3_v3(color->rgb, rgba_f);
+    }
+    else {
+      BKE_brush_color_set(scene, br, rgba_f);
+    }
   }
 }



More information about the Bf-blender-cvs mailing list