diff options
Diffstat (limited to 'source/blender/editors')
-rw-r--r-- | source/blender/editors/include/ED_clip.h | 4 | ||||
-rw-r--r-- | source/blender/editors/include/ED_image.h | 4 | ||||
-rw-r--r-- | source/blender/editors/include/ED_node.h | 5 | ||||
-rw-r--r-- | source/blender/editors/include/UI_interface.h | 5 | ||||
-rw-r--r-- | source/blender/editors/interface/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_eyedropper_color.c | 179 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_templates.c | 8 | ||||
-rw-r--r-- | source/blender/editors/space_clip/clip_editor.c | 17 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_ops.c | 17 | ||||
-rw-r--r-- | source/blender/editors/space_node/drawnode.c | 81 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_edit.c | 10 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_view.c | 26 |
12 files changed, 317 insertions, 40 deletions
diff --git a/source/blender/editors/include/ED_clip.h b/source/blender/editors/include/ED_clip.h index 56494f87bfe..21d8a28e2c9 100644 --- a/source/blender/editors/include/ED_clip.h +++ b/source/blender/editors/include/ED_clip.h @@ -64,6 +64,10 @@ struct ImBuf *ED_space_clip_get_stable_buffer(struct SpaceClip *sc, float *scale, float *angle); +bool ED_space_clip_get_position(struct SpaceClip *sc, + struct ARegion *ar, + int mval[2], + float fpos[2]); bool ED_space_clip_color_sample(struct SpaceClip *sc, struct ARegion *region, int mval[2], diff --git a/source/blender/editors/include/ED_image.h b/source/blender/editors/include/ED_image.h index b139b0765a3..ec525806b81 100644 --- a/source/blender/editors/include/ED_image.h +++ b/source/blender/editors/include/ED_image.h @@ -53,6 +53,10 @@ void ED_space_image_auto_set(const struct bContext *C, struct SpaceImage *sima); struct Mask *ED_space_image_get_mask(struct SpaceImage *sima); void ED_space_image_set_mask(struct bContext *C, struct SpaceImage *sima, struct Mask *mask); +bool ED_space_image_get_position(struct SpaceImage *sima, + struct ARegion *region, + int mval[2], + float fpos[2]); bool ED_space_image_color_sample( struct SpaceImage *sima, struct ARegion *region, int mval[2], float r_col[3], bool *r_is_data); struct ImBuf *ED_space_image_acquire_buffer(struct SpaceImage *sima, void **r_lock, int tile); diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h index ea2383457c2..67a50b83bd6 100644 --- a/source/blender/editors/include/ED_node.h +++ b/source/blender/editors/include/ED_node.h @@ -121,6 +121,11 @@ void ED_node_composite_job(const struct bContext *C, void ED_operatormacros_node(void); /* node_view.c */ +bool ED_space_node_get_position(struct Main *bmain, + struct SpaceNode *snode, + struct ARegion *region, + const int mval[2], + float fpos[2]); bool ED_space_node_color_sample(struct Main *bmain, struct SpaceNode *snode, struct ARegion *region, diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 5620d39ab16..d23daf7f0e3 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -2078,7 +2078,10 @@ void uiTemplatePalette(uiLayout *layout, struct PointerRNA *ptr, const char *propname, bool colors); -void uiTemplateCryptoPicker(uiLayout *layout, struct PointerRNA *ptr, const char *propname); +void uiTemplateCryptoPicker(uiLayout *layout, + struct PointerRNA *ptr, + const char *propname, + int icon); void uiTemplateLayers(uiLayout *layout, struct PointerRNA *ptr, const char *propname, diff --git a/source/blender/editors/interface/CMakeLists.txt b/source/blender/editors/interface/CMakeLists.txt index 82bcd5d7eb4..421019bebb8 100644 --- a/source/blender/editors/interface/CMakeLists.txt +++ b/source/blender/editors/interface/CMakeLists.txt @@ -29,6 +29,7 @@ set(INC ../../makesdna ../../makesrna ../../python + ../../render ../../windowmanager ../../../../intern/glew-mx ../../../../intern/guardedalloc diff --git a/source/blender/editors/interface/interface_eyedropper_color.c b/source/blender/editors/interface/interface_eyedropper_color.c index 5af290db037..349086132dc 100644 --- a/source/blender/editors/interface/interface_eyedropper_color.c +++ b/source/blender/editors/interface/interface_eyedropper_color.c @@ -31,10 +31,14 @@ #include "DNA_screen_types.h" #include "DNA_space_types.h" +#include "BLI_listbase.h" #include "BLI_math_vector.h" +#include "BLI_string.h" #include "BKE_context.h" +#include "BKE_image.h" #include "BKE_main.h" +#include "BKE_node.h" #include "BKE_screen.h" #include "RNA_access.h" @@ -42,6 +46,7 @@ #include "UI_interface.h" #include "IMB_colormanagement.h" +#include "IMB_imbuf_types.h" #include "WM_api.h" #include "WM_types.h" @@ -54,6 +59,8 @@ #include "ED_image.h" #include "ED_node.h" +#include "RE_pipeline.h" + #include "interface_eyedropper_intern.h" typedef struct Eyedropper { @@ -71,13 +78,12 @@ typedef struct Eyedropper { float accum_col[3]; int accum_tot; - bool use_accum; + bNode *crypto_node; } Eyedropper; static bool eyedropper_init(bContext *C, wmOperator *op) { Eyedropper *eye = MEM_callocN(sizeof(Eyedropper), __func__); - eye->use_accum = RNA_boolean_get(op->ptr, "use_accumulate"); uiBut *but = UI_context_active_but_prop_get(C, &eye->ptr, &eye->prop, &eye->index); const enum PropertySubType prop_subtype = eye->prop ? RNA_property_subtype(eye->prop) : 0; @@ -96,6 +102,13 @@ static bool eyedropper_init(bContext *C, wmOperator *op) float col[4]; 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; + } + else { + eye->crypto_node = NULL; + } + if (prop_subtype != PROP_COLOR) { Scene *scene = CTX_data_scene(C); const char *display_device; @@ -125,6 +138,150 @@ static void eyedropper_exit(bContext *C, wmOperator *op) /* *** eyedropper_color_ helper functions *** */ +static bool eyedropper_cryptomatte_sample_renderlayer_fl(RenderLayer *render_layer, + const char *prefix, + const float fpos[2], + float r_col[3]) +{ + if (!render_layer) { + return false; + } + + const int render_layer_name_len = BLI_strnlen(render_layer->name, sizeof(render_layer->name)); + if (strncmp(prefix, render_layer->name, render_layer_name_len) != 0) { + return false; + } + + const int prefix_len = strlen(prefix); + if (prefix_len <= render_layer_name_len + 1) { + return false; + } + + /* RenderResult from images can have no render layer name. */ + const char *render_pass_name_prefix = render_layer_name_len ? + prefix + 1 + render_layer_name_len : + prefix; + + LISTBASE_FOREACH (RenderPass *, render_pass, &render_layer->passes) { + if (STRPREFIX(render_pass->name, render_pass_name_prefix) && + !STREQLEN(render_pass->name, render_pass_name_prefix, sizeof(render_pass->name))) { + BLI_assert(render_pass->channels == 4); + const int x = (int)(fpos[0] * render_pass->rectx); + const int y = (int)(fpos[1] * render_pass->recty); + const int offset = 4 * (y * render_pass->rectx + x); + zero_v3(r_col); + r_col[0] = render_pass->rect[offset]; + return true; + } + } + + return false; +} + +static bool eyedropper_cryptomatte_sample_fl( + bContext *C, Eyedropper *eye, int mx, int my, float r_col[3]) +{ + bNode *node = eye->crypto_node; + NodeCryptomatte *crypto = node ? ((NodeCryptomatte *)node->storage) : NULL; + + if (!crypto) { + return false; + } + + bScreen *screen = CTX_wm_screen(C); + ScrArea *sa = BKE_screen_find_area_xy(screen, SPACE_TYPE_ANY, mx, my); + if (!sa || !ELEM(sa->spacetype, SPACE_IMAGE, SPACE_NODE, SPACE_CLIP)) { + return false; + } + + ARegion *ar = BKE_area_find_region_xy(sa, RGN_TYPE_WINDOW, mx, my); + if (!ar) { + return false; + } + + int mval[2] = {mx - ar->winrct.xmin, my - ar->winrct.ymin}; + float fpos[2] = {-1.0f, -1.0}; + switch (sa->spacetype) { + case SPACE_IMAGE: { + SpaceImage *sima = sa->spacedata.first; + ED_space_image_get_position(sima, ar, mval, fpos); + break; + } + case SPACE_NODE: { + Main *bmain = CTX_data_main(C); + SpaceNode *snode = sa->spacedata.first; + ED_space_node_get_position(bmain, snode, ar, mval, fpos); + break; + } + case SPACE_CLIP: { + SpaceClip *sc = sa->spacedata.first; + ED_space_clip_get_position(sc, ar, mval, fpos); + break; + } + default: { + break; + } + } + + if (fpos[0] < 0.0f || fpos[1] < 0.0f || fpos[0] >= 1.0f || fpos[1] >= 1.0f) { + return false; + } + + /* CMP_CRYPTOMATTE_SRC_RENDER and CMP_CRYPTOMATTE_SRC_IMAGE require a referenced image/scene to + * work properly. */ + if (!node->id) { + return false; + } + + bool success = false; + /* TODO(jbakker): Migrate this file to cc and use std::string as return param. */ + char prefix[MAX_NAME + 1]; + ntreeCompositCryptomatteLayerPrefix(node, prefix, sizeof(prefix) - 1); + prefix[MAX_NAME] = '\0'; + + if (node->custom1 == CMP_CRYPTOMATTE_SRC_RENDER) { + Scene *scene = (Scene *)node->id; + BLI_assert(GS(scene->id.name) == ID_SCE); + Render *re = RE_GetSceneRender(scene); + + if (re) { + RenderResult *rr = RE_AcquireResultRead(re); + if (rr) { + LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) { + RenderLayer *render_layer = RE_GetRenderLayer(rr, view_layer->name); + success = eyedropper_cryptomatte_sample_renderlayer_fl( + render_layer, prefix, fpos, r_col); + if (success) { + break; + } + } + } + RE_ReleaseResult(re); + } + } + else if (node->custom1 == CMP_CRYPTOMATTE_SRC_IMAGE) { + Image *image = (Image *)node->id; + BLI_assert(GS(image->id.name) == ID_IM); + ImageUser *iuser = &crypto->iuser; + + if (image && image->type == IMA_TYPE_MULTILAYER) { + ImBuf *ibuf = BKE_image_acquire_ibuf(image, iuser, NULL); + if (image->rr) { + LISTBASE_FOREACH (RenderLayer *, render_layer, &image->rr->layers) { + success = eyedropper_cryptomatte_sample_renderlayer_fl( + render_layer, prefix, fpos, r_col); + if (success) { + break; + } + } + } + BKE_image_release_ibuf(image, ibuf, NULL); + } + } + + return success; +} + /** * \brief get the color from the screen. * @@ -230,9 +387,16 @@ static void eyedropper_color_sample(bContext *C, Eyedropper *eye, int mx, int my { /* Accumulate color. */ float col[3]; - eyedropper_color_sample_fl(C, mx, my, col); + if (eye->crypto_node) { + if (!eyedropper_cryptomatte_sample_fl(C, eye, mx, my, col)) { + return; + } + } + else { + eyedropper_color_sample_fl(C, mx, my, col); + } - if (eye->use_accum) { + if (!eye->crypto_node) { add_v3_v3(eye->accum_col, col); eye->accum_tot++; } @@ -360,11 +524,4 @@ void UI_OT_eyedropper_color(wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_UNDO | OPTYPE_BLOCKING | OPTYPE_INTERNAL; - - /* properties */ - PropertyRNA *prop; - - /* Needed for color picking with crypto-matte. */ - prop = RNA_def_boolean(ot->srna, "use_accumulate", true, "Accumulate", ""); - RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); } diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index fed011d78d7..08895564a26 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -5485,7 +5485,7 @@ void uiTemplatePalette(uiLayout *layout, } } -void uiTemplateCryptoPicker(uiLayout *layout, PointerRNA *ptr, const char *propname) +void uiTemplateCryptoPicker(uiLayout *layout, PointerRNA *ptr, const char *propname, int icon) { PropertyRNA *prop = RNA_struct_find_property(ptr, propname); @@ -5500,7 +5500,7 @@ void uiTemplateCryptoPicker(uiLayout *layout, PointerRNA *ptr, const char *propn UI_BTYPE_BUT, "UI_OT_eyedropper_color", WM_OP_INVOKE_DEFAULT, - ICON_EYEDROPPER, + icon, RNA_property_ui_name(prop), 0, 0, @@ -5510,10 +5510,6 @@ void uiTemplateCryptoPicker(uiLayout *layout, PointerRNA *ptr, const char *propn but->rnapoin = *ptr; but->rnaprop = prop; but->rnaindex = -1; - - PointerRNA *opptr = UI_but_operator_ptr_get(but); - /* Important for crypto-matte operation. */ - RNA_boolean_set(opptr, "use_accumulate", false); } /** \} */ diff --git a/source/blender/editors/space_clip/clip_editor.c b/source/blender/editors/space_clip/clip_editor.c index e1172458f67..36375ad1ef3 100644 --- a/source/blender/editors/space_clip/clip_editor.c +++ b/source/blender/editors/space_clip/clip_editor.c @@ -269,6 +269,23 @@ ImBuf *ED_space_clip_get_stable_buffer(SpaceClip *sc, float loc[2], float *scale return NULL; } +bool ED_space_clip_get_position(struct SpaceClip *sc, + struct ARegion *ar, + int mval[2], + float fpos[2]) +{ + ImBuf *ibuf = ED_space_clip_get_buffer(sc); + if (!ibuf) { + return false; + } + + /* map the mouse coords to the backdrop image space */ + ED_clip_mouse_pos(sc, ar, mval, fpos); + + IMB_freeImBuf(ibuf); + return true; +} + /* Returns color in linear space, matching ED_space_image_color_sample(). */ bool ED_space_clip_color_sample(SpaceClip *sc, ARegion *region, int mval[2], float r_col[3]) { diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index fc3619f01b9..72405a51aca 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -3147,6 +3147,23 @@ void IMAGE_OT_unpack(wmOperatorType *ot) /** \name Sample Image Operator * \{ */ +/* Returns mouse position in image space. */ +bool ED_space_image_get_position(SpaceImage *sima, struct ARegion *ar, int mval[2], float fpos[2]) +{ + void *lock; + ImBuf *ibuf = ED_space_image_acquire_buffer(sima, &lock, 0); + + if (ibuf == NULL) { + ED_space_image_release_buffer(sima, ibuf, lock); + return false; + } + + UI_view2d_region_to_view(&ar->v2d, mval[0], mval[1], &fpos[0], &fpos[1]); + + ED_space_image_release_buffer(sima, ibuf, lock); + return true; +} + /* Returns color in linear space, matching ED_space_node_color_sample(). */ bool ED_space_image_color_sample( SpaceImage *sima, ARegion *region, int mval[2], float r_col[3], bool *r_is_data) diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 75ea5b9a1bf..0f2b2b435bc 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -643,7 +643,8 @@ static void node_buts_image_user(uiLayout *layout, PointerRNA *ptr, PointerRNA *imaptr, PointerRNA *iuserptr, - bool compositor) + const bool show_layer_selection, + const bool show_color_management) { if (!imaptr->data) { return; @@ -677,20 +678,22 @@ static void node_buts_image_user(uiLayout *layout, uiItemR(col, ptr, "use_auto_refresh", DEFAULT_FLAGS, NULL, ICON_NONE); } - if (compositor && RNA_enum_get(imaptr, "type") == IMA_TYPE_MULTILAYER && + if (show_layer_selection && RNA_enum_get(imaptr, "type") == IMA_TYPE_MULTILAYER && RNA_boolean_get(ptr, "has_layers")) { col = uiLayoutColumn(layout, false); uiItemR(col, ptr, "layer", DEFAULT_FLAGS, NULL, ICON_NONE); } - uiLayout *split = uiLayoutSplit(layout, 0.5f, true); - PointerRNA colorspace_settings_ptr = RNA_pointer_get(imaptr, "colorspace_settings"); - uiItemL(split, IFACE_("Color Space"), ICON_NONE); - uiItemR(split, &colorspace_settings_ptr, "name", DEFAULT_FLAGS, "", ICON_NONE); + if (show_color_management) { + uiLayout *split = uiLayoutSplit(layout, 0.5f, true); + PointerRNA colorspace_settings_ptr = RNA_pointer_get(imaptr, "colorspace_settings"); + uiItemL(split, IFACE_("Color Space"), ICON_NONE); + uiItemR(split, &colorspace_settings_ptr, "name", DEFAULT_FLAGS, "", ICON_NONE); - /* Avoid losing changes image is painted. */ - if (BKE_image_is_dirty(imaptr->data)) { - uiLayoutSetEnabled(split, false); + /* Avoid losing changes image is painted. */ + if (BKE_image_is_dirty(imaptr->data)) { + uiLayoutSetEnabled(split, false); + } } } @@ -756,7 +759,7 @@ static void node_shader_buts_tex_image(uiLayout *layout, bContext *C, PointerRNA /* note: image user properties used directly here, unlike compositor image node, * which redefines them in the node struct RNA to get proper updates. */ - node_buts_image_user(layout, C, &iuserptr, &imaptr, &iuserptr, false); + node_buts_image_user(layout, C, &iuserptr, &imaptr, &iuserptr, false, true); } static void node_shader_buts_tex_image_ex(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -785,7 +788,7 @@ static void node_shader_buts_tex_environment(uiLayout *layout, bContext *C, Poin uiItemR(layout, ptr, "interpolation", DEFAULT_FLAGS, "", ICON_NONE); uiItemR(layout, ptr, "projection", DEFAULT_FLAGS, "", ICON_NONE); - node_buts_image_user(layout, C, &iuserptr, &imaptr, &iuserptr, false); + node_buts_image_user(layout, C, &iuserptr, &imaptr, &iuserptr, false, true); } static void node_shader_buts_tex_environment_ex(uiLayout *layout, bContext *C, PointerRNA *ptr) @@ -1374,7 +1377,7 @@ static void node_composit_buts_image(uiLayout *layout, bContext *C, PointerRNA * PointerRNA imaptr = RNA_pointer_get(ptr, "image"); - node_buts_image_user(layout, C, ptr, &imaptr, &iuserptr, true); + node_buts_image_user(layout, C, ptr, &imaptr, &iuserptr, true, true); node_buts_image_views(layout, C, ptr, &imaptr); } @@ -2665,27 +2668,64 @@ static void node_composit_buts_sunbeams(uiLayout *layout, bContext *UNUSED(C), P uiItemR(layout, ptr, "ray_length", DEFAULT_FLAGS | UI_ITEM_R_SLIDER, NULL, ICON_NONE); } -static void node_composit_buts_cryptomatte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +static void node_composit_buts_cryptomatte_legacy(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *ptr) { uiLayout *col = uiLayoutColumn(layout, true); uiItemL(col, IFACE_("Matte Objects:"), ICON_NONE); uiLayout *row = uiLayoutRow(col, true); - uiTemplateCryptoPicker(row, ptr, "add"); - uiTemplateCryptoPicker(row, ptr, "remove"); + uiTemplateCryptoPicker(row, ptr, "add", ICON_ADD); + uiTemplateCryptoPicker(row, ptr, "remove", ICON_REMOVE); uiItemR(col, ptr, "matte_id", DEFAULT_FLAGS, "", ICON_NONE); } -static void node_composit_buts_cryptomatte_ex(uiLayout *layout, - bContext *UNUSED(C), - PointerRNA *UNUSED(ptr)) +static void node_composit_buts_cryptomatte_legacy_ex(uiLayout *layout, + bContext *UNUSED(C), + PointerRNA *UNUSED(ptr)) { uiItemO(layout, IFACE_("Add Crypto Layer"), ICON_ADD, "NODE_OT_cryptomatte_layer_add"); uiItemO(layout, IFACE_("Remove Crypto Layer"), ICON_REMOVE, "NODE_OT_cryptomatte_layer_remove"); } +static void node_composit_buts_cryptomatte(uiLayout *layout, bContext *C, PointerRNA *ptr) +{ + bNode *node = ptr->data; + + uiLayout *row = uiLayoutRow(layout, true); + uiItemR(row, ptr, "source", DEFAULT_FLAGS | UI_ITEM_R_EXPAND, NULL, ICON_NONE); + + uiLayout *col = uiLayoutColumn(layout, false); + if (node->custom1 == CMP_CRYPTOMATTE_SRC_RENDER) { + uiTemplateID(col, C, ptr, "scene", NULL, NULL, NULL, UI_TEMPLATE_ID_FILTER_ALL, false, NULL); + } + else { + uiTemplateID( + col, C, ptr, "image", NULL, "IMAGE_OT_open", NULL, UI_TEMPLATE_ID_FILTER_ALL, false, NULL); + + NodeCryptomatte *crypto = (NodeCryptomatte *)node->storage; + PointerRNA imaptr = RNA_pointer_get(ptr, "image"); + PointerRNA iuserptr; + RNA_pointer_create((ID *)ptr->owner_id, &RNA_ImageUser, &crypto->iuser, &iuserptr); + uiLayoutSetContextPointer(layout, "image_user", &iuserptr); + + node_buts_image_user(col, C, ptr, &imaptr, &iuserptr, false, false); + node_buts_image_views(col, C, ptr, &imaptr); + } + + col = uiLayoutColumn(layout, true); + uiItemR(col, ptr, "layer_name", 0, "", ICON_NONE); + uiItemL(col, IFACE_("Matte ID:"), ICON_NONE); + + row = uiLayoutRow(col, true); + uiItemR(row, ptr, "matte_id", DEFAULT_FLAGS, "", ICON_NONE); + uiTemplateCryptoPicker(row, ptr, "add", ICON_ADD); + uiTemplateCryptoPicker(row, ptr, "remove", ICON_REMOVE); +} + static void node_composit_buts_brightcontrast(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) @@ -2938,7 +2978,10 @@ static void node_composit_set_butfunc(bNodeType *ntype) break; case CMP_NODE_CRYPTOMATTE: ntype->draw_buttons = node_composit_buts_cryptomatte; - ntype->draw_buttons_ex = node_composit_buts_cryptomatte_ex; + break; + case CMP_NODE_CRYPTOMATTE_LEGACY: + ntype->draw_buttons = node_composit_buts_cryptomatte_legacy; + ntype->draw_buttons_ex = node_composit_buts_cryptomatte_legacy_ex; break; case CMP_NODE_BRIGHTCONTRAST: ntype->draw_buttons = node_composit_buts_brightcontrast; diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index afdc9efb78b..b72a6503749 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -1404,8 +1404,12 @@ static int node_read_viewlayers_exec(bContext *C, wmOperator *UNUSED(op)) } LISTBASE_FOREACH (bNode *, node, &snode->edittree->nodes) { - if (node->type == CMP_NODE_R_LAYERS) { + if ((node->type == CMP_NODE_R_LAYERS) || + (node->type == CMP_NODE_CRYPTOMATTE && node->custom1 == CMP_CRYPTOMATTE_SRC_RENDER)) { ID *id = node->id; + if (id == NULL) { + continue; + } if (id->tag & LIB_TAG_DOIT) { RE_ReadRenderResult(curscene, (Scene *)id); ntreeCompositTagRender((Scene *)id); @@ -2742,7 +2746,7 @@ static int node_cryptomatte_add_socket_exec(bContext *C, wmOperator *UNUSED(op)) node = nodeGetActive(snode->edittree); } - if (!node || node->type != CMP_NODE_CRYPTOMATTE) { + if (!node || node->type != CMP_NODE_CRYPTOMATTE_LEGACY) { return OPERATOR_CANCELLED; } @@ -2786,7 +2790,7 @@ static int node_cryptomatte_remove_socket_exec(bContext *C, wmOperator *UNUSED(o node = nodeGetActive(snode->edittree); } - if (!node || node->type != CMP_NODE_CRYPTOMATTE) { + if (!node || node->type != CMP_NODE_CRYPTOMATTE_LEGACY) { return OPERATOR_CANCELLED; } diff --git a/source/blender/editors/space_node/node_view.c b/source/blender/editors/space_node/node_view.c index 8f1dc3c8c3e..8ecab92aa26 100644 --- a/source/blender/editors/space_node/node_view.c +++ b/source/blender/editors/space_node/node_view.c @@ -443,6 +443,32 @@ static void sample_draw(const bContext *C, ARegion *region, void *arg_info) } } +/* Returns mouse position in image space. */ +bool ED_space_node_get_position( + Main *bmain, SpaceNode *snode, struct ARegion *ar, const int mval[2], float fpos[2]) +{ + if (!ED_node_is_compositor(snode) || (snode->flag & SNODE_BACKDRAW) == 0) { + return false; + } + + void *lock; + Image *ima = BKE_image_ensure_viewer(bmain, IMA_TYPE_COMPOSITE, "Viewer Node"); + ImBuf *ibuf = BKE_image_acquire_ibuf(ima, NULL, &lock); + if (!ibuf) { + BKE_image_release_ibuf(ima, ibuf, lock); + return false; + } + + /* map the mouse coords to the backdrop image space */ + float bufx = ibuf->x * snode->zoom; + float bufy = ibuf->y * snode->zoom; + fpos[0] = (bufx > 0.0f ? ((float)mval[0] - 0.5f * ar->winx - snode->xof) / bufx + 0.5f : 0.0f); + fpos[1] = (bufy > 0.0f ? ((float)mval[1] - 0.5f * ar->winy - snode->yof) / bufy + 0.5f : 0.0f); + + BKE_image_release_ibuf(ima, ibuf, lock); + return true; +} + /* Returns color in linear space, matching ED_space_image_color_sample(). * And here we've got recursion in the comments tips... */ |