Dependency cycles for confusing reasons

I’ve been getting dependency cycle warnings for armatures and I don’t know why. It finds 756 dependency cyles for 18 armatures (42 each). It looks like all of them say Geometry Component/GEOMETRY_EVAL() depends on

I can’t interpret the message. I pasted the output of one cycle below:

Dependency cycle detected:
  OBHeather/Geometry Component/GEOMETRY_EVAL() depends on
  OBHeather.arm/Thumb3.L/BONE_DONE() via 'Armature Modifier'
  OBHeather.arm/Thumb3.L/BONE_READY() via 'Ready -> Done'
  OBHeather.arm/Thumb3.L/BONE_POSE_PARENT() via 'Pose -> Ready'
  OBHeather.arm/Thumb2.L/BONE_DONE() via 'Parent Bone -> Child Bone'
  OBHeather.arm/Thumb2.L/BONE_READY() via 'Ready -> Done'
  OBHeather.arm/Thumb2.L/BONE_POSE_PARENT() via 'Pose -> Ready'
  OBHeather.arm/Thumb1.L/BONE_DONE() via 'Parent Bone -> Child Bone'
  OBHeather.arm/Thumb1.L/BONE_READY() via 'Ready -> Done'
  OBHeather.arm/Thumb1.L/BONE_POSE_PARENT() via 'Pose -> Ready'
  OBHeather.arm/Hand.L/BONE_DONE() via 'Parent Bone -> Child Bone'
  OBHeather.arm/Hand.L/BONE_READY() via 'Ready -> Done'
  OBHeather.arm/Hand.L/BONE_CONSTRAINTS() via 'Constraints -> Ready'
  OBHeather.arm/Hand.L/BONE_POSE_PARENT() via 'Pose -> Constraints Stack'
  OBHeather.arm/LowArmY.L/BONE_DONE() via 'Parent Bone -> Child Bone'
  OBHeather.arm/LowArmY.L/BONE_READY() via 'Ready -> Done'
  OBHeather.arm/LowArmY.L/BONE_CONSTRAINTS() via 'Constraints -> Ready'
  OBHeather.arm/LowArmY.L/BONE_POSE_PARENT() via 'Pose -> Constraints Stack'
  OBHeather.arm/LowArm.L/BONE_DONE() via 'Parent Bone -> Child Bone'
  OBHeather.arm/LowArm.L/BONE_READY() via 'Ready -> Done'
  OBHeather.arm/LowArm.L/BONE_CONSTRAINTS() via 'Constraints -> Ready'
  OBHeather.arm/LowArm.L/BONE_POSE_PARENT() via 'Pose -> Constraints Stack'
  OBHeather.arm/UpArmY.L/BONE_DONE() via 'Parent Bone -> Child Bone'
  OBHeather.arm/UpArmY.L/BONE_READY() via 'Ready -> Done'
  OBHeather.arm/UpArmY.L/BONE_POSE_PARENT() via 'Pose -> Ready'
  OBHeather.arm/UpArm.L/BONE_DONE() via 'Parent Bone -> Child Bone'
  OBHeather.arm/UpArm.L/BONE_READY() via 'Ready -> Done'
  OBHeather.arm/UpArm.L/BONE_CONSTRAINTS() via 'Constraints -> Ready'
  OBHeather/Geometry Component/GEOMETRY_EVAL() via 'Damped Track'

Is Geometry Component/GEOMETRY_EVAL() something specific, or does it cover all transforms (location, rotation, and scale)? The chain in this code goes: Thumb3.L > Thumb2.L > Thumb1.L > Hand.L > LowArmY.L > LowArm.L > UpArmY.L > UpArm.L. All the bones in this chain are parented to the next bone in sequence. I don’t understand Thumb3.L/BONE_DONE() via 'Armature Modifier' because I didn’t think armatuers had modifiers. I thought modifiers were for meshes. The Thumb3.L bone has no bone constraints.

I have attached my armature. It is complex. The bones are in two different layers. The second layer contains bones that are not meant to be transformed manually, but transform based on bone constraints and drivers. Issues discussed in this thread Armature is distorted in 2.80 but not 2.79 are why I designed the armature the way I did.
armature_20200126.blend (1.0 MB)

“Geometry depends on thumb.L via armature modifier” means your mesh has an armature modifier and has weights to thumb.L that mean that the final position of the mesh is dependent on the transformation of thumb.L. It’s not about loc/rot/scale, it’s about the armature modifier.

“…geometry via damped track” means that your uparm.L bone is trying to damped track a position on your mesh. Since mesh depends on thumb, thumb depends on uparm, and uparm depends on mesh, there’s the dependency loop.

Looking at your file, I don’t see that uparm is trying to damped track your mesh. I don’t see dependency cycles loading in 2.81. But I do see a bunch of errors in the console window related to drivers, and I see a few untargeted damped track constraints, incl. on uparm.L. Presumably there’s a difference in addons or versioning or something.

Parenting is not the only thing that can cause a dependency loop. (In fact, IIRC, it’s one of the few things that can’t, not all by itself, because Blender will fail parenting with “loop in parents” before that happens.) Modifiers, constraints both cause dependencies as well.

1 Like

Thanks for the response. There is a Python script that I forgot to include that the drivers refer to. I didn’t include the mesh that this armature goes with because I wasn’t sure I want to put it online where anyone can download it. When I looked at my original file I see that some of the bone constraints incorrectly use the mesh as the target instead of the armature. Now it makes sense why the armature depends on the mesh. Since there are a lot of bone constraints, I’ll have to write a Python script to fix them, and I’ll see if that fixes the dependency cycles.

I think I fixed the dependency cycles and bone constraints with the wrong targets, but I still get messages like this:

add_node_handle_relation(Hook Modifier) - Could not find op_from (ComponentKey(OBJennifer.ShlHook.L, BONE, 'Bone'))
add_node_handle_relation(Hook Modifier) - Could not find op_from (ComponentKey(OBJennifer.ShlHook1.L, BONE, 'Bone'))

What does this mean? I have a lattice object called Jennifer.ShlLat1.L that has a hook modifier with a target of an empty called Jennifer.ShlHook1.L but couldn’t find anything wrong with it.