[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