Fix T71259: Array Modifier Performance is slow
authorSergey Sharybin <sergey.vfx@gmail.com>
Mon, 4 Nov 2019 13:14:03 +0000 (14:14 +0100)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 5 Nov 2019 13:48:44 +0000 (14:48 +0100)
Was happening when object transform is animated.

Caused by overly aggressive dependency construction introduced a
while back in 9d4129eee649: we shouldn't add dependencies unless
we really need them.

This change removes unneeded transform dependency for cap objects
(since only their geometry is used), and also removes own transform
dependency if there is no offset object (which is the only case when
own transform is needed).

Differential Revision: https://developer.blender.org/D6184

source/blender/modifiers/intern/MOD_array.c

index 644ac3a10e8947a455efefb9d4a29e0de76864e6..3b50cfe704a5e31db33dc08ef25bc5e955b00fde 100644 (file)
@@ -80,15 +80,12 @@ static void foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk,
 static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
 {
   ArrayModifierData *amd = (ArrayModifierData *)md;
+  bool need_transform_dependency = false;
   if (amd->start_cap != NULL) {
-    DEG_add_object_relation(
-        ctx->node, amd->start_cap, DEG_OB_COMP_TRANSFORM, "Array Modifier Start Cap");
     DEG_add_object_relation(
         ctx->node, amd->start_cap, DEG_OB_COMP_GEOMETRY, "Array Modifier Start Cap");
   }
   if (amd->end_cap != NULL) {
-    DEG_add_object_relation(
-        ctx->node, amd->end_cap, DEG_OB_COMP_TRANSFORM, "Array Modifier End Cap");
     DEG_add_object_relation(
         ctx->node, amd->end_cap, DEG_OB_COMP_GEOMETRY, "Array Modifier End Cap");
   }
@@ -100,8 +97,12 @@ 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");
+    need_transform_dependency = true;
+  }
+
+  if (need_transform_dependency) {
+    DEG_add_modifier_to_transform_relation(ctx->node, "Array Modifier");
   }
-  DEG_add_modifier_to_transform_relation(ctx->node, "Array Modifier");
 }
 
 BLI_INLINE float sum_v3(const float v[3])