[Bf-blender-cvs] [d020b4c] master: BMesh: extract int/bmesh element access funcs.

Campbell Barton noreply at git.blender.org
Sun Dec 27 09:56:39 CET 2015


Commit: d020b4ca91e1097573a439fdab16e707922fd5a8
Author: Campbell Barton
Date:   Sun Dec 27 18:03:20 2015 +1100
Branches: master
https://developer.blender.org/rBd020b4ca91e1097573a439fdab16e707922fd5a8

BMesh: extract int/bmesh element access funcs.

Support getting an vert/edge/face from a single index, useful for operator redo.

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

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_select.c b/source/blender/editors/mesh/editmesh_select.c
index fba7755..8240f29 100644
--- a/source/blender/editors/mesh/editmesh_select.c
+++ b/source/blender/editors/mesh/editmesh_select.c
@@ -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
diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c
index 4a9be49..656869f 100644
--- a/source/blender/editors/mesh/editmesh_utils.c
+++ b/source/blender/editors/mesh/editmesh_utils.c
@@ -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 */
diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h
index 3b018ea..05c339b 100644
--- a/source/blender/editors/mesh/mesh_intern.h
+++ b/source/blender/editors/mesh/mesh_intern.h
@@ -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);




More information about the Bf-blender-cvs mailing list