Added code to selection-flush to make sure fgons are selected/deselected
when changing vertex/edge selection
This commit is contained in:
parent
f2f97a5092
commit
e25d151aed
@ -110,6 +110,34 @@ void EM_select_edge(EditEdge *eed, int sel)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EM_select_face_fgon(EditFace *efa, int val)
|
||||||
|
{
|
||||||
|
EditMesh *em = G.editMesh;
|
||||||
|
short index=0;
|
||||||
|
|
||||||
|
if(efa->fgonf==0) EM_select_face(efa, val);
|
||||||
|
else {
|
||||||
|
if(efa->e1->fgoni) index= efa->e1->fgoni;
|
||||||
|
if(efa->e2->fgoni) index= efa->e2->fgoni;
|
||||||
|
if(efa->e3->fgoni) index= efa->e3->fgoni;
|
||||||
|
if(efa->v4 && efa->e4->fgoni) index= efa->e4->fgoni;
|
||||||
|
|
||||||
|
if(index==0) printf("wrong fgon select\n");
|
||||||
|
|
||||||
|
// select all ngon faces with index
|
||||||
|
for(efa= em->faces.first; efa; efa= efa->next) {
|
||||||
|
if(efa->fgonf) {
|
||||||
|
if(efa->e1->fgoni==index || efa->e2->fgoni==index ||
|
||||||
|
efa->e3->fgoni==index || (efa->e4 && efa->e4->fgoni==index) ) {
|
||||||
|
EM_select_face(efa, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* only vertices */
|
||||||
int faceselectedOR(EditFace *efa, int flag)
|
int faceselectedOR(EditFace *efa, int flag)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -225,6 +253,77 @@ void EM_select_flush(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* when vertices or edges can be selected, also make fgon consistant */
|
||||||
|
static void check_fgons_selection()
|
||||||
|
{
|
||||||
|
EditMesh *em = G.editMesh;
|
||||||
|
EditFace *efa, *efan;
|
||||||
|
EditEdge *eed;
|
||||||
|
ListBase *lbar;
|
||||||
|
int sel, desel, index, totfgon= 0;
|
||||||
|
|
||||||
|
/* count amount of fgons */
|
||||||
|
for(eed= em->edges.first; eed; eed= eed->next)
|
||||||
|
if(eed->fgoni>totfgon) totfgon= eed->fgoni;
|
||||||
|
|
||||||
|
if(totfgon==0) return;
|
||||||
|
|
||||||
|
lbar= MEM_callocN((totfgon+1)*sizeof(ListBase), "listbase array");
|
||||||
|
|
||||||
|
/* put all fgons in lbar */
|
||||||
|
for(efa= em->faces.first; efa; efa= efan) {
|
||||||
|
efan= efa->next;
|
||||||
|
index= efa->e1->fgoni;
|
||||||
|
if(index==0) index= efa->e2->fgoni;
|
||||||
|
if(index==0) index= efa->e3->fgoni;
|
||||||
|
if(index==0 && efa->e4) index= efa->e4->fgoni;
|
||||||
|
if(index) {
|
||||||
|
BLI_remlink(&em->faces, efa);
|
||||||
|
BLI_addtail(&lbar[index], efa);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* now check the fgons */
|
||||||
|
for(index=1; index<=totfgon; index++) {
|
||||||
|
/* we count on vertices/faces/edges being set OK, so we only have to set ngon itself */
|
||||||
|
sel= desel= 0;
|
||||||
|
for(efa= lbar[index].first; efa; efa= efa->next) {
|
||||||
|
if(efa->e1->fgoni==0) {
|
||||||
|
if(efa->e1->f & SELECT) sel++;
|
||||||
|
else desel++;
|
||||||
|
}
|
||||||
|
if(efa->e2->fgoni==0) {
|
||||||
|
if(efa->e2->f & SELECT) sel++;
|
||||||
|
else desel++;
|
||||||
|
}
|
||||||
|
if(efa->e3->fgoni==0) {
|
||||||
|
if(efa->e3->f & SELECT) sel++;
|
||||||
|
else desel++;
|
||||||
|
}
|
||||||
|
if(efa->e4 && efa->e4->fgoni==0) {
|
||||||
|
if(efa->e4->f & SELECT) sel++;
|
||||||
|
else desel++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(sel && desel) break;
|
||||||
|
}
|
||||||
|
printf("fgon %d sel %d desel %d\n", index, sel, desel);
|
||||||
|
if(sel && desel) sel= 0;
|
||||||
|
else if(sel) sel= 1;
|
||||||
|
else sel= 0;
|
||||||
|
|
||||||
|
/* select/deselect and put back */
|
||||||
|
for(efa= lbar[index].first; efa; efa= efa->next) {
|
||||||
|
if(sel) efa->f |= SELECT;
|
||||||
|
else efa->f &= ~SELECT;
|
||||||
|
}
|
||||||
|
addlisttolist(&em->faces, &lbar[index]);
|
||||||
|
}
|
||||||
|
|
||||||
|
MEM_freeN(lbar);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* flush to edges & faces */
|
/* flush to edges & faces */
|
||||||
|
|
||||||
/* based on select mode it selects edges/faces
|
/* based on select mode it selects edges/faces
|
||||||
@ -267,8 +366,7 @@ void EM_selectmode_flush(void)
|
|||||||
else efa->f &= ~SELECT;
|
else efa->f &= ~SELECT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// make sure selected faces have selected edges too, for extrude (hack?)
|
// make sure selected faces have selected edges too, for extrude (hack?)
|
||||||
else if(G.scene->selectmode & SCE_SELECT_FACE) {
|
else if(G.scene->selectmode & SCE_SELECT_FACE) {
|
||||||
for(efa= em->faces.first; efa; efa= efa->next) {
|
for(efa= em->faces.first; efa; efa= efa->next) {
|
||||||
@ -280,6 +378,8 @@ void EM_selectmode_flush(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
check_fgons_selection();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* when switching select mode, makes sure selection is consistant for editing */
|
/* when switching select mode, makes sure selection is consistant for editing */
|
||||||
|
@ -704,32 +704,6 @@ static int unified_findnearest(EditVert **eve, EditEdge **eed, EditFace **efa)
|
|||||||
return (*eve || *eed || *efa);
|
return (*eve || *eed || *efa);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EM_select_face_fgon(EditFace *efa, int val)
|
|
||||||
{
|
|
||||||
EditMesh *em = G.editMesh;
|
|
||||||
short index=0;
|
|
||||||
|
|
||||||
if(efa->fgonf==0) EM_select_face(efa, val);
|
|
||||||
else {
|
|
||||||
if(efa->e1->fgoni) index= efa->e1->fgoni;
|
|
||||||
if(efa->e2->fgoni) index= efa->e2->fgoni;
|
|
||||||
if(efa->e3->fgoni) index= efa->e3->fgoni;
|
|
||||||
if(efa->v4 && efa->e4->fgoni) index= efa->e4->fgoni;
|
|
||||||
|
|
||||||
if(index==0) printf("wrong fgon select\n");
|
|
||||||
|
|
||||||
// select all ngon faces with index
|
|
||||||
for(efa= em->faces.first; efa; efa= efa->next) {
|
|
||||||
if(efa->fgonf) {
|
|
||||||
if(efa->e1->fgoni==index || efa->e2->fgoni==index ||
|
|
||||||
efa->e3->fgoni==index || (efa->e4 && efa->e4->fgoni==index) ) {
|
|
||||||
EM_select_face(efa, val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* **************** LOOP SELECTS *************** */
|
/* **************** LOOP SELECTS *************** */
|
||||||
|
|
||||||
/* selects quads in loop direction of indicated edge */
|
/* selects quads in loop direction of indicated edge */
|
||||||
|
Loading…
Reference in New Issue
Block a user