Selecting faces in editmode did not delimit seams as it does in Face/UV mode.
added this to editmode, only delimit seams if face selectmode is enabled.
This commit is contained in:
@@ -143,7 +143,10 @@ extern void righthandfaces(int select);
|
||||
extern void mouse_mesh(void);
|
||||
|
||||
extern void deselectall_mesh(void);
|
||||
extern void selectconnected_mesh(int qual);
|
||||
extern void selectconnected_mesh_all(void);
|
||||
extern void selectconnected_mesh(void);
|
||||
extern void selectconnected_delimit_mesh(void);
|
||||
extern void selectconnected_delimit_mesh_all(void);
|
||||
extern void selectswap_mesh(void);
|
||||
|
||||
extern void hide_mesh(int swap);
|
||||
|
||||
@@ -2086,7 +2086,7 @@ void mouse_mesh(void)
|
||||
}
|
||||
|
||||
|
||||
static void selectconnectedAll(void)
|
||||
void selectconnected_mesh_all(void)
|
||||
{
|
||||
EditMesh *em = G.editMesh;
|
||||
EditVert *v1,*v2;
|
||||
@@ -2135,7 +2135,7 @@ static void selectconnectedAll(void)
|
||||
BIF_undo_push("Select Connected (All)");
|
||||
}
|
||||
|
||||
void selectconnected_mesh(int qual)
|
||||
void selectconnected_mesh(void)
|
||||
{
|
||||
EditMesh *em = G.editMesh;
|
||||
EditVert *eve, *v1, *v2;
|
||||
@@ -2144,12 +2144,6 @@ void selectconnected_mesh(int qual)
|
||||
short done=1, sel, toggle=0;
|
||||
|
||||
if(em->edges.first==0) return;
|
||||
|
||||
if(qual & LR_CTRLKEY) {
|
||||
selectconnectedAll();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if( unified_findnearest(&eve, &eed, &efa)==0 ) {
|
||||
error("Nothing indicated ");
|
||||
@@ -2157,7 +2151,7 @@ void selectconnected_mesh(int qual)
|
||||
}
|
||||
|
||||
sel= 1;
|
||||
if(qual & LR_SHIFTKEY) sel=0;
|
||||
if(G.qual & LR_SHIFTKEY) sel=0;
|
||||
|
||||
/* clear test flags */
|
||||
for(v1= em->verts.first; v1; v1= v1->next) v1->f1= 0;
|
||||
@@ -2216,6 +2210,115 @@ void selectconnected_mesh(int qual)
|
||||
|
||||
}
|
||||
|
||||
/* 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(short all, short sel)
|
||||
{
|
||||
EditMesh *em = G.editMesh;
|
||||
EditFace *efa;
|
||||
short done=1, change=0;
|
||||
int dist = 75;
|
||||
EditEdge *eed;
|
||||
if(em->faces.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(&dist);
|
||||
|
||||
if( !efa_mouse ) {
|
||||
error("Nothing indicated ");
|
||||
return;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 (!change)
|
||||
return;
|
||||
|
||||
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);
|
||||
|
||||
countall();
|
||||
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
if (EM_texFaceCheck())
|
||||
allqueue(REDRAWIMAGE, 0);
|
||||
|
||||
BIF_undo_push("Select Linked Delimeted");
|
||||
|
||||
}
|
||||
|
||||
#undef is_edge_delimit_ok
|
||||
#undef is_face_tag
|
||||
#undef face_tag
|
||||
|
||||
void selectconnected_delimit_mesh(void)
|
||||
{
|
||||
selectconnected_delimit_mesh__internal(0, ((G.qual & LR_SHIFTKEY)==0));
|
||||
}
|
||||
void selectconnected_delimit_mesh_all(void)
|
||||
{
|
||||
selectconnected_delimit_mesh__internal(1, 1);
|
||||
}
|
||||
|
||||
|
||||
/* swap is 0 or 1, if 1 it hides not selected */
|
||||
void hide_mesh(int swap)
|
||||
{
|
||||
|
||||
@@ -957,7 +957,7 @@ void do_view3d_select_meshmenu(void *arg, int event)
|
||||
selectswap_mesh();
|
||||
break;
|
||||
case 4: /* select linked vertices */
|
||||
selectconnected_mesh(LR_CTRLKEY);
|
||||
selectconnected_mesh_all();
|
||||
break;
|
||||
case 5: /* select random */
|
||||
selectrandom_mesh();
|
||||
@@ -5025,7 +5025,7 @@ void view3d_buttons(void)
|
||||
uiBlockEndAlign(block);
|
||||
}
|
||||
} else {
|
||||
if (G.obedit==NULL && (G.f & (G_VERTEXPAINT|G_WEIGHTPAINT|G_TEXTUREPAINT))) {
|
||||
if (G.obedit==NULL && (G.f & (G_VERTEXPAINT|G_WEIGHTPAINT|G_TEXTUREPAINT|G_SCULPTMODE))) {
|
||||
uiDefIconButBitI(block, TOG, G_FACESELECT, B_REDR, ICON_FACESEL_HLT,xco,0,XIC,YIC, &G.f, 0, 0, 0, 0, "Painting Mask (FKey)");
|
||||
xco+= XIC+10;
|
||||
} else {
|
||||
|
||||
@@ -2041,8 +2041,21 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
break;
|
||||
case LKEY:
|
||||
if(G.obedit) {
|
||||
if(G.obedit->type==OB_MESH)
|
||||
selectconnected_mesh(G.qual);
|
||||
if(G.obedit->type==OB_MESH) {
|
||||
if (G.qual & LR_CTRLKEY) {
|
||||
if ((G.scene->selectmode & SCE_SELECT_FACE) == 0) {
|
||||
selectconnected_mesh_all(); /* normal select linked */
|
||||
} else {
|
||||
selectconnected_delimit_mesh_all(); /* select linked with edge crease delimiting */
|
||||
}
|
||||
} else {
|
||||
if ((G.scene->selectmode & SCE_SELECT_FACE) == 0) {
|
||||
selectconnected_mesh();
|
||||
} else {
|
||||
selectconnected_delimit_mesh();
|
||||
}
|
||||
}
|
||||
}
|
||||
if(G.obedit->type==OB_ARMATURE)
|
||||
selectconnected_armature();
|
||||
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF)
|
||||
|
||||
Reference in New Issue
Block a user