As positively recieved on the mailing list and irc (and blessed by

guitargeek), this commit enhances the support for temporary storage
for the structs EditVert, EditEdge, and EditFace. The field
"EditVert *vn" has been removed and replaced by a union called
"tmp" that can hold:

 v,  an EditVert pointer;
 e,  an EditEdge pointer;
 f,  an EditFace pointer;
 fp, a float pointer;
 p,  a void pointer;
 l,  a long;

Please see the mailing list post here for more information about
this:

http://projects.blender.org/pipermail/bf-committers/2005-December/012877.html
This commit is contained in:
Chris Want
2006-01-03 17:22:42 +00:00
parent af7e7ab587
commit b41a476401
9 changed files with 348 additions and 261 deletions

View File

@@ -259,7 +259,7 @@ int removedoublesflag(short flag, float limit) /* return amount */
dist= (float)fabs(v1->co[2]-eve->co[2]);
if(dist<=limit) {
v1->f|= 128;
v1->vn= eve;
v1->tmp.v = eve;
}
}
}
@@ -285,8 +285,8 @@ int removedoublesflag(short flag, float limit) /* return amount */
if( (eed->v1->f & 128) || (eed->v2->f & 128) ) {
remedge(eed);
if(eed->v1->f & 128) eed->v1= eed->v1->vn;
if(eed->v2->f & 128) eed->v2= eed->v2->vn;
if(eed->v1->f & 128) eed->v1 = eed->v1->tmp.v;
if(eed->v2->f & 128) eed->v2 = eed->v2->tmp.v;
e1= addedgelist(eed->v1, eed->v2, eed);
if(e1) e1->f2= 1;
@@ -316,10 +316,10 @@ int removedoublesflag(short flag, float limit) /* return amount */
nextvl= efa->next;
if(efa->f1==1) {
if(efa->v1->f & 128) efa->v1= efa->v1->vn;
if(efa->v2->f & 128) efa->v2= efa->v2->vn;
if(efa->v3->f & 128) efa->v3= efa->v3->vn;
if(efa->v4 && (efa->v4->f & 128)) efa->v4= efa->v4->vn;
if(efa->v1->f & 128) efa->v1= efa->v1->tmp.v;
if(efa->v2->f & 128) efa->v2= efa->v2->tmp.v;
if(efa->v3->f & 128) efa->v3= efa->v3->tmp.v;
if(efa->v4 && (efa->v4->f & 128)) efa->v4= efa->v4->tmp.v;
test= 0;
if(efa->v1==efa->v2) test+=1;
@@ -1061,8 +1061,8 @@ void fill_mesh(void)
while(eve) {
if(eve->f & SELECT) {
v1= BLI_addfillvert(eve->co);
eve->vn= v1;
v1->vn= eve;
eve->tmp.v= v1;
v1->tmp.v= eve;
v1->xs= 0; // used for counting edges
}
eve= eve->next;
@@ -1071,7 +1071,7 @@ void fill_mesh(void)
eed= em->edges.first;
while(eed) {
if( (eed->v1->f & SELECT) && (eed->v2->f & SELECT) ) {
e1= BLI_addfilledge(eed->v1->vn, eed->v2->vn);
e1= BLI_addfilledge(eed->v1->tmp.v, eed->v2->tmp.v);
e1->v1->xs++;
e1->v2->xs++;
}
@@ -1085,10 +1085,10 @@ void fill_mesh(void)
while(efa) {
nextvl= efa->next;
if( faceselectedAND(efa, 1) ) {
efa->v1->vn->xs--;
efa->v2->vn->xs--;
efa->v3->vn->xs--;
if(efa->v4) efa->v4->vn->xs--;
efa->v1->tmp.v->xs--;
efa->v2->tmp.v->xs--;
efa->v3->tmp.v->xs--;
if(efa->v4) efa->v4->tmp.v->xs--;
ok= 1;
}
@@ -1108,7 +1108,9 @@ void fill_mesh(void)
if(BLI_edgefill(0, (G.obedit && G.obedit->actcol)?(G.obedit->actcol-1):0)) {
efa= fillfacebase.first;
while(efa) {
efan= addfacelist(efa->v3->vn, efa->v2->vn, efa->v1->vn, 0, NULL, NULL); // normals default pointing up
/* normals default pointing up */
efan= addfacelist(efa->v3->tmp.v, efa->v2->tmp.v,
efa->v1->tmp.v, 0, NULL, NULL);
EM_select_face(efan, 1);
efa= efa->next;
}
@@ -2626,7 +2628,7 @@ static int count_selected_edges(EditEdge *ed)
{
int totedge = 0;
while(ed) {
ed->vn= 0;
ed->tmp.p = 0;
if( ed->f & SELECT ) totedge++;
ed= ed->next;
}
@@ -2653,10 +2655,10 @@ static int collect_quadedges(EVPTuple *efaa, EditEdge *eed, EditFace *efa)
eed->f2= 0;
eed->f1= 0;
if( eed->f & SELECT ) {
eed->vn= (EditVert *) (&efaa[i]);
eed->tmp.p = (EditVert *) (&efaa[i]);
i++;
}
else eed->vn= NULL;
else eed->tmp.p = NULL;
eed= eed->next;
}
@@ -2676,23 +2678,23 @@ static int collect_quadedges(EVPTuple *efaa, EditEdge *eed, EditFace *efa)
e1= efa->e1;
e2= efa->e2;
e3= efa->e3;
if(e1->f2<3 && e1->vn) {
if(e1->f2<3 && e1->tmp.p) {
if(e1->f2<2) {
evp= (EVPtr *) e1->vn;
evp[(int)e1->f2]= efa;
evp= (EVPtr *) e1->tmp.p;
evp[(int)e1->f2] = efa;
}
e1->f2+= 1;
}
if(e2->f2<3 && e2->vn) {
if(e2->f2<3 && e2->tmp.p) {
if(e2->f2<2) {
evp= (EVPtr *) e2->vn;
evp= (EVPtr *) e2->tmp.p;
evp[(int)e2->f2]= efa;
}
e2->f2+= 1;
}
if(e3->f2<3 && e3->vn) {
if(e3->f2<3 && e3->tmp.p) {
if(e3->f2<2) {
evp= (EVPtr *) e3->vn;
evp= (EVPtr *) e3->tmp.p;
evp[(int)e3->f2]= efa;
}
e3->f2+= 1;
@@ -2904,7 +2906,7 @@ void beauty_fill(void)
/* f2 is set in collect_quadedges() */
if(eed->f2==2 && eed->h==0) {
efaa = (EVPtr *) eed->vn;
efaa = (EVPtr *) eed->tmp.p;
/* none of the faces should be treated before, nor be part of fgon */
ok= 1;
@@ -3076,7 +3078,7 @@ void join_triangles(void)
if(eed->f2==2) { /* points to 2 faces */
efaa= (EVPtr *) eed->vn;
efaa= (EVPtr *) eed->tmp.p;
/* don't do it if flagged */
@@ -3173,7 +3175,7 @@ void edge_flip(void)
if(eed->f2==2) { /* points to 2 faces */
efaa= (EVPtr *) eed->vn;
efaa= (EVPtr *) eed->tmp.p;
/* don't do it if flagged */
@@ -4041,7 +4043,7 @@ static void bevel_mesh(float bsize, int allfaces)
efa->f1-= 1;
v1= addvertlist(efa->v1->co);
v1->f= efa->v1->f & ~128;
efa->v1->vn= v1;
efa->v1->tmp.v = v1;
#ifdef __NLA
v1->totweight = efa->v1->totweight;
if (efa->v1->totweight) {
@@ -4053,7 +4055,7 @@ static void bevel_mesh(float bsize, int allfaces)
#endif
v1= addvertlist(efa->v2->co);
v1->f= efa->v2->f & ~128;
efa->v2->vn= v1;
efa->v2->tmp.v = v1;
#ifdef __NLA
v1->totweight = efa->v2->totweight;
if (efa->v2->totweight) {
@@ -4065,7 +4067,7 @@ static void bevel_mesh(float bsize, int allfaces)
#endif
v1= addvertlist(efa->v3->co);
v1->f= efa->v3->f & ~128;
efa->v3->vn= v1;
efa->v3->tmp.v = v1;
#ifdef __NLA
v1->totweight = efa->v3->totweight;
if (efa->v3->totweight) {
@@ -4078,7 +4080,7 @@ static void bevel_mesh(float bsize, int allfaces)
if (efa->v4) {
v1= addvertlist(efa->v4->co);
v1->f= efa->v4->f & ~128;
efa->v4->vn= v1;
efa->v4->tmp.v = v1;
#ifdef __NLA
v1->totweight = efa->v4->totweight;
if (efa->v4->totweight) {
@@ -4091,21 +4093,29 @@ static void bevel_mesh(float bsize, int allfaces)
}
/* Needs better adaption of creases? */
addedgelist(efa->e1->v1->vn, efa->e1->v2->vn, efa->e1);
addedgelist(efa->e2->v1->vn,efa->e2->v2->vn, efa->e2);
addedgelist(efa->e3->v1->vn,efa->e3->v2->vn, efa->e3);
if (efa->e4) addedgelist(efa->e4->v1->vn,efa->e4->v2->vn, efa->e4);
addedgelist(efa->e1->v1->tmp.v,
efa->e1->v2->tmp.v,
efa->e1);
addedgelist(efa->e2->v1->tmp.v,
efa->e2->v2->tmp.v,
efa->e2);
addedgelist(efa->e3->v1->tmp.v,
efa->e3->v2->tmp.v,
efa->e3);
if (efa->e4) addedgelist(efa->e4->v1->tmp.v,
efa->e4->v2->tmp.v,
efa->e4);
if(efa->v4) {
v1= efa->v1->vn;
v2= efa->v2->vn;
v3= efa->v3->vn;
v4= efa->v4->vn;
v1 = efa->v1->tmp.v;
v2 = efa->v2->tmp.v;
v3 = efa->v3->tmp.v;
v4 = efa->v4->tmp.v;
addfacelist(v1, v2, v3, v4, efa,NULL);
} else {
v1= efa->v1->vn;
v2= efa->v2->vn;
v3= efa->v3->vn;
v1= efa->v1->tmp.v;
v2= efa->v2->tmp.v;
v3= efa->v3->tmp.v;
addfacelist(v1, v2, v3, 0, efa,NULL);
}
@@ -4141,8 +4151,9 @@ static void bevel_mesh(float bsize, int allfaces)
eed= em->edges.first;
while(eed) {
eed->f2= eed->f1= 0;
if ( ((eed->v1->f & eed->v2->f) & 1) || allfaces) eed->f1 |= 4; /* original edges */
eed->vn= 0;
if ( ((eed->v1->f & eed->v2->f) & 1) || allfaces)
eed->f1 |= 4; /* original edges */
eed->tmp.v = 0;
eed= eed->next;
}
@@ -4220,7 +4231,7 @@ static void bevel_mesh(float bsize, int allfaces)
eed->f1= 0;
eed->v1->f1 &= ~1;
eed->v2->f1 &= ~1;
eed->vn= 0;
eed->tmp.v = 0;
eed= eed->next;
}
@@ -4233,11 +4244,11 @@ static void bevel_mesh(float bsize, int allfaces)
eve= em->verts.first;
while (eve) {
eve->f &= ~(64|128);
eve->vn= NULL;
eve->tmp.v = NULL;
eve= eve->next;
}
/* eve->f: 128: first vertex in a list (->vn) */
/* eve->f: 128: first vertex in a list (->tmp.v) */
/* 64: vertex is in a list */
eve= em->verts.first;
@@ -4250,11 +4261,11 @@ static void bevel_mesh(float bsize, int allfaces)
if ((eve->f & (128|64)) == 0) {
/* fprintf(stderr,"Found vertex cluster:\n *\n *\n"); */
eve->f |= 128;
eve->vn= eve2;
eve->tmp.v = eve2;
eve3= eve2;
} else if ((eve->f & 64) == 0) {
/* fprintf(stderr," *\n"); */
if (eve3) eve3->vn= eve2;
if (eve3) eve3->tmp.v = eve2;
eve2->f |= 64;
eve3= eve2;
}
@@ -4262,7 +4273,7 @@ static void bevel_mesh(float bsize, int allfaces)
}
eve2= eve2->next;
if (!eve2) {
if (eve3) eve3->vn= NULL;
if (eve3) eve3->tmp.v = NULL;
}
}
eve= eve->next;
@@ -4292,11 +4303,11 @@ static void bevel_mesh(float bsize, int allfaces)
eve->f &= ~128;
a= 0;
neweve[a]= eve;
eve2= eve->vn;
eve2 = eve->tmp.v;
while (eve2) {
a++;
neweve[a]= eve2;
eve2= eve2->vn;
eve2 = eve2->tmp.v;
}
a++;
efa= NULL;
@@ -4379,7 +4390,7 @@ static void bevel_mesh(float bsize, int allfaces)
while (eve) {
eve->f1= 0;
eve->f &= ~(128|64);
eve->vn= NULL;
eve->tmp.v= NULL;
eve= eve->next;
}
@@ -5144,10 +5155,10 @@ static float mesh_rip_edgedist(float mat[][4], float *co1, float *co2, short *mv
static void mesh_rip_setface(EditFace *sefa)
{
/* put new vertices & edges in best face */
if(sefa->v1->vn) sefa->v1= sefa->v1->vn;
if(sefa->v2->vn) sefa->v2= sefa->v2->vn;
if(sefa->v3->vn) sefa->v3= sefa->v3->vn;
if(sefa->v4 && sefa->v4->vn) sefa->v4= sefa->v4->vn;
if(sefa->v1->tmp.v) sefa->v1= sefa->v1->tmp.v;
if(sefa->v2->tmp.v) sefa->v2= sefa->v2->tmp.v;
if(sefa->v3->tmp.v) sefa->v3= sefa->v3->tmp.v;
if(sefa->v4 && sefa->v4->tmp.v) sefa->v4= sefa->v4->tmp.v;
sefa->e1= addedgelist(sefa->v1, sefa->v2, sefa->e1);
sefa->e2= addedgelist(sefa->v2, sefa->v3, sefa->e2);
@@ -5213,11 +5224,11 @@ void mesh_rip(void)
/* duplicate vertices, new vertices get selected */
for(eve = em->verts.last; eve; eve= eve->prev) {
eve->vn= NULL;
eve->tmp.v = NULL;
if(eve->f & SELECT) {
eve->vn= addvertlist(eve->co);
eve->tmp.v = addvertlist(eve->co);
eve->f &= ~SELECT;
eve->vn->f |= SELECT;
eve->tmp.v->f |= SELECT;
}
}
@@ -5231,29 +5242,37 @@ void mesh_rip(void)
/* or we do the distance trick */
if(seed==NULL) {
mindist= 1000000.0f;
if(sefa->e1->v1->vn || sefa->e1->v2->vn) {
dist= mesh_rip_edgedist(projectMat, sefa->e1->v1->co, sefa->e1->v2->co, mval);
if(sefa->e1->v1->tmp.v || sefa->e1->v2->tmp.v) {
dist = mesh_rip_edgedist(projectMat,
sefa->e1->v1->co,
sefa->e1->v2->co, mval);
if(dist<mindist) {
seed= sefa->e1;
mindist= dist;
}
}
if(sefa->e2->v1->vn || sefa->e2->v2->vn) {
dist= mesh_rip_edgedist(projectMat, sefa->e2->v1->co, sefa->e2->v2->co, mval);
if(sefa->e2->v1->tmp.v || sefa->e2->v2->tmp.v) {
dist = mesh_rip_edgedist(projectMat,
sefa->e2->v1->co,
sefa->e2->v2->co, mval);
if(dist<mindist) {
seed= sefa->e2;
mindist= dist;
}
}
if(sefa->e3->v1->vn || sefa->e3->v2->vn) {
dist= mesh_rip_edgedist(projectMat, sefa->e3->v1->co, sefa->e3->v2->co, mval);
if(sefa->e3->v1->tmp.v || sefa->e3->v2->tmp.v) {
dist= mesh_rip_edgedist(projectMat,
sefa->e3->v1->co,
sefa->e3->v2->co, mval);
if(dist<mindist) {
seed= sefa->e3;
mindist= dist;
}
}
if(sefa->e4 && (sefa->e4->v1->vn || sefa->e4->v2->vn)) {
dist= mesh_rip_edgedist(projectMat, sefa->e4->v1->co, sefa->e4->v2->co, mval);
if(sefa->e4 && (sefa->e4->v1->tmp.v || sefa->e4->v2->tmp.v)) {
dist= mesh_rip_edgedist(projectMat,
sefa->e4->v1->co,
sefa->e4->v2->co, mval);
if(dist<mindist) {
seed= sefa->e4;
mindist= dist;
@@ -5270,16 +5289,17 @@ void mesh_rip(void)
/* duplicate edges in the loop, with at least 1 vertex selected, needed for selection flip */
for(eed = em->edges.last; eed; eed= eed->prev) {
eed->vn= NULL;
if((eed->v1->vn) || (eed->v2->vn)) {
eed->tmp.v = NULL;
if((eed->v1->tmp.v) || (eed->v2->tmp.v)) {
EditEdge *newed;
newed= addedgelist(eed->v1->vn?eed->v1->vn:eed->v1, eed->v2->vn?eed->v2->vn:eed->v2, eed);
newed= addedgelist(eed->v1->tmp.v?eed->v1->tmp.v:eed->v1,
eed->v2->tmp.v?eed->v2->tmp.v:eed->v2, eed);
if(eed->f & SELECT) {
eed->f &= ~SELECT;
newed->f |= SELECT;
}
eed->vn= (EditVert *)newed;
eed->tmp.v = (EditVert *)newed;
}
}
@@ -5297,7 +5317,8 @@ void mesh_rip(void)
for(efa= em->faces.first; efa; efa=efa->next) {
/* new vert in face */
if(efa->v1->vn || efa->v2->vn || efa->v3->vn || (efa->v4 && efa->v4->vn)) {
if (efa->v1->tmp.v || efa->v2->tmp.v ||
efa->v3->tmp.v || (efa->v4 && efa->v4->tmp.v)) {
/* face is tagged with loop */
if(efa->f1==1) {
mesh_rip_setface(efa);
@@ -5321,7 +5342,8 @@ void mesh_rip(void)
for(eed = em->edges.last; eed; eed= seed) {
seed= eed->prev;
if(eed->f1==0) {
if(eed->v1->vn || eed->v2->vn || (eed->v1->f & SELECT) || (eed->v2->f & SELECT)) {
if(eed->v1->tmp.v || eed->v2->tmp.v ||
(eed->v1->f & SELECT) || (eed->v2->f & SELECT)) {
remedge(eed);
free_editedge(eed);
eed= NULL;
@@ -5336,7 +5358,7 @@ void mesh_rip(void)
/* and remove loose selected vertices, that got duplicated accidentally */
for(eve = em->verts.first; eve; eve= nextve) {
nextve= eve->next;
if(eve->f1==0 && (eve->vn || (eve->f & SELECT))) {
if(eve->f1==0 && (eve->tmp.v || (eve->f & SELECT))) {
BLI_remlink(&em->verts,eve);
free_editvert(eve);
}