diff options
author | Jeroen Bakker <jeroen@blender.org> | 2020-11-12 11:14:05 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2020-11-12 11:14:05 +0300 |
commit | cd2dfacfa574f99acb06c0d020d96b2be714aa20 (patch) | |
tree | 94c10e0f6081ef1f5a1901e2cd813faeeafa216f | |
parent | 89c8b074e78d1e98f7e3931ddbc7dbed7f6c4183 (diff) | |
parent | f93081a01b7bf484f51fb7d70ac8a8fd90a59d8c (diff) |
Merge branch 'blender-v2.91-release'
-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 6139adaea1a..beffb97bf3f 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_texture.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); + } } } |