BMesh: extract int/bmesh element access funcs.
Support getting an vert/edge/face from a single index, useful for operator redo.
This commit is contained in:
parent
f820c45534
commit
d020b4ca91
|
@ -2798,21 +2798,7 @@ static int edbm_select_linked_pick_invoke(bContext *C, wmOperator *op, const wmE
|
|||
edbm_select_linked_pick_ex(em, eve, eed, efa, sel, delimit);
|
||||
|
||||
/* to support redo */
|
||||
if ((em->selectmode & SCE_SELECT_VERTEX) && eve) {
|
||||
BM_mesh_elem_index_ensure(bm, BM_VERT);
|
||||
index = BM_elem_index_get(eve);
|
||||
}
|
||||
else if ((em->selectmode & SCE_SELECT_EDGE) && eed) {
|
||||
BM_mesh_elem_index_ensure(bm, BM_EDGE);
|
||||
index = BM_elem_index_get(eed) + bm->totvert;
|
||||
}
|
||||
else if ((em->selectmode & SCE_SELECT_FACE) && efa) {
|
||||
BM_mesh_elem_index_ensure(bm, BM_FACE);
|
||||
index = BM_elem_index_get(efa) + bm->totvert + bm->totedge;
|
||||
}
|
||||
else {
|
||||
index = -1;
|
||||
}
|
||||
index = EDBM_elem_to_index_any_selectmode(em, eve, eed, efa);
|
||||
|
||||
RNA_int_set(op->ptr, "index", index);
|
||||
|
||||
|
@ -2838,16 +2824,17 @@ static int edbm_select_linked_pick_exec(bContext *C, wmOperator *op)
|
|||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
if (index < bm->totvert) {
|
||||
eve = BM_vert_at_index_find_or_table(bm, index);
|
||||
}
|
||||
else if (index < (bm->totvert + bm->totedge)) {
|
||||
index -= bm->totvert;
|
||||
eed = BM_edge_at_index_find_or_table(bm, index);
|
||||
}
|
||||
else if (index < (bm->totvert + bm->totedge + bm->totface)) {
|
||||
index -= (bm->totvert + bm->totedge);
|
||||
efa = BM_face_at_index_find_or_table(bm, index);
|
||||
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
|
||||
|
|
|
@ -1431,7 +1431,70 @@ int EDBM_view3d_poll(bContext *C)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used when we want to store a single index for any vert/edge/face.
|
||||
*
|
||||
* Intended for use with operators.
|
||||
*/
|
||||
int EDBM_elem_to_index_any(BMEditMesh *em, BMElem *ele)
|
||||
{
|
||||
BMesh *bm = em->bm;
|
||||
int index = BM_elem_index_get(ele);
|
||||
|
||||
if (ele->head.htype == BM_VERT) {
|
||||
BLI_assert(!(bm->elem_index_dirty & BM_VERT));
|
||||
}
|
||||
else if (ele->head.htype == BM_EDGE) {
|
||||
BLI_assert(!(bm->elem_index_dirty & BM_EDGE));
|
||||
index += bm->totvert;
|
||||
}
|
||||
else if (ele->head.htype == BM_FACE) {
|
||||
BLI_assert(!(bm->elem_index_dirty & BM_FACE));
|
||||
index += bm->totvert + bm->totedge;
|
||||
}
|
||||
else {
|
||||
BLI_assert(0);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
if (index < bm->totvert) {
|
||||
return (BMElem *)BM_vert_at_index_find_or_table(bm, index);
|
||||
}
|
||||
index -= bm->totvert;
|
||||
if (index < bm->totedge) {
|
||||
return (BMElem *)BM_edge_at_index_find_or_table(bm, index);
|
||||
}
|
||||
index -= bm->totedge;
|
||||
if (index < bm->totface) {
|
||||
return (BMElem *)BM_face_at_index_find_or_table(bm, index);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/* BMBVH functions */
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
|
||||
struct BMEditMesh;
|
||||
struct BMOperator;
|
||||
struct BMElem;
|
||||
struct EnumPropertyItem;
|
||||
struct bContext;
|
||||
struct wmKeyConfig;
|
||||
|
@ -74,6 +75,11 @@ 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 BMEditMesh *em,
|
||||
struct BMVert *eve, struct BMEdge *eed, struct BMFace *efa);
|
||||
struct BMElem *EDBM_elem_from_index_any(struct BMEditMesh *em, int index);
|
||||
|
||||
/* *** editmesh_add.c *** */
|
||||
void MESH_OT_primitive_plane_add(struct wmOperatorType *ot);
|
||||
|
|
Loading…
Reference in New Issue