Commit: 7fcdccbb6c42e8d4a2b5804e87698750460caaea
Author: Campbell Barton
Date:   Thu Apr 26 10:08:41 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB7fcdccbb6c42e8d4a2b5804e87698750460caaea

Fix vertex slide regression from multi-edit

- Invalid casts.
- Leaked memory on mode switching.

===================================================================

M       source/blender/editors/transform/transform.c
M       source/blender/editors/transform/transform.h
M       source/blender/editors/transform/transform_generics.c

===================================================================

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);
        }
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to