Fix: Fluid/Cloth/DynamicPaint: Only share pointcaches in CoW case.
Particle copying code was already properly sharing pointcache between orig data and its copy only when `LIB_ID_COPY_SET_COPIED_ON_WRITE` is set, do the same for the other point cache users. Using `LIB_ID_CREATE_NO_MAIN` here is waaaaaaay to much wide scope for such a dangerous/advanced behavior, that kind of things has to be strictly restricted in scope.
This commit is contained in:
@@ -1231,7 +1231,7 @@ void dynamicPaint_Modifier_copy(const struct DynamicPaintModifierData *pmd,
|
||||
/* copy existing surfaces */
|
||||
for (surface = pmd->canvas->surfaces.first; surface; surface = surface->next) {
|
||||
DynamicPaintSurface *t_surface = dynamicPaint_createNewSurface(tpmd->canvas, NULL);
|
||||
if (flag & LIB_ID_CREATE_NO_MAIN) {
|
||||
if (flag & LIB_ID_COPY_SET_COPIED_ON_WRITE) {
|
||||
/* TODO(sergey): Consider passing some tips to the surface
|
||||
* creation to avoid this allocate-and-free cache behavior. */
|
||||
BKE_ptcache_free_list(&t_surface->ptcaches);
|
||||
|
||||
@@ -5094,7 +5094,7 @@ void BKE_fluid_modifier_copy(const struct FluidModifierData *fmd,
|
||||
|
||||
/* pointcache options */
|
||||
BKE_ptcache_free_list(&(tfds->ptcaches[0]));
|
||||
if (flag & LIB_ID_CREATE_NO_MAIN) {
|
||||
if (flag & LIB_ID_COPY_SET_COPIED_ON_WRITE) {
|
||||
/* Share the cache with the original object's modifier. */
|
||||
tfmd->modifier.flag |= eModifierFlag_SharedCaches;
|
||||
tfds->point_cache[0] = fds->point_cache[0];
|
||||
|
||||
@@ -194,7 +194,7 @@ static void copyData(const ModifierData *md, ModifierData *target, const int fla
|
||||
}
|
||||
|
||||
BKE_ptcache_free_list(&tclmd->ptcaches);
|
||||
if (flag & LIB_ID_CREATE_NO_MAIN) {
|
||||
if (flag & LIB_ID_COPY_SET_COPIED_ON_WRITE) {
|
||||
/* Share the cache with the original object's modifier. */
|
||||
tclmd->modifier.flag |= eModifierFlag_SharedCaches;
|
||||
tclmd->ptcaches = clmd->ptcaches;
|
||||
|
||||
Reference in New Issue
Block a user