diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-03-07 17:27:31 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-03-07 18:09:15 +0300 |
commit | 967d82d9b9489aa9f08270a4fafc8415158690ea (patch) | |
tree | 561ee39d17833217c2cecffc73714d32e38e7b1b /source/blender/blenkernel/intern/paint.c | |
parent | 594f2b80165d1fa750150d32f9c9dfd344b497e3 (diff) |
Fix T62271: Particles with multires crash on sculpt
In fact, any modifier on top of multires would lead to crash.
Was missing pointer update.
Basically, bring the control flow closer to 2.7.
Diffstat (limited to 'source/blender/blenkernel/intern/paint.c')
-rw-r--r-- | source/blender/blenkernel/intern/paint.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c index b3999e61216..be0d176dddc 100644 --- a/source/blender/blenkernel/intern/paint.c +++ b/source/blender/blenkernel/intern/paint.c @@ -1381,7 +1381,16 @@ PBVH *BKE_sculpt_object_pbvh_ensure(Depsgraph *depsgraph, Object *ob) } PBVH *pbvh = ob->sculpt->pbvh; if (pbvh != NULL) { - /* Nothing to do, PBVH is already up to date. */ + /* NOTE: It is possible that grids were re-allocated due to modifier + * stack. Need to update those pointers. */ + if (BKE_pbvh_type(pbvh) == PBVH_GRIDS) { + Object *object_eval = DEG_get_evaluated_object(depsgraph, ob); + Mesh *mesh_eval = object_eval->data; + SubdivCCG *subdiv_ccg = mesh_eval->runtime.subdiv_ccg; + if (subdiv_ccg != NULL) { + BKE_sculpt_bvh_update_from_ccg(pbvh, subdiv_ccg); + } + } return pbvh; } @@ -1405,3 +1414,9 @@ PBVH *BKE_sculpt_object_pbvh_ensure(Depsgraph *depsgraph, Object *ob) ob->sculpt->pbvh = pbvh; return pbvh; } + +void BKE_sculpt_bvh_update_from_ccg(PBVH *pbvh, SubdivCCG *subdiv_ccg) +{ + BKE_pbvh_grids_update(pbvh, subdiv_ccg->grids, (void **)subdiv_ccg->grid_faces, + subdiv_ccg->grid_flag_mats, subdiv_ccg->grid_hidden); +} |