[Bf-blender-cvs] [06305e5ca80] master: Cleanup/refactor: split Edge and Vert Slide code into more specific functions
Germano Cavalcante
noreply at git.blender.org
Sat Feb 4 03:02:36 CET 2023
Commit: 06305e5ca800c048c69f18a24951f4bc87305610
Author: Germano Cavalcante
Date: Fri Feb 3 11:29:16 2023 -0300
Branches: master
https://developer.blender.org/rB06305e5ca800c048c69f18a24951f4bc87305610
Cleanup/refactor: split Edge and Vert Slide code into more specific functions
This makes the code more readable.
In this commit also the `int curr_side_unclamp` member was moved to
`EdgeSlideParams` as it is a common value for all "Containers".
===================================================================
M source/blender/editors/transform/transform_mode_edge_slide.c
M source/blender/editors/transform/transform_mode_vert_slide.c
===================================================================
diff --git a/source/blender/editors/transform/transform_mode_edge_slide.c b/source/blender/editors/transform/transform_mode_edge_slide.c
index f2ba8c4bd4d..df081180118 100644
--- a/source/blender/editors/transform/transform_mode_edge_slide.c
+++ b/source/blender/editors/transform/transform_mode_edge_slide.c
@@ -66,14 +66,14 @@ typedef struct EdgeSlideData {
int mval_start[2], mval_end[2];
int curr_sv_index;
-
- /** when un-clamped - use this index: #TransDataEdgeSlideVert.dir_side */
- int curr_side_unclamp;
} EdgeSlideData;
typedef struct EdgeSlideParams {
float perc;
+ /** when un-clamped - use this index: #TransDataEdgeSlideVert.dir_side */
+ int curr_side_unclamp;
+
bool use_even;
bool flipped;
} EdgeSlideParams;
@@ -1198,7 +1198,7 @@ void drawEdgeSlide(TransInfo *t)
immEnd();
}
else if (is_clamp == false) {
- const int side_index = sld->curr_side_unclamp;
+ const int side_index = slp->curr_side_unclamp;
TransDataEdgeSlideVert *sv;
int i;
const int alpha_shade = -160;
@@ -1235,7 +1235,7 @@ void drawEdgeSlide(TransInfo *t)
const int alpha_shade = -160;
float co_dir[3];
- add_v3_v3v3(co_dir, curr_sv->v_co_orig, curr_sv->dir_side[sld->curr_side_unclamp]);
+ add_v3_v3v3(co_dir, curr_sv->v_co_orig, curr_sv->dir_side[slp->curr_side_unclamp]);
GPU_line_width(line_size);
immUniformThemeColorShadeAlpha(TH_EDGE_SELECT, 80, alpha_shade);
@@ -1284,7 +1284,7 @@ static void edge_slide_snap_apply(TransInfo *t, float *value)
side_index = perc < 0.0f;
}
else {
- side_index = sld_active->curr_side_unclamp;
+ side_index = slp->curr_side_unclamp;
}
}
else {
@@ -1336,57 +1336,30 @@ static void edge_slide_snap_apply(TransInfo *t, float *value)
*value = perc;
}
-static void doEdgeSlide(TransInfo *t, float perc)
+static void edge_slide_apply_elem(const TransDataEdgeSlideVert *sv,
+ const float fac,
+ const float curr_length_fac,
+ const int curr_side_unclamp,
+ const bool use_clamp,
+ const bool use_even,
+ const bool use_flip,
+ float r_co[3])
{
- EdgeSlideParams *slp = t->custom.mode.data;
- EdgeSlideData *sld_active = edgeSlideFirstGet(t);
-
- slp->perc = perc;
+ copy_v3_v3(r_co, sv->v_co_orig);
- if (slp->use_even == false) {
- const bool is_clamp = !(t->flag & T_ALT_TRANSFORM);
- if (is_clamp) {
- const int side_index = (perc < 0.0f);
- const float perc_final = fabsf(perc);
- FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- EdgeSlideData *sld = tc->custom.mode.data;
-
- if (sld == NULL) {
- continue;
- }
-
- TransDataEdgeSlideVert *sv = sld->sv;
- for (int i = 0; i < sld->totsv; i++, sv++) {
- madd_v3_v3v3fl(sv->v->co, sv->v_co_orig, sv->dir_side[side_index], perc_final);
- }
- sld->curr_side_unclamp = side_index;
- }
+ if (use_even == false) {
+ if (use_clamp) {
+ const int side_index = (fac < 0.0f);
+ const float fac_final = fabsf(fac);
+ madd_v3_v3fl(r_co, sv->dir_side[side_index], fac_final);
}
else {
- const float perc_init = fabsf(perc) *
- ((sld_active->curr_side_unclamp == (perc < 0.0f)) ? 1 : -1);
- const int side_index = sld_active->curr_side_unclamp;
- FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- EdgeSlideData *sld = tc->custom.mode.data;
-
- if (sld == NULL) {
- continue;
- }
-
- TransDataEdgeSlideVert *sv = sld->sv;
- for (int i = 0; i < sld->totsv; i++, sv++) {
- float dir_flip[3];
- float perc_final = perc_init;
- if (!is_zero_v3(sv->dir_side[side_index])) {
- copy_v3_v3(dir_flip, sv->dir_side[side_index]);
- }
- else {
- copy_v3_v3(dir_flip, sv->dir_side[!side_index]);
- perc_final *= -1;
- }
- madd_v3_v3v3fl(sv->v->co, sv->v_co_orig, dir_flip, perc_final);
- }
+ int side_index = curr_side_unclamp;
+ if (is_zero_v3(sv->dir_side[side_index])) {
+ side_index = !side_index;
}
+ const float fac_final = (side_index == (fac < 0.0f) ? fabsf(fac) : -fabsf(fac));
+ madd_v3_v3fl(r_co, sv->dir_side[side_index], fac_final);
}
}
else {
@@ -1400,36 +1373,55 @@ static void doEdgeSlide(TransInfo *t, float perc)
* is the same as the distance between the original vert locations,
* same goes for the lines below.
*/
- TransDataEdgeSlideVert *curr_sv = &sld_active->sv[sld_active->curr_sv_index];
- const float curr_length_perc = curr_sv->edge_len *
- (((slp->flipped ? perc : -perc) + 1.0f) / 2.0f);
-
- float co_a[3];
- float co_b[3];
+ if (sv->edge_len > FLT_EPSILON) {
+ float co_a[3], co_b[3];
+ const float fac = min_ff(sv->edge_len, curr_length_fac) / sv->edge_len;
- FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- EdgeSlideData *sld = tc->custom.mode.data;
+ add_v3_v3v3(co_a, sv->v_co_orig, sv->dir_side[0]);
+ add_v3_v3v3(co_b, sv->v_co_orig, sv->dir_side[1]);
- if (sld == NULL) {
- continue;
+ if (use_flip) {
+ interp_line_v3_v3v3v3(r_co, co_b, sv->v_co_orig, co_a, fac);
}
+ else {
+ interp_line_v3_v3v3v3(r_co, co_a, sv->v_co_orig, co_b, fac);
+ }
+ }
+ }
+}
- TransDataEdgeSlideVert *sv = sld->sv;
- for (int i = 0; i < sld->totsv; i++, sv++) {
- if (sv->edge_len > FLT_EPSILON) {
- const float fac = min_ff(sv->edge_len, curr_length_perc) / sv->edge_len;
+static void doEdgeSlide(TransInfo *t, float perc)
+{
+ EdgeSlideParams *slp = t->custom.mode.data;
+ EdgeSlideData *sld_active = edgeSlideFirstGet(t);
- add_v3_v3v3(co_a, sv->v_co_orig, sv->dir_side[0]);
- add_v3_v3v3(co_b, sv->v_co_orig, sv->dir_side[1]);
+ slp->perc = perc;
- if (slp->flipped) {
- interp_line_v3_v3v3v3(sv->v->co, co_b, sv->v_co_orig, co_a, fac);
- }
- else {
- interp_line_v3_v3v3v3(sv->v->co, co_a, sv->v_co_orig, co_b, fac);
- }
- }
- }
+ const bool use_clamp = !(t->flag & T_ALT_TRANSFORM);
+ const bool use_even = slp->use_even;
+ const bool use_flip = slp->flipped;
+
+ const int curr_side_unclamp = slp->curr_side_unclamp;
+ float curr_length_fac = 0.0f;
+ if (use_even) {
+ TransDataEdgeSlideVert *sv_active = &sld_active->sv[sld_active->curr_sv_index];
+ curr_length_fac = sv_active->edge_len * (((use_flip ? perc : -perc) + 1.0f) / 2.0f);
+ }
+ else if (use_clamp) {
+ slp->curr_side_unclamp = (perc < 0.0f);
+ }
+
+ FOREACH_TRANS_DATA_CONTAINER (t, tc) {
+ EdgeSlideData *sld = tc->custom.mode.data;
+
+ if (sld == NULL) {
+ continue;
+ }
+
+ TransDataEdgeSlideVert *sv = sld->sv;
+ for (int i = 0; i < sld->totsv; i++, sv++) {
+ edge_slide_apply_elem(
+ sv, perc, curr_length_fac, curr_side_unclamp, use_clamp, use_even, use_flip, sv->v->co);
}
}
}
diff --git a/source/blender/editors/transform/transform_mode_vert_slide.c b/source/blender/editors/transform/transform_mode_vert_slide.c
index f6e8c64af8f..df96287af7c 100644
--- a/source/blender/editors/transform/transform_mode_vert_slide.c
+++ b/source/blender/editors/transform/transform_mode_vert_slide.c
@@ -466,53 +466,58 @@ void drawVertSlide(TransInfo *t)
}
}
+static void vert_slide_apply_elem(const TransDataVertSlideVert *sv,
+ const float perc,
+ const bool use_even,
+ const bool use_flip,
+ float r_co[3])
+{
+ if (use_even == false) {
+ interp_v3_v3v3(r_co, sv->co_orig_3d, sv->co_link_orig_3d[sv->co_link_curr], perc);
+ }
+ else {
+ float dir[3];
+ sub_v3_v3v3(dir, sv->co_link_orig_3d[sv->co_link_curr], sv->co_orig_3d);
+ float edge_len = normalize_v3(dir);
+ if (edge_len > FLT_EPSILON) {
+ if (use_flip) {
+ madd_v3_v3v3fl(r_co, sv->co_link_orig_3d[sv->co_link_curr], dir, -perc);
+ }
+ else {
+ madd_v3_v3v3fl(r_co, sv->co_orig_3d, dir, perc);
+ }
+ }
+ else {
+ copy_v3_v3(r_co, sv->co_orig_3d);
+ }
+ }
+}
+
static void doVertSlide(TransInfo *t, float perc)
{
VertSlideParams *slp = t->custom.mode.data;
slp->perc = perc;
+ const bool use_even = slp->use_even;
+
FOREACH_TRANS_DATA_CONTAINER (t, tc) {
VertSlideData *sld = tc->custom.mode.data;
if (sld == NULL) {
continue;
}
- TransDataVertSlideVert *svlist = sld->sv, *sv;
- int i;
-
- sv = svlist;
-
- if (slp->use_even == false) {
- for (i = 0; i < sld->totsv; i++, sv++) {
- interp_v3_v3v3(sv->v->co, sv->co_orig_3d, sv->co_link_orig_3d[sv->co_link_curr], perc);
- }
- }
- else {
+ float tperc = perc;
+ if (use_even) {
TransDataVertSlideVert *sv_curr = &sld->sv[sld->curr_sv_index];
const float edge_len_curr = len_v3v3(sv_curr->co_orig_3d,
sv_curr->co_link_orig_3d[sv_curr->co_link_curr]);
- const float tperc = perc * edge_len_curr;
-
- for (i = 0; i < sld->totsv; i++, sv++) {
- float edge_len;
- float dir[3];
-
- sub_v3_v3v3(dir, sv->co_link_orig_3d[sv->co_link_curr], sv->co_orig_3d);
- edge_len = normalize_v3(dir);
+ tperc *= edge_len_curr;
+ }
- if (edge_len > FLT_EPSILON) {
- if (slp->flipped) {
- madd_v3_v3v3fl(sv->v->co, sv->co_link_orig_3d[sv->co_link_curr], dir, -tperc);
- }
- else {
- madd_v3_v3v3fl(sv->v->co, sv->co_orig_3d, dir, tperc);
- }
- }
- else {
- copy_v3_v3(sv->v->co, sv->co_orig_3d);
- }
- }
+ TransDataVertSlideVert *sv = sld->sv;
+ for (int i = 0; i < sld->totsv; i++, sv++) {
+ vert_slide_apply_elem(sv, tperc, use_even, slp->flipped, sv->v->co);
}
}
}
More information about the Bf-blender-cvs
mailing list