[Bf-blender-cvs] [698f1e3d942] blender2.8: Fix T57938: Dynamic paint baking issues

Sergey Sharybin noreply at git.blender.org
Tue Nov 20 10:29:54 CET 2018


Commit: 698f1e3d942adf4a28c89b7d4a4a7be6ad53624f
Author: Sergey Sharybin
Date:   Tue Nov 20 10:22:32 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB698f1e3d942adf4a28c89b7d4a4a7be6ad53624f

Fix T57938: Dynamic paint baking issues

Quite usual fix for the caching systems.

===================================================================

M	source/blender/blenkernel/BKE_dynamicpaint.h
M	source/blender/blenkernel/intern/dynamicpaint.c
M	source/blender/editors/physics/dynamicpaint_ops.c
M	source/blender/modifiers/intern/MOD_dynamicpaint.c

===================================================================

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)



More information about the Bf-blender-cvs mailing list