Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/mesh/editmesh_lib.c')
-rw-r--r--source/blender/editors/mesh/editmesh_lib.c237
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);
+ }
+ }
+ }
+}