Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2018-11-20 12:22:32 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2018-11-20 12:29:35 +0300
commit698f1e3d942adf4a28c89b7d4a4a7be6ad53624f (patch)
treea6e3ec298abf24c8498bb7861a1d25f9a98a64cd /source/blender
parent640eb0067017dfbfd7db8c0584251352c17534aa (diff)
Fix T57938: Dynamic paint baking issues
Quite usual fix for the caching systems.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/BKE_dynamicpaint.h7
-rw-r--r--source/blender/blenkernel/intern/dynamicpaint.c23
-rw-r--r--source/blender/editors/physics/dynamicpaint_ops.c2
-rw-r--r--source/blender/modifiers/intern/MOD_dynamicpaint.c4
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)