[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18793] branches/blender2.5/blender/source /blender/editors/mesh: 2.5
Ton Roosendaal
ton at blender.org
Mon Feb 2 20:31:46 CET 2009
Revision: 18793
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18793
Author: ton
Date: 2009-02-02 20:31:43 +0100 (Mon, 02 Feb 2009)
Log Message:
-----------
2.5
Editmesh ops:
- MESH_OT_select_multi_loop
(based on selection it makes loops)
- MESH_OT_select_linked
added boolean 'limit' for linked limited by seams
- MESH_OT_select_linked_pick
same as above
The 'limit' option used to work only for facemode,
with a toolsettings option.
So it had no own hotkey... i made it work for
edges & vertices too, need to find hotkey later.
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/editors/mesh/editmesh_mods.c
branches/blender2.5/blender/source/blender/editors/mesh/mesh_ops.c
Modified: branches/blender2.5/blender/source/blender/editors/mesh/editmesh_mods.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/mesh/editmesh_mods.c 2009-02-02 16:30:03 UTC (rev 18792)
+++ branches/blender2.5/blender/source/blender/editors/mesh/editmesh_mods.c 2009-02-02 19:31:43 UTC (rev 18793)
@@ -1912,11 +1912,14 @@
}
}
-void loop_multiselect(EditMesh *em, int looptype)
+static int loop_multiselect(bContext *C, wmOperator *op)
{
+ Object *obedit= CTX_data_edit_object(C);
+ EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
EditEdge *eed;
EditEdge **edarray;
int edindex, edfirstcount;
+ int looptype= RNA_boolean_get(op->ptr, "ring");
/* sets em->totedgesel */
EM_nedges_selected(em);
@@ -1948,7 +1951,28 @@
}
MEM_freeN(edarray);
// if (EM_texFaceCheck())
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ return OPERATOR_FINISHED;
}
+
+void MESH_OT_select_multi_loop(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Multi Select Loops";
+ ot->idname= "MESH_OT_select_multi_loop";
+
+ /* api callbacks */
+ ot->exec= loop_multiselect;
+ ot->poll= ED_operator_editmesh;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "ring", 0, "Ring", "");
+}
+
/* ***************** MAIN MOUSE SELECTION ************** */
@@ -2207,79 +2231,121 @@
}
-// XXX should we use CTX_scene(C)->selectmode & SCE_SELECT_FACE like it was in the past ? calls selectconnected_delimit_mesh_all if true
-void selectconnected_mesh_all(EditMesh *em)
+/* *********** select linked ************* */
+
+/* for use with selectconnected_delimit_mesh only! */
+#define is_edge_delimit_ok(eed) ((eed->tmp.l == 1) && (eed->seam==0))
+#define is_face_tag(efa) is_edge_delimit_ok(efa->e1) || is_edge_delimit_ok(efa->e2) || is_edge_delimit_ok(efa->e3) || (efa->v4 && is_edge_delimit_ok(efa->e4))
+
+#define face_tag(efa)\
+if(efa->v4) efa->tmp.l= efa->e1->tmp.l= efa->e2->tmp.l= efa->e3->tmp.l= efa->e4->tmp.l= 1;\
+else efa->tmp.l= efa->e1->tmp.l= efa->e2->tmp.l= efa->e3->tmp.l= 1;
+
+/* all - 1) use all faces for extending the selection 2) only use the mouse face
+* sel - 1) select 0) deselect
+* */
+
+/* legacy warning, this function combines too much :) */
+static int select_linked_limited_invoke(ViewContext *vc, short all, short sel)
{
- EditVert *v1,*v2;
+ EditMesh *em= vc->em;
+ EditFace *efa;
EditEdge *eed;
- short done=1, toggle=0;
-
- if(em->edges.first==0) return;
+ EditVert *eve;
+ short done=1, change=0;
+ if(em->faces.first==0) return OPERATOR_CANCELLED;
+
+ /* flag all edges+faces as off*/
+ for(eed= em->edges.first; eed; eed= eed->next)
+ eed->tmp.l=0;
+
+ for(efa= em->faces.first; efa; efa= efa->next) {
+ efa->tmp.l = 0;
+ }
+
+ if (all) {
+ // XXX verts?
+ for(eed= em->edges.first; eed; eed= eed->next) {
+ if(eed->f & SELECT)
+ eed->tmp.l= 1;
+ }
+ for(efa= em->faces.first; efa; efa= efa->next) {
+
+ if (efa->f & SELECT) {
+ face_tag(efa);
+ } else {
+ efa->tmp.l = 0;
+ }
+ }
+ }
+ else {
+ if( unified_findnearest(vc, &eve, &eed, &efa) ) {
+
+ if(efa) {
+ efa->tmp.l = 1;
+ face_tag(efa);
+ }
+ else if(eed)
+ eed->tmp.l= 1;
+ else {
+ for(eed= em->edges.first; eed; eed= eed->next)
+ if(eed->v1==eve || eed->v2==eve)
+ break;
+ eed->tmp.l= 1;
+ }
+ }
+ else
+ return OPERATOR_FINISHED;
+ }
+
while(done==1) {
done= 0;
-
- toggle++;
- if(toggle & 1) eed= em->edges.first;
- else eed= em->edges.last;
-
- while(eed) {
- v1= eed->v1;
- v2= eed->v2;
- if(eed->h==0) {
- if(v1->f & SELECT) {
- if( (v2->f & SELECT)==0 ) {
- v2->f |= SELECT;
- done= 1;
- }
+ /* simple algo - select all faces that have a selected edge
+ * this intern selects the edge, repeat until nothing is left to do */
+ for(efa= em->faces.first; efa; efa= efa->next) {
+ if ((efa->tmp.l == 0) && (!efa->h)) {
+ if (is_face_tag(efa)) {
+ face_tag(efa);
+ done= 1;
}
- else if(v2->f & SELECT) {
- if( (v1->f & SELECT)==0 ) {
- v1->f |= SELECT;
- done= 1;
- }
+ }
+ }
+ }
+
+ for(efa= em->faces.first; efa; efa= efa->next) {
+ if (efa->tmp.l) {
+ if (sel) {
+ if (!(efa->f & SELECT)) {
+ EM_select_face(efa, 1);
+ change = 1;
}
+ } else {
+ if (efa->f & SELECT) {
+ EM_select_face(efa, 0);
+ change = 1;
+ }
}
- if(toggle & 1) eed= eed->next;
- else eed= eed->prev;
}
}
-
- /* now use vertex select flag to select rest */
- EM_select_flush(em);
-// if (EM_texFaceCheck())
-}
-
-static int select_linked_exec(bContext *C, wmOperator *op)
-{
- Object *obedit= CTX_data_edit_object(C);
- EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
+ if (!change)
+ return OPERATOR_CANCELLED;
- selectconnected_mesh_all(em);
+ if (!sel) /* make sure de-selecting faces didnt de-select the verts/edges connected to selected faces, this is common with boundries */
+ for(efa= em->faces.first; efa; efa= efa->next)
+ if (efa->f & SELECT)
+ EM_select_face(efa, 1);
- 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";
+ // if (EM_texFaceCheck())
- /* api callbacks */
- ot->exec= select_linked_exec;
- ot->poll= ED_operator_editmesh;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
+ return OPERATOR_FINISHED;
}
-/* *********** select connected ************* */
+#undef is_edge_delimit_ok
+#undef is_face_tag
+#undef face_tag
-// XXX should we use CTX_scene(C)->selectmode & SCE_SELECT_FACE like it was in the past ? calls selectconnected_delimit_mesh if true
static int select_linked_pick_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
Object *obedit= CTX_data_edit_object(C);
@@ -2289,6 +2355,7 @@
EditFace *efa;
short done=1, toggle=0;
int sel= !RNA_boolean_get(op->ptr, "deselect");
+ int limit= RNA_boolean_get(op->ptr, "limit");
/* unified_finednearest needs ogl */
view3d_operator_needs_opengl(C);
@@ -2301,7 +2368,16 @@
vc.mval[0]= event->x - vc.ar->winrct.xmin;
vc.mval[1]= event->y - vc.ar->winrct.ymin;
+ /* return warning! */
+ if(limit) {
+ int retval= select_linked_limited_invoke(&vc, 0, sel);
+ WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ return retval;
+ }
+
if( unified_findnearest(&vc, &eve, &eed, &efa)==0 ) {
+ WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+
return OPERATOR_CANCELLED;
}
@@ -2372,115 +2448,92 @@
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", "");
+ RNA_def_boolean(ot->srna, "limit", 0, "Limit by Seams", "");
}
+
/* ************************* */
-/* for use with selectconnected_delimit_mesh only! */
-#define is_edge_delimit_ok(eed) ((eed->tmp.l == 1) && (eed->seam==0))
-#define is_face_tag(efa) is_edge_delimit_ok(efa->e1) || is_edge_delimit_ok(efa->e2) || is_edge_delimit_ok(efa->e3) || (efa->v4 && is_edge_delimit_ok(efa->e4))
-
-#define face_tag(efa)\
- if(efa->v4) efa->tmp.l= efa->e1->tmp.l= efa->e2->tmp.l= efa->e3->tmp.l= efa->e4->tmp.l= 1;\
- else efa->tmp.l= efa->e1->tmp.l= efa->e2->tmp.l= efa->e3->tmp.l= 1;
-
-/* all - 1) use all faces for extending the selection 2) only use the mouse face
- * sel - 1) select 0) deselect
- * */
-static void selectconnected_delimit_mesh__internal(ViewContext *vc, short all, short sel)
+void selectconnected_mesh_all(EditMesh *em)
{
- EditMesh *em= vc->em;
- EditFace *efa;
+ EditVert *v1,*v2;
EditEdge *eed;
- short done=1, change=0;
- int dist = 75;
+ short done=1, toggle=0;
- if(em->faces.first==0) return;
+ if(em->edges.first==0) return;
- /* flag all edges as off*/
- for(eed= em->edges.first; eed; eed= eed->next)
- eed->tmp.l=0;
-
- if (all) {
- for(efa= em->faces.first; efa; efa= efa->next) {
- if (efa->f & SELECT) {
- face_tag(efa);
- } else {
- efa->tmp.l = 0;
- }
- }
- } else {
- EditFace *efa_mouse = findnearestface(vc, &dist);
+ while(done==1) {
+ done= 0;
- if( !efa_mouse ) {
- /* error("Nothing indicated "); */ /* this is mostly annoying, eps with occluded geometry */
- return;
- }
+ toggle++;
+ if(toggle & 1) eed= em->edges.first;
+ else eed= em->edges.last;
- for(efa= em->faces.first; efa; efa= efa->next) {
- efa->tmp.l = 0;
- }
- efa_mouse->tmp.l = 1;
- face_tag(efa_mouse);
- }
-
- while(done==1) {
- done= 0;
- /* simple algo - select all faces that have a selected edge
- * this intern selects the edge, repeat until nothing is left to do */
- for(efa= em->faces.first; efa; efa= efa->next) {
- if ((efa->tmp.l == 0) && (!efa->h)) {
- if (is_face_tag(efa)) {
- face_tag(efa);
- done= 1;
+ while(eed) {
+ v1= eed->v1;
+ v2= eed->v2;
+ if(eed->h==0) {
+ if(v1->f & SELECT) {
+ if( (v2->f & SELECT)==0 ) {
+ v2->f |= SELECT;
+ done= 1;
+ }
}
- }
- }
- }
-
- for(efa= em->faces.first; efa; efa= efa->next) {
- if (efa->tmp.l) {
- if (sel) {
- if (!(efa->f & SELECT)) {
- EM_select_face(efa, 1);
- change = 1;
+ else if(v2->f & SELECT) {
+ if( (v1->f & SELECT)==0 ) {
+ v1->f |= SELECT;
+ done= 1;
+ }
}
- } else {
- if (efa->f & SELECT) {
- EM_select_face(efa, 0);
- change = 1;
- }
}
+ if(toggle & 1) eed= eed->next;
+ else eed= eed->prev;
}
}
- if (!change)
- return;
+ /* now use vertex select flag to select rest */
+ EM_select_flush(em);
- if (!sel) /* make sure de-selecting faces didnt de-select the verts/edges connected to selected faces, this is common with boundries */
- for(efa= em->faces.first; efa; efa= efa->next)
- if (efa->f & SELECT)
- EM_select_face(efa, 1);
+ // if (EM_texFaceCheck())
+}
+
+static int select_linked_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ EditMesh *em= ((Mesh *)obedit->data)->edit_mesh;
-// if (EM_texFaceCheck())
+ 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);
+ return OPERATOR_FINISHED;
}
-#undef is_edge_delimit_ok
-#undef is_face_tag
-#undef face_tag
-
-void selectconnected_delimit_mesh(EditMesh *em)
+void MESH_OT_select_linked(wmOperatorType *ot)
{
+ /* identifiers */
+ ot->name= "Select Linked All";
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list