diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-02-20 02:17:30 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-02-20 02:17:30 +0400 |
commit | a368e6771a5f707f41f5959c345943cad07ef7e8 (patch) | |
tree | 818fb646c7651482c400f861fd789078ebaa4e72 /source/blender/blenlib | |
parent | be674afdadaa1ab966147755e224e8bbda6807db (diff) |
- remove some unused editmesh functions.
- copy & rename EditMesh stricts for use with scanfill (remove unused members)
Diffstat (limited to 'source/blender/blenlib')
-rw-r--r-- | source/blender/blenlib/BLI_scanfill.h | 37 | ||||
-rw-r--r-- | source/blender/blenlib/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/blenlib/intern/scanfill.c | 153 |
3 files changed, 108 insertions, 83 deletions
diff --git a/source/blender/blenlib/BLI_scanfill.h b/source/blender/blenlib/BLI_scanfill.h index 890a8c8247d..6886e58ebe9 100644 --- a/source/blender/blenlib/BLI_scanfill.h +++ b/source/blender/blenlib/BLI_scanfill.h @@ -42,17 +42,46 @@ extern struct ListBase fillvertbase; extern struct ListBase filledgebase; extern struct ListBase fillfacebase; -struct EditVert; +struct ScanFillVert; #ifdef __cplusplus extern "C" { #endif +/* note; changing this also might affect the undo copy in editmesh.c */ +typedef struct ScanFillVert +{ + struct ScanFillVert *next, *prev; + union { + struct ScanFillVert *v; + void *p; + intptr_t l; + } tmp; + float co[3]; /*vertex location */ + int keyindex; /* original index #, for restoring key information */ + short poly_nr; + unsigned char f, h; +} ScanFillVert; + +typedef struct ScanFillEdge +{ + struct ScanFillEdge *next, *prev; + struct ScanFillVert *v1, *v2; + short poly_nr; + unsigned char f; +} ScanFillEdge; + +typedef struct ScanFillFace +{ + struct ScanFillFace *next, *prev; + struct ScanFillVert *v1, *v2, *v3; +} ScanFillFace; + /* scanfill.c: used in displist only... */ -struct EditVert *BLI_addfillvert(float *vec); -struct EditEdge *BLI_addfilledge(struct EditVert *v1, struct EditVert *v2); +struct ScanFillVert *BLI_addfillvert(const float vec[3]); +struct ScanFillEdge *BLI_addfilledge(struct ScanFillVert *v1, struct ScanFillVert *v2); -/* Optionally set EditEdge f to this to mark original boundary edges. +/* Optionally set ScanFillEdge f to this to mark original boundary edges. Only needed if there are internal diagonal edges pased to BLI_edgefill. */ #define FILLBOUNDARY 1 diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt index 55a5be3fbc2..6e8da84cb24 100644 --- a/source/blender/blenlib/CMakeLists.txt +++ b/source/blender/blenlib/CMakeLists.txt @@ -102,7 +102,6 @@ set(SRC BLI_dynlib.h BLI_dynstr.h BLI_edgehash.h - BLI_editVert.h BLI_fileops.h BLI_fileops_types.h BLI_fnmatch.h diff --git a/source/blender/blenlib/intern/scanfill.c b/source/blender/blenlib/intern/scanfill.c index 7652cc4f4af..64beed24fc5 100644 --- a/source/blender/blenlib/intern/scanfill.c +++ b/source/blender/blenlib/intern/scanfill.c @@ -38,7 +38,6 @@ #include "MEM_guardedalloc.h" #include "BLI_callbacks.h" -#include "BLI_editVert.h" #include "BLI_listbase.h" #include "BLI_math.h" #include "BLI_scanfill.h" @@ -86,17 +85,17 @@ typedef struct PolyFill { short f,nr; } PolyFill; -typedef struct ScFillVert { - EditVert *v1; - EditEdge *first,*last; -} ScFillVert; +typedef struct ScanFillVertLink { + ScanFillVert *v1; + ScanFillEdge *first, *last; +} ScanFillVertLink; /* local funcs */ #define COMPLIMIT 0.00003 -static ScFillVert *scdata; +static ScanFillVertLink *scdata; ListBase fillvertbase = {NULL, NULL}; ListBase filledgebase = {NULL, NULL}; @@ -109,7 +108,7 @@ static int cox, coy; static int vergscdata(const void *a1, const void *a2) { - const ScFillVert *x1=a1,*x2=a2; + const ScanFillVertLink *x1=a1,*x2=a2; if( x1->v1->co[coy] < x2->v1->co[coy] ) return 1; else if( x1->v1->co[coy] > x2->v1->co[coy]) return -1; @@ -205,11 +204,11 @@ void BLI_end_edgefill(void) /* **** FILL ROUTINES *************************** */ -EditVert *BLI_addfillvert(float *vec) +ScanFillVert *BLI_addfillvert(const float vec[3]) { - EditVert *eve; + ScanFillVert *eve; - eve= mem_element_new(sizeof(EditVert)); + eve= mem_element_new(sizeof(ScanFillVert)); BLI_addtail(&fillvertbase, eve); eve->co[0] = vec[0]; @@ -219,11 +218,11 @@ EditVert *BLI_addfillvert(float *vec) return eve; } -EditEdge *BLI_addfilledge(EditVert *v1, EditVert *v2) +ScanFillEdge *BLI_addfilledge(ScanFillVert *v1, ScanFillVert *v2) { - EditEdge *newed; + ScanFillEdge *newed; - newed= mem_element_new(sizeof(EditEdge)); + newed= mem_element_new(sizeof(ScanFillEdge)); BLI_addtail(&filledgebase, newed); newed->v1= v1; @@ -232,19 +231,17 @@ EditEdge *BLI_addfilledge(EditVert *v1, EditVert *v2) return newed; } -static void addfillface(EditVert *v1, EditVert *v2, EditVert *v3, short mat_nr) +static void addfillface(ScanFillVert *v1, ScanFillVert *v2, ScanFillVert *v3) { /* does not make edges */ - EditFace *evl; + ScanFillFace *evl; - evl= mem_element_new(sizeof(EditFace)); + evl= mem_element_new(sizeof(ScanFillFace)); BLI_addtail(&fillfacebase, evl); evl->v1= v1; evl->v2= v2; evl->v3= v3; - evl->f= 2; - evl->mat_nr= mat_nr; } static int boundisect(PolyFill *pf2, PolyFill *pf1) @@ -273,18 +270,18 @@ static int boundisect(PolyFill *pf2, PolyFill *pf1) static void mergepolysSimp(PolyFill *pf1, PolyFill *pf2) /* add pf2 to pf1 */ { - EditVert *eve; - EditEdge *eed; + ScanFillVert *eve; + ScanFillEdge *eed; /* replace old poly numbers */ eve= fillvertbase.first; while(eve) { - if(eve->xs== pf2->nr) eve->xs= pf1->nr; + if(eve->poly_nr == pf2->nr) eve->poly_nr = pf1->nr; eve= eve->next; } eed= filledgebase.first; while(eed) { - if(eed->f1== pf2->nr) eed->f1= pf1->nr; + if (eed->poly_nr == pf2->nr) eed->poly_nr = pf1->nr; eed= eed->next; } @@ -310,10 +307,10 @@ static short testedgeside(float *v1, float *v2, float *v3) return 1; } -static short addedgetoscanvert(ScFillVert *sc, EditEdge *eed) +static short addedgetoscanvert(ScanFillVertLink *sc, ScanFillEdge *eed) { /* find first edge to the right of eed, and insert eed before that */ - EditEdge *ed; + ScanFillEdge *ed; float fac,fac1,x,y; if(sc->first==0) { @@ -354,12 +351,12 @@ static short addedgetoscanvert(ScFillVert *sc, EditEdge *eed) } -static ScFillVert *addedgetoscanlist(EditEdge *eed, int len) +static ScanFillVertLink *addedgetoscanlist(ScanFillEdge *eed, int len) { - /* inserts edge at correct location in ScFillVert list */ + /* inserts edge at correct location in ScanFillVertLink list */ /* returns sc when edge already exists */ - ScFillVert *sc,scsearch; - EditVert *eve; + ScanFillVertLink *sc,scsearch; + ScanFillVert *eve; /* which vert is left-top? */ if(eed->v1->co[coy] == eed->v2->co[coy]) { @@ -376,8 +373,8 @@ static ScFillVert *addedgetoscanlist(EditEdge *eed, int len) } /* find location in list */ scsearch.v1= eed->v1; - sc= (ScFillVert *)bsearch(&scsearch,scdata,len, - sizeof(ScFillVert), vergscdata); + sc= (ScanFillVertLink *)bsearch(&scsearch,scdata,len, + sizeof(ScanFillVertLink), vergscdata); if(sc==0) printf("Error in search edge: %p\n", (void *)eed); else if(addedgetoscanvert(sc,eed)==0) return sc; @@ -385,7 +382,7 @@ static ScFillVert *addedgetoscanlist(EditEdge *eed, int len) return 0; } -static short boundinsideEV(EditEdge *eed, EditVert *eve) +static short boundinsideEV(ScanFillEdge *eed, ScanFillVert *eve) /* is eve inside boundbox eed */ { float minx,maxx,miny,maxy; @@ -416,8 +413,8 @@ static void testvertexnearedge(void) /* only vertices with ->h==1 are being tested for being close to an edge, if true insert */ - EditVert *eve; - EditEdge *eed,*ed1; + ScanFillVert *eve; + ScanFillEdge *eed,*ed1; float dist,vec1[2],vec2[2],vec3[2]; eve= fillvertbase.first; @@ -437,7 +434,7 @@ static void testvertexnearedge(void) } eed= filledgebase.first; while(eed) { - if(eve!=eed->v1 && eve!=eed->v2 && eve->xs==eed->f1) { + if (eve != eed->v1 && eve != eed->v2 && eve->poly_nr == eed->poly_nr) { if(compare_v3v3(eve->co,eed->v1->co, COMPLIMIT)) { ed1->v2= eed->v1; eed->v1->h++; @@ -462,8 +459,8 @@ static void testvertexnearedge(void) ed1= BLI_addfilledge(eed->v1, eve); /* printf("fill: vertex near edge %x\n",eve); */ - ed1->f= ed1->h= 0; - ed1->f1= eed->f1; + ed1->f= 0; + ed1->poly_nr = eed->poly_nr; eed->v1= eve; eve->h= 3; break; @@ -481,8 +478,8 @@ static void testvertexnearedge(void) static void splitlist(ListBase *tempve, ListBase *temped, short nr) { /* everything is in templist, write only poly nr to fillist */ - EditVert *eve,*nextve; - EditEdge *eed,*nexted; + ScanFillVert *eve,*nextve; + ScanFillEdge *eed,*nexted; BLI_movelisttolist(tempve,&fillvertbase); BLI_movelisttolist(temped,&filledgebase); @@ -490,7 +487,7 @@ static void splitlist(ListBase *tempve, ListBase *temped, short nr) eve= tempve->first; while(eve) { nextve= eve->next; - if(eve->xs==nr) { + if (eve->poly_nr == nr) { BLI_remlink(tempve,eve); BLI_addtail(&fillvertbase,eve); } @@ -499,7 +496,7 @@ static void splitlist(ListBase *tempve, ListBase *temped, short nr) eed= temped->first; while(eed) { nexted= eed->next; - if(eed->f1==nr) { + if(eed->poly_nr==nr) { BLI_remlink(temped,eed); BLI_addtail(&filledgebase,eed); } @@ -508,11 +505,11 @@ static void splitlist(ListBase *tempve, ListBase *temped, short nr) } -static int scanfill(PolyFill *pf, short mat_nr) +static int scanfill(PolyFill *pf) { - ScFillVert *sc = NULL, *sc1; - EditVert *eve,*v1,*v2,*v3; - EditEdge *eed,*nexted,*ed1,*ed2,*ed3; + ScanFillVertLink *sc = NULL, *sc1; + ScanFillVert *eve,*v1,*v2,*v3; + ScanFillEdge *eed,*nexted,*ed1,*ed2,*ed3; float miny = 0.0; int a,b,verts, maxface, totface; short nr, test, twoconnected=0; @@ -558,14 +555,14 @@ static int scanfill(PolyFill *pf, short mat_nr) } /* STEP 1: make using FillVert and FillEdge lists a sorted - ScFillVert list + ScanFillVertLink list */ - sc= scdata= (ScFillVert *)MEM_callocN(pf->verts*sizeof(ScFillVert),"Scanfill1"); + sc= scdata= (ScanFillVertLink *)MEM_callocN(pf->verts*sizeof(ScanFillVertLink),"Scanfill1"); eve= fillvertbase.first; verts= 0; while(eve) { - if(eve->xs==nr) { - if(eve->f!= 255) { + if (eve->poly_nr == nr) { + if (eve->f != 255) { verts++; eve->f= 0; /* flag for connectedges later on */ sc->v1= eve; @@ -575,7 +572,7 @@ static int scanfill(PolyFill *pf, short mat_nr) eve= eve->next; } - qsort(scdata, verts, sizeof(ScFillVert), vergscdata); + qsort(scdata, verts, sizeof(ScanFillVertLink), vergscdata); eed= filledgebase.first; while(eed) { @@ -698,7 +695,7 @@ static int scanfill(PolyFill *pf, short mat_nr) else { /* new triangle */ /* printf("add face %x %x %x\n",v1,v2,v3); */ - addfillface(v1, v2, v3, mat_nr); + addfillface(v1, v2, v3); totface++; BLI_remlink((ListBase *)&(sc->first),ed1); BLI_addtail(&filledgebase,ed1); @@ -787,8 +784,8 @@ int BLI_edgefill(short mat_nr) - returns number of triangle faces added. */ ListBase tempve, temped; - EditVert *eve; - EditEdge *eed,*nexted; + ScanFillVert *eve; + ScanFillEdge *eed,*nexted; PolyFill *pflist,*pf; float limit, *minp, *maxp, *v1, *v2, norm[3], len; short a,c,poly=0,ok=0,toggle=0; @@ -799,7 +796,7 @@ int BLI_edgefill(short mat_nr) a = 0; while(eve) { eve->f= 0; - eve->xs= 0; + eve->poly_nr= 0; eve->h= 0; eve= eve->next; a += 1; @@ -808,7 +805,7 @@ int BLI_edgefill(short mat_nr) if (a == 3 && (mat_nr & 2)) { eve = fillvertbase.first; - addfillface(eve, eve->next, eve->next->next, 0); + addfillface(eve, eve->next, eve->next->next); return 1; } else if (a == 4 && (mat_nr & 2)) { float vec1[3], vec2[3]; @@ -821,15 +818,15 @@ int BLI_edgefill(short mat_nr) sub_v3_v3v3(vec2, eve->next->co, eve->next->next->next->co); if (INPR(vec1, vec1) < INPR(vec2, vec2)) { - addfillface(eve, eve->next, eve->next->next, 0); - addfillface(eve->next->next, eve->next->next->next, eve, 0); + addfillface(eve, eve->next, eve->next->next); + addfillface(eve->next->next, eve->next->next->next, eve); } else{ - addfillface(eve->next, eve->next->next, eve->next->next->next, 0); - addfillface(eve->next->next->next, eve, eve->next, 0); + addfillface(eve->next, eve->next->next, eve->next->next->next); + addfillface(eve->next->next->next, eve, eve->next); } } else { - addfillface(eve, eve->next, eve->next->next, 0); - addfillface(eve->next->next, eve->next->next->next, eve, 0); + addfillface(eve, eve->next, eve->next->next); + addfillface(eve->next->next, eve->next->next->next, eve); } return 2; } @@ -838,7 +835,7 @@ int BLI_edgefill(short mat_nr) /* including resetting of flags */ eed= filledgebase.first; while(eed) { - eed->f1= eed->h= 0; + eed->poly_nr= 0; eed->v1->f= 1; eed->v2->f= 1; @@ -895,11 +892,11 @@ int BLI_edgefill(short mat_nr) eve= fillvertbase.first; while(eve) { /* get first vertex with no poly number */ - if(eve->xs==0) { + if (eve->poly_nr==0) { poly++; /* now a sortof select connected */ ok= 1; - eve->xs= poly; + eve->poly_nr = poly; while(ok) { @@ -909,19 +906,19 @@ int BLI_edgefill(short mat_nr) else eed= filledgebase.last; while(eed) { - if(eed->v1->xs==0 && eed->v2->xs==poly) { - eed->v1->xs= poly; - eed->f1= poly; + if (eed->v1->poly_nr == 0 && eed->v2->poly_nr == poly) { + eed->v1->poly_nr = poly; + eed->poly_nr= poly; ok= 1; } - else if(eed->v2->xs==0 && eed->v1->xs==poly) { - eed->v2->xs= poly; - eed->f1= poly; + else if (eed->v2->poly_nr == 0 && eed->v1->poly_nr == poly) { + eed->v2->poly_nr = poly; + eed->poly_nr= poly; ok= 1; } - else if(eed->f1==0) { - if(eed->v1->xs==poly && eed->v2->xs==poly) { - eed->f1= poly; + else if (eed->poly_nr == 0) { + if (eed->v1->poly_nr == poly && eed->v2->poly_nr == poly) { + eed->poly_nr= poly; ok= 1; } } @@ -1002,21 +999,21 @@ int BLI_edgefill(short mat_nr) } eed= filledgebase.first; while(eed) { - pflist[eed->f1-1].edges++; + pflist[eed->poly_nr-1].edges++; eed= eed->next; } eve= fillvertbase.first; while(eve) { - pflist[eve->xs-1].verts++; - minp= pflist[eve->xs-1].min; - maxp= pflist[eve->xs-1].max; + pflist[eve->poly_nr-1].verts++; + minp= pflist[eve->poly_nr-1].min; + maxp= pflist[eve->poly_nr-1].max; minp[cox]= (minp[cox])<(eve->co[cox]) ? (minp[cox]) : (eve->co[cox]); minp[coy]= (minp[coy])<(eve->co[coy]) ? (minp[coy]) : (eve->co[coy]); maxp[cox]= (maxp[cox])>(eve->co[cox]) ? (maxp[cox]) : (eve->co[cox]); maxp[coy]= (maxp[coy])>(eve->co[coy]) ? (maxp[coy]) : (eve->co[coy]); - if(eve->h>2) pflist[eve->xs-1].f= 1; + if(eve->h > 2) pflist[eve->poly_nr-1].f = 1; eve= eve->next; } @@ -1083,7 +1080,7 @@ int BLI_edgefill(short mat_nr) for(a=0;a<poly;a++) { if(pf->edges>1) { splitlist(&tempve,&temped,pf->nr); - totfaces += scanfill(pf, mat_nr); + totfaces += scanfill(pf); } pf++; } |