Depsgraph: Add utility function for transform dependency
authorSergey Sharybin <sergey.vfx@gmail.com>
Tue, 12 Feb 2019 11:01:17 +0000 (12:01 +0100)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 12 Feb 2019 11:07:59 +0000 (12:07 +0100)
This is what modifiers are to use to indicate that they depend
on a transformation of the object itself.

Currently should be no functional changes, but in the future
this will allow to easily change transform operation depending
on whether there is a simulation associated with the object.

27 files changed:
source/blender/depsgraph/DEG_depsgraph_build.h
source/blender/depsgraph/intern/builder/deg_builder_relations.cc
source/blender/depsgraph/intern/builder/deg_builder_relations.h
source/blender/depsgraph/intern/depsgraph_build.cc
source/blender/modifiers/intern/MOD_armature.c
source/blender/modifiers/intern/MOD_array.c
source/blender/modifiers/intern/MOD_boolean.c
source/blender/modifiers/intern/MOD_cast.c
source/blender/modifiers/intern/MOD_cloth.c
source/blender/modifiers/intern/MOD_curve.c
source/blender/modifiers/intern/MOD_datatransfer.c
source/blender/modifiers/intern/MOD_displace.c
source/blender/modifiers/intern/MOD_hook.c
source/blender/modifiers/intern/MOD_lattice.c
source/blender/modifiers/intern/MOD_mask.c
source/blender/modifiers/intern/MOD_mirror.c
source/blender/modifiers/intern/MOD_normal_edit.c
source/blender/modifiers/intern/MOD_screw.c
source/blender/modifiers/intern/MOD_shrinkwrap.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 0d90f64..fe18193 100644 (file)
@@ -142,9 +142,18 @@ void DEG_add_generic_id_relation(struct DepsNodeHandle *node_handle,
                                  struct ID *id,
                                  const char *description);
 
+/* Special function which is used from modifiers' updateDepsgraph() callback
+ * to indicate that the modifietr needs to know transformation of the object
+ * which that modifier belongs to.
+ * This function will take care of checking which operation is required to
+ * have transformation for the modifier, taking into account possible simulation
+ * solvers. */
+void DEG_add_modifier_to_transform_relation(
+        struct DepsNodeHandle *node_handle,
+        const char *description);
+
 /* Adds relations from the given component of a given object to the given node
- * handle AND the component to the point cache component of the node's ID.
- */
+ * handle AND the component to the point cache component of the node's ID. */
 void DEG_add_object_pointcache_relation(struct DepsNodeHandle *node_handle,
                                         struct Object *object,
                                         eDepsObjectComponentType component,
index c62fc60..0888105 100644 (file)
@@ -278,6 +278,25 @@ bool DepsgraphRelationBuilder::has_node(const OperationKey &key) const
        return find_node(key) != NULL;
 }
 
+void DepsgraphRelationBuilder::add_modifier_to_transform_relation(
+        const DepsNodeHandle *handle,
+        const char *description)
+{
+       /* Geometry operation, this is where relation will be wired to. */
+       OperationNode *geometry_operation_node =
+               handle->node->get_entry_operation();
+       BLI_assert(geometry_operation_node->owner->type == NodeType::GEOMETRY);
+       /* Transform operation, the source of the relation. */
+       ID *id = geometry_operation_node->owner->owner->id_orig;
+       ComponentKey transform_component_key(id, NodeType::TRANSFORM);
+       Node *transform_node = get_node(transform_component_key);
+       OperationNode *transform_operation_node =
+               transform_node->get_exit_operation();
+       /* Wire up the actual relation. */
+       add_operation_relation(
+               transform_operation_node, geometry_operation_node, description);
+}
+
 void DepsgraphRelationBuilder::add_customdata_mask(Object *object, uint64_t mask)
 {
        if (mask != 0 && object != NULL && object->type == OB_MESH) {
index 8765a8a..de39f62 100644 (file)
@@ -194,6 +194,12 @@ struct DepsgraphRelationBuilder
                                           const char *description,
                                           int flags = 0);
 
+       /* Adds relation from proper transformation opertation to the modifier.
+        * Takes care of checking for possible physics solvers modifying position
+        * of this object. */
+       void add_modifier_to_transform_relation(const DepsNodeHandle *handle,
+                                               const char *description);
+
        void add_customdata_mask(Object *object, uint64_t mask);
        void add_special_eval_flag(ID *object, uint32_t flag);
 
index e44a985..8720e40 100644 (file)
@@ -190,6 +190,16 @@ void DEG_add_generic_id_relation(struct DepsNodeHandle *node_handle,
                                                           description);
 }
 
+void DEG_add_modifier_to_transform_relation(
+        struct DepsNodeHandle *node_handle,
+        const char *description)
+{
+       DEG::DepsNodeHandle *deg_node_handle = get_node_handle(node_handle);
+       deg_node_handle->builder->add_modifier_to_transform_relation(
+               deg_node_handle,
+               description);
+}
+
 void DEG_add_special_eval_flag(struct DepsNodeHandle *node_handle,
                                ID *id,
                                uint32_t flag)
index 6781081..282cec4 100644 (file)
@@ -97,7 +97,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
                DEG_add_object_relation(ctx->node, amd->object, DEG_OB_COMP_EVAL_POSE, "Armature Modifier");
                DEG_add_object_relation(ctx->node, amd->object, DEG_OB_COMP_TRANSFORM, "Armature Modifier");
        }
-       DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Armature Modifier");
+       DEG_add_modifier_to_transform_relation(ctx->node, "Armature Modifier");
 }
 
 static void deformVerts(
index e0ae1cc..269e1b0 100644 (file)
@@ -95,7 +95,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");
+       DEG_add_modifier_to_transform_relation(ctx->node, "Array Modifier");
 }
 
 BLI_INLINE float sum_v3(const float v[3])
index d7fca5c..1a2c448 100644 (file)
@@ -89,7 +89,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
                DEG_add_object_relation(ctx->node, bmd->object, DEG_OB_COMP_GEOMETRY, "Boolean Modifier");
        }
        /* We need own transformation as well. */
-       DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Boolean Modifier");
+       DEG_add_modifier_to_transform_relation(ctx->node, "Boolean Modifier");
 }
 
 static Mesh *get_quick_mesh(
index c3aa839..4113656 100644 (file)
@@ -90,7 +90,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
        CastModifierData *cmd = (CastModifierData *)md;
        if (cmd->object != NULL) {
                DEG_add_object_relation(ctx->node, cmd->object, DEG_OB_COMP_TRANSFORM, "Cast Modifier");
-               DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Cast Modifier");
+               DEG_add_modifier_to_transform_relation(ctx->node, "Cast Modifier");
        }
 }
 
index 1cf126d..8b9a28f 100644 (file)
@@ -122,7 +122,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
                DEG_add_collision_relations(ctx->node, ctx->object, clmd->coll_parms->group, eModifierType_Collision, NULL, "Cloth Collision");
                DEG_add_forcefield_relations(ctx->node, ctx->object, clmd->sim_parms->effector_weights, true, 0, "Cloth Field");
        }
-       DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Cloth Modifier");
+       DEG_add_modifier_to_transform_relation(ctx->node, "Cloth Modifier");
 }
 
 static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
index 8a0ee54..d4e56f9 100644 (file)
@@ -91,7 +91,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
                DEG_add_special_eval_flag(ctx->node, &cmd->object->id, DAG_EVAL_NEED_CURVE_PATH);
        }
 
-       DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Curve Modifier");
+       DEG_add_modifier_to_transform_relation(ctx->node, "Curve Modifier");
 }
 
 static void deformVerts(
index 2d18974..d9f73c4 100644 (file)
@@ -128,7 +128,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
 
                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");
+                       DEG_add_modifier_to_transform_relation(ctx->node, "DataTransfer Modifier");
                }
        }
 }
index 3a9f25c..45d09c9 100644 (file)
@@ -136,14 +136,14 @@ 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_modifier_to_transform_relation(ctx->node, "Displace Modifier");
                DEG_add_object_relation(ctx->node, dmd->map_object, DEG_OB_COMP_TRANSFORM, "Displace Modifier");
        }
        if (dmd->texmapping == MOD_DISP_MAP_GLOBAL ||
            (ELEM(dmd->direction, MOD_DISP_DIR_X, MOD_DISP_DIR_Y, MOD_DISP_DIR_Z, MOD_DISP_DIR_RGB_XYZ) &&
            dmd->space == MOD_DISP_SPACE_GLOBAL))
        {
-               DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Displace Modifier");
+               DEG_add_modifier_to_transform_relation(ctx->node, "Displace Modifier");
        }
        if (dmd->texture != NULL) {
                DEG_add_generic_id_relation(ctx->node, &dmd->texture->id, "Displace Modifier");
index 8c9d2f3..36f64d8 100644 (file)
@@ -112,7 +112,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
                DEG_add_object_relation(ctx->node, hmd->object, DEG_OB_COMP_TRANSFORM, "Hook Modifier");
        }
        /* We need own transformation as well. */
-       DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Hook Modifier");
+       DEG_add_modifier_to_transform_relation(ctx->node, "Hook Modifier");
 }
 
 struct HookData_cb {
index f020a3a..01c212e 100644 (file)
@@ -80,7 +80,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
                DEG_add_object_relation(ctx->node, lmd->object, DEG_OB_COMP_GEOMETRY, "Lattice Modifier");
                DEG_add_object_relation(ctx->node, lmd->object, DEG_OB_COMP_TRANSFORM, "Lattice Modifier");
        }
-       DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Lattice Modifier");
+       DEG_add_modifier_to_transform_relation(ctx->node, "Lattice Modifier");
 }
 
 static void deformVerts(
index 35a31fa..173a377 100644 (file)
@@ -69,7 +69,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");
+               DEG_add_modifier_to_transform_relation(ctx->node, "Mask Modifier");
        }
 }
 
index 0b49f78..a1659b2 100644 (file)
@@ -66,7 +66,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
        MirrorModifierData *mmd = (MirrorModifierData *)md;
        if (mmd->mirror_ob != NULL) {
                DEG_add_object_relation(ctx->node, mmd->mirror_ob, DEG_OB_COMP_TRANSFORM, "Mirror Modifier");
-               DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Mirror Modifier");
+               DEG_add_modifier_to_transform_relation(ctx->node, "Mirror Modifier");
        }
 }
 
index 923f7ba..a8d95e0 100644 (file)
@@ -531,7 +531,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");
+               DEG_add_modifier_to_transform_relation(ctx->node, "NormalEdit Modifier");
        }
 }
 
index d86509e..db1cf34 100644 (file)
@@ -1107,7 +1107,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");
+               DEG_add_modifier_to_transform_relation(ctx->node, "Screw Modifier");
        }
 }
 
index c0999af..39f3412 100644 (file)
@@ -157,7 +157,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
                        DEG_add_special_eval_flag(ctx->node, &smd->auxTarget->id, DAG_EVAL_NEED_SHRINKWRAP_BOUNDARY);
                }
        }
-       DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "Shrinkwrap Modifier");
+       DEG_add_modifier_to_transform_relation(ctx->node, "Shrinkwrap Modifier");
 }
 
 static bool dependsOnNormals(ModifierData *md)
index 40df040..8f51a9a 100644 (file)
@@ -367,7 +367,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");
+               DEG_add_modifier_to_transform_relation(ctx->node, "SimpleDeform Modifier");
        }
 }
 
index 3b84a2f..0b0e839 100644 (file)
@@ -99,7 +99,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
                }
        }
        if (do_add_own_transform) {
-               DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "UV Project Modifier");
+               DEG_add_modifier_to_transform_relation(ctx->node, "UV Project Modifier");
        }
 }
 
index 13b1391..dc65151 100644 (file)
@@ -241,7 +241,7 @@ 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");
+       DEG_add_modifier_to_transform_relation(ctx->node, "UVWarp Modifier");
 }
 
 ModifierTypeInfo modifierType_UVWarp = {
index 757ca96..c6140ba 100644 (file)
@@ -135,7 +135,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_modifier_to_transform_relation(ctx->node, "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 fcace4b..fad67b7 100644 (file)
@@ -112,7 +112,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
                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");
+               DEG_add_modifier_to_transform_relation(ctx->node, "Wave Modifier");
        }
        if (wmd->texture != NULL) {
                DEG_add_generic_id_relation(ctx->node, &wmd->texture->id, "Wave Modifier");
index e7a360f..b681cbe 100644 (file)
@@ -133,10 +133,10 @@ 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");
+               DEG_add_modifier_to_transform_relation(ctx->node, "WeightVGEdit Modifier");
        }
        else if (wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL) {
-               DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "WeightVGEdit Modifier");
+               DEG_add_modifier_to_transform_relation(ctx->node, "WeightVGEdit Modifier");
        }
        if (wmd->mask_texture != NULL) {
                DEG_add_generic_id_relation(ctx->node, &wmd->mask_texture->id, "WeightVGEdit Modifier");
index b20a062..b16ef17 100644 (file)
@@ -170,10 +170,10 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
                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");
+               DEG_add_modifier_to_transform_relation(ctx->node, "WeightVGMix Modifier");
        }
        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_modifier_to_transform_relation(ctx->node, "WeightVGMix Modifier");
                DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_GEOMETRY, "WeightVGMix Modifier");
        }
        if (wmd->mask_texture != NULL) {
index 63b8055..bb3898f 100644 (file)
@@ -347,7 +347,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
        if (wmd->mask_texture != NULL) {
                DEG_add_generic_id_relation(ctx->node, &wmd->mask_texture->id, "WeightVGProximity Modifier");
        }
-       DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_TRANSFORM, "WeightVGProximity Modifier");
+       DEG_add_modifier_to_transform_relation(ctx->node, "WeightVGProximity Modifier");
        DEG_add_object_relation(ctx->node, ctx->object, DEG_OB_COMP_GEOMETRY, "WeightVGProximity Modifier");
 }