diff options
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/fcurve.c | 32 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/fcurve_test.cc | 35 |
2 files changed, 67 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c index d0f23221ed0..856e0e872b3 100644 --- a/source/blender/blenkernel/intern/fcurve.c +++ b/source/blender/blenkernel/intern/fcurve.c @@ -830,6 +830,38 @@ bool BKE_fcurve_calc_range( /** \} */ /* -------------------------------------------------------------------- */ +/** \name Active Keyframe + * \{ */ + +/** + * Set the index that stores the FCurve's active keyframe, assuming that \a active_bezt + * is already part of `fcu->bezt`. If NULL, set active keyframe index to "none." + */ +void BKE_fcurve_active_keyframe_set(FCurve *fcu, const BezTriple *active_bezt) +{ + fcu->active_keyframe_index = (active_bezt == NULL) ? FCURVE_ACTIVE_KEYFRAME_NONE : + active_bezt - fcu->bezt; +} + +/** + * Get the active keyframe index, with sanity checks for point bounds. + */ +int BKE_fcurve_active_keyframe_index(const FCurve *fcu) +{ + const int active_keyframe_index = fcu->active_keyframe_index; + + /* Sanity checks. */ + if ((fcu->bezt == NULL) || (active_keyframe_index >= fcu->totvert) || + (active_keyframe_index < 0)) { + return FCURVE_ACTIVE_KEYFRAME_NONE; + } + + return active_keyframe_index; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ /** \name Status Checks * \{ */ diff --git a/source/blender/blenkernel/intern/fcurve_test.cc b/source/blender/blenkernel/intern/fcurve_test.cc index dd672df744b..a58f519adfb 100644 --- a/source/blender/blenkernel/intern/fcurve_test.cc +++ b/source/blender/blenkernel/intern/fcurve_test.cc @@ -273,4 +273,39 @@ TEST(fcurve_subdivide, BKE_bezt_subdivide_handles) BKE_fcurve_free(fcu); } +TEST(fcurve_active_keyframe, ActiveKeyframe) +{ + FCurve *fcu = BKE_fcurve_create(); + + /* There should be no active keyframe with no points. */ + EXPECT_EQ(BKE_fcurve_active_keyframe_index(fcu), FCURVE_ACTIVE_KEYFRAME_NONE); + + /* Check that adding new points sets the active index. */ + EXPECT_EQ(insert_vert_fcurve(fcu, 1.0f, 7.5f, BEZT_KEYTYPE_KEYFRAME, INSERTKEY_NO_USERPREF), 0); + EXPECT_EQ(BKE_fcurve_active_keyframe_index(fcu), 0); + EXPECT_EQ(insert_vert_fcurve(fcu, 8.0f, 15.0f, BEZT_KEYTYPE_KEYFRAME, INSERTKEY_NO_USERPREF), 1); + EXPECT_EQ(BKE_fcurve_active_keyframe_index(fcu), 1); + EXPECT_EQ(insert_vert_fcurve(fcu, 14.0f, 8.2f, BEZT_KEYTYPE_KEYFRAME, INSERTKEY_NO_USERPREF), 2); + EXPECT_EQ(BKE_fcurve_active_keyframe_index(fcu), 2); + + /* Check clearing the index. */ + BKE_fcurve_active_keyframe_set(fcu, NULL); + EXPECT_EQ(fcu->active_keyframe_index, FCURVE_ACTIVE_KEYFRAME_NONE); + EXPECT_EQ(BKE_fcurve_active_keyframe_index(fcu), FCURVE_ACTIVE_KEYFRAME_NONE); + + /* Check a "normal" action. */ + BKE_fcurve_active_keyframe_set(fcu, &fcu->bezt[2]); + EXPECT_EQ(BKE_fcurve_active_keyframe_index(fcu), 2); + + /* Check out of bounds. */ + BKE_fcurve_active_keyframe_set(fcu, fcu->bezt - 20); + EXPECT_EQ(BKE_fcurve_active_keyframe_index(fcu), FCURVE_ACTIVE_KEYFRAME_NONE); + + /* Check out of bounds again. */ + BKE_fcurve_active_keyframe_set(fcu, fcu->bezt + 4); + EXPECT_EQ(BKE_fcurve_active_keyframe_index(fcu), FCURVE_ACTIVE_KEYFRAME_NONE); + + BKE_fcurve_free(fcu); +} + } // namespace blender::bke::tests |