diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-09-20 16:19:44 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-09-20 16:39:41 +0300 |
commit | 315929e095fa8bde905615ea83414c98fb2d9e35 (patch) | |
tree | c8d3225dac202634140ff0094a586c9f55d298b3 /source/blender/editors/sculpt_paint | |
parent | 00037059e90f654a4d3f2f8a706ac86868b16f4a (diff) |
Sculpt: Fix undo not working for multires
Diffstat (limited to 'source/blender/editors/sculpt_paint')
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt_undo.c | 47 |
1 files changed, 24 insertions, 23 deletions
diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.c b/source/blender/editors/sculpt_paint/sculpt_undo.c index d05b974140b..d79c6b81fd7 100644 --- a/source/blender/editors/sculpt_paint/sculpt_undo.c +++ b/source/blender/editors/sculpt_paint/sculpt_undo.c @@ -60,6 +60,7 @@ #include "BKE_mesh.h" #include "BKE_mesh_runtime.h" #include "BKE_subsurf.h" +#include "BKE_subdiv_ccg.h" #include "BKE_undo_system.h" #include "DEG_depsgraph.h" @@ -136,13 +137,14 @@ static bool sculpt_undo_restore_deformed( } } -static bool sculpt_undo_restore_coords(bContext *C, DerivedMesh *dm, SculptUndoNode *unode) +static bool sculpt_undo_restore_coords(bContext *C, SculptUndoNode *unode) { Scene *scene = CTX_data_scene(C); Sculpt *sd = CTX_data_tool_settings(C)->sculpt; Object *ob = CTX_data_active_object(C); Depsgraph *depsgraph = CTX_data_depsgraph(C); SculptSession *ss = ob->sculpt; + SubdivCCG *subdiv_ccg = ss->subdiv_ccg; MVert *mvert; int *index; @@ -228,16 +230,16 @@ static bool sculpt_undo_restore_coords(bContext *C, DerivedMesh *dm, SculptUndoN } } } - else if (unode->maxgrid && dm->getGridData) { + else if (unode->maxgrid && subdiv_ccg != NULL) { /* multires restore */ CCGElem **grids, *grid; CCGKey key; float (*co)[3]; int gridsize; - grids = dm->getGridData(dm); - gridsize = dm->getGridSize(dm); - dm->getGridKey(dm, &key); + grids = subdiv_ccg->grids; + gridsize = subdiv_ccg->grid_size; + BKE_subdiv_ccg_key_top_level(&key, subdiv_ccg); co = unode->co; for (int j = 0; j < unode->totgrid; j++) { @@ -253,11 +255,12 @@ static bool sculpt_undo_restore_coords(bContext *C, DerivedMesh *dm, SculptUndoN } static bool sculpt_undo_restore_hidden( - bContext *C, DerivedMesh *dm, + bContext *C, SculptUndoNode *unode) { Object *ob = CTX_data_active_object(C); SculptSession *ss = ob->sculpt; + SubdivCCG *subdiv_ccg = ss->subdiv_ccg; int i; if (unode->maxvert) { @@ -272,8 +275,8 @@ static bool sculpt_undo_restore_hidden( } } } - else if (unode->maxgrid && dm->getGridData) { - BLI_bitmap **grid_hidden = dm->getGridHidden(dm); + else if (unode->maxgrid && subdiv_ccg != NULL) { + BLI_bitmap **grid_hidden = subdiv_ccg->grid_hidden; for (i = 0; i < unode->totgrid; i++) { SWAP(BLI_bitmap *, @@ -286,10 +289,11 @@ static bool sculpt_undo_restore_hidden( return 1; } -static bool sculpt_undo_restore_mask(bContext *C, DerivedMesh *dm, SculptUndoNode *unode) +static bool sculpt_undo_restore_mask(bContext *C, SculptUndoNode *unode) { Object *ob = CTX_data_active_object(C); SculptSession *ss = ob->sculpt; + SubdivCCG *subdiv_ccg = ss->subdiv_ccg; MVert *mvert; float *vmask; int *index, i, j; @@ -308,16 +312,16 @@ static bool sculpt_undo_restore_mask(bContext *C, DerivedMesh *dm, SculptUndoNod } } } - else if (unode->maxgrid && dm->getGridData) { + else if (unode->maxgrid && subdiv_ccg != NULL) { /* multires restore */ CCGElem **grids, *grid; CCGKey key; float *mask; int gridsize; - grids = dm->getGridData(dm); - gridsize = dm->getGridSize(dm); - dm->getGridKey(dm, &key); + grids = subdiv_ccg->grids; + gridsize = subdiv_ccg->grid_size; + BKE_subdiv_ccg_key_top_level(&key, subdiv_ccg); mask = unode->mask; for (j = 0; j < unode->totgrid; j++) { @@ -475,8 +479,8 @@ static void sculpt_undo_restore_list(bContext *C, ListBase *lb) Sculpt *sd = CTX_data_tool_settings(C)->sculpt; Object *ob = CTX_data_active_object(C); Depsgraph *depsgraph = CTX_data_depsgraph(C); - DerivedMesh *dm; SculptSession *ss = ob->sculpt; + SubdivCCG *subdiv_ccg = ss->subdiv_ccg; SculptUndoNode *unode; bool update = false, rebuild = false; bool need_mask = false; @@ -497,9 +501,6 @@ static void sculpt_undo_restore_list(bContext *C, ListBase *lb) BKE_sculpt_update_mesh_elements(depsgraph, scene, sd, ob, false, need_mask); - /* call _after_ sculpt_update_mesh_elements() which may update 'ob->derivedFinal' */ - dm = mesh_get_derived_final(depsgraph, scene, ob, 0); - if (lb->first && sculpt_undo_bmesh_restore(C, lb->first, ob, ss)) return; @@ -513,9 +514,9 @@ static void sculpt_undo_restore_list(bContext *C, ListBase *lb) if (ss->totvert != unode->maxvert) continue; } - else if (unode->maxgrid && dm->getGridData) { - if ((dm->getNumGrids(dm) != unode->maxgrid) || - (dm->getGridSize(dm) != unode->gridsize)) + else if (unode->maxgrid && subdiv_ccg != NULL) { + if ((subdiv_ccg->num_grids != unode->maxgrid) || + (subdiv_ccg->grid_size != unode->gridsize)) { continue; } @@ -526,15 +527,15 @@ static void sculpt_undo_restore_list(bContext *C, ListBase *lb) switch (unode->type) { case SCULPT_UNDO_COORDS: - if (sculpt_undo_restore_coords(C, dm, unode)) + if (sculpt_undo_restore_coords(C, unode)) update = true; break; case SCULPT_UNDO_HIDDEN: - if (sculpt_undo_restore_hidden(C, dm, unode)) + if (sculpt_undo_restore_hidden(C, unode)) rebuild = true; break; case SCULPT_UNDO_MASK: - if (sculpt_undo_restore_mask(C, dm, unode)) + if (sculpt_undo_restore_mask(C, unode)) update = true; break; |