fixed subdividing bug with addfacelist(..) rule for edges

still needs revision on bevel and rotate edge
This commit is contained in:
2004-10-09 20:49:55 +00:00
parent de2c542d21
commit 76eab0cf16
5 changed files with 60 additions and 60 deletions

View File

@@ -55,7 +55,7 @@ extern void remedge(EditEdge *eed);
extern struct EditVert *addvertlist(float *vec);
extern struct EditEdge *addedgelist(struct EditVert *v1, struct EditVert *v2, struct EditEdge *example);
extern struct EditFace *addfacelist(struct EditVert *v1, struct EditVert *v2, struct EditVert *v3, struct EditVert *v4, struct EditFace *example);
extern struct EditFace *addfacelist(struct EditVert *v1, struct EditVert *v2, struct EditVert *v3, struct EditVert *v4, struct EditFace *example, struct EditFace *exampleEdges);
extern struct EditEdge *findedgelist(struct EditVert *v1, struct EditVert *v2);
/* ******************* editmesh_add.c */

View File

@@ -325,14 +325,14 @@ void free_facelist(ListBase *lb)
lb->first= lb->last= NULL;
}
EditFace *addfacelist(EditVert *v1, EditVert *v2, EditVert *v3, EditVert *v4, EditFace *example)
EditFace *addfacelist(EditVert *v1, EditVert *v2, EditVert *v3, EditVert *v4, EditFace *example, EditFace *exampleEdges)
{
EditMesh *em = G.editMesh;
EditFace *efa;
EditEdge *e1, *e2=0, *e3=0, *e4=0;
/* add face to list and do the edges */
if(example) {
if(exampleEdges) {
e1= addedgelist(v1, v2, example->e1);
e2= addedgelist(v2, v3, example->e2);
if(v4) e3= addedgelist(v3, v4, example->e3);
@@ -732,7 +732,7 @@ void make_editMesh()
if(mface->v3) eve3= evlist[mface->v3]; else eve3= NULL;
if(mface->v4) eve4= evlist[mface->v4]; else eve4= NULL;
efa= addfacelist(eve1, eve2, eve3, eve4, NULL);
efa= addfacelist(eve1, eve2, eve3, eve4, NULL, NULL);
if(efa) {
@@ -1801,9 +1801,9 @@ static void undoMesh_to_editMesh(void *umv)
tface= um->tfaces;
for(a=0, efac= um->faces; a<um->totface; a++, efac++) {
if(efac->v4 != -1)
efa= addfacelist(evar[efac->v1], evar[efac->v2], evar[efac->v3], evar[efac->v4], NULL);
efa= addfacelist(evar[efac->v1], evar[efac->v2], evar[efac->v3], evar[efac->v4], NULL, NULL);
else
efa= addfacelist(evar[efac->v1], evar[efac->v2], evar[efac->v3], NULL, NULL);
efa= addfacelist(evar[efac->v1], evar[efac->v2], evar[efac->v3], NULL, NULL ,NULL);
efa->mat_nr= efac->mat_nr;
efa->flag= efac->flag;

View File

@@ -327,7 +327,7 @@ void addedgeface_mesh(void)
if(amount==3) {
if(exist_face(neweve[0], neweve[1], neweve[2], 0)==0) {
efa= addfacelist(neweve[0], neweve[1], neweve[2], 0, NULL);
efa= addfacelist(neweve[0], neweve[1], neweve[2], 0, NULL, NULL);
}
else error("The selected vertices already form a face");
@@ -340,11 +340,11 @@ void addedgeface_mesh(void)
con3= convex(neweve[0]->co, neweve[3]->co, neweve[1]->co, neweve[2]->co);
if(con1>=con2 && con1>=con3)
efa= addfacelist(neweve[0], neweve[1], neweve[2], neweve[3], NULL);
efa= addfacelist(neweve[0], neweve[1], neweve[2], neweve[3], NULL, NULL);
else if(con2>=con1 && con2>=con3)
efa= addfacelist(neweve[0], neweve[2], neweve[3], neweve[1], NULL);
efa= addfacelist(neweve[0], neweve[2], neweve[3], neweve[1], NULL, NULL);
else
efa= addfacelist(neweve[0], neweve[2], neweve[1], neweve[3], NULL);
efa= addfacelist(neweve[0], neweve[2], neweve[1], neweve[3], NULL, NULL);
}
else error("The selected vertices already form a face");
@@ -582,24 +582,24 @@ void add_primitiveMesh(int type)
v3= v1->next->next;
if(ext) v4= v2->next->next;
addfacelist(v3, v1->next, v1, v3->next, NULL);
if(ext) addfacelist(v2, v2->next, v4, v4->next, NULL);
addfacelist(v3, v1->next, v1, v3->next, NULL, NULL);
if(ext) addfacelist(v2, v2->next, v4, v4->next, NULL, NULL);
}
else {
v3= v1;
v4= v2;
for(a=1; a<tot; a++) {
addfacelist(vdown, v3, v3->next, 0, NULL);
addfacelist(vdown, v3, v3->next, 0, NULL, NULL);
v3= v3->next;
if(ext) {
addfacelist(vtop, v4, v4->next, 0, NULL);
addfacelist(vtop, v4, v4->next, 0, NULL, NULL);
v4= v4->next;
}
}
if(type>1) {
addfacelist(vdown, v3, v1, 0, NULL);
if(ext) addfacelist(vtop, v4, v2, 0, NULL);
addfacelist(vdown, v3, v1, 0, NULL, NULL);
if(ext) addfacelist(vtop, v4, v2, 0, NULL, NULL);
}
}
}
@@ -616,19 +616,19 @@ void add_primitiveMesh(int type)
v3= v1;
v4= v2;
for(a=1; a<tot; a++) {
addfacelist(v3, v3->next, v4->next, v4, NULL);
addfacelist(v3, v3->next, v4->next, v4, NULL, NULL);
v3= v3->next;
v4= v4->next;
}
addfacelist(v3, v1, v2, v4, NULL);
addfacelist(v3, v1, v2, v4, NULL, NULL);
}
else if(type==7) { /* cone */
v3= v1;
for(a=1; a<tot; a++) {
addfacelist(vtop, v3->next, v3, 0, NULL);
addfacelist(vtop, v3->next, v3, 0, NULL, NULL);
v3= v3->next;
}
addfacelist(vtop, v1, v3, 0, NULL);
addfacelist(vtop, v1, v3, 0, NULL, NULL);
}
if(type<2) tot= totoud;
@@ -726,7 +726,7 @@ void add_primitiveMesh(int type)
v1= eva[ icoface[a][0] ];
v2= eva[ icoface[a][1] ];
v3= eva[ icoface[a][2] ];
addfacelist(v1, v2, v3, 0, NULL);
addfacelist(v1, v2, v3, 0, NULL, NULL);
}
dia*=200;
@@ -756,8 +756,8 @@ void add_primitiveMesh(int type)
tv[monkeynv+i]->f |= SELECT;
}
for (i=0; i<monkeynf; i++) {
addfacelist(tv[monkeyf[i][0]+i-monkeyo], tv[monkeyf[i][1]+i-monkeyo], tv[monkeyf[i][2]+i-monkeyo], (monkeyf[i][3]!=monkeyf[i][2])?tv[monkeyf[i][3]+i-monkeyo]:NULL, NULL);
addfacelist(tv[monkeynv+monkeyf[i][2]+i-monkeyo], tv[monkeynv+monkeyf[i][1]+i-monkeyo], tv[monkeynv+monkeyf[i][0]+i-monkeyo], (monkeyf[i][3]!=monkeyf[i][2])?tv[monkeynv+monkeyf[i][3]+i-monkeyo]:NULL, NULL);
addfacelist(tv[monkeyf[i][0]+i-monkeyo], tv[monkeyf[i][1]+i-monkeyo], tv[monkeyf[i][2]+i-monkeyo], (monkeyf[i][3]!=monkeyf[i][2])?tv[monkeyf[i][3]+i-monkeyo]:NULL, NULL, NULL);
addfacelist(tv[monkeynv+monkeyf[i][2]+i-monkeyo], tv[monkeynv+monkeyf[i][1]+i-monkeyo], tv[monkeynv+monkeyf[i][0]+i-monkeyo], (monkeyf[i][3]!=monkeyf[i][2])?tv[monkeynv+monkeyf[i][3]+i-monkeyo]:NULL, NULL, NULL);
}
MEM_freeN(tv);

View File

@@ -537,8 +537,8 @@ static short extrudeflag_edge(short flag)
if(eed->v2->vn==NULL)
eed->v2->vn= addvertlist(eed->v2->co);
if(eed->dir==1) efa2= addfacelist(eed->v1, eed->v2, eed->v2->vn, eed->v1->vn, NULL);
else efa2= addfacelist(eed->v2, eed->v1, eed->v1->vn, eed->v2->vn, NULL);
if(eed->dir==1) efa2= addfacelist(eed->v1, eed->v2, eed->v2->vn, eed->v1->vn, NULL, NULL);
else efa2= addfacelist(eed->v2, eed->v1, eed->v1->vn, eed->v2->vn, NULL, NULL);
if(eed->vn) {
/* btw, we dont do it in addfacelist, it copies edges too */
@@ -558,11 +558,11 @@ static short extrudeflag_edge(short flag)
if(efa->v2->vn==NULL) efa->v2->vn= addvertlist(efa->v2->co);
if(efa->v3->vn==NULL) efa->v3->vn= addvertlist(efa->v3->co);
if(efa->v4 && efa->v4->vn==NULL) efa->v4->vn= addvertlist(efa->v4->co);
/* creases and seams stay on *old* face so no edge copy */
if(efa->v4)
addfacelist(efa->v1->vn, efa->v2->vn, efa->v3->vn, efa->v4->vn, efa);
addfacelist(efa->v1->vn, efa->v2->vn, efa->v3->vn, efa->v4->vn, efa, NULL);
else
addfacelist(efa->v1->vn, efa->v2->vn, efa->v3->vn, NULL, efa);
addfacelist(efa->v1->vn, efa->v2->vn, efa->v3->vn, NULL, efa, NULL);
/* if *one* selected face has edge with unselected face; remove old selected faces */
if(efa->e1->f2 || efa->e2->f2 || efa->e3->f2 || (efa->e4 && efa->e4->f2))
@@ -774,8 +774,8 @@ short extrudeflag_vert(short flag)
if( (eed->f2==1 || eed->f2==2) ) {
if(eed->f1==2) del_old= 1;
if(eed->dir==1) efa2= addfacelist(eed->v1, eed->v2, eed->v2->vn, eed->v1->vn, NULL);
else efa2= addfacelist(eed->v2, eed->v1, eed->v1->vn, eed->v2->vn, NULL);
if(eed->dir==1) efa2= addfacelist(eed->v1, eed->v2, eed->v2->vn, eed->v1->vn, NULL, NULL);
else efa2= addfacelist(eed->v2, eed->v1, eed->v1->vn, eed->v2->vn, NULL, NULL);
if(eed->vn) {
efa= (EditFace *)eed->vn;
@@ -818,7 +818,7 @@ short extrudeflag_vert(short flag)
v3= efa->v3->vn;
if(efa->v4) v4= efa->v4->vn; else v4= 0;
efa2= addfacelist(v1, v2, v3, v4, efa);
efa2= addfacelist(v1, v2, v3, v4, efa, efa); /* hmm .. not sure about edges here */
/* for transform */
VecAddf(nor, nor, efa->n);
@@ -967,7 +967,7 @@ void adduplicateflag(int flag)
v2= efa->v2->vn;
v3= efa->v3->vn;
if(efa->v4) v4= efa->v4->vn; else v4= NULL;
newfa= addfacelist(v1, v2, v3, v4, efa);
newfa= addfacelist(v1, v2, v3, v4, efa, efa);
newfa->f= efa->f;
efa->f -= flag;

View File

@@ -139,9 +139,9 @@ void convert_to_triface(int all)
if(efa->v4) {
if(all || (efa->f & SELECT) ) {
efan= addfacelist(efa->v1, efa->v2, efa->v3, 0, efa);
efan= addfacelist(efa->v1, efa->v2, efa->v3, 0, efa, NULL);
if(efa->f & SELECT) EM_select_face(efan, 1);
efan= addfacelist(efa->v1, efa->v3, efa->v4, 0, efa);
efan= addfacelist(efa->v1, efa->v3, efa->v4, 0, efa, NULL);
if(efa->f & SELECT) EM_select_face(efan, 1);
efan->tf.uv[1][0]= efan->tf.uv[2][0];
@@ -1031,7 +1031,7 @@ void fill_mesh(void)
if(ok) {
efa= fillfacebase.first;
while(efa) {
addfacelist(efa->v1->vn, efa->v2->vn, efa->v3->vn, 0, efa);
addfacelist(efa->v1->vn, efa->v2->vn, efa->v3->vn, 0, efa, NULL);
efa= efa->next;
}
}
@@ -1245,7 +1245,7 @@ static void addface_subdiv(EditFace *efa, int val1, int val2, int val3, int val4
if(val4>=9) v4= eve;
else v4= vert_from_number(efa, val4);
w= addfacelist(v1, v2, v3, v4, efa);
w= addfacelist(v1, v2, v3, v4, efa, NULL);
if(w) {
if(efa->v4) set_wuv(4, w, val1, val2, val3, val4, efapin);
else set_wuv(3, w, val1, val2, val3, val4, efapin);
@@ -2090,14 +2090,14 @@ void beauty_fill(void)
efa= efaa[1];
efa->f1= 1;
w= addfacelist(v1, v2, v3, 0, efa);
w= addfacelist(v1, v2, v3, 0, efa, NULL);
UVCOPY(w->tf.uv[0], uv[0]);
UVCOPY(w->tf.uv[1], uv[1]);
UVCOPY(w->tf.uv[2], uv[2]);
w->tf.col[0] = col[0]; w->tf.col[1] = col[1]; w->tf.col[2] = col[2];
w= addfacelist(v1, v3, v4, 0, efa);
w= addfacelist(v1, v3, v4, 0, efa, NULL);
UVCOPY(w->tf.uv[0], uv[0]);
UVCOPY(w->tf.uv[1], uv[2]);
@@ -2116,13 +2116,13 @@ void beauty_fill(void)
efa= efaa[1];
efa->f1= 1;
w= addfacelist(v2, v3, v4, 0, efa);
w= addfacelist(v2, v3, v4, 0, efa, NULL);
UVCOPY(w->tf.uv[0], uv[1]);
UVCOPY(w->tf.uv[1], uv[3]);
UVCOPY(w->tf.uv[2], uv[4]);
w= addfacelist(v1, v2, v4, 0, efa);
w= addfacelist(v1, v2, v4, 0, efa, NULL);
UVCOPY(w->tf.uv[0], uv[0]);
UVCOPY(w->tf.uv[1], uv[1]);
@@ -2212,7 +2212,7 @@ void join_triangles(void)
/* make new faces */
if( convex(v1->co, v2->co, v3->co, v4->co) > 0.01) {
if(exist_face(v1, v2, v3, v4)==0) {
w = addfacelist(v1, v2, v3, v4, efaa[0]);
w = addfacelist(v1, v2, v3, v4, efaa[0], NULL); /* seam edge may get broken */
untag_edges(w);
UVCOPY(w->tf.uv[0], uv[0]);
@@ -2305,7 +2305,7 @@ void edge_flip(void)
if (v1 && v2 && v3){
if( convex(v1->co, v2->co, v3->co, v4->co) > 0.01) {
if(exist_face(v1, v2, v3, v4)==0) {
w = addfacelist(v1, v2, v3, 0, efaa[1]);
w = addfacelist(v1, v2, v3, 0, efaa[1], NULL); /* outch this may break seams */
untag_edges(w);
@@ -2315,7 +2315,7 @@ void edge_flip(void)
w->tf.col[0] = col[0]; w->tf.col[1] = col[1]; w->tf.col[2] = col[2];
w = addfacelist(v1, v3, v4, 0, efaa[1]);
w = addfacelist(v1, v3, v4, 0, efaa[1], NULL); /* outch this may break seams */
untag_edges(w);
UVCOPY(w->tf.uv[0], uv[0]);
@@ -2486,8 +2486,8 @@ 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);
newFace[1] = addfacelist(faces[1][(p3+1)%3],faces[1][(p3+2)%3],faces[0][(p1+1)%3],NULL,NULL);
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];
@@ -2504,8 +2504,8 @@ static void edge_rotate(EditEdge *eed)
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);
newFace[1] = addfacelist(faces[1][(p3+1)%3],faces[1][(p3+2)%3],faces[0][(p1+1)%4],NULL,NULL);
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];
@@ -2525,8 +2525,8 @@ static void edge_rotate(EditEdge *eed)
}
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);
newFace[1] = addfacelist(faces[1][(p3+1)%4],faces[1][(p3+2)%4],faces[1][(p3+3)%4],faces[0][(p1+1)%3],NULL);
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];
@@ -2547,8 +2547,8 @@ static void edge_rotate(EditEdge *eed)
}
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);
newFace[1] = addfacelist(faces[1][(p3+1)%4],faces[1][(p3+2)%4],faces[1][(p3+3)%4],faces[0][(p1+1)%4],NULL);
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];
@@ -3048,12 +3048,12 @@ void bevel_mesh(float bsize, int allfaces)
v2= efa->v2->vn;
v3= efa->v3->vn;
v4= efa->v4->vn;
addfacelist(v1, v2, v3, v4, efa);
addfacelist(v1, v2, v3, v4, efa,NULL);
} else {
v1= efa->v1->vn;
v2= efa->v2->vn;
v3= efa->v3->vn;
addfacelist(v1, v2, v3, 0, efa);
addfacelist(v1, v2, v3, 0, efa,NULL);
}
efa= efa-> next;
@@ -3137,9 +3137,9 @@ void bevel_mesh(float bsize, int allfaces)
efa= NULL;
if (VecCompare(eed->v1->co, eed2->v2->co, limit)) {
efa= addfacelist(neweve[0], neweve[1], neweve[2], neweve[3], example);
efa= addfacelist(neweve[0], neweve[1], neweve[2], neweve[3], example,NULL);
} else {
efa= addfacelist(neweve[0], neweve[2], neweve[3], neweve[1], example);
efa= addfacelist(neweve[0], neweve[2], neweve[3], neweve[1], example,NULL);
}
if(efa) {
@@ -3282,7 +3282,7 @@ void bevel_mesh(float bsize, int allfaces)
if ((neweve[b]==eed->v1) || (neweve[b]==eed->v2)) c++;
if (c==2) {
if(exist_face(eed->v1, eed->v2, eve2, 0)==0) {
efa= addfacelist(eed->v1, eed->v2, eve2, 0, example);
efa= addfacelist(eed->v1, eed->v2, eve2, 0, example,NULL);
#ifdef BEV_DEBUG
efa->mat_nr= 2;
#endif
@@ -3296,16 +3296,16 @@ void bevel_mesh(float bsize, int allfaces)
con2= convex(neweve[0]->co, neweve[2]->co, neweve[3]->co, neweve[1]->co);
con3= convex(neweve[0]->co, neweve[3]->co, neweve[1]->co, neweve[2]->co);
if(con1>=con2 && con1>=con3)
efa= addfacelist(neweve[0], neweve[1], neweve[2], neweve[3], example);
efa= addfacelist(neweve[0], neweve[1], neweve[2], neweve[3], example,NULL);
else if(con2>=con1 && con2>=con3)
efa= addfacelist(neweve[0], neweve[2], neweve[3], neweve[1], example);
efa= addfacelist(neweve[0], neweve[2], neweve[3], neweve[1], example,NULL);
else
efa= addfacelist(neweve[0], neweve[2], neweve[1], neweve[3], example);
efa= addfacelist(neweve[0], neweve[2], neweve[1], neweve[3], example,NULL);
}
}
else if (a==3) {
if(exist_face(neweve[0], neweve[1], neweve[2], 0)==0)
efa= addfacelist(neweve[0], neweve[1], neweve[2], 0, example);
efa= addfacelist(neweve[0], neweve[1], neweve[2], 0, example, NULL);
}
if(efa) {
float inp;