Modifiers: fix bunch of missing 'self transform' deg relations.
authorBastien Montagne <montagne29@wanadoo.fr>
Tue, 27 Nov 2018 20:14:35 +0000 (21:14 +0100)
committerBastien Montagne <montagne29@wanadoo.fr>
Tue, 27 Nov 2018 20:17:06 +0000 (21:17 +0100)
When a modifier depends on some other object's position, then it also
depends in its own position, this has to be also told to depsgraph.

Fixes several modifiers where moving target would update the modifier,
while moving modified object itself would not.

14 files changed:
source/blender/modifiers/intern/MOD_array.c
source/blender/modifiers/intern/MOD_datatransfer.c
source/blender/modifiers/intern/MOD_displace.c
source/blender/modifiers/intern/MOD_mask.c
source/blender/modifiers/intern/MOD_normal_edit.c
source/blender/modifiers/intern/MOD_screw.c
source/blender/modifiers/intern/MOD_simpledeform.c
source/blender/modifiers/intern/MOD_uvproject.c
source/blender/modifiers/intern/MOD_uvwarp.c
source/blender/modifiers/intern/MOD_warp.c
source/blender/modifiers/intern/MOD_wave.c
source/blender/modifiers/intern/MOD_weightvgedit.c
source/blender/modifiers/intern/MOD_weightvgmix.c
source/blender/modifiers/intern/MOD_weightvgproximity.c

index cd2f7cc364bf0aa29d4c5bb59d69128d6e484910..9decf8e3bb53a72773d4aff9e08af6dc407e9d10 100644 (file)
@@ -107,6 +107,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
        if (amd->offset_ob != NULL) {
                DEG_add_object_relation(ctx->node, amd->offset_ob, DEG_OB_COMP_TRANSFORM, "Array Modifier Offset");
        }
+       DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Array Modifier");
 }
 
 BLI_INLINE float sum_v3(const float v[3])
index d3f573ec4b6ebefafce4886a1de1e9b7a8b7bf71..d3c0dd783cccd928f4f0968cf5050883d14f5da0 100644 (file)
@@ -132,6 +132,11 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
                CustomDataMask mask = BKE_object_data_transfer_dttypes_to_cdmask(dtmd->data_types);
 
                DEG_add_object_relation_with_customdata(ctx->node, dtmd->ob_source, DEG_OB_COMP_GEOMETRY, mask, "DataTransfer Modifier");
+
+               if (dtmd->flags & MOD_DATATRANSFER_OBSRC_TRANSFORM) {
+                       DEG_add_object_relation(ctx->node, dtmd->ob_source, DEG_OB_COMP_TRANSFORM, "DataTransfer Modifier");
+                       DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "DataTransfer Modifier");
+               }
        }
 }
 
index 082c8f9c589855f0de0bbdf9bd0c22bd366c8886..a477191357eedc5ab4dc9a1ee0518a03ad1263bf 100644 (file)
@@ -148,6 +148,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
 {
        DisplaceModifierData *dmd = (DisplaceModifierData *)md;
        if (dmd->map_object != NULL && dmd->texmapping == MOD_DISP_MAP_OBJECT) {
+               DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Displace Modifier");
                DEG_add_object_relation(ctx->node, dmd->map_object, DEG_OB_COMP_TRANSFORM, "Displace Modifier");
        }
        if (dmd->texmapping == MOD_DISP_MAP_GLOBAL ||
index 1a8027e6697f558b4659f35c848f9ab2840a42f3..7c43545a3d36d87fb835ecff99fae47b60cd720d 100644 (file)
@@ -81,6 +81,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
                /* TODO(sergey): Is it a proper relation here? */
                DEG_add_object_relation(ctx->node, mmd->ob_arm, DEG_OB_COMP_TRANSFORM, "Mask Modifier");
                arm->flag |= ARM_HAS_VIZ_DEPS;
+               DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Mask Modifier");
        }
 }
 
index f76acd3983d802d29ad390f575849c931a1f121f..d7126113fe8dcc7f1ae83f917a860f16a4180d6a 100644 (file)
@@ -536,6 +536,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
        NormalEditModifierData *enmd = (NormalEditModifierData *) md;
        if (enmd->target) {
                DEG_add_object_relation(ctx->node, enmd->target, DEG_OB_COMP_TRANSFORM, "NormalEdit Modifier");
+               DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "NormalEdit Modifier");
        }
 }
 
index c59be8151d4c51e76ff781f8fae74ca3bd9eba91..1de2a976fca6aa0d93ec8c9ed9fc3b458ea3d424 100644 (file)
@@ -1116,6 +1116,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
        ScrewModifierData *ltmd = (ScrewModifierData *)md;
        if (ltmd->ob_axis != NULL) {
                DEG_add_object_relation(ctx->node, ltmd->ob_axis, DEG_OB_COMP_TRANSFORM, "Screw Modifier");
+               DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Screw Modifier");
        }
 }
 
index cab1a24fe8516549f7bb34743c3a6cd34142153d..f1ad93e7182c507c549f168303ef3c7f8daafecb 100644 (file)
@@ -376,6 +376,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
        SimpleDeformModifierData *smd  = (SimpleDeformModifierData *)md;
        if (smd->origin != NULL) {
                DEG_add_object_relation(ctx->node, smd->origin, DEG_OB_COMP_TRANSFORM, "SimpleDeform Modifier");
+               DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "SimpleDeform Modifier");
        }
 }
 
index 3aaf67792c6441c78d961bb74fa9cc5c54a730a6..8c9fbefa27ab186a1e3f4c66592bb142c8fd5a5e 100644 (file)
@@ -104,12 +104,16 @@ static void foreachIDLink(
 static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
 {
        UVProjectModifierData *umd = (UVProjectModifierData *)md;
-       int i;
-       for (i = 0; i < umd->num_projectors; ++i) {
+       bool do_add_own_transform = false;
+       for (int i = 0; i < umd->num_projectors; ++i) {
                if (umd->projectors[i] != NULL) {
                        DEG_add_object_relation(ctx->node, umd->projectors[i], DEG_OB_COMP_TRANSFORM, "UV Project Modifier");
+                       do_add_own_transform = true;
                }
        }
+       if (do_add_own_transform) {
+               DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "UV Project Modifier");
+       }
 }
 
 typedef struct Projector {
index f92056d503f59f931a068cabc2af988f691ed01b..e9947826fb6dc8c61d30c70aa9bea060649077a5 100644 (file)
@@ -244,6 +244,8 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
 
        uv_warp_deps_object_bone_new(ctx->node, umd->object_src, umd->bone_src);
        uv_warp_deps_object_bone_new(ctx->node, umd->object_dst, umd->bone_dst);
+
+       DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "UVWarp Modifier");
 }
 
 ModifierTypeInfo modifierType_UVWarp = {
index aa81b945b4c5f7a363395fdc6d21056c4d75fb9f..aea530e7b6e60b21c86f929df16b3a9228d6dacb 100644 (file)
@@ -143,6 +143,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
 {
        WarpModifierData *wmd = (WarpModifierData *) md;
        if (wmd->object_from != NULL && wmd->object_to != NULL) {
+               DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Warplace Modifier");
                DEG_add_object_relation(ctx->node, wmd->object_from, DEG_OB_COMP_TRANSFORM, "Warp Modifier from");
                DEG_add_object_relation(ctx->node, wmd->object_to, DEG_OB_COMP_TRANSFORM, "Warp Modifier to");
        }
index 553f552bb0ad76a8b2d4f5a7db26d2a34027e1c1..a517f753791b8b989b1f510874e31ffdbaf12846 100644 (file)
@@ -123,6 +123,9 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
        if (wmd->map_object != NULL) {
                DEG_add_object_relation(ctx->node, wmd->map_object, DEG_OB_COMP_TRANSFORM, "Wave Modifier");
        }
+       if (wmd->objectcenter != NULL || wmd->map_object != NULL) {
+               DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Wave Modifier");
+       }
 }
 
 static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
index 4bbf73caf922999de84a53ef38b8e8b49449cdf2..bf7517ee6342a38d15e69c51cd2d04f0f864b3dd 100644 (file)
@@ -142,8 +142,9 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
        WeightVGEditModifierData *wmd = (WeightVGEditModifierData *)md;
        if (wmd->mask_tex_map_obj != NULL && wmd->mask_tex_mapping == MOD_DISP_MAP_OBJECT) {
                DEG_add_object_relation(ctx->node, wmd->mask_tex_map_obj, DEG_OB_COMP_TRANSFORM, "WeightVGEdit Modifier");
+               DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "WeightVGEdit Modifier");
        }
-       if (wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL) {
+       else if (wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL) {
                DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "WeightVGEdit Modifier");
        }
 }
index c7a5d4dc70de2dd431c9d978b53638af2310b240..674ef106737431f3980807c5918ece9828bf600a 100644 (file)
@@ -178,8 +178,10 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
        if (wmd->mask_tex_map_obj != NULL && wmd->mask_tex_mapping == MOD_DISP_MAP_OBJECT) {
                DEG_add_object_relation(ctx->node, wmd->mask_tex_map_obj, DEG_OB_COMP_TRANSFORM, "WeightVGMix Modifier");
                DEG_add_object_relation(ctx->node, wmd->mask_tex_map_obj, DEG_OB_COMP_GEOMETRY, "WeightVGMix Modifier");
+
+               DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "WeightVGMix Modifier");
        }
-       if (wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL) {
+       else if (wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL) {
                DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "WeightVGMix Modifier");
                DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_GEOMETRY, "WeightVGMix Modifier");
        }
index bf22051734284a8bcc23348156063d9d9cfce962..6facccaf57abf038726409c5ffa031cfb47c18cd 100644 (file)
@@ -352,10 +352,8 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
                DEG_add_object_relation(ctx->node, wmd->mask_tex_map_obj, DEG_OB_COMP_TRANSFORM, "WeightVGProximity Modifier");
                DEG_add_object_relation(ctx->node, wmd->mask_tex_map_obj, DEG_OB_COMP_GEOMETRY, "WeightVGProximity Modifier");
        }
-       if (wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL) {
-               DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "WeightVGProximity Modifier");
-               DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_GEOMETRY, "WeightVGProximity Modifier");
-       }
+       DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "WeightVGProximity Modifier");
+       DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_GEOMETRY, "WeightVGProximity Modifier");
 }
 
 static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, bool UNUSED(useRenderParams))