[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22220] branches/bmesh/blender/source/ blender: bmeshafied select more/less
Joseph Eagar
joeedh at gmail.com
Wed Aug 5 09:15:17 CEST 2009
Revision: 22220
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22220
Author: joeedh
Date: 2009-08-05 09:15:17 +0200 (Wed, 05 Aug 2009)
Log Message:
-----------
bmeshafied select more/less
Modified Paths:
--------------
branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c
branches/bmesh/blender/source/blender/editors/mesh/editmesh_tools.c
branches/bmesh/blender/source/blender/editors/mesh/mesh_ops.c
Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h 2009-08-05 06:45:47 UTC (rev 22219)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h 2009-08-05 07:15:17 UTC (rev 22220)
@@ -34,6 +34,10 @@
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;
+#define BM_ITER_NOTSELECT(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/intern/bmesh_marking.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c 2009-08-05 06:45:47 UTC (rev 22219)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c 2009-08-05 07:15:17 UTC (rev 22220)
@@ -223,15 +223,37 @@
}while(l != f->loopbase);
}
else{
+ BMIter liter, fiter, eiter;
+ BMFace *f2;
+ BMLoop *l;
+ BMEdge *e;
+
if (BM_TestHFlag(f, BM_SELECT)) bm->totfacesel -= 1;
+ BM_ClearHFlag(&(f->head), BM_SELECT);
- BM_ClearHFlag(&(f->head), BM_SELECT);
- l = f->loopbase;
- do {
- BM_Select_Vert(bm, l->v, 0);
- BM_Select_Edge(bm, l->e, 0);
- l = ((BMLoop*)(l->head.next));
- } while(l != f->loopbase);
+ /*flush down to edges*/
+ BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER(f2, &fiter, bm, BM_FACES_OF_EDGE, l->e) {
+ if (BM_TestHFlag(f2, BM_SELECT))
+ break;
+ }
+
+ if (!f2) {
+ BM_Select(bm, l->e, 0);
+ }
+ }
+
+ /*flush down to verts*/
+ BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, l->v) {
+ if (BM_TestHFlag(e, BM_SELECT))
+ break;
+ }
+
+ if (!e) {
+ BM_Select(bm, l->v, 0);
+ }
+ }
}
}
@@ -417,7 +439,7 @@
/*for now, use face normal*/
- /* make a fake plane thats at rightangles to the normal
+ /* make a fake plane thats at rightangles to the normal
we cant make a crossvec from a vec thats the same as the vec
unlikely but possible, so make sure if the normal is (0,0,1)
that vec isnt the same or in the same direction even.*/
@@ -425,7 +447,7 @@
else if (efa->no[1]<0.5) vec[1]=1.0f;
else vec[2]=1.0f;
Crossf(plane, efa->no, vec);
-#if 0
+#if 0 //BMESH_TODO
if (efa->v4) { /*if its a quad- set the plane along the 2 longest edges.*/
float vecA[3], vecB[3];
Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c 2009-08-05 06:45:47 UTC (rev 22219)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c 2009-08-05 07:15:17 UTC (rev 22220)
@@ -1580,7 +1580,7 @@
int i, tot;
tot = 0;
- BM_ITER_SELECT(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;
@@ -1619,3 +1619,205 @@
RNA_def_boolean(ot->srna, "limit", 0, "Limit by Seams", "");
}
+
+/* ******************** **************** */
+
+void EDBM_select_more(BMEditMesh *em)
+{
+ BMIter iter;
+
+ /*for now, bmops aren't supposed to mess with header flags
+ (might need to revisit that design decision later), so
+ this function is slightly unconventional to avoid the use
+ of the BMO_[Set/Clear]Flag functions. it accumulates lists
+ of elements to make selection changes to in pointer arrays.*/
+
+ if (em->selectmode <= SCE_SELECT_EDGE) {
+ BMVert *v;
+ BMEdge *e;
+ BMIter eiter;
+ BMVert **verts = NULL;
+ V_DECLARE(verts);
+ V_DECLARE(edges);
+ BMEdge **edges = NULL;
+ int vtot=0, etot=0, i;
+
+ BM_ITER_NOTSELECT(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
+ BM_ITER(e, &eiter, em->bm, BM_EDGES_OF_VERT, v) {
+ if (BM_TestHFlag(BM_OtherEdgeVert(e, v), BM_SELECT))
+ break;
+ }
+
+ if (e) {
+ V_GROW(verts);
+ verts[vtot++] = v;
+ }
+
+ }
+
+ for (i=0; i<vtot; i++) {
+ BM_Select(em->bm, verts[i], 1);
+ }
+
+ /*make sure we flush from vertices on up, not from edges*/
+ EDBM_select_flush(em, SCE_SELECT_VERTEX);
+
+ V_FREE(verts);
+ } else {
+ BMIter liter, fiter;
+ BMFace *f, *f2, **faces = NULL;
+ V_DECLARE(faces);
+ BMLoop *l;
+ int i, tot=0;
+
+ BM_ITER_SELECT(f, &iter, em->bm, BM_FACES_OF_MESH, NULL)
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER(f2, &fiter, em->bm, BM_FACES_OF_EDGE, l->e) {
+ if (!BM_TestHFlag(f2, BM_SELECT)) {
+ V_GROW(faces);
+ faces[tot++] = f2;
+ }
+ }
+ }
+ }
+
+ for (i=0; i<tot; i++) {
+ BM_Select(em->bm, faces[i], 1);
+ }
+
+ V_FREE(faces);
+ }
+
+ EDBM_selectmode_flush(em);
+}
+
+static int select_more(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ BMEditMesh *em= (((Mesh *)obedit->data))->edit_btmesh;
+
+ EDBM_select_more(em);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_select_more(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select More";
+ ot->idname= "MESH_OT_select_more";
+
+ /* api callbacks */
+ ot->exec= select_more;
+ ot->poll= ED_operator_editmesh;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+void EDBM_select_less(BMEditMesh *em)
+{
+ BMIter iter;
+
+ /*for now, bmops aren't supposed to mess with header flags
+ (might need to revisit that design decision later), so
+ this function is slightly unconventional to avoid the use
+ of the BMO_[Set/Clear]Flag functions. it accumulates lists
+ of elements to make selection changes to in pointer arrays.*/
+
+ if (em->selectmode <= SCE_SELECT_EDGE) {
+ BMVert *v;
+ BMEdge *e;
+ BMIter eiter;
+ BMVert **verts = NULL;
+ V_DECLARE(verts);
+ V_DECLARE(edges);
+ BMEdge **edges = NULL;
+ int vtot=0, etot=0, i;
+
+ BM_ITER_SELECT(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
+ BM_ITER(e, &eiter, em->bm, BM_EDGES_OF_VERT, v) {
+ if (!BM_TestHFlag(e, BM_SELECT))
+ break;
+ }
+
+ if (e) {
+ V_GROW(verts);
+ verts[vtot++] = v;
+
+ BM_ITER(e, &eiter, em->bm, BM_EDGES_OF_VERT, v) {
+ V_GROW(edges);
+ edges[etot++] = e;
+ }
+ }
+ }
+
+ for (i=0; i<vtot; i++) {
+ BM_Select(em->bm, verts[i], 0);
+ }
+
+ for (i=0; i<etot; i++) {
+ BM_Select(em->bm, edges[i], 0);
+ }
+
+ V_FREE(verts);
+ V_FREE(edges);
+ } else {
+ BMIter liter, fiter;
+ BMFace *f, *f2, **faces = NULL;
+ V_DECLARE(faces);
+ BMLoop *l;
+ int i, tot=0;
+
+ BM_ITER_SELECT(f, &iter, em->bm, BM_FACES_OF_MESH, NULL)
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER(f2, &fiter, em->bm, BM_FACES_OF_EDGE, l->e) {
+ if (!BM_TestHFlag(f2, BM_SELECT))
+ break;
+ }
+ if (f2)
+ break;
+ }
+
+ if (l) {
+ V_GROW(faces);
+ faces[tot++] = f;
+ }
+ }
+
+ for (i=0; i<tot; i++) {
+ BM_Select(em->bm, faces[i], 0);
+ }
+
+ V_FREE(faces);
+ }
+
+ EDBM_selectmode_flush(em);
+}
+
+static int select_less(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ BMEditMesh *em= (((Mesh *)obedit->data))->edit_btmesh;
+
+ EDBM_select_less(em);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_select_less(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select Less";
+ ot->idname= "MESH_OT_select_less";
+
+ /* api callbacks */
+ ot->exec= select_less;
+ ot->poll= ED_operator_editmesh;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
Modified: branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c 2009-08-05 06:45:47 UTC (rev 22219)
+++ branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c 2009-08-05 07:15:17 UTC (rev 22220)
@@ -2361,165 +2361,7 @@
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-/* ******************** **************** */
-void EM_select_more(EditMesh *em)
-{
- EditVert *eve;
- EditEdge *eed;
- EditFace *efa;
-
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(eve->f & SELECT) eve->f1= 1;
- else eve->f1 = 0;
- }
-
- /* set f1 flags in vertices to select 'more' */
- for(eed= em->edges.first; eed; eed= eed->next) {
- if(eed->h==0) {
- if (eed->v1->f & SELECT)
- eed->v2->f1 = 1;
- if (eed->v2->f & SELECT)
- eed->v1->f1 = 1;
- }
- }
-
- /* new selected edges, but not in facemode */
- if(em->selectmode <= SCE_SELECT_EDGE) {
-
- for(eed= em->edges.first; eed; eed= eed->next) {
- if(eed->h==0) {
- if(eed->v1->f1 && eed->v2->f1) EM_select_edge(eed, 1);
- }
- }
- }
- /* new selected faces */
- for(efa= em->faces.first; efa; efa= efa->next) {
- if(efa->h==0) {
- if(efa->v1->f1 && efa->v2->f1 && efa->v3->f1 && (efa->v4==NULL || efa->v4->f1))
- EM_select_face(efa, 1);
- }
- }
-}
-
-static int select_more(bContext *C, wmOperator *op)
-{
- Object *obedit= CTX_data_edit_object(C);
- EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data)) ;
-
- EM_select_more(em);
-
-// if (EM_texFaceCheck(em))
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
- BKE_mesh_end_editmesh(obedit->data, em);
- return OPERATOR_FINISHED;
-}
-
-void MESH_OT_select_more(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Select More";
- ot->idname= "MESH_OT_select_more";
-
- /* api callbacks */
- ot->exec= select_more;
- ot->poll= ED_operator_editmesh;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-void EM_select_less(EditMesh *em)
-{
- EditEdge *eed;
- EditFace *efa;
-
- if(em->selectmode <= SCE_SELECT_EDGE) {
- /* eed->f1 == 1: edge with a selected and deselected vert */
-
- for(eed= em->edges.first; eed; eed= eed->next) {
- eed->f1= 0;
- if(eed->h==0) {
-
- if ( !(eed->v1->f & SELECT) && (eed->v2->f & SELECT) )
- eed->f1= 1;
- if ( (eed->v1->f & SELECT) && !(eed->v2->f & SELECT) )
- eed->f1= 1;
- }
- }
-
- /* deselect edges with flag set */
- for(eed= em->edges.first; eed; eed= eed->next) {
- if (eed->h==0 && eed->f1 == 1) {
- EM_select_edge(eed, 0);
- }
- }
- EM_deselect_flush(em);
-
- }
- else {
- /* deselect faces with 1 or more deselect edges */
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list