diff options
Diffstat (limited to 'source/blender/editors/mesh/editmesh_lib.c')
-rw-r--r-- | source/blender/editors/mesh/editmesh_lib.c | 237 |
1 files changed, 156 insertions, 81 deletions
diff --git a/source/blender/editors/mesh/editmesh_lib.c b/source/blender/editors/mesh/editmesh_lib.c index d34cca0d358..9ec50fdd6b3 100644 --- a/source/blender/editors/mesh/editmesh_lib.c +++ b/source/blender/editors/mesh/editmesh_lib.c @@ -48,16 +48,18 @@ editmesh_lib: generic (no UI, no menus) operations/evaluators for editmesh data #include "BLI_math.h" #include "BLI_editVert.h" #include "BLI_edgehash.h" +#include "BLI_utildefines.h" #include "BKE_customdata.h" #include "BKE_context.h" #include "BKE_global.h" #include "BKE_mesh.h" -#include "BKE_utildefines.h" + #include "ED_mesh.h" #include "ED_screen.h" #include "ED_view3d.h" +#include "ED_transform.h" #include "mesh_intern.h" @@ -214,7 +216,7 @@ static int EM_check_selection(EditMesh *em, void *data) return 0; } -void EM_remove_selection(EditMesh *em, void *data, int type) +void EM_remove_selection(EditMesh *em, void *data, int UNUSED(type)) { EditSelection *ese; for(ese=em->selected.first; ese; ese = ese->next){ @@ -358,7 +360,7 @@ void EM_editselection_plane(float *plane, EditSelection *ese) however selecting different edges can swap the direction of the y axis. this makes it less likely for the y axis of the manipulator (running along the edge).. to flip less often. - at least its more pradictable */ + at least its more predictable */ if (eed->v2->co[1] > eed->v1->co[1]) /*check which to do first */ sub_v3_v3v3(plane, eed->v2->co, eed->v1->co); else @@ -697,7 +699,7 @@ static void check_fgons_selection(EditMesh *em) if(sel) efa->f |= SELECT; else efa->f &= ~SELECT; } - addlisttolist(&em->faces, &lbar[index]); + BLI_movelisttolist(&em->faces, &lbar[index]); } MEM_freeN(lbar); @@ -1050,7 +1052,7 @@ static void set_edge_directions_f2(EditMesh *em, int val) /* individual face extrude */ /* will use vertex normals for extrusion directions, so *nor is unaffected */ -short extrudeflag_face_indiv(EditMesh *em, short flag, float *nor) +short extrudeflag_face_indiv(EditMesh *em, short UNUSED(flag), float *UNUSED(nor)) { EditVert *eve, *v1, *v2, *v3, *v4; EditEdge *eed; @@ -1204,7 +1206,7 @@ short extrudeflag_edges_indiv(EditMesh *em, short flag, float *nor) } /* extrudes individual vertices */ -short extrudeflag_verts_indiv(EditMesh *em, short flag, float *nor) +short extrudeflag_verts_indiv(EditMesh *em, short flag, float *UNUSED(nor)) { EditVert *eve; @@ -1230,7 +1232,7 @@ short extrudeflag_verts_indiv(EditMesh *em, short flag, float *nor) /* this is actually a recode of extrudeflag(), using proper edge/face select */ /* hurms, doesnt use 'flag' yet, but its not called by primitive making stuff anyway */ -static short extrudeflag_edge(Object *obedit, EditMesh *em, short flag, float *nor, int all) +static short extrudeflag_edge(Object *obedit, EditMesh *em, short UNUSED(flag), float *nor, int all) { /* all select edges/faces: extrude */ /* old select is cleared, in new ones it is set */ @@ -1390,27 +1392,22 @@ static short extrudeflag_edge(Object *obedit, EditMesh *em, short flag, float *n if (efa->v4 && (efa->v4->tmp.v == NULL)) efa->v4->tmp.v = addvertlist(em, efa->v4->co, efa->v4); - if(del_old==0) { // keep old faces means flipping normal - if(efa->v4) - efan = addfacelist(em, efa->v4->tmp.v, efa->v3->tmp.v, - efa->v2->tmp.v, efa->v1->tmp.v, efa, efa); - else - efan = addfacelist(em, efa->v3->tmp.v, efa->v2->tmp.v, - efa->v1->tmp.v, NULL, efa, efa); - } - else { - if(efa->v4) - efan = addfacelist(em, efa->v1->tmp.v, efa->v2->tmp.v, - efa->v3->tmp.v, efa->v4->tmp.v, efa, efa); - else - efan = addfacelist(em, efa->v1->tmp.v, efa->v2->tmp.v, - efa->v3->tmp.v, NULL, efa, efa); + if(efa->v4) + efan = addfacelist(em, efa->v1->tmp.v, efa->v2->tmp.v, + efa->v3->tmp.v, efa->v4->tmp.v, efa, efa); + else + efan = addfacelist(em, efa->v1->tmp.v, efa->v2->tmp.v, + efa->v3->tmp.v, NULL, efa, efa); + + /* keep old faces means flipping normal, reverse vertex order gives bad UV's & VCols etc - [#25260] */ + if(del_old==0) { + flipface(em, efan); } - + if (em->act_face == efa) { em->act_face = efan; } - + /* for transform */ add_normal_aligned(nor, efa->n); } @@ -1640,10 +1637,10 @@ short extrudeflag_vert(Object *obedit, EditMesh *em, short flag, float *nor, int VECCOPY(v1->co, eve->co); VECCOPY(v1->no, eve->no); v1->f= eve->f; - eve->f-= flag; + eve->f &= ~flag; eve->tmp.v = v1; } - else eve->tmp.v = 0; + else eve->tmp.v = NULL; eve= eve->prev; } @@ -1701,17 +1698,7 @@ short extrudeflag_vert(Object *obedit, EditMesh *em, short flag, float *nor, int eed= nexted; } - if(del_old) { - eed= em->edges.first; - while(eed) { - nexted= eed->next; - if(eed->f2==3 && eed->f1==1) { - remedge(em, eed); - free_editedge(em, eed); - } - eed= nexted; - } - } + /* duplicate faces, if necessary remove old ones */ efa= em->faces.first; while(efa) { @@ -1724,7 +1711,7 @@ short extrudeflag_vert(Object *obedit, EditMesh *em, short flag, float *nor, int if(efa->v4) v4 = efa->v4->tmp.v; else - v4= 0; + v4= NULL; /* hmm .. not sure about edges here */ if(del_old==0) // if we keep old, we flip normal @@ -1742,6 +1729,18 @@ short extrudeflag_vert(Object *obedit, EditMesh *em, short flag, float *nor, int } efa= nextvl; } + /* delete edges after copying edges above! */ + if(del_old) { + eed= em->edges.first; + while(eed) { + nexted= eed->next; + if(eed->f2==3 && eed->f1==1) { + remedge(em, eed); + free_editedge(em, eed); + } + eed= nexted; + } + } normalize_v3(nor); // for grab @@ -1827,7 +1826,7 @@ static EditVert *adduplicate_vertex(EditMesh *em, EditVert *eve, int flag) EditVert *v1= addvertlist(em, eve->co, eve); v1->f= eve->f; - eve->f-= flag; + eve->f &= ~flag; eve->f|= 128; eve->tmp.v = v1; @@ -1866,7 +1865,7 @@ void adduplicateflag(EditMesh *em, int flag) newed= addedgelist(em, v1, v2, eed); newed->f= eed->f; - eed->f -= flag; + eed->f &= ~flag; eed->f |= 128; } } @@ -1893,7 +1892,7 @@ void adduplicateflag(EditMesh *em, int flag) } newfa->f= efa->f; - efa->f -= flag; + efa->f &= ~flag; efa->f |= 128; } } @@ -2443,7 +2442,7 @@ void EM_make_hq_normals(EditMesh *em) for(edge_iter = BLI_edgehashIterator_new(edge_hash); !BLI_edgehashIterator_isDone(edge_iter); BLI_edgehashIterator_step(edge_iter)) { - /* Get the edge vert indicies, and edge value (the face indicies that use it)*/ + /* Get the edge vert indices, and edge value (the face indices that use it)*/ BLI_edgehashIterator_getKey(edge_iter, (int*)&ed_v1, (int*)&ed_v2); edge_ref = BLI_edgehashIterator_getValue(edge_iter); @@ -2577,18 +2576,23 @@ void em_deselect_nth_face(EditMesh *em, int nth, EditFace *efa_act) 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 */ + } } } } @@ -2643,18 +2647,23 @@ void em_deselect_nth_edge(EditMesh *em, int nth, EditEdge *eed_act) 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 */ + } } } } @@ -2710,18 +2719,22 @@ void em_deselect_nth_vert(EditMesh *em, int nth, EditVert *eve_act) 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 */ - } - else if(eed->v2->tmp.l==2 && eed->v1->tmp.l==0) { /* initialize */ - eed->v1->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 */ + } } } } @@ -2739,29 +2752,91 @@ void em_deselect_nth_vert(EditMesh *em, int nth, EditVert *eve_act) // 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; + for(eve= em->verts.first;eve; eve=eve->next) { + if(eve->f & SELECT) { + float mval[2], vec[3], no_dummy[3]; + int dist_dummy; + mul_v3_m4v3(vec, obedit->obmat, eve->co); + project_float_noclip(ar, vec, mval); + if(snapObjectsContext(C, mval, &dist_dummy, vec, no_dummy, SNAP_NOT_OBEDIT)) { + mul_v3_m4v3(eve->co, obedit->imat, vec); + } + } + } +} |