[Bf-blender-cvs] [977c48b88da] master: Fix T64149: Texture paint can act as a canvas and brush at the same time

Sebastian Parborg noreply at git.blender.org
Tue Jul 9 14:49:09 CEST 2019


Commit: 977c48b88da75ef8df373921c58a26060030af8d
Author: Sebastian Parborg
Date:   Tue Jul 9 14:43:25 2019 +0200
Branches: master
https://developer.blender.org/rB977c48b88da75ef8df373921c58a26060030af8d

Fix T64149: Texture paint can act as a canvas and brush at the same time

I don't know if it was the intended behavior or not, but having brush
and canvas data at the same time with dymanic paint, would lead to the
object trying to act as a brush and a canvas at the same time.

We can't currently handle this with the new depsgraph, and it could
legitimately lead to bad feedback loops.

So now, to be more consistent with the GUI, I've made it only use the
current set type (brush or canvas) as the final type of the object.
That is, you can only have a object be a brush or a canvas, not both at
the same time.

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

M	source/blender/blenkernel/intern/dynamicpaint.c
M	source/blender/modifiers/intern/MOD_dynamicpaint.c

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

diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c
index 8c6fbe98000..ef5e5bb24a8 100644
--- a/source/blender/blenkernel/intern/dynamicpaint.c
+++ b/source/blender/blenkernel/intern/dynamicpaint.c
@@ -1216,11 +1216,9 @@ void dynamicPaint_Modifier_copy(const struct DynamicPaintModifierData *pmd,
 {
   /* Init modifier */
   tpmd->type = pmd->type;
-  if (pmd->canvas) {
-    dynamicPaint_createType(tpmd, MOD_DYNAMICPAINT_TYPE_CANVAS, NULL);
-  }
-  if (pmd->brush) {
-    dynamicPaint_createType(tpmd, MOD_DYNAMICPAINT_TYPE_BRUSH, NULL);
+  if ((pmd->canvas && pmd->type == MOD_DYNAMICPAINT_TYPE_CANVAS) ||
+      (pmd->brush && pmd->type == MOD_DYNAMICPAINT_TYPE_BRUSH)) {
+    dynamicPaint_createType(tpmd, pmd->type, NULL);
   }
 
   /* Copy data */
@@ -1930,7 +1928,8 @@ static Mesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData *pmd, Object *
 {
   Mesh *result = BKE_mesh_copy_for_eval(mesh, false);
 
-  if (pmd->canvas && !(pmd->canvas->flags & MOD_DPAINT_BAKING)) {
+  if (pmd->canvas && !(pmd->canvas->flags & MOD_DPAINT_BAKING) &&
+      pmd->type == MOD_DYNAMICPAINT_TYPE_CANVAS) {
 
     DynamicPaintSurface *surface;
     bool update_normals = false;
@@ -2070,7 +2069,7 @@ static Mesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData *pmd, Object *
     }
   }
   /* make a copy of mesh to use as brush data */
-  if (pmd->brush) {
+  else if (pmd->brush && pmd->type == MOD_DYNAMICPAINT_TYPE_BRUSH) {
     DynamicPaintRuntime *runtime_data = dynamicPaint_Modifier_runtime_ensure(pmd);
     if (runtime_data->brush_mesh != NULL) {
       BKE_id_free(NULL, runtime_data->brush_mesh);
@@ -2198,24 +2197,11 @@ Mesh *dynamicPaint_Modifier_do(DynamicPaintModifierData *pmd,
                                Object *ob,
                                Mesh *mesh)
 {
-  if (pmd->canvas) {
-    Mesh *ret;
-
-    /* Update canvas data for a new frame */
-    dynamicPaint_frameUpdate(pmd, depsgraph, scene, ob, mesh);
+  /* Update canvas data for a new frame */
+  dynamicPaint_frameUpdate(pmd, depsgraph, scene, ob, mesh);
 
-    /* Return output mesh */
-    ret = dynamicPaint_Modifier_apply(pmd, ob, mesh);
-
-    return ret;
-  }
-  else {
-    /* Update canvas data for a new frame */
-    dynamicPaint_frameUpdate(pmd, depsgraph, scene, ob, mesh);
-
-    /* Return output mesh */
-    return dynamicPaint_Modifier_apply(pmd, ob, mesh);
-  }
+  /* Return output mesh */
+  return dynamicPaint_Modifier_apply(pmd, ob, mesh);
 }
 
 /* -------------------------------------------------------------------- */
@@ -6252,7 +6238,7 @@ static int dynamicPaint_doStep(Depsgraph *depsgraph,
       if (md && md->mode & (eModifierMode_Realtime | eModifierMode_Render)) {
         DynamicPaintModifierData *pmd2 = (DynamicPaintModifierData *)md;
         /* make sure we're dealing with a brush */
-        if (pmd2->brush) {
+        if (pmd2->brush && pmd2->type == MOD_DYNAMICPAINT_TYPE_BRUSH) {
           DynamicPaintBrushSettings *brush = pmd2->brush;
 
           /* calculate brush speed vectors if required */
diff --git a/source/blender/modifiers/intern/MOD_dynamicpaint.c b/source/blender/modifiers/intern/MOD_dynamicpaint.c
index ce488a224aa..26ee75140a6 100644
--- a/source/blender/modifiers/intern/MOD_dynamicpaint.c
+++ b/source/blender/modifiers/intern/MOD_dynamicpaint.c
@@ -112,16 +112,17 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
   return mesh;
 }
 
-static bool is_brush_cb(Object *UNUSED(ob), ModifierData *pmd)
+static bool is_brush_cb(Object *UNUSED(ob), ModifierData *md)
 {
-  return ((DynamicPaintModifierData *)pmd)->brush != NULL;
+  DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)md;
+  return (pmd->brush != NULL && pmd->type == MOD_DYNAMICPAINT_TYPE_BRUSH);
 }
 
 static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
 {
   DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)md;
   /* Add relation from canvases to all brush objects. */
-  if (pmd->canvas != NULL) {
+  if (pmd->canvas != NULL && pmd->type == MOD_DYNAMICPAINT_TYPE_CANVAS) {
     for (DynamicPaintSurface *surface = pmd->canvas->surfaces.first; surface;
          surface = surface->next) {
       if (surface->effect & MOD_DPAINT_EFFECT_DO_DRIP) {



More information about the Bf-blender-cvs mailing list