forked from bartvdbraak/blender
Added extra Select Type option for esubdivide and put them in defines to get rid of magic numbers
SUBDIV_SELECT_ORIG - Retain selection to look like original selection SUBDIV_SELECT_INNER - New selection is all the new inner edges SUBDIV_SELECT_INNER_SEL - New selection is all the new inner edges except where only 1 edges was selected on a face Loopcut now uses SUBDIV_SELECT_INNER_SEL for better interaction with edgeslide
This commit is contained in:
parent
ed80fde36b
commit
7f98c960b5
@ -154,6 +154,11 @@ extern void LoopMenu(void);
|
|||||||
extern short sharesFace(struct EditEdge* e1, struct EditEdge* e2);
|
extern short sharesFace(struct EditEdge* e1, struct EditEdge* e2);
|
||||||
|
|
||||||
/* ******************* editmesh_tools.c */
|
/* ******************* editmesh_tools.c */
|
||||||
|
|
||||||
|
#define SUBDIV_SELECT_ORIG 0
|
||||||
|
#define SUBDIV_SELECT_INNER 1
|
||||||
|
#define SUBDIV_SELECT_INNER_SEL 2
|
||||||
|
|
||||||
extern void convert_to_triface(int all);
|
extern void convert_to_triface(int all);
|
||||||
extern int removedoublesflag(short flag, float limit);
|
extern int removedoublesflag(short flag, float limit);
|
||||||
extern void xsortvert_flag(int flag);
|
extern void xsortvert_flag(int flag);
|
||||||
|
@ -376,9 +376,9 @@ void CutEdgeloop(int numcuts)
|
|||||||
|
|
||||||
/* now cut the loops */
|
/* now cut the loops */
|
||||||
if(smooth){
|
if(smooth){
|
||||||
esubdivideflag(SELECT,0,B_SMOOTH,numcuts,1);
|
esubdivideflag(SELECT,0,B_SMOOTH,numcuts,SUBDIV_SELECT_INNER_SEL);
|
||||||
} else {
|
} else {
|
||||||
esubdivideflag(SELECT,0,0,numcuts,1);
|
esubdivideflag(SELECT,0,0,numcuts,SUBDIV_SELECT_INNER_SEL);
|
||||||
}
|
}
|
||||||
/* if this was a single cut, enter edgeslide mode */
|
/* if this was a single cut, enter edgeslide mode */
|
||||||
if(numcuts == 1){
|
if(numcuts == 1){
|
||||||
@ -664,9 +664,9 @@ void KnifeSubdivide(char mode)
|
|||||||
eed= eed->next;
|
eed= eed->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode==KNIFE_EXACT) esubdivideflag(1, 0, B_KNIFE|B_PERCENTSUBD,1,0);
|
if (mode==KNIFE_EXACT) esubdivideflag(1, 0, B_KNIFE|B_PERCENTSUBD,1,SUBDIV_SELECT_ORIG);
|
||||||
else if (mode==KNIFE_MIDPOINT) esubdivideflag(1, 0, B_KNIFE,1,0);
|
else if (mode==KNIFE_MIDPOINT) esubdivideflag(1, 0, B_KNIFE,1,SUBDIV_SELECT_ORIG);
|
||||||
else if (mode==KNIFE_MULTICUT) esubdivideflag(1, 0, B_KNIFE,numcuts,0);
|
else if (mode==KNIFE_MULTICUT) esubdivideflag(1, 0, B_KNIFE,numcuts,SUBDIV_SELECT_ORIG);
|
||||||
|
|
||||||
eed=em->edges.first;
|
eed=em->edges.first;
|
||||||
while(eed){
|
while(eed){
|
||||||
|
@ -1346,7 +1346,7 @@ static void facecopy(EditFace *source,EditFace *target)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fill_quad_single(EditFace *efa, struct GHash *gh, int numcuts)
|
static void fill_quad_single(EditFace *efa, struct GHash *gh, int numcuts, int seltype)
|
||||||
{
|
{
|
||||||
EditEdge *cedge=NULL;
|
EditEdge *cedge=NULL;
|
||||||
EditVert *v[4], **verts;
|
EditVert *v[4], **verts;
|
||||||
@ -1418,17 +1418,21 @@ static void fill_quad_single(EditFace *efa, struct GHash *gh, int numcuts)
|
|||||||
hold = addfacelist(verts[i],verts[i+1],v[right],NULL,NULL,NULL);
|
hold = addfacelist(verts[i],verts[i+1],v[right],NULL,NULL,NULL);
|
||||||
facecopy(efa,hold);
|
facecopy(efa,hold);
|
||||||
if(i+1 != (vertsize-1)/2){
|
if(i+1 != (vertsize-1)/2){
|
||||||
|
if(seltype == SUBDIV_SELECT_INNER){
|
||||||
hold->e2->f2 |= EDGEINNER;
|
hold->e2->f2 |= EDGEINNER;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
hold = addfacelist(verts[vertsize-2-i],verts[vertsize-1-i],v[left],NULL,NULL,NULL);
|
hold = addfacelist(verts[vertsize-2-i],verts[vertsize-1-i],v[left],NULL,NULL,NULL);
|
||||||
facecopy(efa,hold);
|
facecopy(efa,hold);
|
||||||
if(i+1 != (vertsize-1)/2){
|
if(i+1 != (vertsize-1)/2){
|
||||||
|
if(seltype == SUBDIV_SELECT_INNER){
|
||||||
hold->e3->f2 |= EDGEINNER;
|
hold->e3->f2 |= EDGEINNER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void fill_tri_single(EditFace *efa, struct GHash *gh, int numcuts)
|
static void fill_tri_single(EditFace *efa, struct GHash *gh, int numcuts, int seltype)
|
||||||
{
|
{
|
||||||
EditEdge *cedge=NULL;
|
EditEdge *cedge=NULL;
|
||||||
EditVert *v[3], **verts;
|
EditVert *v[3], **verts;
|
||||||
@ -1490,7 +1494,9 @@ static void fill_tri_single(EditFace *efa, struct GHash *gh, int numcuts)
|
|||||||
for(i=0;i<(vertsize-1);i++){
|
for(i=0;i<(vertsize-1);i++){
|
||||||
hold = addfacelist(verts[i],verts[i+1],v[op],NULL,NULL,NULL);
|
hold = addfacelist(verts[i],verts[i+1],v[op],NULL,NULL,NULL);
|
||||||
if(i+1 != vertsize-1){
|
if(i+1 != vertsize-1){
|
||||||
|
if(seltype == SUBDIV_SELECT_INNER){
|
||||||
hold->e2->f2 |= EDGEINNER;
|
hold->e2->f2 |= EDGEINNER;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
facecopy(efa,hold);
|
facecopy(efa,hold);
|
||||||
}
|
}
|
||||||
@ -2242,7 +2248,7 @@ void esubdivideflag(int flag, float rad, int beauty, int numcuts, int seltype)
|
|||||||
switch(edgecount){
|
switch(edgecount){
|
||||||
case 0: break;
|
case 0: break;
|
||||||
case 1: ef->f1 = SELECT;
|
case 1: ef->f1 = SELECT;
|
||||||
fill_quad_single(ef, gh, numcuts);
|
fill_quad_single(ef, gh, numcuts, seltype);
|
||||||
break;
|
break;
|
||||||
case 2: ef->f1 = SELECT;
|
case 2: ef->f1 = SELECT;
|
||||||
// if there are 2, we check if edge 1 and 3 are either both on or off that way
|
// if there are 2, we check if edge 1 and 3 are either both on or off that way
|
||||||
@ -2266,7 +2272,7 @@ void esubdivideflag(int flag, float rad, int beauty, int numcuts, int seltype)
|
|||||||
switch(edgecount){
|
switch(edgecount){
|
||||||
case 0: break;
|
case 0: break;
|
||||||
case 1: ef->f1 = SELECT;
|
case 1: ef->f1 = SELECT;
|
||||||
fill_tri_single(ef, gh, numcuts);
|
fill_tri_single(ef, gh, numcuts, seltype);
|
||||||
break;
|
break;
|
||||||
case 2: ef->f1 = SELECT;
|
case 2: ef->f1 = SELECT;
|
||||||
fill_tri_double(ef, gh, numcuts);
|
fill_tri_double(ef, gh, numcuts);
|
||||||
@ -2290,7 +2296,7 @@ void esubdivideflag(int flag, float rad, int beauty, int numcuts, int seltype)
|
|||||||
}
|
}
|
||||||
free_tagged_edgelist(em->edges.first);
|
free_tagged_edgelist(em->edges.first);
|
||||||
|
|
||||||
if(seltype == 0 && G.qual != LR_CTRLKEY){
|
if(seltype == SUBDIV_SELECT_ORIG && G.qual != LR_CTRLKEY){
|
||||||
for(eed = em->edges.first;eed;eed = eed->next){
|
for(eed = em->edges.first;eed;eed = eed->next){
|
||||||
if(eed->f2 & EDGENEW){
|
if(eed->f2 & EDGENEW){
|
||||||
eed->f |= flag;
|
eed->f |= flag;
|
||||||
@ -2301,7 +2307,7 @@ void esubdivideflag(int flag, float rad, int beauty, int numcuts, int seltype)
|
|||||||
EM_select_edge(eed,0);
|
EM_select_edge(eed,0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (seltype == 1 || G.qual == LR_CTRLKEY){
|
} else if ((seltype == SUBDIV_SELECT_INNER || seltype == SUBDIV_SELECT_INNER_SEL)|| G.qual == LR_CTRLKEY){
|
||||||
for(eed = em->edges.first;eed;eed = eed->next){
|
for(eed = em->edges.first;eed;eed = eed->next){
|
||||||
if(eed->f2 & EDGEINNER){
|
if(eed->f2 & EDGEINNER){
|
||||||
eed->f |= flag;
|
eed->f |= flag;
|
||||||
|
Loading…
Reference in New Issue
Block a user