diff options
author | Germano Cavalcante <germano.costa@ig.com.br> | 2021-02-05 17:01:30 +0300 |
---|---|---|
committer | Germano Cavalcante <germano.costa@ig.com.br> | 2021-02-08 15:54:54 +0300 |
commit | be60b3b23984ff7a9b973a37800522e4b5e7918f (patch) | |
tree | 4bef4e93dc7c23e44d4fa0a7871f95f3a6e37f9a /source | |
parent | bc56c127704f937d7fdfee082975bc0fa01f4b52 (diff) |
Transform: Grid snap target refactor
The code takes many turns to get a suitable "target" for the snap to grid.
Perhaps there were other reasons awaited for `transformCenter_from_type`
and `TransCenterData center_cache[5]`.
But since nothing is defined, it is better to simplify the code.
No user functional changes
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/transform/transform.h | 11 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_convert.c | 4 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_generics.c | 24 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_snap.c | 116 |
4 files changed, 66 insertions, 89 deletions
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index 72f43a14b11..9ee0aa1d6da 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -166,8 +166,10 @@ typedef enum { typedef enum { SNAP_FORCED = 1 << 0, TARGET_INIT = 1 << 1, - POINT_INIT = 1 << 2, - MULTI_POINTS = 1 << 3, + /* Special flag for snap to grid. */ + TARGET_GRID_INIT = 1 << 2, + POINT_INIT = 1 << 3, + MULTI_POINTS = 1 << 4, } eTSnap; /** #TransCon.mode, #TransInfo.con.mode */ @@ -310,6 +312,7 @@ typedef struct TransSnap { float snapPoint[3]; /** to this point (in global-space). */ float snapTarget[3]; + float snapTargetGrid[3]; float snapNormal[3]; char snapNodeBorder; ListBase points; @@ -539,9 +542,6 @@ typedef struct TransInfo { float center_global[3]; /** center in screen coordinates. */ float center2d[2]; - /* Lazy initialize center data for when we need other center values. - * V3D_AROUND_ACTIVE + 1 (static assert checks this) */ - TransCenterData center_cache[5]; /** maximum index on the input vector. */ short idx_max; /** Snapping Gears. */ @@ -764,7 +764,6 @@ void recalcData(TransInfo *t); void calculateCenter2D(TransInfo *t); void calculateCenterLocal(TransInfo *t, const float center_global[3]); -const TransCenterData *transformCenter_from_type(TransInfo *t, int around); void calculateCenter(TransInfo *t); /* API functions for getting center points */ diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c index 0770f39453e..8942a3a319b 100644 --- a/source/blender/editors/transform/transform_convert.c +++ b/source/blender/editors/transform/transform_convert.c @@ -993,10 +993,6 @@ void createTransData(bContext *C, TransInfo *t) else { convert_type = TC_CURSOR_VIEW3D; } - - /* Since we're transforming the cursor, initialize this value before it's modified. - * Needed for #snap_grid_apply to access the cursor location. */ - transformCenter_from_type(t, V3D_AROUND_CURSOR); } else if (!(t->options & CTX_PAINT_CURVE) && (t->spacetype == SPACE_VIEW3D) && ob && (ob->mode == OB_MODE_SCULPT) && ob->sculpt) { diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index e181593d28a..d230670993c 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -1184,13 +1184,6 @@ void calculateCenter(TransInfo *t) } calculateCenterLocal(t, t->center_global); - /* avoid calculating again */ - { - TransCenterData *cd = &t->center_cache[t->around]; - copy_v3_v3(cd->global, t->center_global); - cd->is_set = true; - } - calculateCenter2D(t); /* For panning from the camera-view. */ @@ -1237,23 +1230,6 @@ void calculateCenter(TransInfo *t) } } -BLI_STATIC_ASSERT(ARRAY_SIZE(((TransInfo *)NULL)->center_cache) == (V3D_AROUND_ACTIVE + 1), - "test size"); - -/** - * Lazy initialize transform center data, when we need to access center values from other types. - */ -const TransCenterData *transformCenter_from_type(TransInfo *t, int around) -{ - BLI_assert(around <= V3D_AROUND_ACTIVE); - TransCenterData *cd = &t->center_cache[around]; - if (cd->is_set == false) { - calculateCenter_FromAround(t, around, cd->global); - cd->is_set = true; - } - return cd; -} - void calculatePropRatio(TransInfo *t) { int i; diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index 575c736cf51..8500ff25a1f 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -926,6 +926,64 @@ static void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec)) /** \name Target * \{ */ +static void snap_target_median_impl(TransInfo *t, float r_median[3]) +{ + int i_accum = 0; + + zero_v3(r_median); + + FOREACH_TRANS_DATA_CONTAINER (t, tc) { + TransData *td = tc->data; + int i; + float v[3]; + zero_v3(v); + + for (i = 0; i < tc->data_len && td->flag & TD_SELECTED; i++, td++) { + add_v3_v3(v, td->center); + } + + if (i == 0) { + /* Is this possible? */ + continue; + } + + mul_v3_fl(v, 1.0 / i); + + if (tc->use_local_mat) { + mul_m4_v3(tc->mat, v); + } + + add_v3_v3(r_median, v); + i_accum++; + } + + mul_v3_fl(r_median, 1.0 / i_accum); + + // TargetSnapOffset(t, NULL); +} + +static void snap_target_grid_ensure(TransInfo *t) +{ + /* Only need to calculate once. */ + if ((t->tsnap.status & TARGET_GRID_INIT) == 0) { + if (t->data_type == TC_CURSOR_VIEW3D) { + /* Use a fallback when transforming the cursor. + * In this case the center is _not_ derived from the cursor which is being transformed. */ + copy_v3_v3(t->tsnap.snapTargetGrid, TRANS_DATA_CONTAINER_FIRST_SINGLE(t)->data->iloc); + } + else if (t->around == V3D_AROUND_CURSOR) { + /* Use a fallback for cursor selection, + * this isn't useful as a global center for absolute grid snapping + * since its not based on the position of the selection. */ + snap_target_median_impl(t, t->tsnap.snapTargetGrid); + } + else { + copy_v3_v3(t->tsnap.snapTargetGrid, t->center_global); + } + t->tsnap.status |= TARGET_GRID_INIT; + } +} + static void TargetSnapOffset(TransInfo *t, TransData *td) { if (t->spacetype == SPACE_NODE && td != NULL) { @@ -997,41 +1055,7 @@ static void TargetSnapMedian(TransInfo *t) { /* Only need to calculate once. */ if ((t->tsnap.status & TARGET_INIT) == 0) { - int i_accum = 0; - - t->tsnap.snapTarget[0] = 0; - t->tsnap.snapTarget[1] = 0; - t->tsnap.snapTarget[2] = 0; - - FOREACH_TRANS_DATA_CONTAINER (t, tc) { - TransData *td = tc->data; - int i; - float v[3]; - zero_v3(v); - - for (i = 0; i < tc->data_len && td->flag & TD_SELECTED; i++, td++) { - add_v3_v3(v, td->center); - } - - if (i == 0) { - /* Is this possible? */ - continue; - } - - mul_v3_fl(v, 1.0 / i); - - if (tc->use_local_mat) { - mul_m4_v3(tc->mat, v); - } - - add_v3_v3(t->tsnap.snapTarget, v); - i_accum++; - } - - mul_v3_fl(t->tsnap.snapTarget, 1.0 / i_accum); - - TargetSnapOffset(t, NULL); - + snap_target_median_impl(t, t->tsnap.snapTarget); t->tsnap.status |= TARGET_INIT; } } @@ -1431,28 +1455,10 @@ static void snap_grid_apply( TransInfo *t, const int max_index, const float grid_dist, const float loc[3], float r_out[3]) { BLI_assert(max_index <= 2); - const float *center_global = t->center_global; + snap_target_grid_ensure(t); + const float *center_global = t->tsnap.snapTargetGrid; const float *asp = t->aspect; - if (t->options & CTX_CURSOR) { - /* Note that we must already have called #transformCenter_from_type, otherwise - * we would be lazy-initializing data which is being transformed, - * causing the transformed cursor location to be used instead of it's initial location. */ - BLI_assert(t->center_cache[V3D_AROUND_CURSOR].is_set); - - /* Use a fallback when transforming the cursor. - * In this case the center is _not_ derived from the cursor which is being transformed. */ - const TransCenterData *cd = transformCenter_from_type(t, V3D_AROUND_CURSOR); - center_global = cd->global; - } - else if (t->around == V3D_AROUND_CURSOR) { - /* Use a fallback for cursor selection, - * this isn't useful as a global center for absolute grid snapping - * since its not based on the position of the selection. */ - const TransCenterData *cd = transformCenter_from_type(t, V3D_AROUND_CENTER_MEDIAN); - center_global = cd->global; - } - float in[3]; if (t->con.mode & CON_APPLY) { BLI_assert(t->tsnap.snapElem == 0); |