Page Menu
Home
Search
Configure Global Search
Log In
Paste
P2890
T97135_snippet
Active
Public
Actions
Authored by
Philipp Oeser (lichtwerk)
on Apr 8 2022, 2:21 PM.
Edit Paste
Archive Paste
View Raw File
Subscribe
Mute Notifications
Award Token
Tags
None
Subscribers
None
From: Philipp Oeser <info@graphics-engineer.com>, Fri Apr 8 13:25:41 2022 +0200 (55 minutes ago)
Committer: Philipp Oeser <info@graphics-engineer.com>, Fri Apr 8 13:25:41 2022 +0200 (55 minutes ago)
Follows: v3.1.0
Fix T97135: selection issues with parented masks in the MCE
Box, Circle and Lasso select were not taking into account if a
mask(point) was parented selection was only succeeding in the original
place.
Now do selection on the evaluated mask instead.
I am actually unsure if setting selection, flushing selection and tagging
ID_RECALC_SELECT all on an evaluated ID is allowed; alternative would be
to loop over both original and evaluated mask layers, do the coordinate
checks on the evaluated ID, but do everything regarding the actuall
selection on the original ID
diff --git a/source/blender/editors/mask/mask_select.c b/source/blender/editors/mask/mask_select.c
index 29cd593ce7f..529c70deca0 100644
--- a/source/blender/editors/mask/mask_select.c
+++ b/source/blender/editors/mask/mask_select.c
@@ -16,6 +16,9 @@
#include "BKE_context.h"
#include "BKE_mask.h"
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
+
#include "DNA_mask_types.h"
#include "WM_api.h"
@@ -427,7 +430,9 @@ static int box_select_exec(bContext *C, wmOperator *op)
ScrArea *area = CTX_wm_area(C);
ARegion *region = CTX_wm_region(C);
- Mask *mask = CTX_data_edit_mask(C);
+ Mask *mask_orig = CTX_data_edit_mask(C);
+ Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
+ Mask *mask_eval = (Mask *)DEG_get_evaluated_id(depsgraph, &mask_orig->id);
rcti rect;
rctf rectf;
@@ -436,7 +441,7 @@ static int box_select_exec(bContext *C, wmOperator *op)
const eSelectOp sel_op = RNA_enum_get(op->ptr, "mode");
const bool select = (sel_op != SEL_OP_SUB);
if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
- ED_mask_select_toggle_all(mask, SEL_DESELECT);
+ ED_mask_select_toggle_all(mask_eval, SEL_DESELECT);
changed = true;
}
@@ -447,7 +452,7 @@ static int box_select_exec(bContext *C, wmOperator *op)
ED_mask_point_pos(area, region, rect.xmax, rect.ymax, &rectf.xmax, &rectf.ymax);
/* do actual selection */
- LISTBASE_FOREACH (MaskLayer *, mask_layer, &mask->masklayers) {
+ LISTBASE_FOREACH (MaskLayer *, mask_layer, &mask_eval->masklayers) {
if (mask_layer->visibility_flag & (MASK_HIDE_VIEW | MASK_HIDE_SELECT)) {
continue;
}
@@ -471,10 +476,10 @@ static int box_select_exec(bContext *C, wmOperator *op)
}
if (changed) {
- ED_mask_select_flush_all(mask);
+ ED_mask_select_flush_all(mask_eval);
- DEG_id_tag_update(&mask->id, ID_RECALC_SELECT);
- WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
+ DEG_id_tag_update(&mask_eval->id, ID_RECALC_SELECT);
+ WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask_eval);
return OPERATOR_FINISHED;
}
@@ -517,14 +522,16 @@ static bool do_lasso_select_mask(bContext *C,
ScrArea *area = CTX_wm_area(C);
ARegion *region = CTX_wm_region(C);
- Mask *mask = CTX_data_edit_mask(C);
+ Mask *mask_orig = CTX_data_edit_mask(C);
+ Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
+ Mask *mask_eval = (Mask *)DEG_get_evaluated_id(depsgraph, &mask_orig->id);
rcti rect;
bool changed = false;
const bool select = (sel_op != SEL_OP_SUB);
if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
- ED_mask_select_toggle_all(mask, SEL_DESELECT);
+ ED_mask_select_toggle_all(mask_eval, SEL_DESELECT);
changed = true;
}
@@ -532,7 +539,7 @@ static bool do_lasso_select_mask(bContext *C,
BLI_lasso_boundbox(&rect, mcoords, mcoords_len);
/* do actual selection */
- LISTBASE_FOREACH (MaskLayer *, mask_layer, &mask->masklayers) {
+ LISTBASE_FOREACH (MaskLayer *, mask_layer, &mask_eval->masklayers) {
if (mask_layer->visibility_flag & (MASK_HIDE_VIEW | MASK_HIDE_SELECT)) {
continue;
}
@@ -572,10 +579,10 @@ static bool do_lasso_select_mask(bContext *C,
}
if (changed) {
- ED_mask_select_flush_all(mask);
+ ED_mask_select_flush_all(mask_eval);
- DEG_id_tag_update(&mask->id, ID_RECALC_SELECT);
- WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
+ DEG_id_tag_update(&mask_eval->id, ID_RECALC_SELECT);
+ WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask_eval);
}
return changed;
@@ -643,7 +650,9 @@ static int circle_select_exec(bContext *C, wmOperator *op)
ScrArea *area = CTX_wm_area(C);
ARegion *region = CTX_wm_region(C);
- Mask *mask = CTX_data_edit_mask(C);
+ Mask *mask_orig = CTX_data_edit_mask(C);
+ Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
+ Mask *mask_eval = (Mask *)DEG_get_evaluated_id(depsgraph, &mask_orig->id);
float zoomx, zoomy, offset[2], ellipse[2];
int width, height;
@@ -668,12 +677,12 @@ static int circle_select_exec(bContext *C, wmOperator *op)
WM_gesture_is_modal_first(op->customdata));
const bool select = (sel_op != SEL_OP_SUB);
if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
- ED_mask_select_toggle_all(mask, SEL_DESELECT);
+ ED_mask_select_toggle_all(mask_eval, SEL_DESELECT);
changed = true;
}
/* do actual selection */
- LISTBASE_FOREACH (MaskLayer *, mask_layer, &mask->masklayers) {
+ LISTBASE_FOREACH (MaskLayer *, mask_layer, &mask_eval->masklayers) {
if (mask_layer->visibility_flag & (MASK_HIDE_VIEW | MASK_HIDE_SELECT)) {
continue;
}
@@ -696,10 +705,10 @@ static int circle_select_exec(bContext *C, wmOperator *op)
}
if (changed) {
- ED_mask_select_flush_all(mask);
+ ED_mask_select_flush_all(mask_eval);
- DEG_id_tag_update(&mask->id, ID_RECALC_SELECT);
- WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
+ DEG_id_tag_update(&mask_eval->id, ID_RECALC_SELECT);
+ WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask_orig);
return OPERATOR_FINISHED;
}
Event Timeline
Philipp Oeser (lichtwerk)
created this paste.
Apr 8 2022, 2:21 PM
Philipp Oeser (lichtwerk)
edited the content of this paste.
(Show Details)
Log In to Comment