From ef389028b96d194320894ffd072e00adf2d3ff54 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Fri, 1 Dec 2006 18:41:25 +0000 Subject: [PATCH] Added a copy function for multires; duplicating a mesh with multires now works properly. --- source/blender/blenkernel/intern/mesh.c | 3 ++ source/blender/include/multires.h | 2 ++ source/blender/src/multires.c | 41 +++++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 0f1a571b4f3..21003785148 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -269,6 +269,9 @@ Mesh *copy_mesh(Mesh *me) if(tface->tpage) id_lib_extern((ID*)tface->tpage); } + + if(me->mr) + men->mr= multires_copy(me->mr); men->mselect= NULL; diff --git a/source/blender/include/multires.h b/source/blender/include/multires.h index af5260e14e1..82a4629408d 100644 --- a/source/blender/include/multires.h +++ b/source/blender/include/multires.h @@ -34,12 +34,14 @@ struct uiBlock; struct Object; struct Mesh; struct MultiresLevel; +struct Multires; void multires_draw_interface(struct uiBlock *block, unsigned short cx, unsigned short cy); void multires_disp_map(void *, void*); void multires_make(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_level(MultiresLevel *lvl); void multires_del_lower(void *ob, void *me); diff --git a/source/blender/src/multires.c b/source/blender/src/multires.c index 83b6a8d5cf0..447b1b685ff 100644 --- a/source/blender/src/multires.c +++ b/source/blender/src/multires.c @@ -579,6 +579,47 @@ void multires_delete(void *ob, void *me_v) 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) { if(me->mr) {