diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h index 34e96599b7e1ff0541ce51c08a0f7a23774f1dc8..7a0c8a1f187184e642ddf2f64173abf78e88723e 100644 --- a/source/blender/blenkernel/BKE_pbvh.h +++ b/source/blender/blenkernel/BKE_pbvh.h @@ -71,6 +71,7 @@ void BKE_pbvh_build_bmesh(PBVH *bvh, struct BMesh *bm, int smooth_shading, struct BMLog *log); void BKE_pbvh_free(PBVH *bvh); +void BKE_pbvh_free_layer_disp(PBVH *bvh); /* Hierarchical Search in the BVH, two methods: * - for each hit calling a callback diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c index cb7c7c636c8ea482d767d4e572a26ede71b3f5e4..426a1e1646c1421457e92801a3367f1b29bb875d 100644 --- a/source/blender/blenkernel/intern/pbvh.c +++ b/source/blender/blenkernel/intern/pbvh.c @@ -626,6 +626,13 @@ void BKE_pbvh_free(PBVH *bvh) MEM_freeN(bvh); } +void BKE_pbvh_free_layer_disp(PBVH *bvh) +{ + int i; + for (i = 0; i < bvh->totnode; ++i) + BKE_pbvh_node_layer_disp_free(&bvh->nodes[i]); +} + static void pbvh_iter_begin(PBVHIter *iter, PBVH *bvh, BKE_pbvh_SearchCallback scb, void *search_data) { iter->bvh = bvh; diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 7b10b828769cd634b846a98eadf73b05a47c8666..c4c800434ade51e0db9a9e6085da69de3dd8d142 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -3960,6 +3960,12 @@ static void sculpt_update_cache_invariants(bContext *C, Sculpt *sd, SculptSessio } } } + + if (ss->bm) { + /* Free any remaining layer displacements from nodes. If not and topology changes + * from using another tool, then next layer toolstroke can access past disp array bounds */ + BKE_pbvh_free_layer_disp(ss->pbvh); + } } /* Make copies of the mesh vertex locations and normals for some tools */