[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22218] branches/bmesh/blender/source/ blender: bmeshafied the hide/reveal code.

Joseph Eagar joeedh at gmail.com
Wed Aug 5 08:06:59 CEST 2009


Revision: 22218
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22218
Author:   joeedh
Date:     2009-08-05 08:06:58 +0200 (Wed, 05 Aug 2009)

Log Message:
-----------
bmeshafied the hide/reveal code.  created a set of API functions for hiding/revealing elements in bmesh_marking.c.  main function is BM_Hide, which can hide or reveal an element (vert/edge/face, NOT loops, obviously), and will handle any flushing necassary.  also renamed BM_Is_Selected to BM_Selected, though I may get rid of that function altogether.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_marking.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
    branches/bmesh/blender/source/blender/bmesh/editmesh_tools.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
    branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_loop.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h	2009-08-05 02:40:51 UTC (rev 22217)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h	2009-08-05 06:06:58 UTC (rev 22218)
@@ -30,6 +30,10 @@
 	ele = BMIter_New(iter, bm, type, data); \
 	for ( ; ele; ele=BMIter_Step(iter))
 
+#define BM_ITER_SELECT(ele, iter, bm, type, data)\
+for (ele = BMIter_New(iter, bm, type, data); ele; ele=BMIter_Step(iter)) {\
+	if (BM_TestHFlag(ele, BM_HIDDEN) || !BM_TestHFlag(ele, BM_SELECT)) continue;
+
 /*these are topological iterators.*/
 #define BM_EDGES_OF_VERT 			4
 #define BM_FACES_OF_VERT 			5

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_marking.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_marking.h	2009-08-05 02:40:51 UTC (rev 22217)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_marking.h	2009-08-05 06:06:58 UTC (rev 22218)
@@ -8,18 +8,30 @@
 	void *data;
 } BMEditSelection;
 
+/*geometry hiding code*/
+void BM_Hide(BMesh *bm, void *element, int hide);
+void BM_Hide_Vert(BMesh *bm, BMVert *v, int hide);
+void BM_Hide_Edge(BMesh *bm, BMEdge *e, int hide);
+void BM_Hide_Face(BMesh *bm, BMFace *f, int hide);
+
 /*Selection code*/
+void BM_Select(struct BMesh *bm, void *element, int select);
+/*I don't use this function anywhere, been using BM_TestHFlag instead.
+  Need to decide either to keep it and convert everything over, or
+  chuck it.*/
+int BM_Selected(BMesh *bm, void *element);
+
+/*individual element select functions, BM_Select is a shortcut for these
+  that automatically detects which one to use*/
 void BM_Select_Vert(struct BMesh *bm, struct BMVert *v, int select);
 void BM_Select_Edge(struct BMesh *bm, struct BMEdge *e, int select);
 void BM_Select_Face(struct BMesh *bm, struct BMFace *f, int select);
+
 void BM_Selectmode_Set(struct BMesh *bm, int selectmode);
 
 /*counts number of elements with flag set*/
-int BM_CountFlag(struct BMesh *bm, int type, int flag);
+int BM_CountFlag(struct BMesh *bm, int type, int flag, int respectflag);
 
-void BM_Select(struct BMesh *bm, void *element, int select);
-int BM_Is_Selected(BMesh *bm, void *element);
-
 /*edit selection stuff*/
 void BM_editselection_center(BMesh *bm, float *center, BMEditSelection *ese);
 void BM_editselection_normal(float *normal, BMEditSelection *ese);

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h	2009-08-05 02:40:51 UTC (rev 22217)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h	2009-08-05 06:06:58 UTC (rev 22218)
@@ -234,7 +234,8 @@
 void BMO_UnHeaderFlag_Buffer(struct BMesh *bm, struct BMOperator *op, char *slotname, int flag);
 
 /*puts every element of type type (which is a bitmask) with header flag 
-  flag, into a slot.*/
+  flag, into a slot.  note: ignores hidden elements (e.g. elements with
+  header flag BM_HIDDEN set).*/
 void BMO_HeaderFlag_To_Slot(struct BMesh *bm, struct BMOperator *op, char *slotname, int flag, int type);
 
 /*counts number of elements inside a slot array.*/

Modified: branches/bmesh/blender/source/blender/bmesh/editmesh_tools.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/editmesh_tools.c	2009-08-05 02:40:51 UTC (rev 22217)
+++ branches/bmesh/blender/source/blender/bmesh/editmesh_tools.c	2009-08-05 06:06:58 UTC (rev 22218)
@@ -2435,13 +2435,13 @@
 
 	BMO_Init_Op(&subdop, BMOP_ESUBDIVIDE);
 	for (tot=0, bed=BMIter_New(&iter, bm, BM_EDGES, NULL); bed; bed=BMIter_Step(&iter)) {
-		if (BM_Is_Selected(bm, bed)) tot++;
+		if (BM_Selected(bm, bed)) tot++;
 	}
 	
 	list = MEM_callocN(sizeof(void*)*tot, "vert ptr list");
 
 	for (tot=0, bed=BMIter_New(&iter, bm, BM_EDGES, NULL); bed; bed=BMIter_Step(&iter)) {
-		if (BM_Is_Selected(bm, bed)) list[tot++] = bed;
+		if (BM_Selected(bm, bed)) list[tot++] = bed;
 	}
 	
 	BMO_Set_PntBuf(&subdop, BMOP_ESUBDIVIDE_EDGES, list, tot);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c	2009-08-05 02:40:51 UTC (rev 22217)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c	2009-08-05 06:06:58 UTC (rev 22218)
@@ -392,7 +392,7 @@
 		return;
 
 	/*First we copy select*/
-	if(BM_Is_Selected(source_mesh, source)) BM_Select(target_mesh, target, 1);
+	if(BM_Selected(source_mesh, source)) BM_Select(target_mesh, target, 1);
 	
 	/*Now we copy flags*/
 	theader->flag = sheader->flag;

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2009-08-05 02:40:51 UTC (rev 22217)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2009-08-05 06:06:58 UTC (rev 22218)
@@ -282,7 +282,7 @@
 }
 
 
-int BM_CountFlag(struct BMesh *bm, int type, int flag)
+int BM_CountFlag(struct BMesh *bm, int type, int flag, int respecthide)
 {
 	BMHeader *head;
 	BMIter iter;
@@ -290,16 +290,19 @@
 
 	if (type & BM_VERT) {
 		for (head = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL); head; head=BMIter_Step(&iter)) {
+			if (respecthide && BM_TestHFlag(head, BM_HIDDEN)) continue;
 			if (head->flag & flag) tot++;
 		}
 	}
 	if (type & BM_EDGE) {
 		for (head = BMIter_New(&iter, bm, BM_EDGES_OF_MESH, NULL); head; head=BMIter_Step(&iter)) {
+			if (respecthide && BM_TestHFlag(head, BM_HIDDEN)) continue;
 			if (head->flag & flag) tot++;
 		}
 	}
 	if (type & BM_FACE) {
 		for (head = BMIter_New(&iter, bm, BM_FACES_OF_MESH, NULL); head; head=BMIter_Step(&iter)) {
+			if (respecthide && BM_TestHFlag(head, BM_HIDDEN)) continue;
 			if (head->flag & flag) tot++;
 		}
 	}
@@ -317,7 +320,7 @@
 	else if(head->type == BM_FACE) BM_Select_Face(bm, (BMFace*)element, select);
 }
 
-int BM_Is_Selected(BMesh *bm, void *element)
+int BM_Selected(BMesh *bm, void *element)
 {
 	BMHeader *head = element;
 	return BM_TestHFlag(head, BM_SELECT);
@@ -500,3 +503,103 @@
 		ese = nextese;
 	}
 }
+
+/***************** Mesh Hiding stuff *************/
+
+#define SETHIDE(ele) hide ? BM_SetHFlag(ele, BM_HIDDEN) : BM_ClearHFlag(ele, BM_HIDDEN);
+
+static void vert_flush_hide(BMesh *bm, BMVert *v) {
+	BMIter iter;
+	BMEdge *e;
+
+	BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) {
+		if (!BM_TestHFlag(e, BM_HIDDEN))
+			return;
+	}
+
+	BM_SetHFlag(v, BM_HIDDEN);
+}
+
+static void edge_flush_hide(BMesh *bm, BMEdge *e) {
+	BMIter iter;
+	BMFace *f;
+
+	BM_ITER(f, &iter, bm, BM_FACES_OF_EDGE, e) {
+		if (!BM_TestHFlag(f, BM_HIDDEN))
+			return;
+	}
+
+	BM_SetHFlag(e, BM_HIDDEN);
+}
+
+void BM_Hide_Vert(BMesh *bm, BMVert *v, int hide)
+{
+	/*vert hiding: vert + surrounding edges and faces*/
+	BMIter iter, fiter;
+	BMEdge *e;
+	BMFace *f;
+
+	SETHIDE(v);
+
+	BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) {
+		SETHIDE(e);
+
+		BM_ITER(f, &fiter, bm, BM_FACES_OF_EDGE, e) {
+			SETHIDE(f);
+		}
+	}
+}
+
+void BM_Hide_Edge(BMesh *bm, BMEdge *e, int hide)
+{
+	BMIter iter;
+	BMFace *f;
+	BMVert *v;
+
+	/*edge hiding: faces around the edge*/
+	BM_ITER(f, &iter, bm, BM_FACES_OF_EDGE, e) {
+		SETHIDE(f);
+	}
+	
+	SETHIDE(e);
+
+	/*hide vertices if necassary*/
+	vert_flush_hide(bm, e->v1);
+	vert_flush_hide(bm, e->v2);
+}
+
+void BM_Hide_Face(BMesh *bm, BMFace *f, int hide)
+{
+	BMIter iter;
+	BMLoop *l;
+
+	/**/
+	SETHIDE(f);
+
+	BM_ITER(l, &iter, bm, BM_LOOPS_OF_FACE, f) {
+		edge_flush_hide(bm, l->e);
+	}
+
+	BM_ITER(l, &iter, bm, BM_LOOPS_OF_FACE, f) {
+		vert_flush_hide(bm, l->v);
+	}
+}
+
+void BM_Hide(BMesh *bm, void *element, int hide)
+{
+	BMHeader *h = element;
+
+	switch (h->type) {
+		case BM_VERT:
+			BM_Hide_Vert(bm, element, hide);
+			break;
+		case BM_EDGE:
+			BM_Hide_Edge(bm, element, hide);
+			break;
+		case BM_FACE:
+			BM_Hide_Face(bm, element, hide);
+			break;
+	}
+}
+
+

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2009-08-05 02:40:51 UTC (rev 22217)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2009-08-05 06:06:58 UTC (rev 22218)
@@ -649,14 +649,14 @@
 	BMOpSlot *output = BMO_GetSlot(op, slotname);
 	int totelement=0, i=0;
 	
-	totelement = BM_CountFlag(bm, type, flag);
+	totelement = BM_CountFlag(bm, type, flag, 1);
 
 	if(totelement){
 		alloc_slot_buffer(op, slotname, totelement);
 
 		if (type & BM_VERT) {
 			for (e = BMIter_New(&elements, bm, BM_VERTS_OF_MESH, bm); e; e = BMIter_Step(&elements)) {
-				if(e->flag & flag) {
+				if(!BM_TestHFlag(e, BM_HIDDEN) && BM_TestHFlag(e, flag)) {
 					((BMHeader**)output->data.p)[i] = e;
 					i++;
 				}
@@ -665,7 +665,7 @@
 
 		if (type & BM_EDGE) {
 			for (e = BMIter_New(&elements, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&elements)) {
-				if(e->flag & flag){
+				if(!BM_TestHFlag(e, BM_HIDDEN) && BM_TestHFlag(e, flag)) {
 					((BMHeader**)output->data.p)[i] = e;
 					i++;
 				}
@@ -674,7 +674,7 @@
 
 		if (type & BM_FACE) {
 			for (e = BMIter_New(&elements, bm, BM_FACES_OF_MESH, bm); e; e = BMIter_Step(&elements)) {
-				if(e->flag & flag){
+				if(!BM_TestHFlag(e, BM_HIDDEN) && BM_TestHFlag(e, flag)) {
 					((BMHeader**)output->data.p)[i] = e;
 					i++;
 				}

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c	2009-08-05 02:40:51 UTC (rev 22217)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c	2009-08-05 06:06:58 UTC (rev 22218)
@@ -1580,7 +1580,7 @@
 	int i, tot;
 
 	tot = 0;
-	BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+	BM_ITER_SELECT(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
 		if (BM_TestHFlag(v, BM_SELECT)) {
 			V_GROW(verts);
 			verts[tot++] = v;

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list