diff options
author | Sebastian Parborg <darkdefende@gmail.com> | 2019-07-09 15:43:25 +0300 |
---|---|---|
committer | Sebastian Parborg <darkdefende@gmail.com> | 2019-07-09 15:49:08 +0300 |
commit | 977c48b88da75ef8df373921c58a26060030af8d (patch) | |
tree | 623ca8334e4e8f34cc5c0fa7d2b7b076d9bdb5ce /source/blender/blenkernel/intern/dynamicpaint.c | |
parent | dd84ff212aa5c9d6c1a03888583e11f64a978a1a (diff) |
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.
Diffstat (limited to 'source/blender/blenkernel/intern/dynamicpaint.c')
-rw-r--r-- | source/blender/blenkernel/intern/dynamicpaint.c | 36 |
1 files changed, 11 insertions, 25 deletions
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 */ |