[Bf-blender-cvs] [c6e8353] master: Fix possible invalid-index use /w link/path select

Campbell Barton noreply at git.blender.org
Mon Dec 28 11:40:25 CET 2015


Commit: c6e835346259d6289edbd875fb19907e246d215d
Author: Campbell Barton
Date:   Mon Dec 28 21:26:02 2015 +1100
Branches: master
https://developer.blender.org/rBc6e835346259d6289edbd875fb19907e246d215d

Fix possible invalid-index use /w link/path select

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

M	source/blender/editors/mesh/editmesh_path.c
M	source/blender/editors/mesh/editmesh_select.c
M	source/blender/editors/mesh/editmesh_utils.c
M	source/blender/editors/mesh/mesh_intern.h

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

diff --git a/source/blender/editors/mesh/editmesh_path.c b/source/blender/editors/mesh/editmesh_path.c
index e28b3ce..0adf193 100644
--- a/source/blender/editors/mesh/editmesh_path.c
+++ b/source/blender/editors/mesh/editmesh_path.c
@@ -572,6 +572,7 @@ static int edbm_shortest_path_pick_invoke(bContext *C, wmOperator *op, const wmE
 	}
 
 	/* to support redo */
+	BM_mesh_elem_index_ensure(em->bm, ele_dst->head.htype);
 	int index = EDBM_elem_to_index_any(em, ele_dst);
 
 	RNA_int_set(op->ptr, "index", index);
diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c
index 8240f29..bcc8d6d 100644
--- a/source/blender/editors/mesh/editmesh_select.c
+++ b/source/blender/editors/mesh/editmesh_select.c
@@ -2648,10 +2648,7 @@ void MESH_OT_select_linked(wmOperatorType *ot)
 
 static int edbm_select_linked_pick_exec(bContext *C, wmOperator *op);
 
-static void edbm_select_linked_pick_ex(
-        BMEditMesh *em,
-        BMVert *eve, BMEdge *eed, BMFace *efa,
-        bool sel, int delimit)
+static void edbm_select_linked_pick_ex(BMEditMesh *em, BMElem *ele, bool sel, int delimit)
 {
 	BMesh *bm = em->bm;
 	BMWalker walker;
@@ -2664,7 +2661,8 @@ static void edbm_select_linked_pick_ex(
 
 	/* Note: logic closely matches 'edbm_select_linked_exec', keep in sync */
 
-	if ((em->selectmode & SCE_SELECT_VERTEX) && eve) {
+	if (ele->head.htype == BM_VERT) {
+		BMVert *eve = (BMVert *)ele;
 
 		BMW_init(&walker, bm, delimit ? BMW_LOOP_SHELL_WIRE : BMW_VERT_SHELL,
 		         BMW_MASK_NOP, delimit ? BMO_ELE_TAG : BMW_MASK_NOP, BMW_MASK_NOP,
@@ -2696,7 +2694,8 @@ static void edbm_select_linked_pick_ex(
 
 		EDBM_selectmode_flush(em);
 	}
-	else if ((em->selectmode & SCE_SELECT_EDGE) && eed) {
+	else if (ele->head.htype == BM_EDGE) {
+		BMEdge *eed = (BMEdge *)ele;
 
 		BMW_init(&walker, bm, delimit ? BMW_LOOP_SHELL_WIRE : BMW_VERT_SHELL,
 		         BMW_MASK_NOP, delimit ? BMO_ELE_TAG : BMW_MASK_NOP, BMW_MASK_NOP,
@@ -2728,7 +2727,8 @@ static void edbm_select_linked_pick_ex(
 
 		EDBM_selectmode_flush(em);
 	}
-	else if ((em->selectmode & SCE_SELECT_FACE) && efa) {
+	else if (ele->head.htype == BM_FACE) {
+		BMFace *efa = (BMFace *)ele;
 
 		BMW_init(&walker, bm, BMW_ISLAND,
 		         BMW_MASK_NOP, delimit ? BMO_ELE_TAG : BMW_MASK_NOP, BMW_MASK_NOP,
@@ -2795,10 +2795,13 @@ static int edbm_select_linked_pick_invoke(bContext *C, wmOperator *op, const wmE
 	int delimit = RNA_enum_get(op->ptr, "delimit");
 #endif
 
-	edbm_select_linked_pick_ex(em, eve, eed, efa, sel, delimit);
+	BMElem *ele = EDBM_elem_from_selectmode(em, eve, eed, efa);
+
+	edbm_select_linked_pick_ex(em, ele, sel, delimit);
 
 	/* to support redo */
-	index = EDBM_elem_to_index_any_selectmode(em, eve, eed, efa);
+	BM_mesh_elem_index_ensure(bm, ele->head.htype);
+	index = EDBM_elem_to_index_any(em, ele);
 
 	RNA_int_set(op->ptr, "index", index);
 
@@ -2814,9 +2817,6 @@ static int edbm_select_linked_pick_exec(bContext *C, wmOperator *op)
 	BMEditMesh *em = BKE_editmesh_from_object(obedit);
 	BMesh *bm = em->bm;
 	int index;
-	BMVert *eve = NULL;
-	BMEdge *eed = NULL;
-	BMFace *efa = NULL;
 	const bool sel = !RNA_boolean_get(op->ptr, "deselect");
 
 	index = RNA_int_get(op->ptr, "index");
@@ -2825,17 +2825,6 @@ static int edbm_select_linked_pick_exec(bContext *C, wmOperator *op)
 	}
 
 	BMElem *ele = EDBM_elem_from_index_any(em, index);
-	switch (ele->head.htype) {
-		case BM_VERT:
-			eve = (BMVert *)ele;
-			break;
-		case BM_EDGE:
-			eed = (BMEdge *)ele;
-			break;
-		case BM_FACE:
-			efa = (BMFace *)ele;
-			break;
-	}
 
 #ifdef USE_LINKED_SELECT_DEFAULT_HACK
 	int delimit = select_linked_delimit_default_from_op(op, em);
@@ -2843,7 +2832,7 @@ static int edbm_select_linked_pick_exec(bContext *C, wmOperator *op)
 	int delimit = RNA_enum_get(op->ptr, "delimit");
 #endif
 
-	edbm_select_linked_pick_ex(em, eve, eed, efa, sel, delimit);
+	edbm_select_linked_pick_ex(em, ele, sel, delimit);
 
 	WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit);
 
diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c
index b9f20b6..9cf80c8 100644
--- a/source/blender/editors/mesh/editmesh_utils.c
+++ b/source/blender/editors/mesh/editmesh_utils.c
@@ -1431,6 +1431,23 @@ int EDBM_view3d_poll(bContext *C)
 	return 0;
 }
 
+BMElem *EDBM_elem_from_selectmode(BMEditMesh *em, BMVert *eve, BMEdge *eed, BMFace *efa)
+{
+	BMElem *ele = NULL;
+
+	if ((em->selectmode & SCE_SELECT_VERTEX) && eve) {
+		ele = (BMElem *)eve;
+	}
+	else if ((em->selectmode & SCE_SELECT_EDGE) && eed) {
+		ele = (BMElem *)eed;
+	}
+	else if ((em->selectmode & SCE_SELECT_FACE) && efa) {
+		ele = (BMElem *)efa;
+	}
+
+	return ele;
+}
+
 /**
  * Used when we want to store a single index for any vert/edge/face.
  *
@@ -1459,24 +1476,6 @@ int EDBM_elem_to_index_any(BMEditMesh *em, BMElem *ele)
 	return index;
 }
 
-int EDBM_elem_to_index_any_selectmode(BMEditMesh *em, BMVert *eve, BMEdge *eed, BMFace *efa)
-{
-	BMElem *ele = NULL;
-
-	if ((em->selectmode & SCE_SELECT_VERTEX) && eve) {
-		ele = (BMElem *)eve;
-	}
-	else if ((em->selectmode & SCE_SELECT_EDGE) && eed) {
-		ele = (BMElem *)eed;
-	}
-	else if ((em->selectmode & SCE_SELECT_FACE) && efa) {
-		ele = (BMElem *)efa;
-	}
-
-	return ele ? EDBM_elem_to_index_any(em, ele) : -1;
-}
-
-
 BMElem *EDBM_elem_from_index_any(BMEditMesh *em, int index)
 {
 	BMesh *bm = em->bm;
diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h
index 05c339b..13ac0f6 100644
--- a/source/blender/editors/mesh/mesh_intern.h
+++ b/source/blender/editors/mesh/mesh_intern.h
@@ -75,10 +75,10 @@ void EDBM_stats_update(struct BMEditMesh *em);
 
 int  EDBM_view3d_poll(struct bContext *C);
 
-int            EDBM_elem_to_index_any(struct BMEditMesh *em, struct BMElem *ele);
-int            EDBM_elem_to_index_any_selectmode(
+struct BMElem *EDBM_elem_from_selectmode(
         struct BMEditMesh *em,
         struct BMVert *eve, struct BMEdge *eed, struct BMFace *efa);
+int            EDBM_elem_to_index_any(struct BMEditMesh *em, struct BMElem *ele);
 struct BMElem *EDBM_elem_from_index_any(struct BMEditMesh *em, int index);
 
 /* *** editmesh_add.c *** */




More information about the Bf-blender-cvs mailing list