Added a copy function for multires; duplicating a mesh with multires now works properly.

This commit is contained in:
Nicholas Bishop 2006-12-01 18:41:25 +00:00
parent e3b72755cc
commit ef389028b9
3 changed files with 46 additions and 0 deletions

@ -270,6 +270,9 @@ Mesh *copy_mesh(Mesh *me)
id_lib_extern((ID*)tface->tpage); id_lib_extern((ID*)tface->tpage);
} }
if(me->mr)
men->mr= multires_copy(me->mr);
men->mselect= NULL; men->mselect= NULL;
men->bb= MEM_dupallocN(men->bb); men->bb= MEM_dupallocN(men->bb);

@ -34,12 +34,14 @@ struct uiBlock;
struct Object; struct Object;
struct Mesh; struct Mesh;
struct MultiresLevel; struct MultiresLevel;
struct Multires;
void multires_draw_interface(struct uiBlock *block, unsigned short cx, unsigned short cy); void multires_draw_interface(struct uiBlock *block, unsigned short cx, unsigned short cy);
void multires_disp_map(void *, void*); void multires_disp_map(void *, void*);
void multires_make(void *ob, void *me); void multires_make(void *ob, void *me);
void multires_delete(void *ob, void *me); void multires_delete(void *ob, void *me);
struct Multires *multires_copy(struct Multires *orig);
void multires_free(Mesh *me); void multires_free(Mesh *me);
void multires_free_level(MultiresLevel *lvl); void multires_free_level(MultiresLevel *lvl);
void multires_del_lower(void *ob, void *me); void multires_del_lower(void *ob, void *me);

@ -579,6 +579,47 @@ void multires_delete(void *ob, void *me_v)
BIF_undo_push("Delete multires"); BIF_undo_push("Delete multires");
} }
MultiresLevel *multires_level_copy(MultiresLevel *orig)
{
if(orig) {
MultiresLevel *lvl= MEM_dupallocN(orig);
lvl->verts= MEM_dupallocN(orig->verts);
lvl->faces= MEM_dupallocN(orig->faces);
lvl->texcolfaces= MEM_dupallocN(orig->texcolfaces);
lvl->edges= MEM_dupallocN(orig->edges);
lvl->vert_edge_map= lvl->vert_face_map= NULL;
multires_calc_level_maps(lvl);
return lvl;
}
return NULL;
}
Multires *multires_copy(Multires *orig)
{
if(orig) {
Multires *mr= MEM_dupallocN(orig);
MultiresLevel *lvlorig;
mr->levels.first= mr->levels.last= NULL;
for(lvlorig= orig->levels.first; lvlorig; lvlorig= lvlorig->next)
BLI_addtail(&mr->levels, multires_level_copy(lvlorig));
if(mr->dverts && mr->levels.first) {
MultiresLevel *lvl= mr->levels.first;
mr->dverts= MEM_mallocN(sizeof(MDeformVert)*lvl->totvert, "MDeformVert");
copy_dverts(mr->dverts, orig->dverts, lvl->totvert);
}
else
mr->dverts= NULL;
return mr;
}
return NULL;
}
void multires_free(Mesh *me) void multires_free(Mesh *me)
{ {
if(me->mr) { if(me->mr) {