Blender V4.3
keyframes_keylist.cc File Reference
#include <algorithm>
#include <cfloat>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <optional>
#include "MEM_guardedalloc.h"
#include "BLI_array.hh"
#include "BLI_bounds.hh"
#include "BLI_listbase.h"
#include "BLI_range.h"
#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_cachefile_types.h"
#include "DNA_gpencil_legacy_types.h"
#include "DNA_mask_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "BKE_fcurve.hh"
#include "BKE_grease_pencil.hh"
#include "ED_anim_api.hh"
#include "ED_keyframes_keylist.hh"
#include "ANIM_action.hh"

Go to the source code of this file.

Classes

struct  GreasePencilCel
 
struct  AnimKeylist
 
struct  BezTripleChain
 

Typedefs

using KeylistCreateColumnFunction = std::function<ActKeyColumn *(void *userdata)>
 
using KeylistUpdateColumnFunction = std::function<void(ActKeyColumn *, void *)>
 

Functions

BLI_INLINE bool is_cfra_eq (const float a, const float b)
 
BLI_INLINE bool is_cfra_lt (const float a, const float b)
 
AnimKeylistED_keylist_create ()
 
void ED_keylist_free (AnimKeylist *keylist)
 
static void ED_keylist_convert_key_columns_to_array (AnimKeylist *keylist)
 
static void ED_keylist_runtime_update_key_column_next_prev (AnimKeylist *keylist)
 
static void ED_keylist_runtime_init_listbase (AnimKeylist *keylist)
 
static void ED_keylist_runtime_init (AnimKeylist *keylist)
 
static void ED_keylist_reset_last_accessed (AnimKeylist *keylist)
 
void ED_keylist_prepare_for_direct_access (AnimKeylist *keylist)
 
static const ActKeyColumnED_keylist_find_lower_bound (const AnimKeylist *keylist, const float cfra)
 
static const ActKeyColumnED_keylist_find_upper_bound (const AnimKeylist *keylist, const float cfra)
 
const ActKeyColumnED_keylist_find_exact (const AnimKeylist *keylist, const float cfra)
 
const ActKeyColumnED_keylist_find_next (const AnimKeylist *keylist, const float cfra)
 
const ActKeyColumnED_keylist_find_prev (const AnimKeylist *keylist, const float cfra)
 
const ActKeyColumnED_keylist_find_any_between (const AnimKeylist *keylist, const Range2f frame_range)
 
const ActKeyColumnED_keylist_array (const AnimKeylist *keylist)
 
int64_t ED_keylist_array_len (const AnimKeylist *keylist)
 
bool ED_keylist_is_empty (const AnimKeylist *keylist)
 
const ListBaseED_keylist_listbase (const AnimKeylist *keylist)
 
static void keylist_first_last (const AnimKeylist *keylist, const ActKeyColumn **first_column, const ActKeyColumn **last_column)
 
bool ED_keylist_all_keys_frame_range (const AnimKeylist *keylist, Range2f *r_frame_range)
 
bool ED_keylist_selected_keys_frame_range (const AnimKeylist *keylist, Range2f *r_frame_range)
 
static eKeyframeHandleDrawOpts bezt_handle_type (const BezTriple *bezt)
 
static eKeyframeExtremeDrawOpts bezt_extreme_type (const BezTripleChain *chain)
 
static ActKeyColumnnalloc_ak_bezt (void *data)
 
static void nupdate_ak_bezt (ActKeyColumn *ak, void *data)
 
static ActKeyColumnnalloc_ak_cel (void *data)
 
static void nupdate_ak_cel (ActKeyColumn *ak, void *data)
 
static ActKeyColumnnalloc_ak_gpframe (void *data)
 
static void nupdate_ak_gpframe (ActKeyColumn *ak, void *data)
 
static ActKeyColumnnalloc_ak_masklayshape (void *data)
 
static void nupdate_ak_masklayshape (ActKeyColumn *ak, void *data)
 
static ActKeyColumnED_keylist_find_neighbor_front_to_back (ActKeyColumn *cursor, float cfra)
 
static ActKeyColumnED_keylist_find_neighbor_back_to_front (ActKeyColumn *cursor, float cfra)
 
static ActKeyColumnED_keylist_find_exact_or_neighbor_column (AnimKeylist *keylist, float cfra)
 
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_keycolumns_list (AnimKeylist *keylist, BezTripleChain *bezt)
 
static void add_gpframe_to_keycolumns_list (AnimKeylist *keylist, bGPDframe *gpf)
 
static void add_masklay_to_keycolumns_list (AnimKeylist *keylist, MaskLayerShape *masklay_shape)
 
static void compute_keyblock_data (ActKeyBlockInfo *info, const BezTriple *prev, const BezTriple *beztn)
 
static void add_keyblock_info (ActKeyColumn *col, const ActKeyBlockInfo *block)
 
static void add_bezt_to_keyblocks_list (AnimKeylist *keylist, BezTriple *bezt, const int bezt_len)
 
static void update_keyblocks (AnimKeylist *keylist, BezTriple *bezt, const int bezt_len)
 
bool actkeyblock_is_valid (const ActKeyColumn *ac)
 
int actkeyblock_get_valid_hold (const ActKeyColumn *ac)
 
void summary_to_keylist (bAnimContext *ac, AnimKeylist *keylist, const int saction_flag, blender::float2 range)
 
void scene_to_keylist (bDopeSheet *ads, Scene *sce, AnimKeylist *keylist, const int saction_flag, blender::float2 range)
 
void ob_to_keylist (bDopeSheet *ads, Object *ob, AnimKeylist *keylist, const int saction_flag, blender::float2 range)
 
void cachefile_to_keylist (bDopeSheet *ads, CacheFile *cache_file, AnimKeylist *keylist, const int saction_flag)
 
static void set_up_beztriple_chain (BezTripleChain &chain, const FCurve *fcu, const int key_index, const bool do_extremes, const bool is_cyclic)
 
void fcurve_to_keylist (AnimData *adt, FCurve *fcu, AnimKeylist *keylist, const int saction_flag, blender::float2 range)
 
void action_group_to_keylist (AnimData *adt, bActionGroup *agrp, AnimKeylist *keylist, const int saction_flag, blender::float2 range)
 
void action_slot_to_keylist (AnimData *adt, animrig::Action &action, const animrig::slot_handle_t slot_handle, AnimKeylist *keylist, const int saction_flag, blender::float2 range)
 
void action_to_keylist (AnimData *adt, bAction *dna_action, AnimKeylist *keylist, const int saction_flag, blender::float2 range)
 
void gpencil_to_keylist (bDopeSheet *ads, bGPdata *gpd, AnimKeylist *keylist, const bool active)
 
void grease_pencil_data_block_to_keylist (AnimData *adt, const GreasePencil *grease_pencil, AnimKeylist *keylist, const int saction_flag, const bool active_layer_only)
 
void grease_pencil_cels_to_keylist (AnimData *, const GreasePencilLayer *gpl, AnimKeylist *keylist, int)
 
void grease_pencil_layer_group_to_keylist (AnimData *adt, const GreasePencilLayerTreeGroup *layer_group, AnimKeylist *keylist, const int saction_flag)
 
void gpl_to_keylist (bDopeSheet *, bGPDlayer *gpl, AnimKeylist *keylist)
 
void mask_to_keylist (bDopeSheet *, MaskLayer *masklay, AnimKeylist *keylist)
 

Variables

static const ActKeyBlockInfo dummy_keyblock = {0}
 

Typedef Documentation

◆ KeylistCreateColumnFunction

using KeylistCreateColumnFunction = std::function<ActKeyColumn *(void *userdata)>

Definition at line 632 of file keyframes_keylist.cc.

◆ KeylistUpdateColumnFunction

using KeylistUpdateColumnFunction = std::function<void(ActKeyColumn *, void *)>

Definition at line 633 of file keyframes_keylist.cc.

Function Documentation

◆ action_group_to_keylist()

◆ action_slot_to_keylist()

void action_slot_to_keylist ( AnimData * adt,
animrig::Action & action,
const animrig::slot_handle_t slot_handle,
AnimKeylist * keylist,
const int saction_flag,
blender::float2 range )

◆ action_to_keylist()

void action_to_keylist ( AnimData * adt,
bAction * dna_action,
AnimKeylist * keylist,
const int saction_flag,
blender::float2 range )

Assumption: the animation is bound to adt->slot_handle. This assumption will break when we have things like reference strips, where the strip can reference another slot handle.

Definition at line 1236 of file keyframes_keylist.cc.

References action_slot_to_keylist(), bAction::curves, fcurve_to_keylist(), blender::animrig::Action::is_action_legacy(), LISTBASE_FOREACH, and AnimData::slot_handle.

Referenced by actkeys_list_element_to_keylist(), animviz_calc_motionpaths(), build_channel_keylist(), and nla_action_draw_keyframes().

◆ actkeyblock_get_valid_hold()

int actkeyblock_get_valid_hold ( const ActKeyColumn * ac)

Checks if ActKeyColumn can be used as a block (i.e. drawn/used to detect "holds").

Definition at line 924 of file keyframes_keylist.cc.

References ACTKEYBLOCK_FLAG_ANY_HOLD, ACTKEYBLOCK_FLAG_STATIC_HOLD, actkeyblock_is_valid(), ActKeyColumn::block, ActKeyBlockInfo::conflict, and ActKeyBlockInfo::flag.

Referenced by draw_keylist_block().

◆ actkeyblock_is_valid()

bool actkeyblock_is_valid ( const ActKeyColumn * ac)

Checks if ActKeyColumn has any block data.

Definition at line 919 of file keyframes_keylist.cc.

References ActKeyColumn::next, and ActKeyColumn::totblock.

Referenced by actkeyblock_get_valid_hold(), and draw_keylist_block().

◆ add_bezt_to_keyblocks_list()

static void add_bezt_to_keyblocks_list ( AnimKeylist * keylist,
BezTriple * bezt,
const int bezt_len )
static

◆ add_bezt_to_keycolumns_list()

static void add_bezt_to_keycolumns_list ( AnimKeylist * keylist,
BezTripleChain * bezt )
static

◆ add_gpframe_to_keycolumns_list()

static void add_gpframe_to_keycolumns_list ( AnimKeylist * keylist,
bGPDframe * gpf )
static

◆ add_keyblock_info()

static void add_keyblock_info ( ActKeyColumn * col,
const ActKeyBlockInfo * block )
static

Definition at line 807 of file keyframes_keylist.cc.

References col, ActKeyBlockInfo::flag, and ActKeyBlockInfo::sel.

Referenced by add_bezt_to_keyblocks_list().

◆ add_masklay_to_keycolumns_list()

static void add_masklay_to_keycolumns_list ( AnimKeylist * keylist,
MaskLayerShape * masklay_shape )
static

◆ bezt_extreme_type()

◆ bezt_handle_type()

◆ cachefile_to_keylist()

◆ compute_keyblock_data()

◆ ED_keylist_add_or_update_column()

◆ ED_keylist_all_keys_frame_range()

bool ED_keylist_all_keys_frame_range ( const AnimKeylist * keylist,
Range2f * r_frame_range )

◆ ED_keylist_array()

const ActKeyColumn * ED_keylist_array ( const AnimKeylist * keylist)

◆ ED_keylist_array_len()

int64_t ED_keylist_array_len ( const AnimKeylist * keylist)

Definition at line 302 of file keyframes_keylist.cc.

References AnimKeylist::column_len.

Referenced by draw_channel_blocks(), and draw_channel_keys().

◆ ED_keylist_convert_key_columns_to_array()

static void ED_keylist_convert_key_columns_to_array ( AnimKeylist * keylist)
static

◆ ED_keylist_create()

◆ ED_keylist_find_any_between()

◆ ED_keylist_find_exact()

◆ ED_keylist_find_exact_or_neighbor_column()

◆ ED_keylist_find_lower_bound()

static const ActKeyColumn * ED_keylist_find_lower_bound ( const AnimKeylist * keylist,
const float cfra )
static

◆ ED_keylist_find_neighbor_back_to_front()

static ActKeyColumn * ED_keylist_find_neighbor_back_to_front ( ActKeyColumn * cursor,
float cfra )
static

Definition at line 647 of file keyframes_keylist.cc.

References ActKeyColumn::prev.

Referenced by ED_keylist_find_exact_or_neighbor_column().

◆ ED_keylist_find_neighbor_front_to_back()

static ActKeyColumn * ED_keylist_find_neighbor_front_to_back ( ActKeyColumn * cursor,
float cfra )
static

Definition at line 637 of file keyframes_keylist.cc.

References ActKeyColumn::next.

Referenced by ED_keylist_find_exact_or_neighbor_column().

◆ ED_keylist_find_next()

◆ ED_keylist_find_prev()

◆ ED_keylist_find_upper_bound()

static const ActKeyColumn * ED_keylist_find_upper_bound ( const AnimKeylist * keylist,
const float cfra )
static

◆ ED_keylist_free()

◆ ED_keylist_is_empty()

◆ ED_keylist_listbase()

◆ ED_keylist_prepare_for_direct_access()

◆ ED_keylist_reset_last_accessed()

static void ED_keylist_reset_last_accessed ( AnimKeylist * keylist)
static

◆ ED_keylist_runtime_init()

◆ ED_keylist_runtime_init_listbase()

◆ ED_keylist_runtime_update_key_column_next_prev()

static void ED_keylist_runtime_update_key_column_next_prev ( AnimKeylist * keylist)
static

◆ ED_keylist_selected_keys_frame_range()

bool ED_keylist_selected_keys_frame_range ( const AnimKeylist * keylist,
Range2f * r_frame_range )

Return the selected key-frame's range. If none are selected, return False and do not affect the frame range.

Definition at line 351 of file keyframes_keylist.cc.

References BLI_assert, ActKeyColumn::cfra, ED_keylist_is_empty(), keylist_first_last(), Range2f::max, Range2f::min, ActKeyColumn::next, ActKeyColumn::prev, ActKeyColumn::sel, and SELECT.

Referenced by animviz_motionpath_compute_range().

◆ fcurve_to_keylist()

◆ gpencil_to_keylist()

void gpencil_to_keylist ( bDopeSheet * ads,
bGPdata * gpd,
AnimKeylist * keylist,
const bool active )

◆ gpl_to_keylist()

◆ grease_pencil_cels_to_keylist()

◆ grease_pencil_data_block_to_keylist()

void grease_pencil_data_block_to_keylist ( AnimData * adt,
const GreasePencil * grease_pencil,
AnimKeylist * keylist,
const int saction_flag,
const bool active_layer_only )

◆ grease_pencil_layer_group_to_keylist()

◆ is_cfra_eq()

BLI_INLINE bool is_cfra_eq ( const float a,
const float b )

◆ is_cfra_lt()

◆ keylist_first_last()

static void keylist_first_last ( const AnimKeylist * keylist,
const ActKeyColumn ** first_column,
const ActKeyColumn ** last_column )
static

◆ mask_to_keylist()

◆ nalloc_ak_bezt()

◆ nalloc_ak_cel()

◆ nalloc_ak_gpframe()

◆ nalloc_ak_masklayshape()

static ActKeyColumn * nalloc_ak_masklayshape ( void * data)
static

◆ nupdate_ak_bezt()

◆ nupdate_ak_cel()

◆ nupdate_ak_gpframe()

static void nupdate_ak_gpframe ( ActKeyColumn * ak,
void * data )
static

◆ nupdate_ak_masklayshape()

static void nupdate_ak_masklayshape ( ActKeyColumn * ak,
void * data )
static

◆ ob_to_keylist()

◆ scene_to_keylist()

◆ set_up_beztriple_chain()

static void set_up_beztriple_chain ( BezTripleChain & chain,
const FCurve * fcu,
const int key_index,
const bool do_extremes,
const bool is_cyclic )
inlinestatic

◆ summary_to_keylist()

◆ update_keyblocks()

static void update_keyblocks ( AnimKeylist * keylist,
BezTriple * bezt,
const int bezt_len )
static

Variable Documentation

◆ dummy_keyblock

const ActKeyBlockInfo dummy_keyblock = {0}
static

Definition at line 758 of file keyframes_keylist.cc.

Referenced by add_bezt_to_keyblocks_list().