This commit adds rotate edges Clockwise and CounterClockwise to the Edge Specials Menu (and of course the code to back them up)

This commit is contained in:
2005-02-16 15:02:58 +00:00
parent b7eaee3ad2
commit 0324fc10b1
4 changed files with 169 additions and 82 deletions

View File

@@ -2434,7 +2434,7 @@ void edge_flip(void)
}
static void edge_rotate(EditEdge *eed)
static void edge_rotate(EditEdge *eed,int dir)
{
EditMesh *em = G.editMesh;
EditFace *face[2], *efa, *newFace[2];
@@ -2564,95 +2564,176 @@ static void edge_rotate(EditEdge *eed)
/* create the 2 new faces */
if(fac1 == 3 && fac2 == 3){
newFace[0] = addfacelist(faces[0][(p1+1)%3],faces[0][(p1+2)%3],faces[1][(p3+1)%3],NULL,NULL,NULL);
newFace[1] = addfacelist(faces[1][(p3+1)%3],faces[1][(p3+2)%3],faces[0][(p1+1)%3],NULL,NULL,NULL);
/*No need of reverse setup*/
newFace[0] = addfacelist(faces[0][(p1+1 )%3],faces[0][(p1+2 )%3],faces[1][(p3+1 )%3],NULL,NULL,NULL);
newFace[1] = addfacelist(faces[1][(p3+1 )%3],faces[1][(p3+2 )%3],faces[0][(p1+1 )%3],NULL,NULL,NULL);
newFace[0]->tf.col[0] = face[0]->tf.col[(p1+1)%3];
newFace[0]->tf.col[1] = face[0]->tf.col[(p1+2)%3];
newFace[0]->tf.col[2] = face[1]->tf.col[(p3+1)%3];
newFace[1]->tf.col[0] = face[1]->tf.col[(p3+1)%3];
newFace[1]->tf.col[1] = face[1]->tf.col[(p3+2)%3];
newFace[1]->tf.col[2] = face[0]->tf.col[(p1+1)%3];
newFace[0]->tf.col[0] = face[0]->tf.col[(p1+1 )%3];
newFace[0]->tf.col[1] = face[0]->tf.col[(p1+2 )%3];
newFace[0]->tf.col[2] = face[1]->tf.col[(p3+1 )%3];
newFace[1]->tf.col[0] = face[1]->tf.col[(p3+1 )%3];
newFace[1]->tf.col[1] = face[1]->tf.col[(p3+2 )%3];
newFace[1]->tf.col[2] = face[0]->tf.col[(p1+1 )%3];
UVCOPY(newFace[0]->tf.uv[0],face[0]->tf.uv[(p1+1)%3]);
UVCOPY(newFace[0]->tf.uv[1],face[0]->tf.uv[(p1+2)%3]);
UVCOPY(newFace[0]->tf.uv[2],face[1]->tf.uv[(p3+1)%3]);
UVCOPY(newFace[1]->tf.uv[0],face[1]->tf.uv[(p3+1)%3]);
UVCOPY(newFace[1]->tf.uv[1],face[1]->tf.uv[(p3+2)%3]);
UVCOPY(newFace[1]->tf.uv[2],face[0]->tf.uv[(p1+1)%3]);
UVCOPY(newFace[0]->tf.uv[0],face[0]->tf.uv[(p1+1 )%3]);
UVCOPY(newFace[0]->tf.uv[1],face[0]->tf.uv[(p1+2 )%3]);
UVCOPY(newFace[0]->tf.uv[2],face[1]->tf.uv[(p3+1 )%3]);
UVCOPY(newFace[1]->tf.uv[0],face[1]->tf.uv[(p3+1 )%3]);
UVCOPY(newFace[1]->tf.uv[1],face[1]->tf.uv[(p3+2 )%3]);
UVCOPY(newFace[1]->tf.uv[2],face[0]->tf.uv[(p1+1 )%3]);
}
else if(fac1 == 4 && fac2 == 3){
newFace[0] = addfacelist(faces[0][(p1+1)%4],faces[0][(p1+2)%4],faces[0][(p1+3)%4],faces[1][(p3+1)%3],NULL,NULL);
newFace[1] = addfacelist(faces[1][(p3+1)%3],faces[1][(p3+2)%3],faces[0][(p1+1)%4],NULL,NULL,NULL);
if(dir == 1){
newFace[0] = addfacelist(faces[0][(p1+1 )%4],faces[0][(p1+2 )%4],faces[0][(p1+3 )%4],faces[1][(p3+1 )%3],NULL,NULL);
newFace[1] = addfacelist(faces[1][(p3+1 )%3],faces[1][(p3+2 )%3],faces[0][(p1+1 )%4],NULL,NULL,NULL);
newFace[0]->tf.col[0] = face[0]->tf.col[(p1+1 )%4];
newFace[0]->tf.col[1] = face[0]->tf.col[(p1+2 )%4];
newFace[0]->tf.col[2] = face[0]->tf.col[(p1+3 )%4];
newFace[0]->tf.col[3] = face[1]->tf.col[(p3+1 )%3];
newFace[1]->tf.col[0] = face[1]->tf.col[(p3+1 )%3];
newFace[1]->tf.col[1] = face[1]->tf.col[(p3+2 )%3];
newFace[1]->tf.col[2] = face[0]->tf.col[(p1+1 )%4];
UVCOPY(newFace[0]->tf.uv[0],face[0]->tf.uv[(p1+1 )%4]);
UVCOPY(newFace[0]->tf.uv[1],face[0]->tf.uv[(p1+2 )%4]);
UVCOPY(newFace[0]->tf.uv[2],face[0]->tf.uv[(p1+3 )%4]);
UVCOPY(newFace[0]->tf.uv[3],face[1]->tf.uv[(p3+1 )%3]);
UVCOPY(newFace[1]->tf.uv[0],face[1]->tf.uv[(p3+1 )%3]);
UVCOPY(newFace[1]->tf.uv[1],face[1]->tf.uv[(p3+2 )%3]);
UVCOPY(newFace[1]->tf.uv[2],face[0]->tf.uv[(p1+1 )%4]);
} else if (dir == 2){
newFace[0] = addfacelist(faces[0][(p1+2 )%4],faces[1][(p3+1)%3],faces[0][(p1)%4],faces[0][(p1+1 )%4],NULL,NULL);
newFace[1] = addfacelist(faces[0][(p1+2 )%4],faces[1][(p3)%3],faces[1][(p3+1 )%3],NULL,NULL,NULL);
newFace[0]->tf.col[0] = face[0]->tf.col[(p1+1)%4];
newFace[0]->tf.col[1] = face[0]->tf.col[(p1+2)%4];
newFace[0]->tf.col[2] = face[0]->tf.col[(p1+3)%4];
newFace[0]->tf.col[3] = face[1]->tf.col[(p3+1)%3];
newFace[1]->tf.col[0] = face[1]->tf.col[(p3+1)%3];
newFace[1]->tf.col[1] = face[1]->tf.col[(p3+2)%3];
newFace[1]->tf.col[2] = face[0]->tf.col[(p1+1)%4];
UVCOPY(newFace[0]->tf.uv[0],face[0]->tf.uv[(p1+1)%4]);
UVCOPY(newFace[0]->tf.uv[1],face[0]->tf.uv[(p1+2)%4]);
UVCOPY(newFace[0]->tf.uv[2],face[0]->tf.uv[(p1+3)%4]);
UVCOPY(newFace[0]->tf.uv[3],face[1]->tf.uv[(p3+1)%3]);
UVCOPY(newFace[1]->tf.uv[0],face[1]->tf.uv[(p3+1)%3]);
UVCOPY(newFace[1]->tf.uv[1],face[1]->tf.uv[(p3+2)%3]);
UVCOPY(newFace[1]->tf.uv[2],face[0]->tf.uv[(p1+1)%4]);
newFace[0]->tf.col[0] = face[0]->tf.col[(p1+2)%4];
newFace[0]->tf.col[1] = face[1]->tf.col[(p3+1)%3];
newFace[0]->tf.col[2] = face[0]->tf.col[(p1 )%4];
newFace[0]->tf.col[3] = face[0]->tf.col[(p1+1)%4];
newFace[1]->tf.col[0] = face[0]->tf.col[(p1+2)%4];
newFace[1]->tf.col[1] = face[1]->tf.col[(p3 )%3];
newFace[1]->tf.col[2] = face[1]->tf.col[(p3+1)%3];
UVCOPY(newFace[0]->tf.uv[0],face[0]->tf.uv[(p1+2)%4]);
UVCOPY(newFace[0]->tf.uv[1],face[1]->tf.uv[(p3+1)%3]);
UVCOPY(newFace[0]->tf.uv[2],face[0]->tf.uv[(p1 )%4]);
UVCOPY(newFace[0]->tf.uv[3],face[0]->tf.uv[(p1+1)%4]);
UVCOPY(newFace[1]->tf.uv[0],face[0]->tf.uv[(p1+2)%4]);
UVCOPY(newFace[1]->tf.uv[1],face[1]->tf.uv[(p3 )%3]);
UVCOPY(newFace[1]->tf.uv[2],face[1]->tf.uv[(p3+1)%3]);
faces[0][(p1+2)%fac1]->f |= SELECT;
faces[1][(p3+1)%fac2]->f |= SELECT;
}
}
else if(fac1 == 3 && fac2 == 4){
newFace[0] = addfacelist(faces[0][(p1+1)%3],faces[0][(p1+2)%3],faces[1][(p3+1)%4],NULL,NULL,NULL);
newFace[1] = addfacelist(faces[1][(p3+1)%4],faces[1][(p3+2)%4],faces[1][(p3+3)%4],faces[0][(p1+1)%3],NULL,NULL);
newFace[0]->tf.col[0] = face[0]->tf.col[(p1+1)%3];
newFace[0]->tf.col[1] = face[0]->tf.col[(p1+2)%3];
newFace[0]->tf.col[2] = face[1]->tf.col[(p3+1)%4];
newFace[1]->tf.col[0] = face[1]->tf.col[(p3+1)%4];
newFace[1]->tf.col[1] = face[1]->tf.col[(p3+2)%4];
newFace[1]->tf.col[2] = face[1]->tf.col[(p3+3)%4];
newFace[1]->tf.col[3] = face[0]->tf.col[(p1+1)%3];
UVCOPY(newFace[0]->tf.uv[0],face[0]->tf.uv[(p1+1)%3]);
UVCOPY(newFace[0]->tf.uv[1],face[0]->tf.uv[(p1+2)%3]);
UVCOPY(newFace[0]->tf.uv[2],face[1]->tf.uv[(p3+1)%4]);
UVCOPY(newFace[1]->tf.uv[0],face[1]->tf.uv[(p3+1)%4]);
UVCOPY(newFace[1]->tf.uv[1],face[1]->tf.uv[(p3+2)%4]);
UVCOPY(newFace[1]->tf.uv[2],face[1]->tf.uv[(p3+3)%4]);
UVCOPY(newFace[1]->tf.uv[3],face[0]->tf.uv[(p1+1)%3]);
if(dir == 1){
newFace[0] = addfacelist(faces[0][(p1+1 )%3],faces[0][(p1+2 )%3],faces[1][(p3+1 )%4],NULL,NULL,NULL);
newFace[1] = addfacelist(faces[1][(p3+1 )%4],faces[1][(p3+2 )%4],faces[1][(p3+3 )%4],faces[0][(p1+1 )%3],NULL,NULL);
newFace[0]->tf.col[0] = face[0]->tf.col[(p1+1 )%3];
newFace[0]->tf.col[1] = face[0]->tf.col[(p1+2 )%3];
newFace[0]->tf.col[2] = face[1]->tf.col[(p3+1 )%4];
newFace[1]->tf.col[0] = face[1]->tf.col[(p3+1 )%4];
newFace[1]->tf.col[1] = face[1]->tf.col[(p3+2 )%4];
newFace[1]->tf.col[2] = face[1]->tf.col[(p3+3 )%4];
newFace[1]->tf.col[3] = face[0]->tf.col[(p1+1 )%3];
UVCOPY(newFace[0]->tf.uv[0],face[0]->tf.uv[(p1+1 )%3]);
UVCOPY(newFace[0]->tf.uv[1],face[0]->tf.uv[(p1+2 )%3]);
UVCOPY(newFace[0]->tf.uv[2],face[1]->tf.uv[(p3+1 )%4]);
UVCOPY(newFace[1]->tf.uv[0],face[1]->tf.uv[(p3+1 )%4]);
UVCOPY(newFace[1]->tf.uv[1],face[1]->tf.uv[(p3+2 )%4]);
UVCOPY(newFace[1]->tf.uv[2],face[1]->tf.uv[(p3+3 )%4]);
UVCOPY(newFace[1]->tf.uv[3],face[0]->tf.uv[(p1+1 )%3]);
} else if (dir == 2){
newFace[0] = addfacelist(faces[0][(p1)%3],faces[0][(p1+1 )%3],faces[1][(p3+2 )%4],NULL,NULL,NULL);
newFace[1] = addfacelist(faces[1][(p3+1 )%4],faces[1][(p3+2 )%4],faces[0][(p1+1 )%3],faces[0][(p1+2 )%3],NULL,NULL);
newFace[0]->tf.col[0] = face[0]->tf.col[(p1 )%3];
newFace[0]->tf.col[1] = face[0]->tf.col[(p1+1 )%3];
newFace[0]->tf.col[2] = face[1]->tf.col[(p3+2 )%4];
newFace[1]->tf.col[0] = face[1]->tf.col[(p3+1 )%4];
newFace[1]->tf.col[1] = face[1]->tf.col[(p3+2 )%4];
newFace[1]->tf.col[2] = face[0]->tf.col[(p1+1 )%3];
newFace[1]->tf.col[3] = face[0]->tf.col[(p1+2 )%3];
UVCOPY(newFace[0]->tf.uv[0],face[0]->tf.uv[(p1 )%3]);
UVCOPY(newFace[0]->tf.uv[1],face[0]->tf.uv[(p1+1 )%3]);
UVCOPY(newFace[0]->tf.uv[2],face[1]->tf.uv[(p3+2 )%4]);
UVCOPY(newFace[1]->tf.uv[0],face[1]->tf.uv[(p3+1 )%4]);
UVCOPY(newFace[1]->tf.uv[1],face[1]->tf.uv[(p3+2 )%4]);
UVCOPY(newFace[1]->tf.uv[2],face[0]->tf.uv[(p1+1 )%3]);
UVCOPY(newFace[1]->tf.uv[3],face[0]->tf.uv[(p1+2 )%3]);
faces[0][(p1+1)%fac1]->f |= SELECT;
faces[1][(p3+2)%fac2]->f |= SELECT;
}
}
else if(fac1 == 4 && fac2 == 4){
newFace[0] = addfacelist(faces[0][(p1+1)%4],faces[0][(p1+2)%4],faces[0][(p1+3)%4],faces[1][(p3+1)%4],NULL,NULL);
newFace[1] = addfacelist(faces[1][(p3+1)%4],faces[1][(p3+2)%4],faces[1][(p3+3)%4],faces[0][(p1+1)%4],NULL,NULL);
if(dir == 1){
newFace[0] = addfacelist(faces[0][(p1+1 )%4],faces[0][(p1+2 )%4],faces[0][(p1+3 )%4],faces[1][(p3+1 )%4],NULL,NULL);
newFace[1] = addfacelist(faces[1][(p3+1 )%4],faces[1][(p3+2 )%4],faces[1][(p3+3 )%4],faces[0][(p1+1 )%4],NULL,NULL);
newFace[0]->tf.col[0] = face[0]->tf.col[(p1+1 )%4];
newFace[0]->tf.col[1] = face[0]->tf.col[(p1+2 )%4];
newFace[0]->tf.col[2] = face[0]->tf.col[(p1+3 )%4];
newFace[0]->tf.col[3] = face[1]->tf.col[(p3+1 )%4];
newFace[1]->tf.col[0] = face[1]->tf.col[(p3+1 )%4];
newFace[1]->tf.col[1] = face[1]->tf.col[(p3+2 )%4];
newFace[1]->tf.col[2] = face[1]->tf.col[(p3+3 )%4];
newFace[1]->tf.col[3] = face[0]->tf.col[(p1+1 )%4];
UVCOPY(newFace[0]->tf.uv[0],face[0]->tf.uv[(p1+1 )%4]);
UVCOPY(newFace[0]->tf.uv[1],face[0]->tf.uv[(p1+2 )%4]);
UVCOPY(newFace[0]->tf.uv[2],face[0]->tf.uv[(p1+3 )%4]);
UVCOPY(newFace[0]->tf.uv[3],face[1]->tf.uv[(p3+1 )%4]);
UVCOPY(newFace[1]->tf.uv[0],face[1]->tf.uv[(p3+1 )%4]);
UVCOPY(newFace[1]->tf.uv[1],face[1]->tf.uv[(p3+2 )%4]);
UVCOPY(newFace[1]->tf.uv[2],face[1]->tf.uv[(p3+3 )%4]);
UVCOPY(newFace[1]->tf.uv[3],face[0]->tf.uv[(p1+1 )%4]);
} else if (dir == 2){
newFace[0] = addfacelist(faces[0][(p1+2 )%4],faces[0][(p1+3 )%4],faces[1][(p3+1 )%4],faces[1][(p3+2 )%4],NULL,NULL);
newFace[1] = addfacelist(faces[1][(p3+2 )%4],faces[1][(p3+3 )%4],faces[0][(p1+1 )%4],faces[0][(p1+2 )%4],NULL,NULL);
newFace[0]->tf.col[0] = face[0]->tf.col[(p1+2 )%4];
newFace[0]->tf.col[1] = face[0]->tf.col[(p1+3 )%4];
newFace[0]->tf.col[2] = face[1]->tf.col[(p3+1 )%4];
newFace[0]->tf.col[3] = face[1]->tf.col[(p3+2 )%4];
newFace[1]->tf.col[0] = face[1]->tf.col[(p3+2 )%4];
newFace[1]->tf.col[1] = face[1]->tf.col[(p3+3 )%4];
newFace[1]->tf.col[2] = face[0]->tf.col[(p1+1 )%4];
newFace[1]->tf.col[3] = face[0]->tf.col[(p1+2 )%4];
UVCOPY(newFace[0]->tf.uv[0],face[0]->tf.uv[(p1+2 )%4]);
UVCOPY(newFace[0]->tf.uv[1],face[0]->tf.uv[(p1+3 )%4]);
UVCOPY(newFace[0]->tf.uv[2],face[1]->tf.uv[(p3+1 )%4]);
UVCOPY(newFace[0]->tf.uv[3],face[1]->tf.uv[(p3+2 )%4]);
UVCOPY(newFace[1]->tf.uv[0],face[1]->tf.uv[(p3+2 )%4]);
UVCOPY(newFace[1]->tf.uv[1],face[1]->tf.uv[(p3+3 )%4]);
UVCOPY(newFace[1]->tf.uv[2],face[0]->tf.uv[(p1+1 )%4]);
UVCOPY(newFace[1]->tf.uv[3],face[0]->tf.uv[(p1+2 )%4]);
faces[0][(p1+2)%fac1]->f |= SELECT;
faces[1][(p3+2)%fac2]->f |= SELECT;
}
newFace[0]->tf.col[0] = face[0]->tf.col[(p1+1)%4];
newFace[0]->tf.col[1] = face[0]->tf.col[(p1+2)%4];
newFace[0]->tf.col[2] = face[0]->tf.col[(p1+3)%4];
newFace[0]->tf.col[3] = face[1]->tf.col[(p3+1)%4];
newFace[1]->tf.col[0] = face[1]->tf.col[(p3+1)%4];
newFace[1]->tf.col[1] = face[1]->tf.col[(p3+2)%4];
newFace[1]->tf.col[2] = face[1]->tf.col[(p3+3)%4];
newFace[1]->tf.col[3] = face[0]->tf.col[(p1+1)%4];
UVCOPY(newFace[0]->tf.uv[0],face[0]->tf.uv[(p1+1)%4]);
UVCOPY(newFace[0]->tf.uv[1],face[0]->tf.uv[(p1+2)%4]);
UVCOPY(newFace[0]->tf.uv[2],face[0]->tf.uv[(p1+3)%4]);
UVCOPY(newFace[0]->tf.uv[3],face[1]->tf.uv[(p3+1)%4]);
UVCOPY(newFace[1]->tf.uv[0],face[1]->tf.uv[(p3+1)%4]);
UVCOPY(newFace[1]->tf.uv[1],face[1]->tf.uv[(p3+2)%4]);
UVCOPY(newFace[1]->tf.uv[2],face[1]->tf.uv[(p3+3)%4]);
UVCOPY(newFace[1]->tf.uv[3],face[0]->tf.uv[(p1+1)%4]);
}
else{
/*This should never happen*/
return;
}
if(dir == 1){
faces[0][(p1+1)%fac1]->f |= SELECT;
faces[1][(p3+1)%fac2]->f |= SELECT;
}
/* copy flags and material */
newFace[0]->mat_nr = face[0]->mat_nr;
newFace[0]->tf.flag = face[0]->tf.flag;
newFace[0]->tf.transp = face[0]->tf.transp;
@@ -2670,22 +2751,21 @@ static void edge_rotate(EditEdge *eed)
newFace[1]->tf.tpage = face[1]->tf.tpage;
/* redo the vertex selection */
faces[0][(p1+1)%fac1]->f |= SELECT;
faces[1][(p3+1)%fac2]->f |= SELECT;
/* get rid of the old edge and faces*/
remedge(eed);
free_editedge(eed);
BLI_remlink(&em->faces, face[0]);
free_editface(face[0]);
BLI_remlink(&em->faces, face[1]);
free_editface(face[1]);
free_editface(face[1]);
return;
}
/* only accepts 1 selected edge, or 2 selected faces */
void edge_rotate_selected()
void edge_rotate_selected(int dir)
{
EditEdge *eed;
EditFace *efa;
@@ -2715,7 +2795,7 @@ void edge_rotate_selected()
if(edgeCount==1) {
for(eed= G.editMesh->edges.first; eed; eed= eed->next) {
if(eed->f1==2) {
edge_rotate(eed);
edge_rotate(eed,dir);
break;
}
}
@@ -2726,7 +2806,7 @@ void edge_rotate_selected()
for(eed= G.editMesh->edges.first; eed; eed= eed->next) {
if(eed->f & SELECT) {
EM_select_edge(eed, 0);
edge_rotate(eed);
edge_rotate(eed,dir);
break;
}
}