From e508c2d9e1151a75926937cfdfb2799d2959bca1 Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Mon, 19 Mar 2012 05:13:41 +0000 Subject: Add a multires function to delete MDisps. The code was duplicated in various places, replaced with calls to a new function, multires_customdata_delete(). --- source/blender/blenkernel/intern/multires.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) (limited to 'source/blender/blenkernel/intern/multires.c') diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index 102f1cc335d..19f8cee989d 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -77,6 +77,27 @@ typedef enum { static void multires_mvert_to_ss(DerivedMesh *dm, MVert *mvert); static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, DerivedMesh *dm2, DispOp op, DMGridData **oldGridData, int totlvl); +/** Customdata **/ + +void multires_customdata_delete(Mesh *me) +{ + if(me->edit_btmesh) { + BMEditMesh *em= me->edit_btmesh; + /* CustomData_external_remove is used here only to mark layer + * as non-external for further free-ing, so zero element count + * looks safer than em->totface */ + CustomData_external_remove(&em->bm->ldata, &me->id, + CD_MDISPS, 0); + BM_data_layer_free(em->bm, &em->bm->ldata, CD_MDISPS); + } + else { + CustomData_external_remove(&me->ldata, &me->id, + CD_MDISPS, me->totloop); + CustomData_free_layer_active(&me->ldata, CD_MDISPS, + me->totloop); + } +} + /** Grid hiding **/ static BLI_bitmap multires_mdisps_upsample_hidden(BLI_bitmap lo_hidden, int lo_level, @@ -619,8 +640,7 @@ static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl) } } else { - CustomData_external_remove(&me->ldata, &me->id, CD_MDISPS, me->totloop); - CustomData_free_layer_active(&me->ldata, CD_MDISPS, me->totloop); + multires_customdata_delete(me); } } @@ -2005,10 +2025,7 @@ static void multires_sync_levels(Scene *scene, Object *ob, Object *to_ob) * upsampled correct without modifier data. * just remove mdisps if no multires present (nazgul) */ - Mesh *me= (Mesh*)ob->data; - - CustomData_external_remove(&me->ldata, &me->id, CD_MDISPS, me->totloop); - CustomData_free_layer_active(&me->ldata, CD_MDISPS, me->totloop); + multires_customdata_delete(ob->data); } if (!mmd || !to_mmd) return; -- cgit v1.2.3