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.
This commit is contained in:
@@ -3523,8 +3523,6 @@ static void shrinkwrap_get_tarmat(bConstraint *con, bConstraintOb *cob, bConstra
|
|||||||
|
|
||||||
free_bvhtree_from_mesh(&treeData);
|
free_bvhtree_from_mesh(&treeData);
|
||||||
|
|
||||||
target->release(target);
|
|
||||||
|
|
||||||
if (fail == true) {
|
if (fail == true) {
|
||||||
/* Don't move the point */
|
/* Don't move the point */
|
||||||
zero_v3(co);
|
zero_v3(co);
|
||||||
|
@@ -4365,6 +4365,7 @@ static void ccgDM_recalcLoopTri(DerivedMesh *UNUSED(dm))
|
|||||||
|
|
||||||
static const MLoopTri *ccgDM_getLoopTriArray(DerivedMesh *dm)
|
static const MLoopTri *ccgDM_getLoopTriArray(DerivedMesh *dm)
|
||||||
{
|
{
|
||||||
|
BLI_rw_mutex_lock(&loops_cache_rwlock, THREAD_LOCK_WRITE);
|
||||||
if (dm->looptris.array) {
|
if (dm->looptris.array) {
|
||||||
BLI_assert(poly_to_tri_count(dm->numPolyData, dm->numLoopData) == dm->looptris.num);
|
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;
|
lt->poly = poly_index;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
BLI_rw_mutex_unlock(&loops_cache_rwlock);
|
||||||
return dm->looptris.array;
|
return dm->looptris.array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user