[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22216] branches/bmesh/blender/source/ blender: select linked has been bmeshafied, yay
Joseph Eagar
joeedh at gmail.com
Wed Aug 5 04:34:57 CEST 2009
Revision: 22216
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22216
Author: joeedh
Date: 2009-08-05 04:34:54 +0200 (Wed, 05 Aug 2009)
Log Message:
-----------
select linked has been bmeshafied, yay
Modified Paths:
--------------
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c
branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c
branches/bmesh/blender/source/blender/editors/uvedit/uvedit_ops.c
branches/bmesh/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c 2009-08-04 22:59:50 UTC (rev 22215)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c 2009-08-05 02:34:54 UTC (rev 22216)
@@ -150,9 +150,18 @@
/*ensure vert selections are valid, only if not in a multiselect
mode that shares SCE_SELECT_VERT*/
- if (bm->selectmode & (SCE_SELECT_VERTEX|SCE_SELECT_EDGE)) testiso = 1;
- else if (bm->selectmode & (SCE_SELECT_VERTEX|SCE_SELECT_FACE)) testiso = 1;
-
+ switch (bm->selectmode) {
+ case SCE_SELECT_VERTEX:
+ case SCE_SELECT_EDGE:
+ case SCE_SELECT_FACE:
+ case SCE_SELECT_EDGE|SCE_SELECT_FACE:
+ testiso = 1;
+ break;
+ default:
+ testiso = 0;
+ break;
+ }
+
if (testiso && !select) {
BMIter eiter;
BMEdge *e2;
@@ -177,8 +186,8 @@
if (!BM_TestHFlag(e, BM_SELECT)) bm->totedgesel += 1;
BM_SetHFlag(&(e->head), BM_SELECT);
- BM_SetHFlag(e->v1, BM_SELECT);
- BM_SetHFlag(e->v2, BM_SELECT);
+ BM_Select(bm, e->v1, 1);
+ BM_Select(bm, e->v2, 1);
}
else{
if (BM_TestHFlag(e, BM_SELECT)) bm->totedgesel -= 1;
@@ -208,8 +217,8 @@
BM_SetHFlag(&(f->head), BM_SELECT);
l = f->loopbase;
do{
- BM_SetHFlag(&(l->v->head), BM_SELECT);
- BM_SetHFlag(&(l->e->head), BM_SELECT);
+ BM_Select_Vert(bm, l->v, 1);
+ BM_Select_Edge(bm, l->e, 1);
l = ((BMLoop*)(l->head.next));
}while(l != f->loopbase);
}
@@ -219,8 +228,8 @@
BM_ClearHFlag(&(f->head), BM_SELECT);
l = f->loopbase;
do {
- BM_ClearHFlag(&(l->v->head), BM_SELECT);
- BM_ClearHFlag(&(l->e->head), BM_SELECT);
+ BM_Select_Vert(bm, l->v, 0);
+ BM_Select_Edge(bm, l->e, 0);
l = ((BMLoop*)(l->head.next));
} while(l != f->loopbase);
}
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c 2009-08-04 22:59:50 UTC (rev 22215)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c 2009-08-05 02:34:54 UTC (rev 22216)
@@ -303,6 +303,7 @@
if(v->edge){
shellWalk->base = v;
shellWalk->curedge = v->edge;
+ BLI_ghash_insert(walker->visithash, v->edge, NULL);
}
}
static void *shellWalker_yield(BMWalker *walker)
@@ -316,44 +317,37 @@
BMEdge *curedge, *next = NULL;
BMVert *ov = NULL;
int restrictpass = 1;
- shellWalker *shellWalk = walker->currentstate;
+ shellWalker shellWalk = *((shellWalker*)walker->currentstate);
- if (!BLI_ghash_haskey(walker->visithash, shellWalk->base))
- BLI_ghash_insert(walker->visithash, shellWalk->base, NULL);
+ if (!BLI_ghash_haskey(walker->visithash, shellWalk.base))
+ BLI_ghash_insert(walker->visithash, shellWalk.base, NULL);
+ BMW_popstate(walker);
+
/*find the next edge whose other vertex has not been visited*/
- curedge = shellWalk->curedge;
+ curedge = shellWalk.curedge;
do{
if (!BLI_ghash_haskey(walker->visithash, curedge)) {
BLI_ghash_insert(walker->visithash, curedge, NULL);
- if(walker->restrictflag &&
- (!BMO_TestFlag(walker->bm, curedge, walker->restrictflag)))
+
+ if(!(walker->restrictflag &&
+ !BMO_TestFlag(walker->bm, curedge, walker->restrictflag)))
{
- restrictpass = 0;
- }
- if(restrictpass) {
- ov = BM_OtherEdgeVert(curedge, shellWalk->base);
+ ov = BM_OtherEdgeVert(curedge, shellWalk.base);
- /*save current state*/
- shellWalk->curedge = curedge;
-
/*push a new state onto the stack*/
BMW_pushstate(walker);
/*populate the new state*/
+
((shellWalker*)walker->currentstate)->base = ov;
((shellWalker*)walker->currentstate)->curedge = curedge;
- /*break out of loop*/
-
- next = curedge;
- break;
}
}
- curedge = bmesh_disk_nextedge(curedge, shellWalk->base);
- }while(curedge != shellWalk->curedge);
+ curedge = bmesh_disk_nextedge(curedge, shellWalk.base);
+ }while(curedge != shellWalk.curedge);
- shellWalk->current = next;
- return next;
+ return shellWalk.curedge;
}
/* Island Boundary Walker:
Modified: branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/editors/include/ED_mesh.h 2009-08-04 22:59:50 UTC (rev 22215)
+++ branches/bmesh/blender/source/blender/editors/include/ED_mesh.h 2009-08-05 02:34:54 UTC (rev 22216)
@@ -93,15 +93,23 @@
struct BMFace *EDBM_get_face_for_index(struct BMEditMesh *tm, int index);
struct BMFace *EDBM_get_actFace(struct BMEditMesh *em, int sloppy);
+/*flushes based on the current select mode. if in vertex select mode,
+ verts select/deselect edges and faces, if in edge select mode,
+ edges select/deselect faces and vertices, and in face select mode faces select/deselect
+ edges and vertices.*/
void EDBM_selectmode_flush(struct BMEditMesh *em);
int EDBM_get_actSelection(struct BMEditMesh *em, struct BMEditSelection *ese);
+/*exactly the same as EDBM_selectmode_flush, but you pass in the selectmode
+ instead of using the current one*/
+void EDBM_select_flush(struct BMEditMesh *em, int selectmode);
+void EDBM_selectmode_set(struct BMEditMesh *em);
+void EDBM_convertsel(struct BMEditMesh *em, short oldmode, short selectmode);
+
void EDBM_editselection_center(struct BMEditMesh *em, float *center, struct BMEditSelection *ese);
void EDBM_editselection_plane(struct BMEditMesh *em, float *plane, struct BMEditSelection *ese);
void EDBM_editselection_normal(float *normal, struct BMEditSelection *ese);
-void EDBM_selectmode_set(struct BMEditMesh *em);
-void EDBM_convertsel(struct BMEditMesh *em, short oldmode, short selectmode);
void EDBM_hide_mesh(struct BMEditMesh *em, int swap);
void EDBM_reveal_mesh(struct BMEditMesh *em);
Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c 2009-08-04 22:59:50 UTC (rev 22215)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c 2009-08-05 02:34:54 UTC (rev 22216)
@@ -1537,10 +1537,13 @@
}
BMW_Init(&walker, em->bm, BMW_SHELL, 0);
- e = BMW_Begin(&walker, eed);
+ e = BMW_Begin(&walker, eed->v1);
for (; e; e=BMW_Step(&walker)) {
- BM_Select(em->bm, e, sel);
+ BM_Select(em->bm, e->v1, sel);
+ BM_Select(em->bm, e->v2, sel);
}
+ BMW_End(&walker);
+ EDBM_select_flush(em, SCE_SELECT_VERTEX);
WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
return OPERATOR_FINISHED;
@@ -1562,3 +1565,57 @@
RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", "");
RNA_def_boolean(ot->srna, "limit", 0, "Limit by Seams", "");
}
+
+
+static int select_linked_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh;
+ V_DECLARE(verts);
+ BMVert **verts = NULL;
+ BMIter iter;
+ BMVert *v;
+ BMEdge *e;
+ BMWalker walker;
+ int i, tot;
+
+ tot = 0;
+ BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ if (BM_TestHFlag(v, BM_SELECT)) {
+ V_GROW(verts);
+ verts[tot++] = v;
+ }
+ }
+
+ BMW_Init(&walker, em->bm, BMW_SHELL, 0);
+ for (i=0; i<tot; i++) {
+ e = BMW_Begin(&walker, verts[i]);
+ for (; e; e=BMW_Step(&walker)) {
+ BM_Select(em->bm, e->v1, 1);
+ BM_Select(em->bm, e->v2, 1);
+ }
+ }
+ BMW_End(&walker);
+ EDBM_select_flush(em, SCE_SELECT_VERTEX);
+
+ V_FREE(verts);
+ WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_select_linked(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select Linked All";
+ ot->idname= "MESH_OT_select_linked";
+
+ /* api callbacks */
+ ot->exec= select_linked_exec;
+ ot->poll= ED_operator_editmesh;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_boolean(ot->srna, "limit", 0, "Limit by Seams", "");
+}
Modified: branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c 2009-08-04 22:59:50 UTC (rev 22215)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c 2009-08-05 02:34:54 UTC (rev 22216)
@@ -386,6 +386,13 @@
}
+void EDBM_select_flush(BMEditMesh *em, int selectmode)
+{
+ em->bm->selectmode = selectmode;
+ BM_SelectMode_Flush(em->bm);
+ em->bm->selectmode = em->selectmode;
+}
+
void EDBM_selectmode_flush(BMEditMesh *em)
{
em->bm->selectmode = em->selectmode;
@@ -440,6 +447,7 @@
type = BM_FACES_OF_MESH;
break;
}
+
ele = BMIter_New(&iter, em->bm, type, NULL);
for ( ; ele; ele=BMIter_Step(&iter)) {
if (flag & BM_SELECT) BM_Select(em->bm, ele, 0);
@@ -467,6 +475,7 @@
type = BM_FACES_OF_MESH;
break;
}
+
ele = BMIter_New(&iter, em->bm, type, NULL);
for ( ; ele; ele=BMIter_Step(&iter)) {
if (flag & BM_SELECT) BM_Select(em->bm, ele, 1);
Modified: branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c 2009-08-04 22:59:50 UTC (rev 22215)
+++ branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c 2009-08-05 02:34:54 UTC (rev 22216)
@@ -1900,42 +1900,6 @@
// if (EM_texFaceCheck())
}
-static int select_linked_exec(bContext *C, wmOperator *op)
-{
- Object *obedit= CTX_data_edit_object(C);
- EditMesh *em= BKE_mesh_get_editmesh(obedit->data);
-
- if( RNA_boolean_get(op->ptr, "limit") ) {
- ViewContext vc;
- em_setup_viewcontext(C, &vc);
- select_linked_limited_invoke(&vc, 1, 1);
- }
- else
- selectconnected_mesh_all(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_linked(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Select Linked All";
- ot->idname= "MESH_OT_select_linked";
-
- /* api callbacks */
- ot->exec= select_linked_exec;
- ot->poll= ED_operator_editmesh;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_boolean(ot->srna, "limit", 0, "Limit by Seams", "");
-}
-
-
/* ************************* */
/* swap is 0 or 1, if 1 it hides not selected */
Modified: branches/bmesh/blender/source/blender/editors/uvedit/uvedit_ops.c
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list