~ubuntu-branches/ubuntu/gutsy/blender/gutsy-security

« back to all changes in this revision

Viewing changes to source/blender/blenlib/intern/scanfill.c

  • Committer: Bazaar Package Importer
  • Author(s): Florian Ernst
  • Date: 2005-11-06 12:40:03 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20051106124003-3pgs7tcg5rox96xg
Tags: 2.37a-1.1
* Non-maintainer upload.
* Split out parts of 01_SConstruct_debian.dpatch again: root_build_dir
  really needs to get adjusted before the clean target runs - closes: #333958,
  see #288882 for reference

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/**
2
 
 * $Id: scanfill.c,v 1.6 2004/03/28 08:46:34 zuster Exp $
 
2
 * $Id: scanfill.c,v 1.9 2005/06/04 16:22:49 lukep Exp $
3
3
 *
4
4
 * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
5
5
 *
115
115
int vergscdata(const void *a1, const void *a2);
116
116
int vergpoly(const void *a1, const void *a2);
117
117
void *new_mem_element(int size);
118
 
void addfillvlak(EditVert *v1, EditVert *v2, EditVert *v3);
 
118
void addfillface(EditVert *v1, EditVert *v2, EditVert *v3);
119
119
int boundinside(PolyFill *pf1, PolyFill *pf2);
120
120
int boundisect(PolyFill *pf2, PolyFill *pf1);
121
121
void mergepolysSimp(PolyFill *pf1, PolyFill *pf2)       /* pf2 added to pf1 */;
137
137
 
138
138
ListBase fillvertbase = {0,0};
139
139
ListBase filledgebase = {0,0};
140
 
ListBase fillvlakbase = {0,0};
 
140
ListBase fillfacebase = {0,0};
141
141
 
142
142
short cox, coy;
143
143
 
227
227
        
228
228
        fillvertbase.first= fillvertbase.last= 0;
229
229
        filledgebase.first= filledgebase.last= 0;
230
 
        fillvlakbase.first= fillvlakbase.last= 0;
 
230
        fillfacebase.first= fillfacebase.last= 0;
231
231
}
232
232
 
233
233
/* ****  FILL ROUTINES *************************** */
262
262
        return newed;
263
263
}
264
264
 
265
 
void addfillvlak(EditVert *v1, EditVert *v2, EditVert *v3)
 
265
void addfillface(EditVert *v1, EditVert *v2, EditVert *v3)
266
266
{
267
267
        /* does not make edges */
268
 
        EditVlak *evl;
 
268
        EditFace *evl;
269
269
 
270
 
        evl= new_mem_element(sizeof(EditVlak));
271
 
        BLI_addtail(&fillvlakbase, evl);
 
270
        evl= new_mem_element(sizeof(EditFace));
 
271
        BLI_addtail(&fillfacebase, evl);
272
272
        
273
273
        evl->v1= v1;
274
274
        evl->v2= v2;
461
461
        sc= (ScFillVert *)bsearch(&scsearch,scdata,len,
462
462
            sizeof(ScFillVert), vergscdata);
463
463
 
464
 
        if(sc==0) printf("Error in search edge: %x\n",eed);
 
464
        if(sc==0) printf("Error in search edge: %lx\n",eed);
465
465
        else if(addedgetoscanvert(sc,eed)==0) return sc;
466
466
 
467
467
        return 0;
596
596
        EditVert *eve,*v1,*v2,*v3;
597
597
        EditEdge *eed,*nexted,*ed1,*ed2,*ed3;
598
598
        float miny = 0.0;
599
 
        int a,b,verts, maxvlak, totvlak;        /* vlak = face in dutch! */
 
599
        int a,b,verts, maxface, totface;        
600
600
        short nr, test, twoconnected=0;
601
601
 
602
602
        nr= pf->nr;
695
695
        if(pf->f==0) twoconnected= 1;
696
696
 
697
697
        /* (temporal) security: never much more faces than vertices */
698
 
        totvlak= 0;
699
 
        maxvlak= 2*verts;               /* 2*verts: based at a filled circle within a triangle */
 
698
        totface= 0;
 
699
        maxface= 2*verts;               /* 2*verts: based at a filled circle within a triangle */
700
700
 
701
701
        sc= scdata;
702
702
        for(a=0;a<verts;a++) {
717
717
                while(sc->first) {      /* for as long there are edges */
718
718
                        ed1= sc->first;
719
719
                        ed2= ed1->next;
720
 
 
721
 
                        if(callLocalInterruptCallBack()) break;
722
 
                        if(totvlak>maxvlak) {
 
720
                        
 
721
                        /* commented out... the ESC here delivers corrupted memory (and doesnt work during grab) */
 
722
                        /* if(callLocalInterruptCallBack()) break; */
 
723
                        if(totface>maxface) {
723
724
                                /* printf("Fill error: endless loop. Escaped at vert %d,  tot: %d.\n", a, verts); */
724
725
                                a= verts;
725
726
                                break;
774
775
                                else {
775
776
                                        /* new triangle */
776
777
                                        /* printf("add face %x %x %x\n",v1,v2,v3); */
777
 
                                        addfillvlak(v1, v2, v3);
778
 
                                        totvlak++;
 
778
                                        addfillface(v1, v2, v3);
 
779
                                        totface++;
779
780
                                        BLI_remlink((ListBase *)&(sc->first),ed1);
780
781
                                        BLI_addtail(&filledgebase,ed1);
781
782
                                        ed1->v2->f= 0;
1128
1129
        addlisttolist(&fillvertbase,&tempve);
1129
1130
        addlisttolist(&filledgebase,&temped);
1130
1131
 
1131
 
        /* evl= fillvlakbase.first;     
1132
 
        while(evl) {
1133
 
                printf("new face %x %x %x\n",evl->v1,evl->v2,evl->v3);
1134
 
                evl= evl->next;
1135
 
        }*/
1136
 
 
1137
 
 
1138
1132
        /* FREE */
1139
1133
 
1140
1134
        MEM_freeN(pflist);
1141
1135
        return 1;
1142
1136
 
1143
1137
}
1144
 
 
1145
 
/*
1146
 
  MOVED TO EDITMESH.C since it's really bad to leave it here
1147
 
  
1148
 
void fill_mesh(void)
1149
 
{
1150
 
        EditMesh *em = G.editMesh;
1151
 
        EditVert *eve,*v1;
1152
 
        EditEdge *eed,*e1,*nexted;
1153
 
        EditVlak *evl,*nextvl;
1154
 
        short ok;
1155
 
 
1156
 
        if(G.obedit==0 || (G.obedit->type!=OB_MESH)) return;
1157
 
 
1158
 
        waitcursor(1);
1159
 
 
1160
 
        / * alle selected vertices kopieeren * /
1161
 
        eve= em->verts.first;
1162
 
        while(eve) {
1163
 
                if(eve->f & 1) {
1164
 
                        v1= addfillvert(eve->co);
1165
 
                        eve->vn= v1;
1166
 
                        v1->vn= eve;
1167
 
                        v1->h= 0;
1168
 
                }
1169
 
                eve= eve->next;
1170
 
        }
1171
 
        / * alle selected edges kopieeren * /
1172
 
        eed= em->edges.first;
1173
 
        while(eed) {
1174
 
                if( (eed->v1->f & 1) && (eed->v2->f & 1) ) {
1175
 
                        e1= addfilledge(eed->v1->vn, eed->v2->vn);
1176
 
                        e1->v1->h++; 
1177
 
                        e1->v2->h++;
1178
 
                }
1179
 
                eed= eed->next;
1180
 
        }
1181
 
        / * van alle selected vlakken vertices en edges verwijderen om dubbels te voorkomen * /
1182
 
        / * alle edges tellen punten op, vlakken trekken af,
1183
 
           edges met vertices ->h<2 verwijderen * /
1184
 
        evl= em->faces.first;
1185
 
        ok= 0;
1186
 
        while(evl) {
1187
 
                nextvl= evl->next;
1188
 
                if( vlakselectedAND(evl, 1) ) {
1189
 
                        evl->v1->vn->h--;
1190
 
                        evl->v2->vn->h--;
1191
 
                        evl->v3->vn->h--;
1192
 
                        if(evl->v4) evl->v4->vn->h--;
1193
 
                        ok= 1;
1194
 
                        
1195
 
                }
1196
 
                evl= nextvl;
1197
 
        }
1198
 
        if(ok) {        / * er zijn vlakken geselecteerd * /
1199
 
                eed= filledgebase.first;
1200
 
                while(eed) {
1201
 
                        nexted= eed->next;
1202
 
                        if(eed->v1->h<2 || eed->v2->h<2) {
1203
 
                                remlink(&filledgebase,eed);
1204
 
                        }
1205
 
                        eed= nexted;
1206
 
                }
1207
 
        }
1208
 
 
1209
 
        / * tijd=clock(); * /
1210
 
 
1211
 
        ok= edgefill(0);
1212
 
 
1213
 
        / * printf("time: %d\n",(clock()-tijd)/1000); * /
1214
 
 
1215
 
        if(ok) {
1216
 
                evl= fillvlakbase.first;
1217
 
                while(evl) {
1218
 
                        addvlaklist(evl->v1->vn, evl->v2->vn, evl->v3->vn, 0, evl);
1219
 
                        evl= evl->next;
1220
 
                }
1221
 
        }
1222
 
        / * else printf("fill error\n"); * /
1223
 
 
1224
 
        end_edgefill();
1225
 
 
1226
 
        waitcursor(0);
1227
 
 
1228
 
        countall();
1229
 
        allqueue(REDRAWVIEW3D, 0);
1230
 
}
1231
 
 
1232
 
MOVED TO editmesh.c !!!!! (you bastards!)
1233
 
 
1234
 
 */