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:
Johnny Matthews 2005-08-08 15:59:05 +00:00
parent ed80fde36b
commit 7f98c960b5
3 changed files with 23 additions and 12 deletions

@ -154,6 +154,11 @@ extern void LoopMenu(void);
extern short sharesFace(struct EditEdge* e1, struct EditEdge* e2);
/* ******************* 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 int removedoublesflag(short flag, float limit);
extern void xsortvert_flag(int flag);

@ -376,9 +376,9 @@ void CutEdgeloop(int numcuts)
/* now cut the loops */
if(smooth){
esubdivideflag(SELECT,0,B_SMOOTH,numcuts,1);
esubdivideflag(SELECT,0,B_SMOOTH,numcuts,SUBDIV_SELECT_INNER_SEL);
} 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(numcuts == 1){
@ -664,9 +664,9 @@ void KnifeSubdivide(char mode)
eed= eed->next;
}
if (mode==KNIFE_EXACT) esubdivideflag(1, 0, B_KNIFE|B_PERCENTSUBD,1,0);
else if (mode==KNIFE_MIDPOINT) esubdivideflag(1, 0, B_KNIFE,1,0);
else if (mode==KNIFE_MULTICUT) esubdivideflag(1, 0, B_KNIFE,numcuts,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,SUBDIV_SELECT_ORIG);
else if (mode==KNIFE_MULTICUT) esubdivideflag(1, 0, B_KNIFE,numcuts,SUBDIV_SELECT_ORIG);
eed=em->edges.first;
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;
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);
facecopy(efa,hold);
if(i+1 != (vertsize-1)/2){
hold->e2->f2 |= EDGEINNER;
if(seltype == SUBDIV_SELECT_INNER){
hold->e2->f2 |= EDGEINNER;
}
}
hold = addfacelist(verts[vertsize-2-i],verts[vertsize-1-i],v[left],NULL,NULL,NULL);
facecopy(efa,hold);
if(i+1 != (vertsize-1)/2){
if(seltype == SUBDIV_SELECT_INNER){
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;
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++){
hold = addfacelist(verts[i],verts[i+1],v[op],NULL,NULL,NULL);
if(i+1 != vertsize-1){
if(seltype == SUBDIV_SELECT_INNER){
hold->e2->f2 |= EDGEINNER;
}
}
facecopy(efa,hold);
}
@ -2242,7 +2248,7 @@ void esubdivideflag(int flag, float rad, int beauty, int numcuts, int seltype)
switch(edgecount){
case 0: break;
case 1: ef->f1 = SELECT;
fill_quad_single(ef, gh, numcuts);
fill_quad_single(ef, gh, numcuts, seltype);
break;
case 2: ef->f1 = SELECT;
// 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){
case 0: break;
case 1: ef->f1 = SELECT;
fill_tri_single(ef, gh, numcuts);
fill_tri_single(ef, gh, numcuts, seltype);
break;
case 2: ef->f1 = SELECT;
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);
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){
if(eed->f2 & EDGENEW){
eed->f |= flag;
@ -2301,7 +2307,7 @@ void esubdivideflag(int flag, float rad, int beauty, int numcuts, int seltype)
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){
if(eed->f2 & EDGEINNER){
eed->f |= flag;