diff options
author | Campbell Barton <ideasman42@gmail.com> | 2015-12-28 13:26:02 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2015-12-28 13:26:02 +0300 |
commit | c6e835346259d6289edbd875fb19907e246d215d (patch) | |
tree | 5d19a077bf7a98f90ae40e2edc33207eefc08fea /source | |
parent | 641d4e2b7fc4fd563c3c2dd880c8c412dd35ce9a (diff) |
Fix possible invalid-index use /w link/path select
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/mesh/editmesh_path.c | 1 | ||||
-rw-r--r-- | source/blender/editors/mesh/editmesh_select.c | 37 | ||||
-rw-r--r-- | source/blender/editors/mesh/editmesh_utils.c | 35 | ||||
-rw-r--r-- | source/blender/editors/mesh/mesh_intern.h | 4 |
4 files changed, 33 insertions, 44 deletions
diff --git a/source/blender/editors/mesh/editmesh_path.c b/source/blender/editors/mesh/editmesh_path.c index e28b3ce3ca8..0adf19337e0 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 8240f29d7f9..bcc8d6d38f9 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 b9f20b6740f..9cf80c8f4cf 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 05c339b8eaf..13ac0f6770d 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 *** */ |