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:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user