Bone Action Constraints with shared Action leads to glitches
Closed, ResolvedPublic

Description

System Information
Suse Leap 42.1
NVidia GTX 560ti (official drivers)

Blender Version
Broken: 2.77a
Worked: -

Short description of error
If Bone Action Constraints are assigned to bones in different armatures and all share the same Action, the animation will usually glitch if two or more targets are moved at the same time. Affects view-port and final renders.

Example video:
https://www.youtube.com/watch?v=uYD3E5xaJag&t=41

Exact steps for others to reproduce the error

  • open .blend
  • select all Empties
  • move slowly along Z axis
  • bone animations will glitch

Workaround

  • create copies of the original Action - one for each bone/constraint (looks like Blender might be caching the Action positions?)

Related Objects

Paul R (intracube) updated the task description. (Show Details)
Paul R (intracube) raised the priority of this task from to Needs Triage.
Paul R (intracube) set Type to Bug.
Bastien Montagne (mont29) triaged this task as Confirmed priority.Apr 22 2016, 1:06 PM

This is a threading issue (running Blender mono-threaded, with -t 1 command line option, shows no problem). We are evaluating the same action in parallel for different frames, fiddling with its update flags, etc. No good.

@Sergey Sharybin (sergey) from quick look, think we can either:

  • Lock around action evaluation itself (last part of what_does_obaction(), or maybe even in constraint exec itself).
  • Make temp copy of action for its evaluation (but would expect this to be overkilling?).
  • Change depsgraph to check this situation??? Doubt this is really doable or desired though.

First solution sounds simpler one to me, but likely not the optimal one…

This is a threading issue (running Blender mono-threaded, with -t 1 command line option, shows no problem).

Ah, thanks.

Can confirm that -t 1 fixes the issue with all my armature/constraint setups.

We could move away from using FCurve.curval.
This patch fixes the bug for me: P364

... just makes some local changes to avoid using FCurve.curval.

It's now working as expected. Thanks for the fix!