From 680b135ec1cf220c7ebd579b88bc5481fc379fc3 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 26 Apr 2016 14:42:58 +0200 Subject: [PATCH] Fix T48176: Shrinkwrap crashes when multiple objects uses same target Annoying bug caused by temp nature of looptri layer for CCGDM. Fixed in a similar to CCG loops by using lock when allocating and filling looptri arrays. Real fix would be to make sure this array is allocated on object evaluation using DAG's eval_flag, but that's more involved change which we'll work on later. --- source/blender/blenkernel/intern/constraint.c | 2 -- source/blender/blenkernel/intern/subsurf_ccg.c | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index dabe606fa55..1b9ac499e1f 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -3523,8 +3523,6 @@ static void shrinkwrap_get_tarmat(bConstraint *con, bConstraintOb *cob, bConstra free_bvhtree_from_mesh(&treeData); - target->release(target); - if (fail == true) { /* Don't move the point */ zero_v3(co); diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index daa667fba71..a84b8352417 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -4365,6 +4365,7 @@ static void ccgDM_recalcLoopTri(DerivedMesh *UNUSED(dm)) static const MLoopTri *ccgDM_getLoopTriArray(DerivedMesh *dm) { + BLI_rw_mutex_lock(&loops_cache_rwlock, THREAD_LOCK_WRITE); if (dm->looptris.array) { BLI_assert(poly_to_tri_count(dm->numPolyData, dm->numLoopData) == dm->looptris.num); } @@ -4395,6 +4396,7 @@ static const MLoopTri *ccgDM_getLoopTriArray(DerivedMesh *dm) lt->poly = poly_index; } } + BLI_rw_mutex_unlock(&loops_cache_rwlock); return dm->looptris.array; }