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:
@@ -1225,7 +1225,7 @@ void filldisplist(ListBase *dispbase, ListBase *to)
|
|||||||
f1+= 3;
|
f1+= 3;
|
||||||
|
|
||||||
/* index number */
|
/* index number */
|
||||||
eve->vn= (EditVert *)totvert;
|
eve->tmp.l = totvert;
|
||||||
totvert++;
|
totvert++;
|
||||||
|
|
||||||
eve= eve->next;
|
eve= eve->next;
|
||||||
@@ -1235,9 +1235,9 @@ void filldisplist(ListBase *dispbase, ListBase *to)
|
|||||||
efa= fillfacebase.first;
|
efa= fillfacebase.first;
|
||||||
index= dlnew->index;
|
index= dlnew->index;
|
||||||
while(efa) {
|
while(efa) {
|
||||||
index[0]= (long)efa->v1->vn;
|
index[0]= (long)efa->v1->tmp.l;
|
||||||
index[1]= (long)efa->v2->vn;
|
index[1]= (long)efa->v2->tmp.l;
|
||||||
index[2]= (long)efa->v3->vn;
|
index[2]= (long)efa->v3->tmp.l;
|
||||||
|
|
||||||
index+= 3;
|
index+= 3;
|
||||||
efa= efa->next;
|
efa= efa->next;
|
||||||
|
|||||||
@@ -2611,7 +2611,7 @@ static void write_videoscape_mesh(Object *ob, char *str)
|
|||||||
VECCOPY(co, eve->co);
|
VECCOPY(co, eve->co);
|
||||||
Mat4MulVecfl(ob->obmat, co);
|
Mat4MulVecfl(ob->obmat, co);
|
||||||
fprintf(fp, "%f %f %f\n", co[0], co[1], co[2] );
|
fprintf(fp, "%f %f %f\n", co[0], co[1], co[2] );
|
||||||
eve->vn= (struct EditVert *)tot;
|
eve->tmp.l = tot;
|
||||||
tot++;
|
tot++;
|
||||||
eve= eve->next;
|
eve= eve->next;
|
||||||
}
|
}
|
||||||
@@ -2619,10 +2619,19 @@ static void write_videoscape_mesh(Object *ob, char *str)
|
|||||||
while(evl) {
|
while(evl) {
|
||||||
|
|
||||||
if(evl->v4==0) {
|
if(evl->v4==0) {
|
||||||
fprintf(fp, "3 %p %p %p 0x%x\n", evl->v1->vn, evl->v2->vn, evl->v3->vn, kleur[evl->mat_nr]);
|
fprintf(fp, "3 %ld %ld %ld 0x%x\n",
|
||||||
|
evl->v1->tmp.l,
|
||||||
|
evl->v2->tmp.l,
|
||||||
|
evl->v3->tmp.l,
|
||||||
|
kleur[evl->mat_nr]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fprintf(fp, "4 %p %p %p %p 0x%x\n", evl->v1->vn, evl->v2->vn, evl->v3->vn, evl->v4->vn, kleur[evl->mat_nr]);
|
fprintf(fp, "4 %ld %ld %ld %ld 0x%x\n",
|
||||||
|
evl->v1->tmp.l,
|
||||||
|
evl->v2->tmp.l,
|
||||||
|
evl->v3->tmp.l,
|
||||||
|
evl->v4->tmp.l,
|
||||||
|
kleur[evl->mat_nr]);
|
||||||
}
|
}
|
||||||
evl= evl->next;
|
evl= evl->next;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,18 @@ struct DerivedMesh;
|
|||||||
/* note; changing this also might affect the undo copy in editmesh.c */
|
/* note; changing this also might affect the undo copy in editmesh.c */
|
||||||
typedef struct EditVert
|
typedef struct EditVert
|
||||||
{
|
{
|
||||||
struct EditVert *next, *prev, *vn;
|
struct EditVert *next, *prev;
|
||||||
|
union {
|
||||||
|
/* some lean storage for temporary usage
|
||||||
|
* in editmesh routines
|
||||||
|
*/
|
||||||
|
struct EditVert *v;
|
||||||
|
struct EditEdge *e;
|
||||||
|
struct EditFace *f;
|
||||||
|
float *fp;
|
||||||
|
void *p;
|
||||||
|
long l;
|
||||||
|
} tmp;
|
||||||
float no[3];
|
float no[3];
|
||||||
float co[3];
|
float co[3];
|
||||||
short xs, ys;
|
short xs, ys;
|
||||||
@@ -66,8 +77,17 @@ typedef struct HashEdge {
|
|||||||
typedef struct EditEdge
|
typedef struct EditEdge
|
||||||
{
|
{
|
||||||
struct EditEdge *next, *prev;
|
struct EditEdge *next, *prev;
|
||||||
/* Note: vn is for general purpose temporary storage */
|
struct EditVert *v1, *v2;
|
||||||
struct EditVert *v1, *v2, *vn;
|
union {
|
||||||
|
/* some lean storage for temporary usage
|
||||||
|
* in editmesh routines
|
||||||
|
*/
|
||||||
|
struct EditVert *v;
|
||||||
|
struct EditEdge *e;
|
||||||
|
struct EditFace *f;
|
||||||
|
void *p;
|
||||||
|
long l;
|
||||||
|
} tmp;
|
||||||
short f1, f2; /* short, f1 is (ab)used in subdiv */
|
short f1, f2; /* short, f1 is (ab)used in subdiv */
|
||||||
unsigned char f, h, dir, seam;
|
unsigned char f, h, dir, seam;
|
||||||
float crease;
|
float crease;
|
||||||
@@ -82,6 +102,16 @@ typedef struct EditFace
|
|||||||
struct EditFace *next, *prev;
|
struct EditFace *next, *prev;
|
||||||
struct EditVert *v1, *v2, *v3, *v4;
|
struct EditVert *v1, *v2, *v3, *v4;
|
||||||
struct EditEdge *e1, *e2, *e3, *e4;
|
struct EditEdge *e1, *e2, *e3, *e4;
|
||||||
|
union {
|
||||||
|
/* some lean storage for temporary usage
|
||||||
|
* in editmesh routines
|
||||||
|
*/
|
||||||
|
struct EditVert *v;
|
||||||
|
struct EditEdge *e;
|
||||||
|
struct EditFace *f;
|
||||||
|
void *p;
|
||||||
|
long l;
|
||||||
|
} tmp;
|
||||||
float n[3], cent[3];
|
float n[3], cent[3];
|
||||||
struct TFace tf; /* a copy of original tface. */
|
struct TFace tf; /* a copy of original tface. */
|
||||||
unsigned char mat_nr, flag;
|
unsigned char mat_nr, flag;
|
||||||
|
|||||||
@@ -581,18 +581,18 @@ static void scanfill(PolyFill *pf, int mat_nr)
|
|||||||
if(eed->v1->co[coy]==eed->v2->co[coy]) {
|
if(eed->v1->co[coy]==eed->v2->co[coy]) {
|
||||||
if(eed->v1->f==255 && eed->v2->f!=255) {
|
if(eed->v1->f==255 && eed->v2->f!=255) {
|
||||||
eed->v2->f= 255;
|
eed->v2->f= 255;
|
||||||
eed->v2->vn= eed->v1->vn;
|
eed->v2->tmp.v= eed->v1->tmp.v;
|
||||||
}
|
}
|
||||||
else if(eed->v2->f==255 && eed->v1->f!=255) {
|
else if(eed->v2->f==255 && eed->v1->f!=255) {
|
||||||
eed->v1->f= 255;
|
eed->v1->f= 255;
|
||||||
eed->v1->vn= eed->v2->vn;
|
eed->v1->tmp.v= eed->v2->tmp.v;
|
||||||
}
|
}
|
||||||
else if(eed->v2->f==255 && eed->v1->f==255) {
|
else if(eed->v2->f==255 && eed->v1->f==255) {
|
||||||
eed->v1->vn= eed->v2->vn;
|
eed->v1->tmp.v= eed->v2->tmp.v;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
eed->v2->f= 255;
|
eed->v2->f= 255;
|
||||||
eed->v2->vn= eed->v1;
|
eed->v2->tmp.v = eed->v1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -627,11 +627,13 @@ static void scanfill(PolyFill *pf, int mat_nr)
|
|||||||
BLI_remlink(&filledgebase,eed);
|
BLI_remlink(&filledgebase,eed);
|
||||||
if(eed->v1->f==255) {
|
if(eed->v1->f==255) {
|
||||||
v1= eed->v1;
|
v1= eed->v1;
|
||||||
while(eed->v1->f==255 && eed->v1->vn!=v1) eed->v1= eed->v1->vn;
|
while((eed->v1->f == 255) && (eed->v1->tmp.v != v1))
|
||||||
|
eed->v1 = eed->v1->tmp.v;
|
||||||
}
|
}
|
||||||
if(eed->v2->f==255) {
|
if(eed->v2->f==255) {
|
||||||
v2= eed->v2;
|
v2= eed->v2;
|
||||||
while(eed->v2->f==255 && eed->v2->vn!=v2) eed->v2= eed->v2->vn;
|
while((eed->v2->f == 255) && (eed->v2->tmp.v != v2))
|
||||||
|
eed->v2 = eed->v2->tmp.v;
|
||||||
}
|
}
|
||||||
if(eed->v1!=eed->v2) addedgetoscanlist(eed,verts);
|
if(eed->v1!=eed->v2) addedgetoscanlist(eed,verts);
|
||||||
|
|
||||||
@@ -808,7 +810,7 @@ int BLI_edgefill(int mode, int mat_nr)
|
|||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
- fill works with its own lists, so create that first (no faces!)
|
- fill works with its own lists, so create that first (no faces!)
|
||||||
- for vertices, put in ->vn the old pointer
|
- for vertices, put in ->tmp.v the old pointer
|
||||||
- struct elements xs en ys are not used here: don't hide stuff in it
|
- struct elements xs en ys are not used here: don't hide stuff in it
|
||||||
- edge flag ->f becomes 2 when it's a new edge
|
- edge flag ->f becomes 2 when it's a new edge
|
||||||
- mode: & 1 is check for crossings, then create edges (TO DO )
|
- mode: & 1 is check for crossings, then create edges (TO DO )
|
||||||
@@ -980,10 +982,10 @@ int BLI_edgefill(int mode, int mat_nr)
|
|||||||
|
|
||||||
|
|
||||||
/* CURRENT STATUS:
|
/* CURRENT STATUS:
|
||||||
- eve->f :1= availalble in edges
|
- eve->f :1= availalble in edges
|
||||||
- eve->xs :polynumber
|
- eve->xs :polynumber
|
||||||
- eve->h :amount of edges connected to vertex
|
- eve->h :amount of edges connected to vertex
|
||||||
- eve->vn :store! original vertex number
|
- eve->tmp.v :store! original vertex number
|
||||||
|
|
||||||
- eed->f :
|
- eed->f :
|
||||||
- eed->f1 :poly number
|
- eed->f1 :poly number
|
||||||
|
|||||||
@@ -567,7 +567,7 @@ static void edge_normal_compare(EditEdge *eed, EditFace *efa1)
|
|||||||
float cent1[3], cent2[3];
|
float cent1[3], cent2[3];
|
||||||
float inp;
|
float inp;
|
||||||
|
|
||||||
efa2= (EditFace *)eed->vn;
|
efa2 = eed->tmp.f;
|
||||||
if(efa1==efa2) return;
|
if(efa1==efa2) return;
|
||||||
|
|
||||||
inp= efa1->n[0]*efa2->n[0] + efa1->n[1]*efa2->n[1] + efa1->n[2]*efa2->n[2];
|
inp= efa1->n[0]*efa2->n[0] + efa1->n[1]*efa2->n[1] + efa1->n[2]*efa2->n[2];
|
||||||
@@ -611,7 +611,7 @@ static void edge_drawflags(void)
|
|||||||
EditFace *efa;
|
EditFace *efa;
|
||||||
|
|
||||||
/* - count number of times edges are used in faces: 0 en 1 time means draw edge
|
/* - count number of times edges are used in faces: 0 en 1 time means draw edge
|
||||||
* - edges more than 1 time used: in *vn is pointer to first face
|
* - edges more than 1 time used: in *tmp.f is pointer to first face
|
||||||
* - check all faces, when normal differs to much: draw (flag becomes 1)
|
* - check all faces, when normal differs to much: draw (flag becomes 1)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -630,7 +630,7 @@ static void edge_drawflags(void)
|
|||||||
eed= em->edges.first;
|
eed= em->edges.first;
|
||||||
while(eed) {
|
while(eed) {
|
||||||
eed->f2= eed->f1= 0;
|
eed->f2= eed->f1= 0;
|
||||||
eed->vn= 0;
|
eed->tmp.f = 0;
|
||||||
eed= eed->next;
|
eed= eed->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -645,10 +645,10 @@ static void edge_drawflags(void)
|
|||||||
if(e3->f2<4) e3->f2+= 1;
|
if(e3->f2<4) e3->f2+= 1;
|
||||||
if(e4 && e4->f2<4) e4->f2+= 1;
|
if(e4 && e4->f2<4) e4->f2+= 1;
|
||||||
|
|
||||||
if(e1->vn==0) e1->vn= (EditVert *)efa;
|
if(e1->tmp.f == 0) e1->tmp.f = (void *) efa;
|
||||||
if(e2->vn==0) e2->vn= (EditVert *)efa;
|
if(e2->tmp.f == 0) e2->tmp.f = (void *) efa;
|
||||||
if(e3->vn==0) e3->vn= (EditVert *)efa;
|
if(e3->tmp.f ==0) e3->tmp.f = (void *) efa;
|
||||||
if(e4 && e4->vn==0) e4->vn= (EditVert *)efa;
|
if(e4 && (e4->tmp.f == 0)) e4->tmp.f = (void *) efa;
|
||||||
|
|
||||||
efa= efa->next;
|
efa= efa->next;
|
||||||
}
|
}
|
||||||
@@ -920,7 +920,7 @@ void load_editMesh(void)
|
|||||||
me->mface= mface;
|
me->mface= mface;
|
||||||
me->totface= G.totface;
|
me->totface= G.totface;
|
||||||
|
|
||||||
/* the vertices, abuse ->vn as counter */
|
/* the vertices, use ->tmp.l as counter */
|
||||||
eve= em->verts.first;
|
eve= em->verts.first;
|
||||||
a= 0;
|
a= 0;
|
||||||
|
|
||||||
@@ -944,7 +944,7 @@ void load_editMesh(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
eve->vn= (EditVert *)(long)(a++); /* counter */
|
eve->tmp.l = a++; /* counter */
|
||||||
|
|
||||||
mvert->flag= 0;
|
mvert->flag= 0;
|
||||||
if(eve->f1==1) mvert->flag |= ME_SPHERETEST;
|
if(eve->f1==1) mvert->flag |= ME_SPHERETEST;
|
||||||
@@ -959,8 +959,8 @@ void load_editMesh(void)
|
|||||||
/* the edges */
|
/* the edges */
|
||||||
eed= em->edges.first;
|
eed= em->edges.first;
|
||||||
while(eed) {
|
while(eed) {
|
||||||
medge->v1= (unsigned int) eed->v1->vn;
|
medge->v1= (unsigned int) eed->v1->tmp.l;
|
||||||
medge->v2= (unsigned int) eed->v2->vn;
|
medge->v2= (unsigned int) eed->v2->tmp.l;
|
||||||
|
|
||||||
medge->flag= (eed->f & SELECT) | ME_EDGERENDER;
|
medge->flag= (eed->f & SELECT) | ME_EDGERENDER;
|
||||||
if(eed->f2<2) medge->flag |= ME_EDGEDRAW;
|
if(eed->f2<2) medge->flag |= ME_EDGEDRAW;
|
||||||
@@ -981,10 +981,10 @@ void load_editMesh(void)
|
|||||||
while(efa) {
|
while(efa) {
|
||||||
mface= &((MFace *) me->mface)[i];
|
mface= &((MFace *) me->mface)[i];
|
||||||
|
|
||||||
mface->v1= (unsigned int) efa->v1->vn;
|
mface->v1= (unsigned int) efa->v1->tmp.l;
|
||||||
mface->v2= (unsigned int) efa->v2->vn;
|
mface->v2= (unsigned int) efa->v2->tmp.l;
|
||||||
mface->v3= (unsigned int) efa->v3->vn;
|
mface->v3= (unsigned int) efa->v3->tmp.l;
|
||||||
if(efa->v4) mface->v4= (unsigned int) efa->v4->vn;
|
if (efa->v4) mface->v4 = (unsigned int) efa->v4->tmp.l;
|
||||||
|
|
||||||
mface->mat_nr= efa->mat_nr;
|
mface->mat_nr= efa->mat_nr;
|
||||||
|
|
||||||
@@ -1107,7 +1107,7 @@ void load_editMesh(void)
|
|||||||
eve = vertMap[hmd->indexar[i]];
|
eve = vertMap[hmd->indexar[i]];
|
||||||
|
|
||||||
if (eve) {
|
if (eve) {
|
||||||
hmd->indexar[j++] = (long) eve->vn;
|
hmd->indexar[j++] = eve->tmp.l;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else j++;
|
else j++;
|
||||||
@@ -1175,10 +1175,10 @@ void load_editMesh(void)
|
|||||||
|
|
||||||
if(oldverts) MEM_freeN(oldverts);
|
if(oldverts) MEM_freeN(oldverts);
|
||||||
|
|
||||||
/* to be sure: clear ->vn pointers */
|
/* to be sure: clear ->tmp.l pointers */
|
||||||
eve= em->verts.first;
|
eve= em->verts.first;
|
||||||
while(eve) {
|
while(eve) {
|
||||||
eve->vn= 0;
|
eve->tmp.l = 0;
|
||||||
eve= eve->next;
|
eve= eve->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1643,13 +1643,13 @@ static void *editMesh_to_undoMesh(void)
|
|||||||
evec->totweight= eve->totweight;
|
evec->totweight= eve->totweight;
|
||||||
evec->dw= MEM_dupallocN(eve->dw);
|
evec->dw= MEM_dupallocN(eve->dw);
|
||||||
|
|
||||||
eve->vn= (EditVert *)a;
|
eve->tmp.l = a;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copy edges */
|
/* copy edges */
|
||||||
for(eed=em->edges.first; eed; eed= eed->next, eedc++) {
|
for(eed=em->edges.first; eed; eed= eed->next, eedc++) {
|
||||||
eedc->v1= (int)eed->v1->vn;
|
eedc->v1= (int)eed->v1->tmp.l;
|
||||||
eedc->v2= (int)eed->v2->vn;
|
eedc->v2= (int)eed->v2->tmp.l;
|
||||||
eedc->f= eed->f;
|
eedc->f= eed->f;
|
||||||
eedc->h= eed->h;
|
eedc->h= eed->h;
|
||||||
eedc->seam= eed->seam;
|
eedc->seam= eed->seam;
|
||||||
@@ -1659,10 +1659,10 @@ static void *editMesh_to_undoMesh(void)
|
|||||||
|
|
||||||
/* copy faces */
|
/* copy faces */
|
||||||
for(efa=em->faces.first; efa; efa= efa->next, efac++) {
|
for(efa=em->faces.first; efa; efa= efa->next, efac++) {
|
||||||
efac->v1= (int)efa->v1->vn;
|
efac->v1= (int)efa->v1->tmp.l;
|
||||||
efac->v2= (int)efa->v2->vn;
|
efac->v2= (int)efa->v2->tmp.l;
|
||||||
efac->v3= (int)efa->v3->vn;
|
efac->v3= (int)efa->v3->tmp.l;
|
||||||
if(efa->v4) efac->v4= (int)efa->v4->vn;
|
if(efa->v4) efac->v4= (int)efa->v4->tmp.l;
|
||||||
else efac->v4= -1;
|
else efac->v4= -1;
|
||||||
|
|
||||||
efac->mat_nr= efa->mat_nr;
|
efac->mat_nr= efa->mat_nr;
|
||||||
|
|||||||
@@ -604,9 +604,9 @@ short extrudeflag_edges_indiv(short flag, float *nor)
|
|||||||
EditEdge *eed;
|
EditEdge *eed;
|
||||||
EditFace *efa;
|
EditFace *efa;
|
||||||
|
|
||||||
for(eve= em->verts.first; eve; eve= eve->next) eve->vn= NULL;
|
for(eve= em->verts.first; eve; eve= eve->next) eve->tmp.v = NULL;
|
||||||
for(eed= em->edges.first; eed; eed= eed->next) {
|
for(eed= em->edges.first; eed; eed= eed->next) {
|
||||||
eed->vn= NULL;
|
eed->tmp.f = NULL;
|
||||||
eed->f2= ((eed->f & flag)!=0);
|
eed->f2= ((eed->f & flag)!=0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -614,24 +614,32 @@ short extrudeflag_edges_indiv(short flag, float *nor)
|
|||||||
|
|
||||||
/* sample for next loop */
|
/* sample for next loop */
|
||||||
for(efa= em->faces.first; efa; efa= efa->next) {
|
for(efa= em->faces.first; efa; efa= efa->next) {
|
||||||
efa->e1->vn= (EditVert *)efa;
|
efa->e1->tmp.f = efa;
|
||||||
efa->e2->vn= (EditVert *)efa;
|
efa->e2->tmp.f = efa;
|
||||||
efa->e3->vn= (EditVert *)efa;
|
efa->e3->tmp.f = efa;
|
||||||
if(efa->e4) efa->e4->vn= (EditVert *)efa;
|
if(efa->e4) efa->e4->tmp.f = efa;
|
||||||
}
|
}
|
||||||
/* make the faces */
|
/* make the faces */
|
||||||
for(eed= em->edges.first; eed; eed= eed->next) {
|
for(eed= em->edges.first; eed; eed= eed->next) {
|
||||||
if(eed->f & flag) {
|
if(eed->f & flag) {
|
||||||
if(eed->v1->vn==NULL) eed->v1->vn= addvertlist(eed->v1->co);
|
if(eed->v1->tmp.v == NULL)
|
||||||
if(eed->v2->vn==NULL) eed->v2->vn= addvertlist(eed->v2->co);
|
eed->v1->tmp.v = addvertlist(eed->v1->co);
|
||||||
|
if(eed->v2->tmp.v == NULL)
|
||||||
|
eed->v2->tmp.v = addvertlist(eed->v2->co);
|
||||||
|
|
||||||
if(eed->dir==1) addfacelist(eed->v1, eed->v2, eed->v2->vn, eed->v1->vn, (EditFace *)eed->vn, NULL);
|
if(eed->dir==1)
|
||||||
else addfacelist(eed->v2, eed->v1, eed->v1->vn, eed->v2->vn, (EditFace *)eed->vn, NULL);
|
addfacelist(eed->v1, eed->v2,
|
||||||
|
eed->v2->tmp.v, eed->v1->tmp.v,
|
||||||
|
eed->tmp.f, NULL);
|
||||||
|
else
|
||||||
|
addfacelist(eed->v2, eed->v1,
|
||||||
|
eed->v1->tmp.v, eed->v2->tmp.v,
|
||||||
|
eed->tmp.f, NULL);
|
||||||
|
|
||||||
/* for transform */
|
/* for transform */
|
||||||
if(eed->vn) {
|
if(eed->tmp.f) {
|
||||||
efa= (EditFace *)eed->vn;
|
efa = eed->tmp.f;
|
||||||
if(efa->f & SELECT) add_normal_aligned(nor, efa->n);
|
if (efa->f & SELECT) add_normal_aligned(nor, efa->n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -640,8 +648,8 @@ short extrudeflag_edges_indiv(short flag, float *nor)
|
|||||||
/* set correct selection */
|
/* set correct selection */
|
||||||
EM_clear_flag_all(SELECT);
|
EM_clear_flag_all(SELECT);
|
||||||
for(eve= em->verts.last; eve; eve= eve->prev) {
|
for(eve= em->verts.last; eve; eve= eve->prev) {
|
||||||
if(eve->vn) {
|
if(eve->tmp.v) {
|
||||||
eve->vn->f |= flag;
|
eve->tmp.v->f |= flag;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -662,16 +670,18 @@ short extrudeflag_verts_indiv(short flag, float *nor)
|
|||||||
/* make the edges */
|
/* make the edges */
|
||||||
for(eve= em->verts.first; eve; eve= eve->next) {
|
for(eve= em->verts.first; eve; eve= eve->next) {
|
||||||
if(eve->f & flag) {
|
if(eve->f & flag) {
|
||||||
eve->vn= addvertlist(eve->co);
|
eve->tmp.v = addvertlist(eve->co);
|
||||||
addedgelist(eve, eve->vn, NULL);
|
addedgelist(eve, eve->tmp.v, NULL);
|
||||||
}
|
}
|
||||||
else eve->vn= NULL;
|
else eve->tmp.v = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set correct selection */
|
/* set correct selection */
|
||||||
EM_clear_flag_all(SELECT);
|
EM_clear_flag_all(SELECT);
|
||||||
|
|
||||||
for(eve= em->verts.last; eve; eve= eve->prev) if(eve->vn) eve->vn->f |= flag;
|
for(eve= em->verts.last; eve; eve= eve->prev)
|
||||||
|
if (eve->tmp.v)
|
||||||
|
eve->tmp.v->f |= flag;
|
||||||
|
|
||||||
return 'g'; // g is grab
|
return 'g'; // g is grab
|
||||||
}
|
}
|
||||||
@@ -706,7 +716,7 @@ static short extrudeflag_edge(short flag, float *nor)
|
|||||||
recalc_editnormals();
|
recalc_editnormals();
|
||||||
|
|
||||||
for(eve= em->verts.first; eve; eve= eve->next) {
|
for(eve= em->verts.first; eve; eve= eve->next) {
|
||||||
eve->vn= NULL;
|
eve->tmp.v = NULL;
|
||||||
eve->f1= 0;
|
eve->f1= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -717,7 +727,7 @@ static short extrudeflag_edge(short flag, float *nor)
|
|||||||
eed->v1->f1= 1; // we call this 'selected vertex' now
|
eed->v1->f1= 1; // we call this 'selected vertex' now
|
||||||
eed->v2->f1= 1;
|
eed->v2->f1= 1;
|
||||||
}
|
}
|
||||||
eed->vn= NULL; // here we tuck face pointer, as sample
|
eed->tmp.f = NULL; // here we tuck face pointer, as sample
|
||||||
}
|
}
|
||||||
for(efa= em->faces.first; efa; efa= efa->next) {
|
for(efa= em->faces.first; efa; efa= efa->next) {
|
||||||
if(efa->f & SELECT) {
|
if(efa->f & SELECT) {
|
||||||
@@ -727,10 +737,10 @@ static short extrudeflag_edge(short flag, float *nor)
|
|||||||
if(efa->e4) efa->e4->f2++;
|
if(efa->e4) efa->e4->f2++;
|
||||||
|
|
||||||
// sample for next loop
|
// sample for next loop
|
||||||
efa->e1->vn= (EditVert *)efa;
|
efa->e1->tmp.f = efa;
|
||||||
efa->e2->vn= (EditVert *)efa;
|
efa->e2->tmp.f = efa;
|
||||||
efa->e3->vn= (EditVert *)efa;
|
efa->e3->tmp.f = efa;
|
||||||
if(efa->e4) efa->e4->vn= (EditVert *)efa;
|
if(efa->e4) efa->e4->tmp.f = efa;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
efa->e1->f1++;
|
efa->e1->f1++;
|
||||||
@@ -756,14 +766,22 @@ static short extrudeflag_edge(short flag, float *nor)
|
|||||||
for(eed= em->edges.last; eed; eed= eed->prev) {
|
for(eed= em->edges.last; eed; eed= eed->prev) {
|
||||||
if(eed->f & SELECT) {
|
if(eed->f & SELECT) {
|
||||||
if(eed->f2<2) {
|
if(eed->f2<2) {
|
||||||
if(eed->v1->vn==NULL)
|
if(eed->v1->tmp.v == NULL)
|
||||||
eed->v1->vn= addvertlist(eed->v1->co);
|
eed->v1->tmp.v = addvertlist(eed->v1->co);
|
||||||
if(eed->v2->vn==NULL)
|
if(eed->v2->tmp.v == NULL)
|
||||||
eed->v2->vn= addvertlist(eed->v2->co);
|
eed->v2->tmp.v = addvertlist(eed->v2->co);
|
||||||
|
|
||||||
/* if del_old, the preferred normal direction is exact opposite as for keep old faces */
|
/* if del_old, the preferred normal direction is exact
|
||||||
if(eed->dir!=del_old) addfacelist(eed->v1, eed->v2, eed->v2->vn, eed->v1->vn, (EditFace *)eed->vn, NULL);
|
* opposite as for keep old faces
|
||||||
else addfacelist(eed->v2, eed->v1, eed->v1->vn, eed->v2->vn, (EditFace *)eed->vn, NULL);
|
*/
|
||||||
|
if(eed->dir!=del_old)
|
||||||
|
addfacelist(eed->v1, eed->v2,
|
||||||
|
eed->v2->tmp.v, eed->v1->tmp.v,
|
||||||
|
eed->tmp.f, NULL);
|
||||||
|
else
|
||||||
|
addfacelist(eed->v2, eed->v1,
|
||||||
|
eed->v1->tmp.v, eed->v2->tmp.v,
|
||||||
|
eed->tmp.f, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -771,22 +789,30 @@ static short extrudeflag_edge(short flag, float *nor)
|
|||||||
/* step 3: make new faces from faces */
|
/* step 3: make new faces from faces */
|
||||||
for(efa= em->faces.last; efa; efa= efa->prev) {
|
for(efa= em->faces.last; efa; efa= efa->prev) {
|
||||||
if(efa->f & SELECT) {
|
if(efa->f & SELECT) {
|
||||||
if(efa->v1->vn==NULL) efa->v1->vn= addvertlist(efa->v1->co);
|
if (efa->v1->tmp.v == NULL)
|
||||||
if(efa->v2->vn==NULL) efa->v2->vn= addvertlist(efa->v2->co);
|
efa->v1->tmp.v = addvertlist(efa->v1->co);
|
||||||
if(efa->v3->vn==NULL) efa->v3->vn= addvertlist(efa->v3->co);
|
if (efa->v2->tmp.v ==NULL)
|
||||||
if(efa->v4 && efa->v4->vn==NULL) efa->v4->vn= addvertlist(efa->v4->co);
|
efa->v2->tmp.v = addvertlist(efa->v2->co);
|
||||||
|
if (efa->v3->tmp.v ==NULL)
|
||||||
|
efa->v3->tmp.v = addvertlist(efa->v3->co);
|
||||||
|
if (efa->v4 && (efa->v4->tmp.v == NULL))
|
||||||
|
efa->v4->tmp.v = addvertlist(efa->v4->co);
|
||||||
|
|
||||||
if(del_old==0) { // keep old faces means flipping normal
|
if(del_old==0) { // keep old faces means flipping normal
|
||||||
if(efa->v4)
|
if(efa->v4)
|
||||||
addfacelist(efa->v4->vn, efa->v3->vn, efa->v2->vn, efa->v1->vn, efa, efa);
|
addfacelist(efa->v4->tmp.v, efa->v3->tmp.v,
|
||||||
|
efa->v2->tmp.v, efa->v1->tmp.v, efa, efa);
|
||||||
else
|
else
|
||||||
addfacelist(efa->v3->vn, efa->v2->vn, efa->v1->vn, NULL, efa, efa);
|
addfacelist(efa->v3->tmp.v, efa->v2->tmp.v,
|
||||||
|
efa->v1->tmp.v, NULL, efa, efa);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(efa->v4)
|
if(efa->v4)
|
||||||
addfacelist(efa->v1->vn, efa->v2->vn, efa->v3->vn, efa->v4->vn, efa, efa);
|
addfacelist(efa->v1->tmp.v, efa->v2->tmp.v,
|
||||||
|
efa->v3->tmp.v, efa->v4->tmp.v, efa, efa);
|
||||||
else
|
else
|
||||||
addfacelist(efa->v1->vn, efa->v2->vn, efa->v3->vn, NULL, efa, efa);
|
addfacelist(efa->v1->tmp.v, efa->v2->tmp.v,
|
||||||
|
efa->v3->tmp.v, NULL, efa, efa);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for transform */
|
/* for transform */
|
||||||
@@ -837,7 +863,7 @@ static short extrudeflag_edge(short flag, float *nor)
|
|||||||
nextve= eve->next;
|
nextve= eve->next;
|
||||||
if(eve->f1) {
|
if(eve->f1) {
|
||||||
// hack... but we need it for step 7, redoing selection
|
// hack... but we need it for step 7, redoing selection
|
||||||
if(eve->vn) eve->vn->vn= eve->vn;
|
if(eve->tmp.v) eve->tmp.v->tmp.v= eve->tmp.v;
|
||||||
|
|
||||||
BLI_remlink(&em->verts, eve);
|
BLI_remlink(&em->verts, eve);
|
||||||
free_editvert(eve);
|
free_editvert(eve);
|
||||||
@@ -852,8 +878,8 @@ static short extrudeflag_edge(short flag, float *nor)
|
|||||||
EM_clear_flag_all(SELECT);
|
EM_clear_flag_all(SELECT);
|
||||||
|
|
||||||
for(eve= em->verts.first; eve; eve= eve->next) {
|
for(eve= em->verts.first; eve; eve= eve->next) {
|
||||||
if(eve->vn) {
|
if(eve->tmp.v) {
|
||||||
eve->vn->f |= SELECT;
|
eve->tmp.v->f |= SELECT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -893,7 +919,7 @@ short extrudeflag_vert(short flag, float *nor)
|
|||||||
else eed->f2= 0;
|
else eed->f2= 0;
|
||||||
|
|
||||||
eed->f1= 1; /* this indicates it is an 'old' edge (in this routine we make new ones) */
|
eed->f1= 1; /* this indicates it is an 'old' edge (in this routine we make new ones) */
|
||||||
eed->vn= NULL; /* abused as sample */
|
eed->tmp.f = NULL; /* used as sample */
|
||||||
|
|
||||||
eed= eed->next;
|
eed= eed->next;
|
||||||
}
|
}
|
||||||
@@ -931,10 +957,10 @@ short extrudeflag_vert(short flag, float *nor)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// sample for next loop
|
// sample for next loop
|
||||||
efa->e1->vn= (EditVert *)efa;
|
efa->e1->tmp.f = efa;
|
||||||
efa->e2->vn= (EditVert *)efa;
|
efa->e2->tmp.f = efa;
|
||||||
efa->e3->vn= (EditVert *)efa;
|
efa->e3->tmp.f = efa;
|
||||||
if(efa->e4) efa->e4->vn= (EditVert *)efa;
|
if(efa->e4) efa->e4->tmp.f = efa;
|
||||||
|
|
||||||
efa= efa->next;
|
efa= efa->next;
|
||||||
}
|
}
|
||||||
@@ -957,7 +983,7 @@ short extrudeflag_vert(short flag, float *nor)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* copy all selected vertices, */
|
/* copy all selected vertices, */
|
||||||
/* write pointer to new vert in old struct at eve->vn */
|
/* write pointer to new vert in old struct at eve->tmp.v */
|
||||||
eve= em->verts.last;
|
eve= em->verts.last;
|
||||||
while(eve) {
|
while(eve) {
|
||||||
eve->f &= ~128; /* clear, for later test for loose verts */
|
eve->f &= ~128; /* clear, for later test for loose verts */
|
||||||
@@ -968,9 +994,9 @@ short extrudeflag_vert(short flag, float *nor)
|
|||||||
VECCOPY(v1->co, eve->co);
|
VECCOPY(v1->co, eve->co);
|
||||||
v1->f= eve->f;
|
v1->f= eve->f;
|
||||||
eve->f-= flag;
|
eve->f-= flag;
|
||||||
eve->vn= v1;
|
eve->tmp.v = v1;
|
||||||
}
|
}
|
||||||
else eve->vn= 0;
|
else eve->tmp.v = 0;
|
||||||
eve= eve->prev;
|
eve= eve->prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1007,11 +1033,17 @@ short extrudeflag_vert(short flag, float *nor)
|
|||||||
if( (eed->f2==1 || eed->f2==2) ) {
|
if( (eed->f2==1 || eed->f2==2) ) {
|
||||||
|
|
||||||
/* if del_old, the preferred normal direction is exact opposite as for keep old faces */
|
/* if del_old, the preferred normal direction is exact opposite as for keep old faces */
|
||||||
if(eed->dir!=del_old) efa2= addfacelist(eed->v1, eed->v2, eed->v2->vn, eed->v1->vn, NULL, NULL);
|
if(eed->dir != del_old)
|
||||||
else efa2= addfacelist(eed->v2, eed->v1, eed->v1->vn, eed->v2->vn, NULL, NULL);
|
efa2 = addfacelist(eed->v1, eed->v2,
|
||||||
|
eed->v2->tmp.v, eed->v1->tmp.v,
|
||||||
|
NULL, NULL);
|
||||||
|
else
|
||||||
|
efa2 = addfacelist(eed->v2, eed->v1,
|
||||||
|
eed->v1->tmp.v, eed->v2->tmp.v,
|
||||||
|
NULL, NULL);
|
||||||
|
|
||||||
if(eed->vn) {
|
if(eed->tmp.f) {
|
||||||
efa= (EditFace *)eed->vn;
|
efa = eed->tmp.f;
|
||||||
efa2->mat_nr= efa->mat_nr;
|
efa2->mat_nr= efa->mat_nr;
|
||||||
efa2->tf= efa->tf;
|
efa2->tf= efa->tf;
|
||||||
efa2->flag= efa->flag;
|
efa2->flag= efa->flag;
|
||||||
@@ -1046,15 +1078,19 @@ short extrudeflag_vert(short flag, float *nor)
|
|||||||
nextvl= efa->next;
|
nextvl= efa->next;
|
||||||
if(efa->f1 & 1) {
|
if(efa->f1 & 1) {
|
||||||
|
|
||||||
v1= efa->v1->vn;
|
v1 = efa->v1->tmp.v;
|
||||||
v2= efa->v2->vn;
|
v2 = efa->v2->tmp.v;
|
||||||
v3= efa->v3->vn;
|
v3 = efa->v3->tmp.v;
|
||||||
if(efa->v4) v4= efa->v4->vn; else v4= 0;
|
if(efa->v4)
|
||||||
|
v4 = efa->v4->tmp.v;
|
||||||
if(del_old==0) // if we keep old, we flip normal
|
|
||||||
efa2= addfacelist(v3, v2, v1, v4, efa, efa); /* hmm .. not sure about edges here */
|
|
||||||
else
|
else
|
||||||
efa2= addfacelist(v1, v2, v3, v4, efa, efa); /* hmm .. not sure about edges here */
|
v4= 0;
|
||||||
|
|
||||||
|
/* hmm .. not sure about edges here */
|
||||||
|
if(del_old==0) // if we keep old, we flip normal
|
||||||
|
efa2= addfacelist(v3, v2, v1, v4, efa, efa);
|
||||||
|
else
|
||||||
|
efa2= addfacelist(v1, v2, v3, v4, efa, efa);
|
||||||
|
|
||||||
/* for transform */
|
/* for transform */
|
||||||
add_normal_aligned(nor, efa->n);
|
add_normal_aligned(nor, efa->n);
|
||||||
@@ -1069,15 +1105,15 @@ short extrudeflag_vert(short flag, float *nor)
|
|||||||
|
|
||||||
Normalise(nor); // for grab
|
Normalise(nor); // for grab
|
||||||
|
|
||||||
/* for all vertices with eve->vn!=0
|
/* for all vertices with eve->tmp.v!=0
|
||||||
if eve->f1==1: make edge
|
if eve->f1==1: make edge
|
||||||
if flag!=128 : if del_old==1: remove
|
if flag!=128 : if del_old==1: remove
|
||||||
*/
|
*/
|
||||||
eve= em->verts.last;
|
eve= em->verts.last;
|
||||||
while(eve) {
|
while(eve) {
|
||||||
nextve= eve->prev;
|
nextve= eve->prev;
|
||||||
if(eve->vn) {
|
if(eve->tmp.v) {
|
||||||
if(eve->f1==1) addedgelist(eve, eve->vn, NULL);
|
if(eve->f1==1) addedgelist(eve, eve->tmp.v, NULL);
|
||||||
else if( (eve->f & 128)==0) {
|
else if( (eve->f & 128)==0) {
|
||||||
if(del_old) {
|
if(del_old) {
|
||||||
BLI_remlink(&em->verts,eve);
|
BLI_remlink(&em->verts,eve);
|
||||||
@@ -1168,7 +1204,7 @@ void adduplicateflag(int flag)
|
|||||||
eve->f-= flag;
|
eve->f-= flag;
|
||||||
eve->f|= 128;
|
eve->f|= 128;
|
||||||
|
|
||||||
eve->vn= v1;
|
eve->tmp.v = v1;
|
||||||
|
|
||||||
/* >>>>> FIXME: Copy deformation weight ? */
|
/* >>>>> FIXME: Copy deformation weight ? */
|
||||||
v1->totweight = eve->totweight;
|
v1->totweight = eve->totweight;
|
||||||
@@ -1184,8 +1220,8 @@ void adduplicateflag(int flag)
|
|||||||
/* copy edges */
|
/* copy edges */
|
||||||
for(eed= em->edges.last; eed; eed= eed->prev) {
|
for(eed= em->edges.last; eed; eed= eed->prev) {
|
||||||
if( eed->f & flag ) {
|
if( eed->f & flag ) {
|
||||||
v1= eed->v1->vn;
|
v1 = eed->v1->tmp.v;
|
||||||
v2= eed->v2->vn;
|
v2 = eed->v2->tmp.v;
|
||||||
newed= addedgelist(v1, v2, eed);
|
newed= addedgelist(v1, v2, eed);
|
||||||
|
|
||||||
newed->f= eed->f;
|
newed->f= eed->f;
|
||||||
@@ -1197,10 +1233,10 @@ void adduplicateflag(int flag)
|
|||||||
/* then dupicate faces */
|
/* then dupicate faces */
|
||||||
for(efa= em->faces.last; efa; efa= efa->prev) {
|
for(efa= em->faces.last; efa; efa= efa->prev) {
|
||||||
if(efa->f & flag) {
|
if(efa->f & flag) {
|
||||||
v1= efa->v1->vn;
|
v1 = efa->v1->tmp.v;
|
||||||
v2= efa->v2->vn;
|
v2 = efa->v2->tmp.v;
|
||||||
v3= efa->v3->vn;
|
v3 = efa->v3->tmp.v;
|
||||||
if(efa->v4) v4= efa->v4->vn; else v4= NULL;
|
if(efa->v4) v4 = efa->v4->tmp.v; else v4= NULL;
|
||||||
newfa= addfacelist(v1, v2, v3, v4, efa, efa);
|
newfa= addfacelist(v1, v2, v3, v4, efa, efa);
|
||||||
|
|
||||||
newfa->f= efa->f;
|
newfa->f= efa->f;
|
||||||
|
|||||||
@@ -1517,7 +1517,7 @@ void select_sharp_edges(void)
|
|||||||
EditFace *efa;
|
EditFace *efa;
|
||||||
EditFace **efa1;
|
EditFace **efa1;
|
||||||
EditFace **efa2;
|
EditFace **efa2;
|
||||||
long edgecount = 0, i, *vnptr;
|
long edgecount = 0, i;
|
||||||
static short sharpness = 135;
|
static short sharpness = 135;
|
||||||
float fsharpness;
|
float fsharpness;
|
||||||
|
|
||||||
@@ -1533,12 +1533,11 @@ void select_sharp_edges(void)
|
|||||||
fsharpness = ((180.0 - sharpness) * M_PI) / 180.0;
|
fsharpness = ((180.0 - sharpness) * M_PI) / 180.0;
|
||||||
|
|
||||||
i=0;
|
i=0;
|
||||||
/* count edges, (ab)use vn to be a long */
|
/* count edges, use tmp.l */
|
||||||
eed= em->edges.first;
|
eed= em->edges.first;
|
||||||
while(eed) {
|
while(eed) {
|
||||||
edgecount++;
|
edgecount++;
|
||||||
vnptr = (long *) &eed->vn;
|
eed->tmp.l = i;
|
||||||
*vnptr = i;
|
|
||||||
eed= eed->next;
|
eed= eed->next;
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
@@ -1549,12 +1548,13 @@ void select_sharp_edges(void)
|
|||||||
efa2 = MEM_callocN(edgecount*sizeof(EditFace *),
|
efa2 = MEM_callocN(edgecount*sizeof(EditFace *),
|
||||||
"pairs of edit face pointers");
|
"pairs of edit face pointers");
|
||||||
|
|
||||||
#define face_table_edge { \
|
#define face_table_edge(eed) { \
|
||||||
i = *vnptr; \
|
i = eed->tmp.l; \
|
||||||
if (i != -1) { \
|
if (i != -1) { \
|
||||||
if (efa1[i]) { \
|
if (efa1[i]) { \
|
||||||
if (efa2[i]) { \
|
if (efa2[i]) { \
|
||||||
*vnptr = -1; /* bad, edge has more than two neighbors */ \
|
/* invalidate, edge has more than two neighbors */ \
|
||||||
|
eed->tmp.l = -1; \
|
||||||
} \
|
} \
|
||||||
else { \
|
else { \
|
||||||
efa2[i] = efa; \
|
efa2[i] = efa; \
|
||||||
@@ -1569,25 +1569,20 @@ void select_sharp_edges(void)
|
|||||||
/* find the adjacent faces of each edge, we want only two */
|
/* find the adjacent faces of each edge, we want only two */
|
||||||
efa= em->faces.first;
|
efa= em->faces.first;
|
||||||
while(efa) {
|
while(efa) {
|
||||||
vnptr = (long *) &efa->e1->vn;
|
face_table_edge(efa->e1);
|
||||||
face_table_edge;
|
face_table_edge(efa->e2);
|
||||||
vnptr = (long *) &efa->e2->vn;
|
face_table_edge(efa->e3);
|
||||||
face_table_edge;
|
|
||||||
vnptr = (long *) &efa->e3->vn;
|
|
||||||
face_table_edge;
|
|
||||||
if (efa->e4) {
|
if (efa->e4) {
|
||||||
vnptr = (long *) &efa->e4->vn;
|
face_table_edge(efa->e4);
|
||||||
face_table_edge;
|
|
||||||
}
|
}
|
||||||
efa= efa->next;
|
efa= efa->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef face_table_edge
|
#undef face_table_edge
|
||||||
|
|
||||||
eed= em->edges.first;
|
eed = em->edges.first;
|
||||||
while(eed) {
|
while(eed) {
|
||||||
vnptr = (long *) &eed->vn;
|
i = eed->tmp.l;
|
||||||
i = *vnptr;
|
|
||||||
if (i != -1) {
|
if (i != -1) {
|
||||||
/* edge has two or less neighboring faces */
|
/* edge has two or less neighboring faces */
|
||||||
if ( (efa1[i]) && (efa2[i]) ) {
|
if ( (efa1[i]) && (efa2[i]) ) {
|
||||||
@@ -1623,7 +1618,7 @@ void select_linked_flat_faces(void)
|
|||||||
EditFace *efa;
|
EditFace *efa;
|
||||||
EditFace **efa1;
|
EditFace **efa1;
|
||||||
EditFace **efa2;
|
EditFace **efa2;
|
||||||
long edgecount = 0, i, *vnptr, faceselcount=0, faceselcountold=0;
|
long edgecount = 0, i, faceselcount=0, faceselcountold=0;
|
||||||
static short sharpness = 135;
|
static short sharpness = 135;
|
||||||
float fsharpness;
|
float fsharpness;
|
||||||
|
|
||||||
@@ -1639,12 +1634,11 @@ void select_linked_flat_faces(void)
|
|||||||
fsharpness = ((180.0 - sharpness) * M_PI) / 180.0;
|
fsharpness = ((180.0 - sharpness) * M_PI) / 180.0;
|
||||||
|
|
||||||
i=0;
|
i=0;
|
||||||
/* count edges, (ab)use vn to be a long */
|
/* count edges, use tmp.l */
|
||||||
eed= em->edges.first;
|
eed= em->edges.first;
|
||||||
while(eed) {
|
while(eed) {
|
||||||
edgecount++;
|
edgecount++;
|
||||||
vnptr = (long *) &eed->vn;
|
eed->tmp.l = i;
|
||||||
*vnptr = i;
|
|
||||||
eed= eed->next;
|
eed= eed->next;
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
@@ -1655,12 +1649,13 @@ void select_linked_flat_faces(void)
|
|||||||
efa2 = MEM_callocN(edgecount*sizeof(EditFace *),
|
efa2 = MEM_callocN(edgecount*sizeof(EditFace *),
|
||||||
"pairs of edit face pointers");
|
"pairs of edit face pointers");
|
||||||
|
|
||||||
#define face_table_edge { \
|
#define face_table_edge(eed) { \
|
||||||
i = *vnptr; \
|
i = eed->tmp.l; \
|
||||||
if (i != -1) { \
|
if (i != -1) { \
|
||||||
if (efa1[i]) { \
|
if (efa1[i]) { \
|
||||||
if (efa2[i]) { \
|
if (efa2[i]) { \
|
||||||
*vnptr = -1; /* bad, edge has more than two neighbors */ \
|
/* invalidate, edge has more than two neighbors */ \
|
||||||
|
eed->tmp.l = -1; \
|
||||||
} \
|
} \
|
||||||
else { \
|
else { \
|
||||||
efa2[i] = efa; \
|
efa2[i] = efa; \
|
||||||
@@ -1675,15 +1670,11 @@ void select_linked_flat_faces(void)
|
|||||||
/* find the adjacent faces of each edge, we want only two */
|
/* find the adjacent faces of each edge, we want only two */
|
||||||
efa= em->faces.first;
|
efa= em->faces.first;
|
||||||
while(efa) {
|
while(efa) {
|
||||||
vnptr = (long *) &efa->e1->vn;
|
face_table_edge(efa->e1);
|
||||||
face_table_edge;
|
face_table_edge(efa->e2);
|
||||||
vnptr = (long *) &efa->e2->vn;
|
face_table_edge(efa->e3);
|
||||||
face_table_edge;
|
|
||||||
vnptr = (long *) &efa->e3->vn;
|
|
||||||
face_table_edge;
|
|
||||||
if (efa->e4) {
|
if (efa->e4) {
|
||||||
vnptr = (long *) &efa->e4->vn;
|
face_table_edge(efa->e4);
|
||||||
face_table_edge;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* while were at it, count the selected faces */
|
/* while were at it, count the selected faces */
|
||||||
@@ -1696,8 +1687,7 @@ void select_linked_flat_faces(void)
|
|||||||
|
|
||||||
eed= em->edges.first;
|
eed= em->edges.first;
|
||||||
while(eed) {
|
while(eed) {
|
||||||
vnptr = (long *) &eed->vn;
|
i = eed->tmp.l;
|
||||||
i = *vnptr;
|
|
||||||
if (i != -1) {
|
if (i != -1) {
|
||||||
/* edge has two or less neighboring faces */
|
/* edge has two or less neighboring faces */
|
||||||
if ( (efa1[i]) && (efa2[i]) ) {
|
if ( (efa1[i]) && (efa2[i]) ) {
|
||||||
@@ -1706,21 +1696,21 @@ void select_linked_flat_faces(void)
|
|||||||
angle = saacos(efa1[i]->n[0]*efa2[i]->n[0] +
|
angle = saacos(efa1[i]->n[0]*efa2[i]->n[0] +
|
||||||
efa1[i]->n[1]*efa2[i]->n[1] +
|
efa1[i]->n[1]*efa2[i]->n[1] +
|
||||||
efa1[i]->n[2]*efa2[i]->n[2]);
|
efa1[i]->n[2]*efa2[i]->n[2]);
|
||||||
/* flag sharp edges */
|
/* invalidate: edge too sharp */
|
||||||
if (fabs(angle) >= fsharpness)
|
if (fabs(angle) >= fsharpness)
|
||||||
*vnptr = -1;
|
eed->tmp.l = -1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* less than two neighbors */
|
/* invalidate: less than two neighbors */
|
||||||
*vnptr = -1;
|
eed->tmp.l = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
eed= eed->next;
|
eed= eed->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define select_flat_neighbor { \
|
#define select_flat_neighbor(eed) { \
|
||||||
i = *vnptr; \
|
i = eed->tmp.l; \
|
||||||
if (i!=-1) { \
|
if (i!=-1) { \
|
||||||
if (! (efa1[i]->f & SELECT) ) { \
|
if (! (efa1[i]->f & SELECT) ) { \
|
||||||
EM_select_face(efa1[i], 1); \
|
EM_select_face(efa1[i], 1); \
|
||||||
@@ -1739,15 +1729,11 @@ void select_linked_flat_faces(void)
|
|||||||
efa= em->faces.first;
|
efa= em->faces.first;
|
||||||
while(efa) {
|
while(efa) {
|
||||||
if (efa->f & SELECT) {
|
if (efa->f & SELECT) {
|
||||||
vnptr = (long *) &efa->e1->vn;
|
select_flat_neighbor(efa->e1);
|
||||||
select_flat_neighbor;
|
select_flat_neighbor(efa->e2);
|
||||||
vnptr = (long *) &efa->e2->vn;
|
select_flat_neighbor(efa->e3);
|
||||||
select_flat_neighbor;
|
|
||||||
vnptr = (long *) &efa->e3->vn;
|
|
||||||
select_flat_neighbor;
|
|
||||||
if (efa->e4) {
|
if (efa->e4) {
|
||||||
vnptr = (long *) &efa->e4->vn;
|
select_flat_neighbor(efa->e4);
|
||||||
select_flat_neighbor;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
efa= efa->next;
|
efa= efa->next;
|
||||||
@@ -2547,7 +2533,7 @@ void vertexsmooth(void)
|
|||||||
eve= em->verts.first;
|
eve= em->verts.first;
|
||||||
while(eve) {
|
while(eve) {
|
||||||
if(eve->f & SELECT) {
|
if(eve->f & SELECT) {
|
||||||
eve->vn= (EditVert *)adr;
|
eve->tmp.fp = adr;
|
||||||
eve->f1= 0;
|
eve->f1= 0;
|
||||||
eve->f2= 0;
|
eve->f2= 0;
|
||||||
adr+= 3;
|
adr+= 3;
|
||||||
@@ -2595,11 +2581,11 @@ void vertexsmooth(void)
|
|||||||
|
|
||||||
if((eed->v1->f & SELECT) && eed->v1->f1<255) {
|
if((eed->v1->f & SELECT) && eed->v1->f1<255) {
|
||||||
eed->v1->f1++;
|
eed->v1->f1++;
|
||||||
VecAddf((float *)eed->v1->vn, (float *)eed->v1->vn, fvec);
|
VecAddf(eed->v1->tmp.fp, eed->v1->tmp.fp, fvec);
|
||||||
}
|
}
|
||||||
if((eed->v2->f & SELECT) && eed->v2->f1<255) {
|
if((eed->v2->f & SELECT) && eed->v2->f1<255) {
|
||||||
eed->v2->f1++;
|
eed->v2->f1++;
|
||||||
VecAddf((float *)eed->v2->vn, (float *)eed->v2->vn, fvec);
|
VecAddf(eed->v2->tmp.fp, eed->v2->tmp.fp, fvec);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
eed= eed->next;
|
eed= eed->next;
|
||||||
@@ -2609,7 +2595,7 @@ void vertexsmooth(void)
|
|||||||
while(eve) {
|
while(eve) {
|
||||||
if(eve->f & SELECT) {
|
if(eve->f & SELECT) {
|
||||||
if(eve->f1) {
|
if(eve->f1) {
|
||||||
adr= (float *)eve->vn;
|
adr = eve->tmp.fp;
|
||||||
fac= 0.5/(float)eve->f1;
|
fac= 0.5/(float)eve->f1;
|
||||||
|
|
||||||
eve->co[0]= 0.5*eve->co[0]+fac*adr[0];
|
eve->co[0]= 0.5*eve->co[0]+fac*adr[0];
|
||||||
@@ -2629,7 +2615,7 @@ void vertexsmooth(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
eve->vn= 0;
|
eve->tmp.fp= 0;
|
||||||
}
|
}
|
||||||
eve= eve->next;
|
eve= eve->next;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -259,7 +259,7 @@ int removedoublesflag(short flag, float limit) /* return amount */
|
|||||||
dist= (float)fabs(v1->co[2]-eve->co[2]);
|
dist= (float)fabs(v1->co[2]-eve->co[2]);
|
||||||
if(dist<=limit) {
|
if(dist<=limit) {
|
||||||
v1->f|= 128;
|
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) ) {
|
if( (eed->v1->f & 128) || (eed->v2->f & 128) ) {
|
||||||
remedge(eed);
|
remedge(eed);
|
||||||
|
|
||||||
if(eed->v1->f & 128) eed->v1= eed->v1->vn;
|
if(eed->v1->f & 128) eed->v1 = eed->v1->tmp.v;
|
||||||
if(eed->v2->f & 128) eed->v2= eed->v2->vn;
|
if(eed->v2->f & 128) eed->v2 = eed->v2->tmp.v;
|
||||||
e1= addedgelist(eed->v1, eed->v2, eed);
|
e1= addedgelist(eed->v1, eed->v2, eed);
|
||||||
|
|
||||||
if(e1) e1->f2= 1;
|
if(e1) e1->f2= 1;
|
||||||
@@ -316,10 +316,10 @@ int removedoublesflag(short flag, float limit) /* return amount */
|
|||||||
nextvl= efa->next;
|
nextvl= efa->next;
|
||||||
if(efa->f1==1) {
|
if(efa->f1==1) {
|
||||||
|
|
||||||
if(efa->v1->f & 128) efa->v1= efa->v1->vn;
|
if(efa->v1->f & 128) efa->v1= efa->v1->tmp.v;
|
||||||
if(efa->v2->f & 128) efa->v2= efa->v2->vn;
|
if(efa->v2->f & 128) efa->v2= efa->v2->tmp.v;
|
||||||
if(efa->v3->f & 128) efa->v3= efa->v3->vn;
|
if(efa->v3->f & 128) efa->v3= efa->v3->tmp.v;
|
||||||
if(efa->v4 && (efa->v4->f & 128)) efa->v4= efa->v4->vn;
|
if(efa->v4 && (efa->v4->f & 128)) efa->v4= efa->v4->tmp.v;
|
||||||
|
|
||||||
test= 0;
|
test= 0;
|
||||||
if(efa->v1==efa->v2) test+=1;
|
if(efa->v1==efa->v2) test+=1;
|
||||||
@@ -1061,8 +1061,8 @@ void fill_mesh(void)
|
|||||||
while(eve) {
|
while(eve) {
|
||||||
if(eve->f & SELECT) {
|
if(eve->f & SELECT) {
|
||||||
v1= BLI_addfillvert(eve->co);
|
v1= BLI_addfillvert(eve->co);
|
||||||
eve->vn= v1;
|
eve->tmp.v= v1;
|
||||||
v1->vn= eve;
|
v1->tmp.v= eve;
|
||||||
v1->xs= 0; // used for counting edges
|
v1->xs= 0; // used for counting edges
|
||||||
}
|
}
|
||||||
eve= eve->next;
|
eve= eve->next;
|
||||||
@@ -1071,7 +1071,7 @@ void fill_mesh(void)
|
|||||||
eed= em->edges.first;
|
eed= em->edges.first;
|
||||||
while(eed) {
|
while(eed) {
|
||||||
if( (eed->v1->f & SELECT) && (eed->v2->f & SELECT) ) {
|
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->v1->xs++;
|
||||||
e1->v2->xs++;
|
e1->v2->xs++;
|
||||||
}
|
}
|
||||||
@@ -1085,10 +1085,10 @@ void fill_mesh(void)
|
|||||||
while(efa) {
|
while(efa) {
|
||||||
nextvl= efa->next;
|
nextvl= efa->next;
|
||||||
if( faceselectedAND(efa, 1) ) {
|
if( faceselectedAND(efa, 1) ) {
|
||||||
efa->v1->vn->xs--;
|
efa->v1->tmp.v->xs--;
|
||||||
efa->v2->vn->xs--;
|
efa->v2->tmp.v->xs--;
|
||||||
efa->v3->vn->xs--;
|
efa->v3->tmp.v->xs--;
|
||||||
if(efa->v4) efa->v4->vn->xs--;
|
if(efa->v4) efa->v4->tmp.v->xs--;
|
||||||
ok= 1;
|
ok= 1;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1108,7 +1108,9 @@ void fill_mesh(void)
|
|||||||
if(BLI_edgefill(0, (G.obedit && G.obedit->actcol)?(G.obedit->actcol-1):0)) {
|
if(BLI_edgefill(0, (G.obedit && G.obedit->actcol)?(G.obedit->actcol-1):0)) {
|
||||||
efa= fillfacebase.first;
|
efa= fillfacebase.first;
|
||||||
while(efa) {
|
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);
|
EM_select_face(efan, 1);
|
||||||
efa= efa->next;
|
efa= efa->next;
|
||||||
}
|
}
|
||||||
@@ -2626,7 +2628,7 @@ static int count_selected_edges(EditEdge *ed)
|
|||||||
{
|
{
|
||||||
int totedge = 0;
|
int totedge = 0;
|
||||||
while(ed) {
|
while(ed) {
|
||||||
ed->vn= 0;
|
ed->tmp.p = 0;
|
||||||
if( ed->f & SELECT ) totedge++;
|
if( ed->f & SELECT ) totedge++;
|
||||||
ed= ed->next;
|
ed= ed->next;
|
||||||
}
|
}
|
||||||
@@ -2653,10 +2655,10 @@ static int collect_quadedges(EVPTuple *efaa, EditEdge *eed, EditFace *efa)
|
|||||||
eed->f2= 0;
|
eed->f2= 0;
|
||||||
eed->f1= 0;
|
eed->f1= 0;
|
||||||
if( eed->f & SELECT ) {
|
if( eed->f & SELECT ) {
|
||||||
eed->vn= (EditVert *) (&efaa[i]);
|
eed->tmp.p = (EditVert *) (&efaa[i]);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
else eed->vn= NULL;
|
else eed->tmp.p = NULL;
|
||||||
|
|
||||||
eed= eed->next;
|
eed= eed->next;
|
||||||
}
|
}
|
||||||
@@ -2676,23 +2678,23 @@ static int collect_quadedges(EVPTuple *efaa, EditEdge *eed, EditFace *efa)
|
|||||||
e1= efa->e1;
|
e1= efa->e1;
|
||||||
e2= efa->e2;
|
e2= efa->e2;
|
||||||
e3= efa->e3;
|
e3= efa->e3;
|
||||||
if(e1->f2<3 && e1->vn) {
|
if(e1->f2<3 && e1->tmp.p) {
|
||||||
if(e1->f2<2) {
|
if(e1->f2<2) {
|
||||||
evp= (EVPtr *) e1->vn;
|
evp= (EVPtr *) e1->tmp.p;
|
||||||
evp[(int)e1->f2]= efa;
|
evp[(int)e1->f2] = efa;
|
||||||
}
|
}
|
||||||
e1->f2+= 1;
|
e1->f2+= 1;
|
||||||
}
|
}
|
||||||
if(e2->f2<3 && e2->vn) {
|
if(e2->f2<3 && e2->tmp.p) {
|
||||||
if(e2->f2<2) {
|
if(e2->f2<2) {
|
||||||
evp= (EVPtr *) e2->vn;
|
evp= (EVPtr *) e2->tmp.p;
|
||||||
evp[(int)e2->f2]= efa;
|
evp[(int)e2->f2]= efa;
|
||||||
}
|
}
|
||||||
e2->f2+= 1;
|
e2->f2+= 1;
|
||||||
}
|
}
|
||||||
if(e3->f2<3 && e3->vn) {
|
if(e3->f2<3 && e3->tmp.p) {
|
||||||
if(e3->f2<2) {
|
if(e3->f2<2) {
|
||||||
evp= (EVPtr *) e3->vn;
|
evp= (EVPtr *) e3->tmp.p;
|
||||||
evp[(int)e3->f2]= efa;
|
evp[(int)e3->f2]= efa;
|
||||||
}
|
}
|
||||||
e3->f2+= 1;
|
e3->f2+= 1;
|
||||||
@@ -2904,7 +2906,7 @@ void beauty_fill(void)
|
|||||||
/* f2 is set in collect_quadedges() */
|
/* f2 is set in collect_quadedges() */
|
||||||
if(eed->f2==2 && eed->h==0) {
|
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 */
|
/* none of the faces should be treated before, nor be part of fgon */
|
||||||
ok= 1;
|
ok= 1;
|
||||||
@@ -3076,7 +3078,7 @@ void join_triangles(void)
|
|||||||
|
|
||||||
if(eed->f2==2) { /* points to 2 faces */
|
if(eed->f2==2) { /* points to 2 faces */
|
||||||
|
|
||||||
efaa= (EVPtr *) eed->vn;
|
efaa= (EVPtr *) eed->tmp.p;
|
||||||
|
|
||||||
/* don't do it if flagged */
|
/* don't do it if flagged */
|
||||||
|
|
||||||
@@ -3173,7 +3175,7 @@ void edge_flip(void)
|
|||||||
|
|
||||||
if(eed->f2==2) { /* points to 2 faces */
|
if(eed->f2==2) { /* points to 2 faces */
|
||||||
|
|
||||||
efaa= (EVPtr *) eed->vn;
|
efaa= (EVPtr *) eed->tmp.p;
|
||||||
|
|
||||||
/* don't do it if flagged */
|
/* don't do it if flagged */
|
||||||
|
|
||||||
@@ -4041,7 +4043,7 @@ static void bevel_mesh(float bsize, int allfaces)
|
|||||||
efa->f1-= 1;
|
efa->f1-= 1;
|
||||||
v1= addvertlist(efa->v1->co);
|
v1= addvertlist(efa->v1->co);
|
||||||
v1->f= efa->v1->f & ~128;
|
v1->f= efa->v1->f & ~128;
|
||||||
efa->v1->vn= v1;
|
efa->v1->tmp.v = v1;
|
||||||
#ifdef __NLA
|
#ifdef __NLA
|
||||||
v1->totweight = efa->v1->totweight;
|
v1->totweight = efa->v1->totweight;
|
||||||
if (efa->v1->totweight) {
|
if (efa->v1->totweight) {
|
||||||
@@ -4053,7 +4055,7 @@ static void bevel_mesh(float bsize, int allfaces)
|
|||||||
#endif
|
#endif
|
||||||
v1= addvertlist(efa->v2->co);
|
v1= addvertlist(efa->v2->co);
|
||||||
v1->f= efa->v2->f & ~128;
|
v1->f= efa->v2->f & ~128;
|
||||||
efa->v2->vn= v1;
|
efa->v2->tmp.v = v1;
|
||||||
#ifdef __NLA
|
#ifdef __NLA
|
||||||
v1->totweight = efa->v2->totweight;
|
v1->totweight = efa->v2->totweight;
|
||||||
if (efa->v2->totweight) {
|
if (efa->v2->totweight) {
|
||||||
@@ -4065,7 +4067,7 @@ static void bevel_mesh(float bsize, int allfaces)
|
|||||||
#endif
|
#endif
|
||||||
v1= addvertlist(efa->v3->co);
|
v1= addvertlist(efa->v3->co);
|
||||||
v1->f= efa->v3->f & ~128;
|
v1->f= efa->v3->f & ~128;
|
||||||
efa->v3->vn= v1;
|
efa->v3->tmp.v = v1;
|
||||||
#ifdef __NLA
|
#ifdef __NLA
|
||||||
v1->totweight = efa->v3->totweight;
|
v1->totweight = efa->v3->totweight;
|
||||||
if (efa->v3->totweight) {
|
if (efa->v3->totweight) {
|
||||||
@@ -4078,7 +4080,7 @@ static void bevel_mesh(float bsize, int allfaces)
|
|||||||
if (efa->v4) {
|
if (efa->v4) {
|
||||||
v1= addvertlist(efa->v4->co);
|
v1= addvertlist(efa->v4->co);
|
||||||
v1->f= efa->v4->f & ~128;
|
v1->f= efa->v4->f & ~128;
|
||||||
efa->v4->vn= v1;
|
efa->v4->tmp.v = v1;
|
||||||
#ifdef __NLA
|
#ifdef __NLA
|
||||||
v1->totweight = efa->v4->totweight;
|
v1->totweight = efa->v4->totweight;
|
||||||
if (efa->v4->totweight) {
|
if (efa->v4->totweight) {
|
||||||
@@ -4091,21 +4093,29 @@ static void bevel_mesh(float bsize, int allfaces)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Needs better adaption of creases? */
|
/* Needs better adaption of creases? */
|
||||||
addedgelist(efa->e1->v1->vn, efa->e1->v2->vn, efa->e1);
|
addedgelist(efa->e1->v1->tmp.v,
|
||||||
addedgelist(efa->e2->v1->vn,efa->e2->v2->vn, efa->e2);
|
efa->e1->v2->tmp.v,
|
||||||
addedgelist(efa->e3->v1->vn,efa->e3->v2->vn, efa->e3);
|
efa->e1);
|
||||||
if (efa->e4) addedgelist(efa->e4->v1->vn,efa->e4->v2->vn, efa->e4);
|
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) {
|
if(efa->v4) {
|
||||||
v1= efa->v1->vn;
|
v1 = efa->v1->tmp.v;
|
||||||
v2= efa->v2->vn;
|
v2 = efa->v2->tmp.v;
|
||||||
v3= efa->v3->vn;
|
v3 = efa->v3->tmp.v;
|
||||||
v4= efa->v4->vn;
|
v4 = efa->v4->tmp.v;
|
||||||
addfacelist(v1, v2, v3, v4, efa,NULL);
|
addfacelist(v1, v2, v3, v4, efa,NULL);
|
||||||
} else {
|
} else {
|
||||||
v1= efa->v1->vn;
|
v1= efa->v1->tmp.v;
|
||||||
v2= efa->v2->vn;
|
v2= efa->v2->tmp.v;
|
||||||
v3= efa->v3->vn;
|
v3= efa->v3->tmp.v;
|
||||||
addfacelist(v1, v2, v3, 0, efa,NULL);
|
addfacelist(v1, v2, v3, 0, efa,NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4141,8 +4151,9 @@ static void bevel_mesh(float bsize, int allfaces)
|
|||||||
eed= em->edges.first;
|
eed= em->edges.first;
|
||||||
while(eed) {
|
while(eed) {
|
||||||
eed->f2= eed->f1= 0;
|
eed->f2= eed->f1= 0;
|
||||||
if ( ((eed->v1->f & eed->v2->f) & 1) || allfaces) eed->f1 |= 4; /* original edges */
|
if ( ((eed->v1->f & eed->v2->f) & 1) || allfaces)
|
||||||
eed->vn= 0;
|
eed->f1 |= 4; /* original edges */
|
||||||
|
eed->tmp.v = 0;
|
||||||
eed= eed->next;
|
eed= eed->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4220,7 +4231,7 @@ static void bevel_mesh(float bsize, int allfaces)
|
|||||||
eed->f1= 0;
|
eed->f1= 0;
|
||||||
eed->v1->f1 &= ~1;
|
eed->v1->f1 &= ~1;
|
||||||
eed->v2->f1 &= ~1;
|
eed->v2->f1 &= ~1;
|
||||||
eed->vn= 0;
|
eed->tmp.v = 0;
|
||||||
eed= eed->next;
|
eed= eed->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4233,11 +4244,11 @@ static void bevel_mesh(float bsize, int allfaces)
|
|||||||
eve= em->verts.first;
|
eve= em->verts.first;
|
||||||
while (eve) {
|
while (eve) {
|
||||||
eve->f &= ~(64|128);
|
eve->f &= ~(64|128);
|
||||||
eve->vn= NULL;
|
eve->tmp.v = NULL;
|
||||||
eve= eve->next;
|
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 */
|
/* 64: vertex is in a list */
|
||||||
|
|
||||||
eve= em->verts.first;
|
eve= em->verts.first;
|
||||||
@@ -4250,11 +4261,11 @@ static void bevel_mesh(float bsize, int allfaces)
|
|||||||
if ((eve->f & (128|64)) == 0) {
|
if ((eve->f & (128|64)) == 0) {
|
||||||
/* fprintf(stderr,"Found vertex cluster:\n *\n *\n"); */
|
/* fprintf(stderr,"Found vertex cluster:\n *\n *\n"); */
|
||||||
eve->f |= 128;
|
eve->f |= 128;
|
||||||
eve->vn= eve2;
|
eve->tmp.v = eve2;
|
||||||
eve3= eve2;
|
eve3= eve2;
|
||||||
} else if ((eve->f & 64) == 0) {
|
} else if ((eve->f & 64) == 0) {
|
||||||
/* fprintf(stderr," *\n"); */
|
/* fprintf(stderr," *\n"); */
|
||||||
if (eve3) eve3->vn= eve2;
|
if (eve3) eve3->tmp.v = eve2;
|
||||||
eve2->f |= 64;
|
eve2->f |= 64;
|
||||||
eve3= eve2;
|
eve3= eve2;
|
||||||
}
|
}
|
||||||
@@ -4262,7 +4273,7 @@ static void bevel_mesh(float bsize, int allfaces)
|
|||||||
}
|
}
|
||||||
eve2= eve2->next;
|
eve2= eve2->next;
|
||||||
if (!eve2) {
|
if (!eve2) {
|
||||||
if (eve3) eve3->vn= NULL;
|
if (eve3) eve3->tmp.v = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
eve= eve->next;
|
eve= eve->next;
|
||||||
@@ -4292,11 +4303,11 @@ static void bevel_mesh(float bsize, int allfaces)
|
|||||||
eve->f &= ~128;
|
eve->f &= ~128;
|
||||||
a= 0;
|
a= 0;
|
||||||
neweve[a]= eve;
|
neweve[a]= eve;
|
||||||
eve2= eve->vn;
|
eve2 = eve->tmp.v;
|
||||||
while (eve2) {
|
while (eve2) {
|
||||||
a++;
|
a++;
|
||||||
neweve[a]= eve2;
|
neweve[a]= eve2;
|
||||||
eve2= eve2->vn;
|
eve2 = eve2->tmp.v;
|
||||||
}
|
}
|
||||||
a++;
|
a++;
|
||||||
efa= NULL;
|
efa= NULL;
|
||||||
@@ -4379,7 +4390,7 @@ static void bevel_mesh(float bsize, int allfaces)
|
|||||||
while (eve) {
|
while (eve) {
|
||||||
eve->f1= 0;
|
eve->f1= 0;
|
||||||
eve->f &= ~(128|64);
|
eve->f &= ~(128|64);
|
||||||
eve->vn= NULL;
|
eve->tmp.v= NULL;
|
||||||
eve= eve->next;
|
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)
|
static void mesh_rip_setface(EditFace *sefa)
|
||||||
{
|
{
|
||||||
/* put new vertices & edges in best face */
|
/* put new vertices & edges in best face */
|
||||||
if(sefa->v1->vn) sefa->v1= sefa->v1->vn;
|
if(sefa->v1->tmp.v) sefa->v1= sefa->v1->tmp.v;
|
||||||
if(sefa->v2->vn) sefa->v2= sefa->v2->vn;
|
if(sefa->v2->tmp.v) sefa->v2= sefa->v2->tmp.v;
|
||||||
if(sefa->v3->vn) sefa->v3= sefa->v3->vn;
|
if(sefa->v3->tmp.v) sefa->v3= sefa->v3->tmp.v;
|
||||||
if(sefa->v4 && sefa->v4->vn) sefa->v4= sefa->v4->vn;
|
if(sefa->v4 && sefa->v4->tmp.v) sefa->v4= sefa->v4->tmp.v;
|
||||||
|
|
||||||
sefa->e1= addedgelist(sefa->v1, sefa->v2, sefa->e1);
|
sefa->e1= addedgelist(sefa->v1, sefa->v2, sefa->e1);
|
||||||
sefa->e2= addedgelist(sefa->v2, sefa->v3, sefa->e2);
|
sefa->e2= addedgelist(sefa->v2, sefa->v3, sefa->e2);
|
||||||
@@ -5213,11 +5224,11 @@ void mesh_rip(void)
|
|||||||
|
|
||||||
/* duplicate vertices, new vertices get selected */
|
/* duplicate vertices, new vertices get selected */
|
||||||
for(eve = em->verts.last; eve; eve= eve->prev) {
|
for(eve = em->verts.last; eve; eve= eve->prev) {
|
||||||
eve->vn= NULL;
|
eve->tmp.v = NULL;
|
||||||
if(eve->f & SELECT) {
|
if(eve->f & SELECT) {
|
||||||
eve->vn= addvertlist(eve->co);
|
eve->tmp.v = addvertlist(eve->co);
|
||||||
eve->f &= ~SELECT;
|
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 */
|
/* or we do the distance trick */
|
||||||
if(seed==NULL) {
|
if(seed==NULL) {
|
||||||
mindist= 1000000.0f;
|
mindist= 1000000.0f;
|
||||||
if(sefa->e1->v1->vn || sefa->e1->v2->vn) {
|
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);
|
dist = mesh_rip_edgedist(projectMat,
|
||||||
|
sefa->e1->v1->co,
|
||||||
|
sefa->e1->v2->co, mval);
|
||||||
if(dist<mindist) {
|
if(dist<mindist) {
|
||||||
seed= sefa->e1;
|
seed= sefa->e1;
|
||||||
mindist= dist;
|
mindist= dist;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(sefa->e2->v1->vn || sefa->e2->v2->vn) {
|
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);
|
dist = mesh_rip_edgedist(projectMat,
|
||||||
|
sefa->e2->v1->co,
|
||||||
|
sefa->e2->v2->co, mval);
|
||||||
if(dist<mindist) {
|
if(dist<mindist) {
|
||||||
seed= sefa->e2;
|
seed= sefa->e2;
|
||||||
mindist= dist;
|
mindist= dist;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(sefa->e3->v1->vn || sefa->e3->v2->vn) {
|
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);
|
dist= mesh_rip_edgedist(projectMat,
|
||||||
|
sefa->e3->v1->co,
|
||||||
|
sefa->e3->v2->co, mval);
|
||||||
if(dist<mindist) {
|
if(dist<mindist) {
|
||||||
seed= sefa->e3;
|
seed= sefa->e3;
|
||||||
mindist= dist;
|
mindist= dist;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(sefa->e4 && (sefa->e4->v1->vn || sefa->e4->v2->vn)) {
|
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);
|
dist= mesh_rip_edgedist(projectMat,
|
||||||
|
sefa->e4->v1->co,
|
||||||
|
sefa->e4->v2->co, mval);
|
||||||
if(dist<mindist) {
|
if(dist<mindist) {
|
||||||
seed= sefa->e4;
|
seed= sefa->e4;
|
||||||
mindist= dist;
|
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 */
|
/* duplicate edges in the loop, with at least 1 vertex selected, needed for selection flip */
|
||||||
for(eed = em->edges.last; eed; eed= eed->prev) {
|
for(eed = em->edges.last; eed; eed= eed->prev) {
|
||||||
eed->vn= NULL;
|
eed->tmp.v = NULL;
|
||||||
if((eed->v1->vn) || (eed->v2->vn)) {
|
if((eed->v1->tmp.v) || (eed->v2->tmp.v)) {
|
||||||
EditEdge *newed;
|
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) {
|
if(eed->f & SELECT) {
|
||||||
eed->f &= ~SELECT;
|
eed->f &= ~SELECT;
|
||||||
newed->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) {
|
for(efa= em->faces.first; efa; efa=efa->next) {
|
||||||
/* new vert in face */
|
/* 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 */
|
/* face is tagged with loop */
|
||||||
if(efa->f1==1) {
|
if(efa->f1==1) {
|
||||||
mesh_rip_setface(efa);
|
mesh_rip_setface(efa);
|
||||||
@@ -5321,7 +5342,8 @@ void mesh_rip(void)
|
|||||||
for(eed = em->edges.last; eed; eed= seed) {
|
for(eed = em->edges.last; eed; eed= seed) {
|
||||||
seed= eed->prev;
|
seed= eed->prev;
|
||||||
if(eed->f1==0) {
|
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);
|
remedge(eed);
|
||||||
free_editedge(eed);
|
free_editedge(eed);
|
||||||
eed= NULL;
|
eed= NULL;
|
||||||
@@ -5336,7 +5358,7 @@ void mesh_rip(void)
|
|||||||
/* and remove loose selected vertices, that got duplicated accidentally */
|
/* and remove loose selected vertices, that got duplicated accidentally */
|
||||||
for(eve = em->verts.first; eve; eve= nextve) {
|
for(eve = em->verts.first; eve; eve= nextve) {
|
||||||
nextve= eve->next;
|
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);
|
BLI_remlink(&em->verts,eve);
|
||||||
free_editvert(eve);
|
free_editvert(eve);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1268,8 +1268,8 @@ static void createTransLatticeVerts(TransInfo *t)
|
|||||||
/* ********************* mesh ****************** */
|
/* ********************* mesh ****************** */
|
||||||
|
|
||||||
/* proportional distance based on connectivity */
|
/* proportional distance based on connectivity */
|
||||||
#define E_VEC(a) (vectors + (3 * (int)(a)->vn))
|
#define E_VEC(a) (vectors + (3 * (a)->tmp.l))
|
||||||
#define E_NEAR(a) (nears[((int)(a)->vn)])
|
#define E_NEAR(a) (nears[((a)->tmp.l)])
|
||||||
static void editmesh_set_connectivity_distance(int total, float *vectors, EditVert **nears)
|
static void editmesh_set_connectivity_distance(int total, float *vectors, EditVert **nears)
|
||||||
{
|
{
|
||||||
EditMesh *em = G.editMesh;
|
EditMesh *em = G.editMesh;
|
||||||
@@ -1278,10 +1278,10 @@ static void editmesh_set_connectivity_distance(int total, float *vectors, EditVe
|
|||||||
int i= 0, done= 1;
|
int i= 0, done= 1;
|
||||||
|
|
||||||
/* f2 flag is used for 'selection' */
|
/* f2 flag is used for 'selection' */
|
||||||
/* vn is offset on scratch array */
|
/* tmp.l is offset on scratch array */
|
||||||
for(eve= em->verts.first; eve; eve= eve->next) {
|
for(eve= em->verts.first; eve; eve= eve->next) {
|
||||||
if(eve->h==0) {
|
if(eve->h==0) {
|
||||||
eve->vn = (EditVert *)(i++);
|
eve->tmp.l = i++;
|
||||||
|
|
||||||
if(eve->f & SELECT) {
|
if(eve->f & SELECT) {
|
||||||
eve->f2= 2;
|
eve->f2= 2;
|
||||||
@@ -1423,13 +1423,13 @@ static float *get_mapped_editverts(void)
|
|||||||
/* helper for below, interpolates or assigns and increments */
|
/* helper for below, interpolates or assigns and increments */
|
||||||
static float *crazy_quat_blend(EditVert *eve, float *quat)
|
static float *crazy_quat_blend(EditVert *eve, float *quat)
|
||||||
{
|
{
|
||||||
if(eve->vn==NULL) {
|
if(eve->tmp.fp == NULL) {
|
||||||
eve->vn= (EditVert *)quat;
|
eve->tmp.fp = quat;
|
||||||
QUATCOPY(quat+4, quat);
|
QUATCOPY(quat+4, quat);
|
||||||
return quat+4;
|
return quat+4;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
float *q1= (float *)eve->vn;
|
float *q1= eve->tmp.fp;
|
||||||
QuatInterpol(q1, q1, quat, 0.5f);
|
QuatInterpol(q1, q1, quat, 0.5f);
|
||||||
return quat;
|
return quat;
|
||||||
}
|
}
|
||||||
@@ -1446,7 +1446,7 @@ static void set_crazyspace_quats(float *mappedcos, float *quats)
|
|||||||
|
|
||||||
/* 2 abused locations in vertices */
|
/* 2 abused locations in vertices */
|
||||||
for(eve= em->verts.first; eve; eve= eve->next, index++) {
|
for(eve= em->verts.first; eve; eve= eve->next, index++) {
|
||||||
eve->vn= NULL;
|
eve->tmp.fp = NULL;
|
||||||
eve->prev= (EditVert *)index;
|
eve->prev= (EditVert *)index;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1454,8 +1454,10 @@ static void set_crazyspace_quats(float *mappedcos, float *quats)
|
|||||||
for(efa= em->faces.first; efa; efa= efa->next) {
|
for(efa= em->faces.first; efa; efa= efa->next) {
|
||||||
/* vertex f1 flags were set for transform */
|
/* vertex f1 flags were set for transform */
|
||||||
|
|
||||||
if( (efa->v1->f1 && efa->v1->vn==NULL) || (efa->v2->f1 && efa->v2->vn==NULL)
|
if( (efa->v1->f1 && efa->v1->tmp.fp==NULL) ||
|
||||||
|| (efa->v3->f1 && efa->v3->vn==NULL) || (efa->v4 && efa->v4->f1 && efa->v4->vn==NULL) ) {
|
(efa->v2->f1 && efa->v2->tmp.fp==NULL) ||
|
||||||
|
(efa->v3->f1 && efa->v3->tmp.fp==NULL) ||
|
||||||
|
(efa->v4 && efa->v4->f1 && efa->v4->tmp.fp==NULL) ) {
|
||||||
|
|
||||||
triatoquat(efa->v1->co, efa->v2->co, efa->v3->co, q1);
|
triatoquat(efa->v1->co, efa->v2->co, efa->v3->co, q1);
|
||||||
|
|
||||||
@@ -1589,10 +1591,10 @@ static void createTransEditVerts(TransInfo *t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* CrazySpace */
|
/* CrazySpace */
|
||||||
if(quats && eve->vn) {
|
if(quats && eve->tmp.fp) {
|
||||||
float mat[3][3], imat[3][3], qmat[3][3];
|
float mat[3][3], imat[3][3], qmat[3][3];
|
||||||
|
|
||||||
QuatToMat3((float *)eve->vn, qmat);
|
QuatToMat3(eve->tmp.fp, qmat);
|
||||||
Mat3MulMat3(mat, mtx, qmat);
|
Mat3MulMat3(mat, mtx, qmat);
|
||||||
Mat3Inv(imat, mat);
|
Mat3Inv(imat, mat);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user