diff options
-rw-r--r-- | source/blender/blenkernel/BKE_DerivedMesh.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 13 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_iterators.c | 6 |
3 files changed, 19 insertions, 3 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index e209938cc80..c9ea8b3174c 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -508,6 +508,9 @@ DerivedMesh *mesh_create_derived(struct Mesh *me, float (*vertCos)[3]); struct Mesh *editbmesh_get_eval_cage( struct Depsgraph *depsgraph, struct Scene *scene, struct Object *, struct BMEditMesh *em, CustomDataMask dataMask); +struct Mesh *editbmesh_get_eval_cage_from_orig( + struct Depsgraph *depsgraph, struct Scene *scene, struct Object *, + struct BMEditMesh *em, CustomDataMask dataMask); struct Mesh *editbmesh_get_eval_cage_and_final( struct Depsgraph *depsgraph, struct Scene *scene, struct Object *, struct BMEditMesh *em, CustomDataMask dataMask, diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 9880904daf7..a29b0011216 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -2079,6 +2079,8 @@ static void editbmesh_build_data( struct Depsgraph *depsgraph, Scene *scene, Object *obedit, BMEditMesh *em, CustomDataMask dataMask) { + BLI_assert(em->ob->id.tag & LIB_TAG_COPIED_ON_WRITE); + BKE_object_free_derived_caches(obedit); BKE_object_sculpt_modifiers_changed(obedit); @@ -2419,6 +2421,17 @@ Mesh *editbmesh_get_eval_cage( return em->mesh_eval_cage; } +Mesh *editbmesh_get_eval_cage_from_orig( + struct Depsgraph *depsgraph, Scene *scene, Object *obedit, BMEditMesh *UNUSED(em), + CustomDataMask dataMask) +{ + BLI_assert((obedit->id.tag & LIB_TAG_COPIED_ON_WRITE) == 0); + Scene *scene_eval = (Scene *)DEG_get_evaluated_id(depsgraph, &scene->id); + Object *obedit_eval = (Object *)DEG_get_evaluated_id(depsgraph, &obedit->id); + BMEditMesh *em_eval = BKE_editmesh_from_object(obedit_eval); + return editbmesh_get_eval_cage(depsgraph, scene_eval, obedit_eval, em_eval, dataMask); +} + /***/ /* UNUSED */ diff --git a/source/blender/editors/space_view3d/view3d_iterators.c b/source/blender/editors/space_view3d/view3d_iterators.c index c7552d2887e..9ee7cbabd2a 100644 --- a/source/blender/editors/space_view3d/view3d_iterators.c +++ b/source/blender/editors/space_view3d/view3d_iterators.c @@ -162,7 +162,7 @@ void mesh_foreachScreenVert( { foreachScreenVert_userData data; - Mesh *me = editbmesh_get_eval_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH); + Mesh *me = editbmesh_get_eval_cage_from_orig(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH); ED_view3d_check_mats_rv3d(vc->rv3d); @@ -215,7 +215,7 @@ void mesh_foreachScreenEdge( { foreachScreenEdge_userData data; - Mesh *me = editbmesh_get_eval_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH); + Mesh *me = editbmesh_get_eval_cage_from_orig(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH); ED_view3d_check_mats_rv3d(vc->rv3d); @@ -260,7 +260,7 @@ void mesh_foreachScreenFace( { foreachScreenFace_userData data; - Mesh *me = editbmesh_get_eval_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH); + Mesh *me = editbmesh_get_eval_cage_from_orig(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH); ED_view3d_check_mats_rv3d(vc->rv3d); data.vc = *vc; |