diff options
-rw-r--r-- | source/blender/blenkernel/BKE_dynamicpaint.h | 7 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/dynamicpaint.c | 23 | ||||
-rw-r--r-- | source/blender/editors/physics/dynamicpaint_ops.c | 2 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_dynamicpaint.c | 4 |
4 files changed, 26 insertions, 10 deletions
diff --git a/source/blender/blenkernel/BKE_dynamicpaint.h b/source/blender/blenkernel/BKE_dynamicpaint.h index cffadeb5fd9..d6a9cbb5e17 100644 --- a/source/blender/blenkernel/BKE_dynamicpaint.h +++ b/source/blender/blenkernel/BKE_dynamicpaint.h @@ -69,13 +69,16 @@ struct Mesh *dynamicPaint_Modifier_do( struct DynamicPaintModifierData *pmd, struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct Mesh *me); void dynamicPaint_Modifier_free(struct DynamicPaintModifierData *pmd); -void dynamicPaint_Modifier_copy(const struct DynamicPaintModifierData *pmd, struct DynamicPaintModifierData *tsmd); +void dynamicPaint_Modifier_copy(const struct DynamicPaintModifierData *pmd, + struct DynamicPaintModifierData *tsmd, + int flag); bool dynamicPaint_createType(struct DynamicPaintModifierData *pmd, int type, struct Scene *scene); struct DynamicPaintSurface *dynamicPaint_createNewSurface(struct DynamicPaintCanvasSettings *canvas, struct Scene *scene); void dynamicPaint_clearSurface(const struct Scene *scene, struct DynamicPaintSurface *surface); bool dynamicPaint_resetSurface(const struct Scene *scene, struct DynamicPaintSurface *surface); -void dynamicPaint_freeSurface(struct DynamicPaintSurface *surface); +void dynamicPaint_freeSurface(const struct DynamicPaintModifierData *pmd, + struct DynamicPaintSurface *surface); void dynamicPaint_freeCanvas(struct DynamicPaintModifierData *pmd); void dynamicPaint_freeBrush(struct DynamicPaintModifierData *pmd); void dynamicPaint_freeSurfaceData(struct DynamicPaintSurface *surface); diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c index 7e692330b79..5453982b070 100644 --- a/source/blender/blenkernel/intern/dynamicpaint.c +++ b/source/blender/blenkernel/intern/dynamicpaint.c @@ -915,10 +915,13 @@ void dynamicPaint_freeSurfaceData(DynamicPaintSurface *surface) surface->data = NULL; } -void dynamicPaint_freeSurface(DynamicPaintSurface *surface) +void dynamicPaint_freeSurface(const DynamicPaintModifierData *pmd, + DynamicPaintSurface *surface) { /* point cache */ - BKE_ptcache_free_list(&(surface->ptcaches)); + if ((pmd->modifier.flag & eModifierFlag_SharedCaches) == 0) { + BKE_ptcache_free_list(&(surface->ptcaches)); + } surface->pointcache = NULL; if (surface->effector_weights) @@ -940,7 +943,7 @@ void dynamicPaint_freeCanvas(DynamicPaintModifierData *pmd) while (surface) { next_surface = surface->next; - dynamicPaint_freeSurface(surface); + dynamicPaint_freeSurface(pmd, surface); surface = next_surface; } @@ -1139,7 +1142,9 @@ bool dynamicPaint_createType(struct DynamicPaintModifierData *pmd, int type, str return true; } -void dynamicPaint_Modifier_copy(const struct DynamicPaintModifierData *pmd, struct DynamicPaintModifierData *tpmd) +void dynamicPaint_Modifier_copy(const struct DynamicPaintModifierData *pmd, + struct DynamicPaintModifierData *tpmd, + int flag) { /* Init modifier */ tpmd->type = pmd->type; @@ -1154,11 +1159,19 @@ void dynamicPaint_Modifier_copy(const struct DynamicPaintModifierData *pmd, stru tpmd->canvas->pmd = tpmd; /* free default surface */ if (tpmd->canvas->surfaces.first) - dynamicPaint_freeSurface(tpmd->canvas->surfaces.first); + dynamicPaint_freeSurface(tpmd, tpmd->canvas->surfaces.first); /* 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) { + /* 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); + tpmd->modifier.flag |= eModifierFlag_SharedCaches; + t_surface->ptcaches = surface->ptcaches; + t_surface->pointcache = surface->pointcache; + } /* surface settings */ t_surface->brush_group = surface->brush_group; diff --git a/source/blender/editors/physics/dynamicpaint_ops.c b/source/blender/editors/physics/dynamicpaint_ops.c index a967450408c..5fb03b628b2 100644 --- a/source/blender/editors/physics/dynamicpaint_ops.c +++ b/source/blender/editors/physics/dynamicpaint_ops.c @@ -130,7 +130,7 @@ static int surface_slot_remove_exec(bContext *C, wmOperator *UNUSED(op)) for (; surface; surface = surface->next) { if (id == canvas->active_sur) { canvas->active_sur -= 1; - dynamicPaint_freeSurface(surface); + dynamicPaint_freeSurface(pmd, surface); break; } id++; diff --git a/source/blender/modifiers/intern/MOD_dynamicpaint.c b/source/blender/modifiers/intern/MOD_dynamicpaint.c index 2e3d164a86e..c23a65ec23c 100644 --- a/source/blender/modifiers/intern/MOD_dynamicpaint.c +++ b/source/blender/modifiers/intern/MOD_dynamicpaint.c @@ -58,12 +58,12 @@ static void initData(ModifierData *md) pmd->type = MOD_DYNAMICPAINT_TYPE_CANVAS; } -static void copyData(const ModifierData *md, ModifierData *target, const int UNUSED(flag)) +static void copyData(const ModifierData *md, ModifierData *target, const int flag) { const DynamicPaintModifierData *pmd = (const DynamicPaintModifierData *)md; DynamicPaintModifierData *tpmd = (DynamicPaintModifierData *)target; - dynamicPaint_Modifier_copy(pmd, tpmd); + dynamicPaint_Modifier_copy(pmd, tpmd, flag); } static void freeData(ModifierData *md) |