diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index b6d794a7812..28c2ea3b824 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -1041,11 +1041,13 @@ int transformEvent(TransInfo *t, const wmEvent *event) initEdgeSlide(t); /* if that fails, do vertex slide */ if (t->state == TRANS_CANCEL) { + resetTransModal(t); t->state = TRANS_STARTING; initVertSlide(t); } /* vert slide can fail on unconnected vertices (rare but possible) */ if (t->state == TRANS_CANCEL) { + resetTransModal(t); t->mode = TFM_TRANSLATION; t->state = TRANS_STARTING; restoreTransObjects(t); @@ -6937,7 +6939,7 @@ static eRedrawFlag handleEventEdgeSlide(struct TransInfo *t, const struct wmEven static void drawEdgeSlide(TransInfo *t) { if ((t->mode == TFM_EDGE_SLIDE) && TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data) { - EdgeSlideParams *slp = t->custom.mode.data; + const EdgeSlideParams *slp = t->custom.mode.data; EdgeSlideData *sld = TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data; const bool is_clamp = !(t->flag & T_ALT_TRANSFORM); @@ -7189,6 +7191,7 @@ static void applyEdgeSlide(TransInfo *t, const int UNUSED(mval[2])) static void calcVertSlideCustomPoints(struct TransInfo *t) { + VertSlideParams *slp = t->custom.mode.data; VertSlideData *sld = TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data; TransDataVertSlideVert *sv = &sld->sv[sld->curr_sv_index]; @@ -7206,7 +7209,7 @@ static void calcVertSlideCustomPoints(struct TransInfo *t) ARRAY_SET_ITEMS(mval_start, co_orig_2d[0] + mval_ofs[0], co_orig_2d[1] + mval_ofs[1]); ARRAY_SET_ITEMS(mval_end, co_curr_2d[0] + mval_ofs[0], co_curr_2d[1] + mval_ofs[1]); - if (sld->flipped && sld->use_even) { + if (slp->flipped && slp->use_even) { setCustomPoints(t, &t->mouse, mval_start, mval_end); } else { @@ -7567,6 +7570,7 @@ static eRedrawFlag handleEventVertSlide(struct TransInfo *t, const struct wmEven static void drawVertSlide(TransInfo *t) { if ((t->mode == TFM_VERT_SLIDE) && TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data) { + const VertSlideParams *slp = t->custom.mode.data; VertSlideData *sld = TRANS_DATA_CONTAINER_FIRST_OK(t)->custom.mode.data; const bool is_clamp = !(t->flag & T_ALT_TRANSFORM); @@ -7623,7 +7627,7 @@ static void drawVertSlide(TransInfo *t) glPointSize(ctrl_size); immBegin(GWN_PRIM_POINTS, 1); - immVertex3fv(shdr_pos, (sld->flipped && sld->use_even) ? + immVertex3fv(shdr_pos, (slp->flipped && slp->use_even) ? curr_sv->co_link_orig_3d[curr_sv->co_link_curr] : curr_sv->co_orig_3d); immEnd(); @@ -7683,15 +7687,18 @@ static void drawVertSlide(TransInfo *t) static void doVertSlide(TransInfo *t, float perc) { + VertSlideParams *slp = t->custom.mode.data; + + slp->perc = perc; + FOREACH_TRANS_DATA_CONTAINER (t, tc) { VertSlideData *sld = tc->custom.mode.data; TransDataVertSlideVert *svlist = sld->sv, *sv; int i; - sld->perc = perc; sv = svlist; - if (sld->use_even == false) { + 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); } @@ -7709,7 +7716,7 @@ static void doVertSlide(TransInfo *t, float perc) edge_len = normalize_v3(dir); if (edge_len > FLT_EPSILON) { - if (sld->flipped) { + if (slp->flipped) { madd_v3_v3v3fl(sv->v->co, sv->co_link_orig_3d[sv->co_link_curr], dir, -tperc); } else { @@ -7729,7 +7736,7 @@ static void applyVertSlide(TransInfo *t, const int UNUSED(mval[2])) char str[UI_MAX_DRAW_STR]; size_t ofs = 0; float final; - VertSlideData *slp = t->custom.mode.data; + VertSlideParams *slp = t->custom.mode.data; const bool flipped = slp->flipped; const bool use_even = slp->use_even; const bool is_clamp = !(t->flag & T_ALT_TRANSFORM); diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index f642dfc27d9..19e023b467d 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -307,11 +307,6 @@ typedef struct VertSlideData { SlideOrigData orig_data; - float perc; - - bool use_even; - bool flipped; - int curr_sv_index; /* result of ED_view3d_ob_project_mat_get */ @@ -800,6 +795,7 @@ void setInputPostFct(MouseInput *mi, void (*post)(struct TransInfo *t, float val void initTransDataContainers_FromObjectData(TransInfo *t); void initTransInfo(struct bContext *C, TransInfo *t, struct wmOperator *op, const struct wmEvent *event); +void freeTransCustomDataForMode(TransInfo *t); void postTrans(struct bContext *C, TransInfo *t); void resetTransModal(TransInfo *t); void resetTransRestrictions(TransInfo *t); diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 08f54a75dcf..e0a4fb35d47 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -1142,18 +1142,7 @@ void drawLine(TransInfo *t, const float center[3], const float dir[3], char axis */ void resetTransModal(TransInfo *t) { - FOREACH_TRANS_DATA_CONTAINER (t, tc) { - if (t->mode == TFM_EDGE_SLIDE) { - freeEdgeSlideVerts(t, tc, &tc->custom.mode); - } - else if (t->mode == TFM_VERT_SLIDE) { - freeVertSlideVerts(t, tc, &tc->custom.mode); - } - else { - /* no need to keep looping... */ - break; - } - } + freeTransCustomDataForMode(t); } void resetTransRestrictions(TransInfo *t) @@ -1577,19 +1566,41 @@ void initTransInfo(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve initNumInput(&t->num); } + +static void freeTransCustomData( + TransInfo *t, TransDataContainer *tc, + TransCustomData *custom_data) +{ + if (custom_data->free_cb) { + /* Can take over freeing t->data and data_2d etc... */ + custom_data->free_cb(t, tc, custom_data); + BLI_assert(custom_data->data == NULL); + } + else if ((custom_data->data != NULL) && custom_data->use_free) { + MEM_freeN(custom_data->data); + custom_data->data = NULL; + } + /* In case modes are switched in the same transform session. */ + custom_data->free_cb = false; + custom_data->use_free = false; +} + static void freeTransCustomDataContainer(TransInfo *t, TransDataContainer *tc, TransCustomDataContainer *tcdc) { TransCustomData *custom_data = &tcdc->first_elem; for (int i = 0; i < TRANS_CUSTOM_DATA_ELEM_MAX; i++, custom_data++) { - if (custom_data->free_cb) { - /* Can take over freeing t->data and data_2d etc... */ - custom_data->free_cb(t, tc, custom_data); - BLI_assert(custom_data->data == NULL); - } - else if ((custom_data->data != NULL) && custom_data->use_free) { - MEM_freeN(custom_data->data); - custom_data->data = NULL; - } + freeTransCustomData(t, tc, custom_data); + } +} + +/** + * Needed for mode switching. + */ +void freeTransCustomDataForMode(TransInfo *t) +{ + freeTransCustomData(t, NULL, &t->custom.mode); + FOREACH_TRANS_DATA_CONTAINER (t, tc) { + freeTransCustomData(t, tc, &tc->custom.mode); } }