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