91 #ifdef WITH_CXX_GUARDEDALLOC
92 MEM_CXX_CLASS_ALLOC_FUNCS(
"editors:AnimKeylist")
118 for (
size_t index = 0; index < keylist->
column_len; index++) {
119 const bool is_first = (index == 0);
122 const bool is_last = (index == keylist->
column_len - 1);
203 "ED_keylist_prepare_for_direct_access needs to be called before searching.");
212 if (found_column == end) {
224 "ED_keylist_prepare_for_direct_access needs to be called before searching.");
233 if (found_column == end) {
242 "ED_keylist_prepare_for_direct_access needs to be called before searching.");
251 if (found_column == end) {
264 "ED_keylist_prepare_for_direct_access needs to be called before searching.");
275 if (column->
cfra >= frame_range.
max) {
285 "ED_keylist_prepare_for_direct_access needs to be called before accessing array.");
332 r_frame_range->
min = first_column->
cfra;
333 r_frame_range->
max = last_column->
cfra;
350 while (first_column && !(first_column->
sel &
SELECT)) {
351 first_column = first_column->
next;
353 while (last_column && !(last_column->
sel &
SELECT)) {
354 last_column = last_column->
prev;
356 if (!first_column || !last_column || first_column == last_column) {
359 r_frame_range->
min = first_column->
cfra;
360 r_frame_range->
max = last_column->
cfra;
397 if (chain->
prev ==
nullptr && chain->
next ==
nullptr) {
402 const float cur_y = chain->
cur->
vec[1][1];
403 float prev_y = cur_y, next_y = cur_y;
406 prev_y = chain->
prev->
vec[1][1];
409 next_y = chain->
next->
vec[1][1];
413 if (prev_y == cur_y && next_y == cur_y) {
418 if ((prev_y < cur_y && next_y > cur_y) || (prev_y > cur_y && next_y < cur_y)) {
425 const float handle_l = l_bezier ? chain->
cur->
vec[0][1] : cur_y;
426 const float handle_r = r_bezier ? chain->
cur->
vec[2][1] : cur_y;
429 if (prev_y < cur_y || next_y < cur_y) {
430 const bool is_overshoot = (handle_l > cur_y || handle_r > cur_y);
436 if (prev_y > cur_y || next_y > cur_y) {
437 const bool is_overshoot = (handle_l < cur_y || handle_r < cur_y);
590 cursor = cursor->
next;
600 cursor = cursor->
prev;
623 const bool walking_direction_front_to_back = cursor->
cfra <= cfra;
624 if (walking_direction_front_to_back) {
644 "Modifying AnimKeylist isn't allowed after runtime is initialized "
645 "keylist->key_columns/columns_len will get out of sync with runtime.key_columns.");
656 update_func(nearest, userdata);
675 if (
ELEM(
nullptr, keylist, bezt)) {
679 float cfra = bezt->
cur->
vec[1][0];
686 if (
ELEM(
nullptr, keylist, gpf)) {
697 if (
ELEM(
nullptr, keylist, masklay_shape)) {
701 float cfra = masklay_shape->
frame;
760 if (
col->totcurve <= 1 &&
col->totblock == 0) {
765 col->block.conflict |= (
col->block.flag ^ block->
flag);
766 col->block.flag |= block->
flag;
767 col->block.sel |= block->
sel;
779 if (bezt && bezt_len >= 2) {
790 for (
int v = 1;
col !=
nullptr &&
v < bezt_len;
v++, bezt++) {
792 if (
is_cfra_lt(bezt[1].vec[1][0], bezt[0].vec[1][0])) {
802 if (
col->prev !=
nullptr) {
827 for (;
col !=
nullptr;
col =
col->next) {
843 max_curve =
MAX2(max_curve,
col->totcurve);
851 if (
col->totcurve > 0) {
855 else if (prev_ready !=
nullptr) {
860 col->totcurve = max_curve + 1;
871 return ac !=
nullptr && ac->
next !=
nullptr && ac->
totblock > 0;
890 ListBase anim_data = {
nullptr,
nullptr};
904 switch (ale->datatype) {
927 ListBase anim_data = {
nullptr,
nullptr};
931 if (sce ==
nullptr) {
937 dummychan.
data = sce;
938 dummychan.
id = &sce->
id;
942 ac.
data = &dummychan;
962 ListBase anim_data = {
nullptr,
nullptr};
965 Base dummybase = {
nullptr};
975 dummychan.
data = &dummybase;
976 dummychan.
id = &ob->
id;
980 ac.
data = &dummychan;
999 const int saction_flag)
1001 if (cache_file ==
nullptr) {
1008 dummychan.
data = cache_file;
1009 dummychan.
id = &cache_file->
id;
1010 dummychan.
adt = cache_file->
adt;
1014 ac.
data = &dummychan;
1018 ListBase anim_data = {
nullptr,
nullptr};
1076 const int saction_flag)
1081 if (fcu->grp != agrp) {
1101 if (gpd && keylist) {
1115 if (gpl && keylist) {
1129 if (masklay && keylist) {
#define BEZT_BINARYSEARCH_THRESH
bool BKE_fcurve_is_cyclic(struct FCurve *fcu)
#define BLI_assert_msg(a, msg)
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_insertlinkbefore(struct ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1)
#define BEZT_ISSEL_ANY(bezt)
Object is a sort of wrapper for general info.
@ ANIMFILTER_DATA_VISIBLE
@ ACTKEYBLOCK_FLAG_ANY_HOLD
@ ACTKEYBLOCK_FLAG_MOVING_HOLD
@ ACTKEYBLOCK_FLAG_GPENCIL
@ ACTKEYBLOCK_FLAG_NON_BEZIER
@ ACTKEYBLOCK_FLAG_STATIC_HOLD
@ KEYFRAME_HANDLE_AUTO_CLAMP
@ KEYFRAME_HANDLE_ALIGNED
Read Guarded memory(de)allocation.
void ANIM_animdata_freelist(ListBase *anim_data)
void ANIM_nla_mapping_apply_fcurve(AnimData *adt, FCurve *fcu, bool restore, bool only_keys)
size_t ANIM_animdata_filter(bAnimContext *ac, ListBase *anim_data, eAnimFilter_Flags filter_mode, void *data, eAnimCont_Types datatype)
ATTR_WARN_UNUSED_RESULT const BMVert * v
SyclQueue void void size_t num_bytes void
static bool is_cyclic(const Nurb *nu)
DO_INLINE void filter(lfVector *V, fmatrix3x3 *S)
static ActKeyColumn * nalloc_ak_masklayshape(void *data)
BLI_INLINE bool is_cfra_lt(const float a, const float b)
void fcurve_to_keylist(AnimData *adt, FCurve *fcu, AnimKeylist *keylist, const int saction_flag)
BLI_INLINE bool is_cfra_eq(const float a, const float b)
AnimKeylist * ED_keylist_create()
void scene_to_keylist(bDopeSheet *ads, Scene *sce, AnimKeylist *keylist, const int saction_flag)
static ActKeyColumn * ED_keylist_find_exact_or_neighbor_column(AnimKeylist *keylist, float cfra)
void mask_to_keylist(bDopeSheet *UNUSED(ads), MaskLayer *masklay, AnimKeylist *keylist)
static eKeyframeHandleDrawOpts bezt_handle_type(const BezTriple *bezt)
bool actkeyblock_is_valid(const ActKeyColumn *ac)
static void nupdate_ak_gpframe(ActKeyColumn *ak, void *data)
std::function< ActKeyColumn *(void *userdata)> KeylistCreateColumnFunction
std::function< void(ActKeyColumn *, void *)> KeylistUpdateColumnFunction
void gpencil_to_keylist(bDopeSheet *ads, bGPdata *gpd, AnimKeylist *keylist, const bool active)
static ActKeyColumn * nalloc_ak_gpframe(void *data)
static void ED_keylist_reset_last_accessed(AnimKeylist *keylist)
const ActKeyColumn * ED_keylist_find_any_between(const AnimKeylist *keylist, const Range2f frame_range)
static const ActKeyColumn * ED_keylist_find_upper_bound(const AnimKeylist *keylist, const float cfra)
void ob_to_keylist(bDopeSheet *ads, Object *ob, AnimKeylist *keylist, const int saction_flag)
static void keylist_first_last(const struct AnimKeylist *keylist, const struct ActKeyColumn **first_column, const struct ActKeyColumn **last_column)
static void nupdate_ak_masklayshape(ActKeyColumn *ak, void *data)
static void ED_keylist_runtime_init_listbase(AnimKeylist *keylist)
static void add_gpframe_to_keycolumns_list(AnimKeylist *keylist, bGPDframe *gpf)
const ActKeyColumn * ED_keylist_array(const struct AnimKeylist *keylist)
static void ED_keylist_runtime_init(AnimKeylist *keylist)
bool ED_keylist_is_empty(const struct AnimKeylist *keylist)
void cachefile_to_keylist(bDopeSheet *ads, CacheFile *cache_file, AnimKeylist *keylist, const int saction_flag)
static ActKeyColumn * ED_keylist_find_neighbor_back_to_front(ActKeyColumn *cursor, float cfra)
bool ED_keylist_selected_keys_frame_range(const struct AnimKeylist *keylist, Range2f *r_frame_range)
static void nupdate_ak_bezt(ActKeyColumn *ak, void *data)
void summary_to_keylist(bAnimContext *ac, AnimKeylist *keylist, const int saction_flag)
void ED_keylist_prepare_for_direct_access(AnimKeylist *keylist)
const ActKeyColumn * ED_keylist_find_next(const AnimKeylist *keylist, const float cfra)
static void compute_keyblock_data(ActKeyBlockInfo *info, const BezTriple *prev, const BezTriple *beztn)
static void add_keyblock_info(ActKeyColumn *col, const ActKeyBlockInfo *block)
static const ActKeyBlockInfo dummy_keyblock
static ActKeyColumn * ED_keylist_find_neighbor_front_to_back(ActKeyColumn *cursor, float cfra)
int actkeyblock_get_valid_hold(const ActKeyColumn *ac)
void ED_keylist_free(AnimKeylist *keylist)
static ActKeyColumn * nalloc_ak_bezt(void *data)
bool ED_keylist_all_keys_frame_range(const struct AnimKeylist *keylist, Range2f *r_frame_range)
static const ActKeyColumn * ED_keylist_find_lower_bound(const AnimKeylist *keylist, const float cfra)
int64_t ED_keylist_array_len(const struct AnimKeylist *keylist)
void action_to_keylist(AnimData *adt, bAction *act, AnimKeylist *keylist, const int saction_flag)
static eKeyframeExtremeDrawOpts bezt_extreme_type(const BezTripleChain *chain)
static void ED_keylist_convert_key_columns_to_array(AnimKeylist *keylist)
static void ED_keylist_add_or_update_column(AnimKeylist *keylist, float cfra, KeylistCreateColumnFunction create_func, KeylistUpdateColumnFunction update_func, void *userdata)
static void add_bezt_to_keyblocks_list(AnimKeylist *keylist, BezTriple *bezt, const int bezt_len)
const struct ListBase * ED_keylist_listbase(const AnimKeylist *keylist)
static void update_keyblocks(AnimKeylist *keylist, BezTriple *bezt, const int bezt_len)
void gpl_to_keylist(bDopeSheet *UNUSED(ads), bGPDlayer *gpl, AnimKeylist *keylist)
static void add_masklay_to_keycolumns_list(AnimKeylist *keylist, MaskLayerShape *masklay_shape)
void agroup_to_keylist(AnimData *adt, bActionGroup *agrp, AnimKeylist *keylist, const int saction_flag)
static void ED_keylist_runtime_update_key_column_next_prev(AnimKeylist *keylist)
const ActKeyColumn * ED_keylist_find_prev(const AnimKeylist *keylist, const float cfra)
static void add_bezt_to_keycolumns_list(AnimKeylist *keylist, BezTripleChain *bezt)
const ActKeyColumn * ED_keylist_find_exact(const AnimKeylist *keylist, const float cfra)
void *(* MEM_callocN)(size_t len, const char *str)
bool active
all scheduled work for the GPU.
SymEdge< T > * prev(const SymEdge< T > *se)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
static PyObject * create_func(PyObject *, PyObject *args)
struct ActKeyColumn * next
struct ActKeyColumn * prev
struct AnimKeylist::@320 runtime
bool is_runtime_initialized
std::optional< ActKeyColumn * > last_accessed_column
blender::Array< ActKeyColumn > key_columns