diff options
author | Jeroen Bakker <jbakker> | 2020-11-12 11:04:50 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2020-11-12 11:08:32 +0300 |
commit | f93081a01b7bf484f51fb7d70ac8a8fd90a59d8c (patch) | |
tree | 78645ab9fc1b15610dd9178faf5e44fae5a8ee93 /source/blender/editors/sculpt_paint | |
parent | b99faa0f567fdf139a8e357112f9b2c7a0458aa5 (diff) |
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
Diffstat (limited to 'source/blender/editors/sculpt_paint')
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_utils.c | 54 |
1 files changed, 31 insertions, 23 deletions
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); + } } } |