165
if(me->mat) MEM_freeN(me->mat);
166
if(me->orco) MEM_freeN(me->orco);
141
if(me->mvert) MEM_freeN(me->mvert);
142
if(me->medge) MEM_freeN(me->medge);
167
143
if(me->mface) MEM_freeN(me->mface);
168
145
if(me->tface) MEM_freeN(me->tface);
169
if(me->mvert) MEM_freeN(me->mvert);
170
146
if(me->dvert) free_dverts(me->dvert, me->totvert);
171
147
if(me->mcol) MEM_freeN(me->mcol);
172
148
if(me->msticky) MEM_freeN(me->msticky);
150
if(me->mat) MEM_freeN(me->mat);
151
if(me->orco) MEM_freeN(me->orco);
173
153
if(me->bb) MEM_freeN(me->bb);
174
154
if(me->disp.first) freedisplist(&me->disp);
155
if(me->derived) me->derived->release(me->derived);
177
158
void copy_dverts(MDeformVert *dst, MDeformVert *src, int copycount)
238
219
id_us_plus((ID *)men->mat[a]);
240
221
id_us_plus((ID *)men->texcomesh);
223
men->mvert= MEM_dupallocN(me->mvert);
224
men->medge= MEM_dupallocN(me->medge);
241
225
men->mface= MEM_dupallocN(me->mface);
243
226
men->tface= MEM_dupallocN(me->tface);
246
men->mvert= MEM_dupallocN(me->mvert);
247
memcpy (men->mvert, me->mvert, sizeof (MVert)*me->totvert);
249
230
men->dvert = MEM_mallocN (sizeof (MDeformVert)*me->totvert, "MDeformVert");
250
231
copy_dverts(men->dvert, me->dvert, me->totvert);
443
427
void make_orco_displist_mesh(Object *ob, int subdivlvl)
446
431
DispListMesh *dlm;
451
/* if there's a key, set the first one */
452
if(me->key && me->texcomesh==0) {
453
cp_key(0, me->totvert, me->totvert, (char*) me->mvert->co, me->key, me->key->refkey, 0);
436
if (G.obedit && G.obedit->data==me) {
437
dm= subsurf_make_derived_from_editmesh(G.editMesh, subdivlvl, me->subsurftype, NULL);
438
dlm= dm->convertToDispListMesh(dm);
441
/* if there's a key, set the first one */
442
if(me->key && me->texcomesh==0) {
443
cp_key(0, me->totvert, me->totvert, (char*) me->mvert->co, me->key, me->key->refkey, 0);
446
dm= subsurf_make_derived_from_mesh(me, subdivlvl);
447
dlm= dm->convertToDispListMesh(dm);
450
/* Restore correct key */
456
dlm= subsurf_make_dispListMesh_from_mesh(me, NULL, subdivlvl, me->flag);
458
/* Restore correct key */
461
454
if (me->orco) MEM_freeN(me->orco);
462
455
me->orco= MEM_mallocN(dlm->totvert*3*sizeof(float), "mesh displist orco");
784
777
test_object_materials((ID *)me);
780
/* ************** make edges in a Mesh, for outside of editmode */
787
/* edges have to be added with lowest index first for sorting */
788
static void to_edgesort(struct edgesort *ed, int v1, int v2, int flag)
791
ed->v1= v1; ed->v2= v2;
794
ed->v1= v2; ed->v2= v1;
799
static int vergedgesort(const void *v1, const void *v2)
801
const struct edgesort *x1=v1, *x2=v2;
803
if( x1->v1 > x2->v1) return 1;
804
else if( x1->v1 < x2->v1) return -1;
805
else if( x1->v2 > x2->v2) return 1;
806
else if( x1->v2 < x2->v2) return -1;
812
void make_edges(Mesh *me)
816
struct edgesort *edsort, *ed;
817
int a, totedge=0, final=0;
819
/* we put all edges in array, sort them, and detect doubles that way */
821
for(a= me->totface, mface= me->mface; a>0; a--, mface++) {
822
if(mface->v4) totedge+=4;
823
else if(mface->v3) totedge+=3;
827
if(totedge==0) return;
829
ed= edsort= MEM_mallocN(totedge*sizeof(struct edgesort), "edgesort");
831
for(a= me->totface, mface= me->mface; a>0; a--, mface++) {
833
to_edgesort(ed, mface->v1, mface->v2, mface->edcode & ME_V1V2);
836
to_edgesort(ed, mface->v2, mface->v3, mface->edcode & ME_V2V3);
838
to_edgesort(ed, mface->v3, mface->v4, mface->edcode & ME_V3V4);
840
to_edgesort(ed, mface->v4, mface->v1, mface->edcode & ME_V4V1);
844
to_edgesort(ed, mface->v2, mface->v3, mface->edcode & ME_V2V3);
846
to_edgesort(ed, mface->v3, mface->v1, mface->edcode & ME_V3V1);
851
qsort(edsort, totedge, sizeof(struct edgesort), vergedgesort);
853
/* count final amount */
854
for(a=totedge, ed=edsort; a>1; a--, ed++) {
855
/* edge is unique when it differs from next edge, or is last */
856
if(ed->v1 != (ed+1)->v1 || ed->v2 != (ed+1)->v2) final++;
858
/* this makes sure identical edges both get draw flag */
859
if(ed->flag) (ed+1)->flag= 1;
860
else if((ed+1)->flag) ed->flag= 1;
865
medge= me->medge= MEM_callocN(final*sizeof(MEdge), "make mesh edges");
868
for(a=totedge, ed=edsort; a>1; a--, ed++) {
869
/* edge is unique when it differs from next edge, or is last */
870
if(ed->v1 != (ed+1)->v1 || ed->v2 != (ed+1)->v2) {
873
if(ed->flag) medge->flag= ME_EDGEDRAW;
880
if(ed->flag) medge->flag= ME_EDGEDRAW;
787
887
void mball_to_mesh(ListBase *lb, Mesh *me)