From 72acce43bc34e5e9569606e08ee536b02cab088b Mon Sep 17 00:00:00 2001 From: Alexander Gavrilov Date: Tue, 27 Jul 2021 10:39:52 +0300 Subject: Animation: allow marking actions as cyclic for Cycle-Aware Keying. When a manual frame range is set, allow marking an action as having Cyclic Animation. This does not affect how the action is evaluated, but the Cycle-Aware Keying option will automatically make any newly added F-Curves cyclic. This allows using the option from the start to build the cycle, rather than only for tweaking an existing loop. The curves are made cyclic when they have only one key, either after inserting the first key, or before adding the second one. The latter case avoids the need to manually make the first added curve cyclic after marking a newly added action cyclic. Differential Revision: https://developer.blender.org/D11803 --- source/blender/blenkernel/BKE_action.h | 3 +++ source/blender/blenkernel/intern/action.c | 6 ++++++ source/blender/blenkernel/intern/nla.c | 5 +++++ 3 files changed, 14 insertions(+) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h index 6d457ed32f0..b5e94793658 100644 --- a/source/blender/blenkernel/BKE_action.h +++ b/source/blender/blenkernel/BKE_action.h @@ -98,6 +98,9 @@ void BKE_action_get_frame_range(const struct bAction *act, float *r_start, float /* Does action have any motion data at all? */ bool action_has_motion(const struct bAction *act); +/* Is the action configured as cyclic. */ +bool BKE_action_is_cyclic(const struct bAction *act); + /* Action Groups API ----------------- */ /* Get the active action-group for an Action */ diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index 47db5183e76..408a0b3065e 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -1591,6 +1591,12 @@ void BKE_action_get_frame_range(const struct bAction *act, float *r_start, float } } +/* Is the action configured as cyclic. */ +bool BKE_action_is_cyclic(const struct bAction *act) +{ + return act && (act->flag & ACT_FRAME_RANGE) && (act->flag & ACT_CYCLIC); +} + /* Return flags indicating which transforms the given object/posechannel has * - if 'curves' is provided, a list of links to these curves are also returned */ diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c index 0666c1dfc53..8f2a60358e7 100644 --- a/source/blender/blenkernel/intern/nla.c +++ b/source/blender/blenkernel/intern/nla.c @@ -395,6 +395,11 @@ NlaStrip *BKE_nlastrip_new(bAction *act) strip->flag &= ~NLASTRIP_FLAG_SYNC_LENGTH; } + /* Enable cyclic time for known cyclic actions. */ + if (BKE_action_is_cyclic(act)) { + strip->flag |= NLASTRIP_FLAG_USR_TIME_CYCLIC; + } + /* assign the action reference */ strip->act = act; id_us_plus(&act->id); -- cgit v1.2.3