Revision: 39753
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39753
Author:   howardt
Date:     2011-08-28 17:15:24 +0000 (Sun, 28 Aug 2011)
Log Message:
-----------
implement select nth, separate loose parts, and a few bug fixes

This code is from Andrew Wiggen (ender79) and reviewed by me.

His comments:

Implements some tools that were marked TODO:
- select nth
- separate loose parts

And also fixes a few bugs;
- extrude and move on normals causes faces to disappear until the move starts
- hiding verts/edges/faces does not deselect them
- deleting a selection sometimes deletes too much (e.g. a solid cube and a wire 
cube build of only edges, join them on a single edge, select only the faces of 
the solid cube and delete, some of the deselected edges from the wire cube were 
also being deleted)

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenlib/intern/path_util.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c
    branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c
    branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c

Modified: branches/bmesh/blender/source/blender/blenlib/intern/path_util.c
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/intern/path_util.c    
2011-08-28 16:46:40 UTC (rev 39752)
+++ branches/bmesh/blender/source/blender/blenlib/intern/path_util.c    
2011-08-28 17:15:24 UTC (rev 39753)
@@ -37,6 +37,7 @@
 #include <ctype.h>
 #include <string.h>
 #include <stdlib.h>
+#include <stddef.h>
 #include <assert.h>
 
 #include "MEM_guardedalloc.h"
@@ -298,7 +299,7 @@
 
 void BLI_cleanup_path(const char *relabase, char *dir)
 {
-       short a;
+       ptrdiff_t a;
        char *start, *eind;
        if (relabase) {
                BLI_path_abs(dir, relabase);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c  
2011-08-28 16:46:40 UTC (rev 39752)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c  
2011-08-28 17:15:24 UTC (rev 39753)
@@ -648,6 +648,11 @@
 {
        BMHeader *h = element;
 
+       /*Follow convention of always deselecting before
+         hiding an element*/
+       if (hide)
+               BM_Select(bm, element, 0);
+
        switch (h->type) {
                case BM_VERT:
                        BM_Hide_Vert(bm, element, hide);

Modified: 
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c     
2011-08-28 16:46:40 UTC (rev 39752)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c     
2011-08-28 17:15:24 UTC (rev 39753)
@@ -231,7 +231,7 @@
                        l = bmesh_radial_nextloop(l);
                        f = l->f;
                        e = l->e;
-                       if(!BMO_TestFlag(walker->bm, f, walker->restrictflag)){
+                       if(walker->restrictflag && !BMO_TestFlag(walker->bm, f, 
walker->restrictflag)){
                                l = l->radial_next;
                                break;
                        }
@@ -301,7 +301,7 @@
        for (; l; l=BMIter_Step(&liter)) {
                f = BMIter_New(&iter, walker->bm, BM_FACES_OF_EDGE, l->e);
                for (; f; f=BMIter_Step(&iter)) {
-                       if (!BMO_TestFlag(walker->bm, f, walker->restrictflag))
+                       if (walker->restrictflag && !BMO_TestFlag(walker->bm, 
f, walker->restrictflag))
                                continue;
                        if (BLI_ghash_haskey(walker->visithash, f)) continue;
                        
@@ -310,7 +310,6 @@
                        iwalk->cur = f;
                        BLI_ghash_insert(walker->visithash, f, NULL);
                        break;
-
                }
        }
        
@@ -318,13 +317,9 @@
 }
 
 
-/*     Island Walker:
+/*     Edge Loop Walker:
  *
- *     Starts at a tool flagged-face and walks over the face region
- *
- *     TODO:
- *
- *  Add restriction flag/callback for wire edges.
+ *     Starts at a tool-flagged edge and walks over the edge loop
  * 
 */
 

Modified: branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c       
2011-08-28 16:46:40 UTC (rev 39752)
+++ branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c       
2011-08-28 17:15:24 UTC (rev 39753)
@@ -516,12 +516,21 @@
                /*now go through and mark all remaining faces all edges for 
keeping.*/
                for(f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm); f; f = 
BMIter_Step(&faces)){
                        if(!BMO_TestFlag(bm, (BMHeader*)f, DEL_INPUT)){
-                               for(e = BMIter_New(&edges, bm, 
BM_EDGES_OF_FACE, f); e; e= BMIter_Step(&edges))
+                               for(e = BMIter_New(&edges, bm, 
BM_EDGES_OF_FACE, f); e; e= BMIter_Step(&edges)){
                                        BMO_ClearFlag(bm, (BMHeader*)e, 
DEL_INPUT);
-                               for(v = BMIter_New(&verts, bm, 
BM_VERTS_OF_FACE, f); v; v= BMIter_Step(&verts))
+                               }
+                               for(v = BMIter_New(&verts, bm, 
BM_VERTS_OF_FACE, f); v; v= BMIter_Step(&verts)){
                                        BMO_ClearFlag(bm, (BMHeader*)v, 
DEL_INPUT);
+                               }
                        }
                }
+               /*also mark all the vertices of remaining edges for keeping.*/
+               for(e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = 
BMIter_Step(&edges)){
+                       if(!BMO_TestFlag(bm, (BMHeader*)e, DEL_INPUT)){
+                               BMO_ClearFlag(bm, (BMHeader*)e->v1, DEL_INPUT);
+                               BMO_ClearFlag(bm, (BMHeader*)e->v2, DEL_INPUT);
+                       }
+               }
                /*now delete marked faces*/
                BM_remove_tagged_faces(bm, DEL_INPUT);
                /*delete marked edges*/

Modified: branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c   
2011-08-28 16:46:40 UTC (rev 39752)
+++ branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c   
2011-08-28 17:15:24 UTC (rev 39753)
@@ -63,7 +63,6 @@
 
        if (!me || !me->totvert) return; /*sanity check*/
        
-       mvert = me->mvert;
        vt = MEM_mallocN(sizeof(void**)*me->totvert, "mesh to bmesh vtable");
 
        CustomData_copy(&me->vdata, &bm->vdata, CD_MASK_BMESH, CD_CALLOC, 0);
@@ -125,7 +124,7 @@
        CustomData_bmesh_init_pool(&bm->ldata, allocsize[2]);
        CustomData_bmesh_init_pool(&bm->pdata, allocsize[3]);
 
-       for (i=0; i<me->totvert; i++, mvert++) {
+       for (i=0, mvert = me->mvert; i<me->totvert; i++, mvert++) {
                v = BM_Make_Vert(bm, keyco&&set_key ? keyco[i] : mvert->co, 
NULL);
                normal_short_to_float_v3(v->no, mvert->no);
 

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c   
2011-08-28 16:46:40 UTC (rev 39752)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c   
2011-08-28 17:15:24 UTC (rev 39753)
@@ -1646,282 +1646,343 @@
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 }
 
-static int mesh_select_nth_exec(bContext *C, wmOperator *op)
+/* not that optimal!, should be nicer with bmesh */
+static void tag_face_edges(BMesh* bm, BMFace *f)
 {
-       Object *obedit= CTX_data_edit_object(C);
-//     BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh;
-//     int nth = RNA_int_get(op->ptr, "nth");
+       BMLoop *l;
+       BMIter iter;
 
-#if 0 //BMESH_TODO
-       if(EM_deselect_nth(em, nth) == 0) {
-               BKE_report(op->reports, RPT_ERROR, "Mesh has no active 
vert/edge/face.");
-               return OPERATOR_CANCELLED;
+       BM_ITER(l, &iter, bm, BM_LOOPS_OF_FACE, f) {
+               BM_SetIndex(l->e, 1);
        }
-#else
-               BKE_report(op->reports, RPT_ERROR, "Unimplemented");
-#endif
-
-       DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
-       WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
-
-       return OPERATOR_FINISHED;
 }
-
-
-void MESH_OT_select_nth(wmOperatorType *ot)
+static int tag_face_edges_test(BMesh* bm, BMFace *f)
 {
-       /* identifiers */
-       ot->name= "Select Nth";
-       ot->description= "";
-       ot->idname= "MESH_OT_select_nth";
+       BMLoop *l;
+       BMIter iter;
 
-       /* api callbacks */
-       ot->exec= mesh_select_nth_exec;
-       ot->poll= ED_operator_editmesh;
+       BM_ITER(l, &iter, bm, BM_LOOPS_OF_FACE, f) {
+               if(BM_GetIndex(l->e) != 0)
+                       return 1;
+       }
 
-       /* flags */
-       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
-       RNA_def_int(ot->srna, "nth", 2, 2, 100, "Nth Selection", "", 1, 
INT_MAX);
+       return 0;
 }
 
-#if 0 //BMESH_TODO, select nth tool
-/* not that optimal!, should be nicer with bmesh */
-static void tag_face_edges(EditFace *efa)
+static void em_deselect_nth_face(BMEditMesh *em, int nth, BMFace *f_act)
 {
-       if(efa->v4)
-               efa->e1->tmp.l= efa->e2->tmp.l= efa->e3->tmp.l= efa->e4->tmp.l= 
1;
-       else
-               efa->e1->tmp.l= efa->e2->tmp.l= efa->e3->tmp.l= 1;
-}
-static int tag_face_edges_test(EditFace *efa)
-{
-       if(efa->v4)
-               return (efa->e1->tmp.l || efa->e2->tmp.l || efa->e3->tmp.l || 
efa->e4->tmp.l) ? 1:0;
-       else
-               return (efa->e1->tmp.l || efa->e2->tmp.l || efa->e3->tmp.l) ? 
1:0;
-}
-
-void em_deselect_nth_face(EditMesh *em, int nth, EditFace *efa_act)
-{
-       EditFace *efa;
-       EditEdge *eed;
+       BMFace *f;
+       BMEdge *e;
+       BMIter iter;
+       BMesh *bm = em->bm;
+       int index;
        int ok= 1;
 
-       if(efa_act==NULL) {
+       if(f_act==NULL) {
                return;
        }
 
        /* to detect loose edges, we put f2 flag on 1 */
-       for(eed= em->edges.first; eed; eed= eed->next) {
-               eed->tmp.l= 0;
+       BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+               BM_SetIndex(e, 0);
        }
 
-       for (efa= em->faces.first; efa; efa= efa->next) {
-               efa->tmp.l = 0;
+       BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+               BM_SetIndex(f, 0);
        }
 
-       efa_act->tmp.l = 1;
+       BM_SetIndex(f_act, 1);
 
        while(ok) {
                ok = 0;
 
-               for (efa= em->faces.first; efa; efa= efa->next) {
-                       if(efa->tmp.l==1) { /* initialize */
-                               tag_face_edges(efa);
+               BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+                       index= BM_GetIndex(f);
+                       if(index==1) { /* initialize */
+                               tag_face_edges(bm, f);
                        }
 
-                       if(efa->tmp.l)
-                               efa->tmp.l++;
+                       if (index)
+                               BM_SetIndex(f, index+1);
                }
 
-               for (efa= em->faces.first; efa; efa= efa->next) {
-                       if(efa->tmp.l==0 && tag_face_edges_test(efa)) {
-                               efa->tmp.l= 1;
-                               ok = 1; /* keep looping */
+               BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+                       if(BM_GetIndex(f)==0 && tag_face_edges_test(bm, f)) {
+                               BM_SetIndex(f, 1);
+                               ok= 1; /* keep looping */
                        }
                }
        }
 
-       for (efa= em->faces.first; efa; efa= efa->next) {
-               if(efa->tmp.l > 0 && efa->tmp.l % nth) {
-                       EM_select_face(efa, 0);
+       BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+               index= BM_GetIndex(f);
+               if(index > 0 && index % nth) {
+                       BM_Select(bm, f, 0);
                }
        }
-       for (efa= em->faces.first; efa; efa= efa->next) {
-               if(efa->f & SELECT) {
-                       EM_select_face(efa, 1);
-               }
-       }
 
-       EM_nvertices_selected(em);
-       EM_nedges_selected(em);
-       EM_nfaces_selected(em);
+       EDBM_select_flush(em, SCE_SELECT_FACE);
 }
 
 /* not that optimal!, should be nicer with bmesh */
-static void tag_edge_verts(EditEdge *eed)
+static void tag_edge_verts(BMesh *bm, BMEdge *e)
 {
-       eed->v1->tmp.l= eed->v2->tmp.l= 1;
+       BM_SetIndex(e->v1, 1);
+       BM_SetIndex(e->v2, 1);
 }
-static int tag_edge_verts_test(EditEdge *eed)
+static int tag_edge_verts_test(BMesh *bm, BMEdge *e)
 {
-       return (eed->v1->tmp.l || eed->v2->tmp.l) ? 1:0;
+       return (BM_GetIndex(e->v1) || BM_GetIndex(e->v2)) ? 1:0;
 }
 
-void em_deselect_nth_edge(EditMesh *em, int nth, EditEdge *eed_act)
+static void em_deselect_nth_edge(BMEditMesh *em, int nth, BMEdge *e_act)
 {
-       EditEdge *eed;
-       EditVert *eve;
+       BMEdge *e;
+       BMVert *v;
+       BMIter iter;
+       BMesh *bm = em->bm;
+       int index;
        int ok= 1;
 
-       if(eed_act==NULL) {
+       if(e_act==NULL) {
                return;
        }
 
-       for(eve= em->verts.first; eve; eve= eve->next) {
-               eve->tmp.l= 0;
+       BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+               BM_SetIndex(v, 0);
        }
 
-       for (eed= em->edges.first; eed; eed= eed->next) {
-               eed->tmp.l = 0;
+       BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+               BM_SetIndex(e, 0);
        }
 
-       eed_act->tmp.l = 1;
+       BM_SetIndex(e_act, 1);
 

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to