From 4d7c9901800835122413faebd9ead267f1f32285 Mon Sep 17 00:00:00 2001 From: Chris Blackbourn Date: Fri, 15 Jul 2022 23:13:59 +1200 Subject: Fix T98061: uv resize with individual origins could break constrain to bounds Fix unreported: Resize with Constrain To Bounds will now limit one shared scale value for both U and V instead of calculating separate scale values for each. To fix T98061, the individual origins (transdata->center) is now used when that mode is active. See also: 0e9367fc29bc Differential Revision: https://developer.blender.org/D15420 --- .../editors/transform/transform_mode_resize.c | 63 ++++++++++++---------- 1 file changed, 35 insertions(+), 28 deletions(-) (limited to 'source/blender/editors/transform') diff --git a/source/blender/editors/transform/transform_mode_resize.c b/source/blender/editors/transform/transform_mode_resize.c index bc45ec07eab..bbe1cfdf521 100644 --- a/source/blender/editors/transform/transform_mode_resize.c +++ b/source/blender/editors/transform/transform_mode_resize.c @@ -126,10 +126,6 @@ static void constrain_scale_to_boundary(const float numerator, static bool clip_uv_transform_resize(TransInfo *t, float vec[2]) { - /* Assume no change is required. */ - float scalex = 1.0f; - float scaley = 1.0f; - /* Check if the current image in UV editor is a tiled image or not. */ const SpaceImage *sima = t->area->spacedata.first; const Image *image = sima->image; @@ -150,35 +146,46 @@ static bool clip_uv_transform_resize(TransInfo *t, float vec[2]) } } - float min[2], max[2]; - min[0] = min[1] = FLT_MAX; - max[0] = max[1] = -FLT_MAX; + /* Assume no change is required. */ + float scale = 1.0f; + /* Are we scaling U and V together, or just one axis? */ + const bool adjust_u = !(t->con.mode & CON_AXIS1); + const bool adjust_v = !(t->con.mode & CON_AXIS0); + const bool use_local_center = transdata_check_local_center(t, t->around); FOREACH_TRANS_DATA_CONTAINER (t, tc) { + for (TransData *td = tc->data; td < tc->data + tc->data_len; td++) { + + /* Get scale origin. */ + const float *scale_origin = use_local_center ? td->center : t->center_global; + + /* Alias td->loc as min and max just in case we need to optimize later. */ + const float *min = td->loc; + const float *max = td->loc; + + if (adjust_u) { + /* Update U against the left border. */ + constrain_scale_to_boundary( + scale_origin[0] - base_offset[0], scale_origin[0] - min[0], &scale); - TransData *td; - int a; - for (a = 0, td = tc->data; a < tc->data_len; a++, td++) { - minmax_v2v2_v2(min, max, td->loc); + /* Now the right border, negated, because `-1.0 / -1.0 = 1.0` */ + constrain_scale_to_boundary( + base_offset[0] + t->aspect[0] - scale_origin[0], max[0] - scale_origin[0], &scale); + } + + /* Do the same for the V co-ordinate. */ + if (adjust_v) { + constrain_scale_to_boundary( + scale_origin[1] - base_offset[1], scale_origin[1] - min[1], &scale); + + constrain_scale_to_boundary( + base_offset[1] + t->aspect[1] - scale_origin[1], max[1] - scale_origin[1], &scale); + } } } - - /* Update U against the left border. */ - constrain_scale_to_boundary( - t->center_global[0] - base_offset[0], t->center_global[0] - min[0], &scalex); - /* Now the right border, negated, because `-1.0 / -1.0 = 1.0` */ - constrain_scale_to_boundary( - base_offset[0] + t->aspect[0] - t->center_global[0], max[0] - t->center_global[0], &scalex); - - /* Do the same for the V co-ordinate, which is called `y`. */ - constrain_scale_to_boundary( - t->center_global[1] - base_offset[1], t->center_global[1] - min[1], &scaley); - constrain_scale_to_boundary( - base_offset[1] + t->aspect[1] - t->center_global[1], max[1] - t->center_global[1], &scaley); - - vec[0] *= scalex; - vec[1] *= scaley; - return (scalex != 1.0f) || (scaley != 1.0f); + vec[0] *= scale; + vec[1] *= scale; + return scale != 1.0f; } static void applyResize(TransInfo *t, const int UNUSED(mval[2])) -- cgit v1.2.3