Commit Graph

256 Commits

Author SHA1 Message Date
Sybren A. Stüvel
1b09466e13 Refactor: Anim, move some Slot methods next to their siblings
Move some methods on `Slot` in the source file so that they sit next to
their siblings. Some unrelated functions squeezed in between them.

No functional changes.
2024-07-09 15:57:48 +02:00
Nathan Vegdahl
8b44d6fb0d Fix: inserting keys in Action editor for non-active ID doesn't work
After #122672 landed, slots other than the the slot for the currently active
ID became accessible from the Action Editor.  However, the code for inserting
keys directly in the Action Editor assumed that the ID being keyed was
always the active one.  This made inserting keys on slots other than the slot
for the active ID fail because the RNA paths wouldn't resolve for that ID.
Additionally, even if they did resolve (e.g. if the ID type was the same), the
keying code would use the wrong ID anyway, which would result in unexpected
behavior regardless.

This commit fixes this by looking up an ID that actually uses the given slot,
and using that ID to perform the keying.

Note that there are various corner cases that have to be handled, such as when
there is more than one user of a slot (and none of them are the active ID),
which makes the choice ambiguous, or when there are no users of a slot.  We
handle these corner cases by simply keying the fcurves directly, rather than
going through the normal keyframing code paths.  This means that in those corner
cases the value of the property in the scene is ignored, and the fcurve is
simply keyed with whatever value the fcurve evaluates to on that frame.  We may
revisit this in the future if this fallback behavior turns out to not feel good
to users in practice, but for now it seems like a reasonable solution.

Pull Request: https://projects.blender.org/blender/blender/pulls/124227
2024-07-09 11:25:45 +02:00
Campbell Barton
cd1dbab348 Cleanup: spelling in comments 2024-07-07 00:29:39 +10:00
Campbell Barton
48383cf20e Cleanup: avoid shadowing, redundant assignment & minor changes
Quiet cppecheck warnings, use const pointers, ELEM(..) macro,
replace NULL -> nullptr, unsigned int -> uint.
2024-07-07 00:18:00 +10:00
Campbell Barton
c3c69c8956 Merge branch 'blender-v4.2-release' 2024-07-06 15:00:38 +10:00
Campbell Barton
bdf06e6d82 Cleanup: spelling in comments 2024-07-06 14:21:24 +10:00
Jacques Lucke
5360722449 Merge branch 'blender-v4.2-release'
This also reverts da2a262658 and 57e925b38f and fixes a
merge conflict in `action.cc`.
2024-07-05 18:16:08 +02:00
Christoph Lendenfeld
c446813dd3 Fix #123943: manual channel ordering no longer works
The issue was that the function `animfilter_action` got a new
code segment at the start which checked `if (action.is_empty())`.
That function didn't check if the `groups` list of the action is empty
though. Regular keyframe animation is usually sorted into
keyframe groups, which means it is not stored under `curves` of the action.
However in the anim filtering code, the function `split_groups_action_temp`
moves the fcurves to their groups under the `groups` listbase.

Pull Request: https://projects.blender.org/blender/blender/pulls/124172
2024-07-05 17:56:45 +02:00
Sybren A. Stüvel
0aa75ab57b Refactor: rename "Animation data-block" to "Action"
Rename "Animation data-block" to "Action" or "Layered Action", where
appropriate. Some uses of the term actually refer to the `AnimData`
struct, in which case they were left as-is.

No real functional changes, just changing some messages & descriptions.

Pull Request: https://projects.blender.org/blender/blender/pulls/124170
2024-07-05 17:52:55 +02:00
Sybren A. Stüvel
c0364efec0 Refactor: rename 'Action Binding' to 'Action Slot'
Rename 'Binding' to 'Slot'. The old term was causing all kind of
confusion, and 'slot' was considered to be a better term for the
intended functionality.

This commit breaks existing blend files that were using the new layered
Action for their animation. The animation data will be lost due to the
rename, as there is no versioning code or DNA renaming logic. At this
time the new system is still marked as experimental, so shouldn't be
used for anything serious anyway.

Pull Request: https://projects.blender.org/blender/blender/pulls/124170
2024-07-05 17:52:55 +02:00
Sybren A. Stüvel
e466c5315d Anim: fix compiler warning about double declaration
Fix compiler warning about double declaration of
`get_action_binding_pair()`

No functional changes.
2024-07-04 17:53:42 +02:00
Sybren A. Stüvel
1d2cea1e3e Show Action Slots (Bindings) in the Action editor
In the Action mode of the Dope Sheet, show the Bindings, optionally
showing all Bindings in that Action. This also works when different
data-block types are animated from the same Action.

Bindings are selectable in the Action editor with box/range select.
Since there is no use for an 'active Binding' yet, this has not been
implemented, and as a result, clicking on a Binding does nothing.

Note on 'Binding' vs 'Slot': this code change was created before the
decision to change the name from 'Bindings' to 'Slots'. To avoid
confusion, and to keep this PR in sync with the code changes, it still
uses the term 'binding'. Renames of 'Binding' to 'Slot' in the code will
happen after this PR lands.

Pull Request: https://projects.blender.org/blender/blender/pulls/122672
2024-07-04 14:44:19 +02:00
Bastien Montagne
9a13aff4b8 Merge branch 'blender-v4.2-release' 2024-07-04 14:39:58 +02:00
Damien Picard
cc40d9f565 I18n: Fix translations for NLA
- Do not translate a label containing the name of the active NLA
  action.
- Translate default action name when created by inserting a keyframe.
- Translate "<NoAction>" and other default NLA strip names.
- Translate "<NoAction>" displayed in the UI when no action exists in
  the NLA.
- Translate the temporary meta-strip created when moving an NLA strip
  around. This uses DATA_() for consistency, even though it is not
  really user data.

Issues reported by Gabriel Gazzán.

Pull Request: https://projects.blender.org/blender/blender/pulls/124113
2024-07-04 14:35:19 +02:00
Nathan Vegdahl
2e505b76a4 Anim: add a method to Action that ensures a Binding exists for an ID
This PR also uses the new method in the one place I'm currently aware of that
needs it.

The reason to split this out into its own method is that it's coming up again in
upcoming PRs that handle smaller corner cases in the Baklava keyframing code. So
this centralizes the 'ensure binding' logic in one place so it's handled
consistently everywhere.

Since this is a small PR, I've also taken the opportunity to do some minor
cleanup of the affected areas of the keyframing code while I was there anyway.

Pull Request: https://projects.blender.org/blender/blender/pulls/123988
2024-07-02 09:40:40 +02:00
Sybren A. Stüvel
dc2fa02f00 Cleanup: Anim, add documentation to Binding::name_without_prefix()
Just some extra documentation that this is also known as the "display name".

No functional changes.
2024-07-01 13:44:28 +02:00
Nathan Vegdahl
3f3dfe1680 Cleanup: fix unused parameter compiler warning in release builds 2024-06-28 17:42:53 +02:00
Sybren A. Stüvel
c4a7c4e2a1 Anim: add ID* cache of users to Action Bindings
Keep track of which IDs are animated by which Action Binding. This will
be necessary for display in the Action editor, where animation data that
is unrelated to the active object can be shown (when "show all bindings"
is on).

Note: animation evaluation will not be using this cache, at least not in
the near future. Potentially when we introduce animation-level
constraints this will change, but that's for the future.

The user cache isn't actually used in this commit. It will be used soon
in !122672.

Pull Request: https://projects.blender.org/blender/blender/pulls/123187

Pull Request: https://projects.blender.org/blender/blender/pulls/123187
2024-06-28 14:41:27 +02:00
Nathan Vegdahl
c83727f0bd Anim: add functions for asserting Project Baklava phase-1 invariants
This is implemented as an overloaded function,
`assert_baklava_phase_1_invariants()`, with variants for `Action`, `Layer`, and
`Strip`.

The invariants asserted are those that are specific to phase 1 and which will
later be lifted as more features (such as animation layers, additional strip
types, etc.) are added. The intention is for this to serve as a kind of todo
marker for later phases *and* to help ensure that the phase-1 invariants
currently hold at runtime.

In addition to adding the overloaded function itself, this commit also uses it
in a couple of places in the keyframing code.  Upcoming work on the keyframing
code will be using it more.

This is based on a discussion with @dr.sybren.

Pull Request: https://projects.blender.org/blender/blender/pulls/123830
2024-06-28 11:06:34 +02:00
Nathan Vegdahl
cae1faec12 Refactor: bundle fcurve lookup/creation parameters in a struct
This is a follow up to #123022 to clean up the resultant verbose parameter
passing.  We add a new struct `FCurveDescriptor` that contains the parameters
needed for either looking up or creating an fcurve, and that in turn is passed
down the keyframing call chains where fcurve lookup/creation needs to be done.

Pull Request: https://projects.blender.org/blender/blender/pulls/123486
2024-06-28 09:39:51 +02:00
Sybren A. Stüvel
e067b11c3c Anim: add non-const version of animrig::fcurves_all(action)
To avoid code duplication between the const and non-const versions, use
a static function with lotsa template arguments.

Pull Request: https://projects.blender.org/blender/blender/pulls/123722
2024-06-25 14:26:11 +02:00
Nathan Vegdahl
fb0f409237 Fix #123716: autokeying Shape Key fields does not work
The issue had essentially the same origin as #123538 (fixed
in #123719), but in the autokeying code. The autokeying code was
already fully resolving the RNA path to be relative to the owning
ID, but the RNA pointer getting passed with that fully-resolved path
to the keying code was the struct for the not-fully-resolved path.

This fixes it by simply passing the RNA pointer for the owning ID
rather than the struct being keyed.

Pull Request: https://projects.blender.org/blender/blender/pulls/123721
2024-06-25 14:21:02 +02:00
Campbell Barton
a142a7a538 Merge branch 'blender-v4.2-release' 2024-06-25 19:16:33 +10:00
Christoph Lendenfeld
34dcfb365b Fix #88208: Multi user action missing depsgraph update
The issue was a missing Dependency Graph update tag.
That usually happened in `ANIM_list_elem_update/59` but only if the action is still linked
to the `AnimData`. That isn't the case when all keys get deleted because the action is unlinked
in `animdata_fcurve_delete` if the action is empty.

Pull Request: https://projects.blender.org/blender/blender/pulls/123553
2024-06-25 09:45:12 +02:00
Nathan Vegdahl
3ab3ac1b0a Anim: make "XYZ to RGB" user preference work for layered actions
The approach taken here is to pass an optional `PropertySubType` parameter down
the call chain from `insert_key_layered_action()` and terminating at
`create_fcurve_for_channel()`, which uses it to determine the color mode for
new fcurves.

The parameter is optional to allow other callers (e.g. Python RNA functions)
to skip passing it, in which case any new fcurves will get the default rainbow
coloration.

Pull Request: https://projects.blender.org/blender/blender/pulls/123022
2024-06-20 14:05:09 +02:00
Sybren A. Stüvel
aa0e5368e7 Anim: add layered Action support to BKE_action_frame_range_calc()
Add layered Action support to `BKE_action_frame_range_calc()`, by
looping over all F-Curves of all Bindings in the Action.

Introduce `animrig::fcurves_all(action)`, which returns a vector of all
F-Curves in the Action, both for legacy and layered Actions.

No functional changes for legacy Actions.
2024-06-20 10:05:34 +02:00
Nathan Vegdahl
d2260ec183 Cleanup: remove ID prefixes from names in animation tests
The functions that create the IDs already take care of this, so it was
redundant and resulted in confusing reports on test failure.

Pull Request: https://projects.blender.org/blender/blender/pulls/123185
2024-06-13 15:14:25 +02:00
Sybren A. Stüvel
68b4139368 Anim: Change how un-assigning an action binding works
Reorder `Action::assign_id()` so that there is a clear "unassign any
previously-assigned binding" step first, and then a clear "assign the new
binding" step. Previously these were a bit too much intertwined.

Also `animrig::unassign_binding()` now simply calls into `Action::assign_id()`
instead of having somewhat overlapping responsibilities.

Finally the RNA setter for `AnimData.action_binding_handle` is changed
to always call `Action::assign_id()` for both assigning and unassigning
the handle. This ensures the API is properly used, instead of modifying
properties directly.

Pull Request: https://projects.blender.org/blender/blender/pulls/123184
2024-06-13 15:12:25 +02:00
Sybren A. Stüvel
46d50858d4 Anim: remove invalid assertion
Remove the assertion in `animrig::assign_animation()` that the passed
Action is a layered Action. The code works equally well for legacy Actions.

No functional changes.
2024-06-13 12:59:07 +02:00
Nathan Vegdahl
1a4f084806 Refactor: combine insert_keyframe() and insert_key_rna() into a single function
The goal of this PR is to merge `insert_keyframe()` and `insert_key_rna()` into
a single function, `insert_keyframes()`, that fully accommodates the
functionality of both.  This results in a bit of a mega function, which isn't
great, but it centralizes a lot of otherwise redundant keyframing code so it
only needs to be changed in one place in the future.

Future PRs can work to reduce the "mega" aspect of this function, stripping it
down to its core functionality and eliminating left over incidental redundancy
(e.g. passing both `scene_frame` and `anim_eval_context`).

As a wonderful side effect, this PR also makes layered action keyframing work in
most of the remaining places left over from #121661, such as buttons, the
dopesheet, the graph editor, etc.

Pull Request: https://projects.blender.org/blender/blender/pulls/122053
2024-06-11 16:42:55 +02:00
Nathan Vegdahl
6ac8f8efad Anim: use keyframing user preferences for layered action keying
This makes the following user preferences/settings work when inserting keys on layered actions:
- Keyframe type ('Keyframe', 'Breakdown', etc.)
- Handle type (auto, auto-clamped, etc.)
- Interpolation mode (bezier, linear, etc.)

Pull Request: https://projects.blender.org/blender/blender/pulls/123006
2024-06-11 14:10:04 +02:00
Campbell Barton
bdbd6598ad Cleanup: various non-functional changes
- Use brief `uint` type name.
- Remove unnecessary "struct".
- Remove duplicate variable declaration.
- Pass arguments by const reference instead of value.
- Use const argument.
2024-06-11 20:45:06 +10:00
Campbell Barton
55632bee7f Cleanup: spelling in comments 2024-06-11 19:33:19 +10:00
Sybren A. Stüvel
7944fd47dc Refactor: Anim: extract 'can Action be assigned?' logic into function
Extract the 'can this Action be assigned to this ID?' logic from the
RNA function `rna_Action_actedit_assign_poll()` to the `animrig` module.

This way it can be called from multiple places in the future, and tested
properly.

No functional changes.

Pull Request: https://projects.blender.org/blender/blender/pulls/123060
2024-06-11 11:21:19 +02:00
Sybren A. Stüvel
6070357c18 Merge remote-tracking branch 'origin/blender-v4.2-release' 2024-06-11 11:13:54 +02:00
Sybren A. Stüvel
83311ef96d Fix #122777: The keyframe_insert method throws python exceptions
Just for the `pyrna_struct_keyframe_insert()` function, reduce the
reporting level of keyframe insertion failures from `RPT_ERROR` to
`RPT_WARNING`. This prevents the conversion of these reports to a Python
exception.

`CombinedKeyingResult::generate_reports()` now accepts an option
argument `report_level`, so that the caller is in control over the type
of reports it generates.

Previously only errors were converted to exceptions; warnings were
implicitly cleared and never displayed. To avoid these 'keyframe
insertion failure' reports from becoming invisible, the
`pyrna_struct_keyframe_insert()` function now sends any warnings to
stdout (unless there were errors, in which case the old
error-to-exception behaviour is still there).

Pull Request: https://projects.blender.org/blender/blender/pulls/122827
2024-06-11 11:11:16 +02:00
Sybren A. Stüvel
69e520627f Anim: reset idroot when adding a layer or binding to an Action
Legacy Actions can become a layered Action, simply by removing all the
legacy FCurves and adding a layer or binding. This means that
`Action::idroot` can be non-zero, while it should be zero for layered
Actions. This is now enforced in `Action::layer_add()` and
`Action::binding_add()`.

Pull Request: https://projects.blender.org/blender/blender/pulls/123004
2024-06-10 15:57:47 +02:00
Nathan Vegdahl
a36599b323 Anim: implement 3D viewport keyframing functionality for layered actions
This modifies the 3D viewport keyframing operators to work with layered
actions.  The functionality is relative basic, and still leaves some things out.
Of particular note:

- Keyframing with keying sets does not yet work.
- User preferences such as the `XYZ to RGB` flag and the keyframe interpolation
  type are not yet used/respected.
- Something not caused by this PR but revealed by it: when the last keyframe of
  an fcurve is deleted in a layered action, the fcurve still sticks around. This
  is different from legacy actions, which delete fcurves when their last key is
  deleted. Since the "Only Insert Available" feature is based on the existence
  of fcurves, that makes the feature appear broken in some circumstances right
  now with layered actions.

Pull Request: https://projects.blender.org/blender/blender/pulls/121661
2024-06-07 13:26:18 +02:00
Sybren A. Stüvel
e49963c6a7 Refactor: Anim: type conversions for Strip and KeyframeStrip
Two quality-of-life additions to juggle the `Strip` and `KeyframeStrip`
types:

- New function `Layer.strip_add<KeyframeStrip>()` that returns a
  `KeyframeStrip` instead of a `Strip`.
- Implicit conversion operator `operator Strip &()` on `KeyframeStrip`
  so that `KeyframeStrip` can be passed to a parameter of type
  `Strip &`.

No functional changes.

Pull Request: https://projects.blender.org/blender/blender/pulls/122659
2024-06-06 15:29:05 +02:00
Campbell Barton
7f7648c6ed Cleanup: spelling in code comments & minor edits
- Use uppercase NOTE: tags.
- Correct bNote -> bNode.
- Use colon after parameters.
- Use doxy-style doc-strings.
2024-06-06 09:55:13 +10:00
Nathan Vegdahl
b9c7e5e766 Anim: add keyframing unit tests
Add unit tests for the two main keyframing API functions: `insert_key_rna()` and `insert_keyframe()`.

The tests are not exhaustive of every possible permutation of parameters, but the tests do try to hit each of the behaviors in at least one permutation.  In the future tests should also be added for the lower-level keying functions and behaviors as well, but I'm leaving that as future work since we aren't changing/refactoring those functions right now.

Pull Request: https://projects.blender.org/blender/blender/pulls/122553
2024-06-04 16:03:52 +02:00
Sybren A. Stüvel
0be9540775 Refactor: Anim: move animation.cc into action.cc
Move the content of `animation.cc` into `action.cc`. This is part of the
removal of the `Animation` datablock, and the injection of its
functionality into the `Action` datablock.

The test file `animation_test.cc` is renamed to `action_test.cc`.

No functional changes.

Pull Request: https://projects.blender.org/blender/blender/pulls/122480
2024-05-30 12:23:58 +02:00
Nathan Vegdahl
b821e56165 Refactor: Anim: put default channel group names in one place
Previously they were split between two places, and were not fully
consistent with each other.  The inconsistency didn't result in
user-facing inconsistency due to what was called when at a higher
level, but this will ensure continued user-facing consistency as we make
more changes to the keyframing code.

Pull Request: https://projects.blender.org/blender/blender/pulls/122317
2024-05-28 09:59:35 +02:00
Nathan Vegdahl
ec0a3e966c Refactor: Anim: make insert_key_rna() take RNAPath's instead of strings
This allows each path to optionally specify a single array index,
enabling `insert_key_rna()` to optionally insert keys for just a single
element of an array property. This will allow us to use it in more
places, and eventually reduce the total number of keying functions
needed in the code base.

PR #121879

Pull Request: https://projects.blender.org/blender/blender/pulls/121879
2024-05-24 15:06:21 +02:00
Nathan Vegdahl
98b0bfa9e7 Refactor: make yet more fcurve evaluation functions take const fcurves
This follows on after #121788.

Pull Request: https://projects.blender.org/blender/blender/pulls/121882
2024-05-17 15:56:57 +02:00
Nathan Vegdahl
6709d598cf Anim: don't split keyframing error messages into singular and plural
Having different strings for singular/plural is meaningless or
insufficient in some languages, and thus complicates localization
unnecessarily.
2024-05-14 11:55:14 +02:00
Sybren A. Stüvel
0caf6397df Anim, remove Action::binding_for_id() method
Remove the `Action::binding_for_id()` method, as it is a bit dangerous,
only useful in a very specific situation, and can be removed altogether
with just a little bit of refactoring. This in turn made some other
functions a bit simpler too.

Almost no functional changes. The only change is that when through some
magic (aka data corruption or other bug) the Binding is no longer valid
for the animated ID's type, the IDs properties may still show as
animated in the interface.

Pull Request: https://projects.blender.org/blender/blender/pulls/121748
2024-05-13 17:30:37 +02:00
Sybren A. Stüvel
d94a56bdad Anim: merge Animation data-block into bAction
The new/experimental, layered `Animation` data-block is merged with the
existing `bAction` data-block.

The `Animation` data-block is considerably newer than `bAction`, so the
supporting code that was written for it is also more modern. When moving
that code into `bAction`, I chose to keep the modernity where possible,
and thus some of the old code has been updated as well. Things like
preferring references over pointers.

The `Animation` data-block is now gone from DNA, the main database, etc.
As this was still an experimental feature, there is no versioning code
to convert any of that to Actions.

The DNA struct `bAction` now has a C++ wrapper `animrig::Action`, that
can be obtained via `some_action->wrap()`.

`animrig::Action` has functions `is_empty()`, `is_action_legacy()`, and
`is_action_layered()`. They **all** return `true` when the Action is
empty, as in that case none of the data that makes an action either
'legacy' or 'layered' is there.

The 'animation filtering' code (for showing things in the dope sheet,
graph editor, etc) that I wrote for `Animation` is intentionally kept
around. These types now target 'layered actions' and the
already-existing ones 'legacy actions'. A future PR may merge these two
together, but given how much work it was to add something new there, I'd
rather wait until the dust has settled on this commit.

There are plenty of variables (and some comments) named `anim` or
`animation` that now are of type `animrig::Action`. I haven't renamed
them all, to keep the noise level low in this commit (it's already big
enough). This can be done in a followup, non-functional PR.

Related task: #121355

Pull Request: https://projects.blender.org/blender/blender/pulls/121357
2024-05-13 15:58:04 +02:00
Nathan Vegdahl
58cf1a7c44 Refactor: centralize responsibility for "Only Insert Needed"
This moves the responsibility for handling the "Only Insert Needed"
flag from `insert_keyframe_value()` to the lower-level function
`insert_vert_fcurve()`.

We're doing this because `insert_vert_fcurve()` is the common entry
point between the new animation system's and old animation system's
keyframing code. This therefore ensures that both systems will
behave the same way with respect to the "Only Insert Needed" flag.

Pull Request: https://projects.blender.org/blender/blender/pulls/121525
2024-05-10 17:11:19 +02:00
Nathan Vegdahl
fa201712e1 Anim: simplify object/pose autokeying code
Both `autokeyframe_object()` and `autokeyframe_pose_channel()` had an
odd structure where they would call completely different keying
functions depending on whether "Only Insert Available" was toggled on
or not. This not only overcomplicated the code, but also introduced
the possibility for divergent keyframing behavior depending on whether
that flag was set or not, beyond the intended effect of the flag.

This commit changes both functions to call the same keyframing function
(which already handles that flag correctly on its own) regardless of
whether that flag is set or not, unifying the keyframing behavior and
simplifying the code.

As a happy side effect, auto-keyframing failures are now reported even
when "Only Insert Available" is disabled, which wasn't the case before.
(An example of the aforementioned unintentional divergent behavior.)

Pull Request: https://projects.blender.org/blender/blender/pulls/121476
2024-05-10 17:00:03 +02:00