[Bf-blender-cvs] [7fcdccbb6c4] blender2.8: Fix vertex slide regression from multi-edit

Campbell Barton noreply at git.blender.org
Thu Apr 26 10:18:39 CEST 2018


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



More information about the Bf-blender-cvs mailing list