Fix T85467: Mask transform center doesn't take parent Track into account

Coordinate checks in `spline_under_mouse_get` need to take place with
the evaluated mask to get the right center. This is now more in line to
how this is done in `ED_mask_point_find_nearest`.

Note: similar issues are reported with box/circle/lasso selection in
T97135, will tackle these separately though.

Maniphest Tasks: T85467

Differential Revision: https://developer.blender.org/D14598
This commit is contained in:
Philipp Oeser 2022-04-08 14:09:59 +02:00
parent 59e68d8031
commit d2ca2c6e74
Notes: blender-bot 2023-02-14 03:03:03 +01:00
Referenced by issue #88449: Blender LTS: Maintenance Task 2.93
Referenced by issue #88449, Blender LTS: Maintenance Task 2.93
Referenced by issue #85467, Mask transform center doesn't take parent Track into account
1 changed files with 22 additions and 15 deletions

View File

@ -31,6 +31,7 @@
#include "BKE_mask.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
#include "DNA_mask_types.h"
#include "DNA_object_types.h" /* SELECT */
@ -260,7 +261,7 @@ static void mask_point_undistort_pos(SpaceClip *sc, float r_co[2], const float c
}
static bool spline_under_mouse_get(const bContext *C,
Mask *mask,
Mask *mask_orig,
const float co[2],
MaskLayer **r_mask_layer,
MaskSpline **r_mask_spline)
@ -275,6 +276,9 @@ static bool spline_under_mouse_get(const bContext *C,
*r_mask_layer = NULL;
*r_mask_spline = NULL;
Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
Mask *mask_eval = (Mask *)DEG_get_evaluated_id(depsgraph, &mask_orig->id);
int width, height;
ED_mask_get_size(area, &width, &height);
float pixel_co[2];
@ -283,22 +287,25 @@ static bool spline_under_mouse_get(const bContext *C,
if (sc != NULL) {
undistort = (sc->clip != NULL) && (sc->user.render_flag & MCLIP_PROXY_RENDER_UNDISTORT) != 0;
}
for (MaskLayer *mask_layer = mask->masklayers.first; mask_layer != NULL;
mask_layer = mask_layer->next) {
if (mask_layer->restrictflag & MASK_RESTRICT_SELECT) {
for (MaskLayer *mask_layer_orig = mask_orig->masklayers.first,
*mask_layer_eval = mask_eval->masklayers.first;
mask_layer_orig != NULL;
mask_layer_orig = mask_layer_orig->next, mask_layer_eval = mask_layer_eval->next) {
if (mask_layer_orig->restrictflag & MASK_RESTRICT_SELECT) {
continue;
}
for (MaskSpline *spline = mask_layer->splines.first; spline != NULL; spline = spline->next) {
MaskSplinePoint *points_array;
float min[2], max[2], center[2];
if ((spline->flag & SELECT) == 0) {
for (MaskSpline *spline_orig = mask_layer_orig->splines.first,
*spline_eval = mask_layer_eval->splines.first;
spline_orig != NULL;
spline_orig = spline_orig->next, spline_eval = spline_eval->next) {
if ((spline_orig->flag & SELECT) == 0) {
continue;
}
points_array = BKE_mask_spline_point_array(spline);
MaskSplinePoint *points_array = BKE_mask_spline_point_array(spline_eval);
float min[2], max[2], center[2];
INIT_MINMAX2(min, max);
for (int i = 0; i < spline->tot_point; i++) {
for (int i = 0; i < spline_orig->tot_point; i++) {
MaskSplinePoint *point_deform = &points_array[i];
BezTriple *bezt = &point_deform->bezt;
@ -319,8 +326,8 @@ static bool spline_under_mouse_get(const bContext *C,
float max_bb_side = min_ff((max[0] - min[0]) * width, (max[1] - min[1]) * height);
if (dist_squared <= max_bb_side * max_bb_side * 0.5f &&
(closest_spline == NULL || dist_squared < closest_dist_squared)) {
closest_layer = mask_layer;
closest_spline = spline;
closest_layer = mask_layer_orig;
closest_spline = spline_orig;
closest_dist_squared = dist_squared;
}
}
@ -328,7 +335,7 @@ static bool spline_under_mouse_get(const bContext *C,
if (closest_dist_squared < square_f(threshold) && closest_spline != NULL) {
float diff_score;
if (ED_mask_find_nearest_diff_point(C,
mask,
mask_orig,
co,
threshold,
false,