[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32837] trunk/blender/source/blender/ editors/mesh: bugfix [#24398] Select Nth
Campbell Barton
ideasman42 at gmail.com
Tue Nov 2 12:14:04 CET 2010
Revision: 32837
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32837
Author: campbellbarton
Date: 2010-11-02 12:14:04 +0100 (Tue, 02 Nov 2010)
Log Message:
-----------
bugfix [#24398] Select Nth
- use first selected if non active (clears confusion since this isn't at all clear)
- dont take unselected into account when calculating connectivity, would mess up in many cases.
Modified Paths:
--------------
trunk/blender/source/blender/editors/mesh/editmesh_lib.c
trunk/blender/source/blender/editors/mesh/editmesh_mods.c
Modified: trunk/blender/source/blender/editors/mesh/editmesh_lib.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_lib.c 2010-11-02 11:10:21 UTC (rev 32836)
+++ trunk/blender/source/blender/editors/mesh/editmesh_lib.c 2010-11-02 11:14:04 UTC (rev 32837)
@@ -2578,18 +2578,23 @@
ok = 0;
for (efa= em->faces.first; efa; efa= efa->next) {
- if(efa->tmp.l==1) { /* initialize */
- tag_face_edges(efa);
+ if(efa->f & SELECT) {
+ if(efa->tmp.l==1) { /* initialize */
+ tag_face_edges(efa);
+ }
+
+ if(efa->tmp.l) {
+ efa->tmp.l++;
+ }
}
-
- if(efa->tmp.l)
- efa->tmp.l++;
}
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 */
+ if(efa->f & SELECT) {
+ if(efa->tmp.l==0 && tag_face_edges_test(efa)) {
+ efa->tmp.l= 1;
+ ok = 1; /* keep looping */
+ }
}
}
}
@@ -2644,18 +2649,23 @@
ok = 0;
for (eed= em->edges.first; eed; eed= eed->next) {
- if(eed->tmp.l==1) { /* initialize */
- tag_edge_verts(eed);
+ if(eed->f & SELECT) {
+ if(eed->tmp.l==1) { /* initialize */
+ tag_edge_verts(eed);
+ }
+
+ if(eed->tmp.l) {
+ eed->tmp.l++;
+ }
}
-
- if(eed->tmp.l)
- eed->tmp.l++;
}
for (eed= em->edges.first; eed; eed= eed->next) {
- if(eed->tmp.l==0 && tag_edge_verts_test(eed)) {
- eed->tmp.l= 1;
- ok = 1; /* keep looping */
+ if(eed->f & SELECT) {
+ if(eed->tmp.l==0 && tag_edge_verts_test(eed)) {
+ eed->tmp.l= 1;
+ ok = 1; /* keep looping */
+ }
}
}
}
@@ -2711,19 +2721,23 @@
ok = 0;
for (eve= em->verts.first; eve; eve= eve->next) {
- if(eve->tmp.l)
- eve->tmp.l++;
+ if(eve->f & SELECT) {
+ if(eve->tmp.l)
+ eve->tmp.l++;
+ }
}
for (eed= em->edges.first; eed; eed= eed->next) {
- if(eed->v1->tmp.l==2 && eed->v2->tmp.l==0) { /* initialize */
- eed->v2->tmp.l= 1;
- ok = 1; /* keep looping */
+ if(eed->f & SELECT) {
+ if(eed->v1->tmp.l==2 && eed->v2->tmp.l==0) { /* initialize */
+ eed->v2->tmp.l= 1;
+ ok = 1; /* keep looping */
+ }
+ else if(eed->v2->tmp.l==2 && eed->v1->tmp.l==0) { /* initialize */
+ eed->v1->tmp.l= 1;
+ ok = 1; /* keep looping */
+ }
}
- else if(eed->v2->tmp.l==2 && eed->v1->tmp.l==0) { /* initialize */
- eed->v1->tmp.l= 1;
- ok = 1; /* keep looping */
- }
}
}
@@ -2740,32 +2754,79 @@
// EM_nfaces_selected(em); // flush does these
}
-int EM_deselect_nth(EditMesh *em, int nth)
+static void deselect_nth_active(EditMesh *em, EditVert **eve_p, EditEdge **eed_p, EditFace **efa_p)
{
EditSelection *ese;
- ese = ((EditSelection*)em->selected.last);
+
+ *eve_p= NULL;
+ *eed_p= NULL;
+ *efa_p= NULL;
+
+ ese= (EditSelection*)em->selected.last;
+
if(ese) {
- if(ese->type == EDITVERT) {
- em_deselect_nth_vert(em, nth, (EditVert*)ese->data);
- return 1;
+ switch(ese->type) {
+ case EDITVERT:
+ *eve_p= (EditVert *)ese->data;
+ return;
+ case EDITEDGE:
+ *eed_p= (EditEdge *)ese->data;
+ return;
+ case EDITFACE:
+ *efa_p= (EditFace *)ese->data;
+ return;
}
+ }
- if(ese->type == EDITEDGE) {
- em_deselect_nth_edge(em, nth, (EditEdge*)ese->data);
- return 1;
+ if(em->selectmode & SCE_SELECT_VERTEX) {
+ EditVert *eve;
+ for (eve= em->verts.first; eve; eve= eve->next) {
+ if(eve->f & SELECT) {
+ *eve_p= eve;
+ return;
+ }
}
}
- else {
- EditFace *efa_act = EM_get_actFace(em, 0);
- if(efa_act) {
- em_deselect_nth_face(em, nth, efa_act);
- return 1;
+
+ if(em->selectmode & SCE_SELECT_EDGE) {
+ EditEdge *eed;
+ for (eed= em->edges.first; eed; eed= eed->next) {
+ if(eed->f & SELECT) {
+ *eed_p= eed;
+ return;
+ }
}
}
- return 0;
+ if(em->selectmode & SCE_SELECT_FACE) {
+ EditFace *efa= EM_get_actFace(em, 1);
+ if(efa) {
+ *efa_p= efa;
+ return;
+ }
+ }
}
+int EM_deselect_nth(EditMesh *em, int nth)
+{
+ EditVert *eve;
+ EditEdge *eed;
+ EditFace *efa;
+
+ deselect_nth_active(em, &eve, &eed, &efa);
+
+ if(eve)
+ em_deselect_nth_vert(em, nth, eve);
+ else if (eed)
+ em_deselect_nth_edge(em, nth, eed);
+ else if (efa)
+ em_deselect_nth_face(em, nth, efa);
+ else
+ return 0;
+
+ return 1;
+}
+
void EM_project_snap_verts(bContext *C, ARegion *ar, Object *obedit, EditMesh *em)
{
EditVert *eve;
Modified: trunk/blender/source/blender/editors/mesh/editmesh_mods.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_mods.c 2010-11-02 11:10:21 UTC (rev 32836)
+++ trunk/blender/source/blender/editors/mesh/editmesh_mods.c 2010-11-02 11:14:04 UTC (rev 32837)
@@ -4581,10 +4581,7 @@
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
int nth = RNA_int_get(op->ptr, "nth");
- if(EM_deselect_nth(em, nth) == 0) {
- BKE_report(op->reports, RPT_ERROR, "Mesh has no active vert/edge/face.");
- return OPERATOR_CANCELLED;
- }
+ EM_deselect_nth(em, nth);
BKE_mesh_end_editmesh(obedit->data, em);
More information about the Bf-blender-cvs
mailing list