136 switch (saction->
mode) {
144 saction->
action =
nullptr;
161 if (key && key->
adt) {
165 saction->
action =
nullptr;
190 Strip *strip = SEQ_select_active_get(ac->
scene);
247 if (sipo->
ads ==
nullptr) {
263 switch (sipo->
mode) {
295 if (snla->
ads ==
nullptr) {
358 return (ok && ac->
data);
423#define BEGIN_ANIMFILTER_SUBCHANNELS(expanded_check) \
425 const eAnimFilter_Flags _filter = filter_mode; \
426 short _doSubChannels = 0; \
427 if (!(filter_mode & ANIMFILTER_LIST_VISIBLE) || (expanded_check)) { \
428 _doSubChannels = 1; \
430 else if (!(filter_mode & ANIMFILTER_LIST_CHANNELS)) { \
431 _doSubChannels = 2; \
434 filter_mode |= ANIMFILTER_TMP_PEEK; \
438 (void)_doSubChannels; \
441#define END_ANIMFILTER_SUBCHANNELS \
442 filter_mode = _filter; \
449#define ANIMDATA_HAS_ACTION_LEGACY(id) \
450 ((id)->adt && (id)->adt->action && (id)->adt->action->wrap().is_action_legacy())
452#define ANIMDATA_HAS_ACTION_LAYERED(id) \
453 ((id)->adt && (id)->adt->action && (id)->adt->action->wrap().is_action_layered())
456#define ANIMDATA_HAS_DRIVERS(id) ((id)->adt && (id)->adt->drivers.first)
459#define ANIMDATA_HAS_NLA(id) ((id)->adt && (id)->adt->nla_tracks.first)
498#define ANIMDATA_FILTER_CASES( \
499 id, adtOk, nlaOk, driversOk, nlaKeysOk, legacyActionOk, layeredActionOk) \
502 if (!(filter_mode & ANIMFILTER_CURVE_VISIBLE) || \
503 !((id)->adt->flag & ADT_CURVES_NOT_VISIBLE)) { \
504 if (filter_mode & ANIMFILTER_ANIMDATA) { \
507 else if (ac->ads->filterflag & ADS_FILTER_ONLYNLA) { \
508 if (ANIMDATA_HAS_NLA(id)) { \
511 else if (!(ac->ads->filterflag & ADS_FILTER_NLA_NOACT) || \
512 ANIMDATA_HAS_ACTION_LAYERED(id)) \
517 else if (ac->ads->filterflag & ADS_FILTER_ONLYDRIVERS) { \
518 if (ANIMDATA_HAS_DRIVERS(id)) { \
523 if (ANIMDATA_HAS_NLA(id)) { \
526 if (ANIMDATA_HAS_ACTION_LAYERED(id)) { \
529 else if (ANIMDATA_HAS_ACTION_LEGACY(id)) { \
546#define ANIMCHANNEL_NEW_CHANNEL_FULL( \
547 bmain, channel_data, channel_type, owner_id, fcurve_owner_id, ale_statement) \
548 if (filter_mode & ANIMFILTER_TMP_PEEK) { \
552 bAnimListElem *ale = make_new_animlistelem( \
553 bmain, channel_data, channel_type, (ID *)owner_id, fcurve_owner_id); \
555 BLI_addtail(anim_data, ale); \
562#define ANIMCHANNEL_NEW_CHANNEL(bmain, channel_data, channel_type, owner_id, fcurve_owner_id) \
563 ANIMCHANNEL_NEW_CHANNEL_FULL(bmain, channel_data, channel_type, owner_id, fcurve_owner_id, {})
568#define ANIMCHANNEL_ACTIVEOK(ale) \
569 (!(filter_mode & ANIMFILTER_ACTIVE) || !(ale->adt) || (ale->adt->flag & ADT_UI_ACTIVE))
573#define ANIMCHANNEL_SELOK(test_func) \
574 (!(filter_mode & (ANIMFILTER_SEL | ANIMFILTER_UNSEL)) || \
575 ((filter_mode & ANIMFILTER_SEL) && test_func) || \
576 ((filter_mode & ANIMFILTER_UNSEL) && test_func == 0))
587#define ANIMCHANNEL_SELEDITOK(test_func) \
588 (!(filter_mode & ANIMFILTER_SELEDIT) || !(filter_mode & ANIMFILTER_FOREDIT) || (test_func))
626 ale->
type = datatype;
866 Key *key =
reinterpret_cast<Key *
>(ale->
id);
982 char bone_name[
sizeof(pchan->
name)];
992 if (pchan && pchan->
bone) {
1014 Scene *scene =
reinterpret_cast<Scene *
>(owner_id);
1015 Strip *strip =
nullptr;
1016 char strip_name[
sizeof(strip->
name)];
1046 if (strip ==
nullptr) {
1058 bNode *node =
nullptr;
1059 char node_name[
sizeof(node->
name)];
1087 const size_t str_len = strlen(ads->
searchstr);
1090 int(*words)[2] =
static_cast<int(*)[2]
>(
BLI_array_alloca(words, words_max));
1092 ads->
searchstr, str_len,
' ', words, words_max);
1096 for (
int index = 0; index < words_len; index++) {
1121 ale_dummy.
type = channel_type;
1122 ale_dummy.
owner = owner;
1123 ale_dummy.
id = owner_id;
1124 ale_dummy.
data = fcu;
1128 if (acf && acf->
name) {
1132 acf->
name(&ale_dummy, name);
1154 acf->
name(&ale, name);
1221 for (fcu = first; ((fcu) && (fcu->
grp == grp)); fcu = fcu->
next) {
1231 if (ac->
ads && owner_id) {
1286 ID *fcurve_owner_id)
1369 ID *fcurve_owner_id)
1371 size_t num_items = 0;
1380 const bool filter_by_name = ac->
ads && (ac->
ads->
searchstr[0] !=
'\0');
1382 for (
FCurve *fcu : fcurves) {
1391 if (selection_matters &&
bool(fcu->flag &
FCURVE_SELECTED) != must_be_selected) {
1461 ListBase tmp_data = {
nullptr,
nullptr};
1462 size_t tmp_items = 0;
1521 ac, &tmp_data, first_fcu,
ANIMTYPE_FCURVE, filter_mode, agrp, owner_id, &act->
id);
1527 ac, &tmp_data, fcurves, slot_handle, filter_mode, owner_id, &act->
id);
1547 ale->slot_handle = slot_handle;
1579 ID *slot_user_id =
nullptr;
1583 if (!slot_user_id) {
1591 slot_user_id = animated_id;
1604 const bool selection_ok_for_slot = !selection_matters || slot.
is_selected() == must_be_selected;
1615 const bool show_slot_channel = (is_action_mode && selection_ok_for_slot &&
1616 include_summary_channels);
1617 if (show_slot_channel) {
1625 const bool expansion_is_ok = !visible_only || !show_slot_channel || slot.
is_expanded();
1628 if (channelbag ==
nullptr) {
1632 if (!expansion_is_ok) {
1639 ac, anim_data, &action, slot.
handle, group, filter_mode, slot_user_id);
1643 if (!show_active_group_only) {
1644 int first_ungrouped_fcurve_index = 0;
1653 ac, anim_data, fcurves, slot.
handle, filter_mode, slot_user_id, &action.
id);
1690 FCurve *lastchan =
nullptr;
1709 if (agrp->channels.last) {
1710 lastchan =
static_cast<FCurve *
>(agrp->channels.last);
1720 FCurve *firstfcu = (lastchan) ? (lastchan->
next) :
1723 ac, anim_data, firstfcu,
ANIMTYPE_FCURVE, filter_mode,
nullptr, owner_id, &action.
id);
1736 if (is_action_mode && !show_active_only) {
1782 ale->data = adt->action ? adt->action : nullptr;
1797 for (nlt = first; nlt; nlt =
next) {
1814 bool track_ok =
false, strip_ok =
false;
1819 if (track_ok ==
false) {
1829 if (!track_ok && !strip_ok) {
1854 ListBase tmp_data = {
nullptr,
nullptr};
1855 size_t tmp_items = 0;
1870 static_cast<FCurve *
>(strip->fcurves.first),
1990 if (ads !=
nullptr && ads->
searchstr[0] !=
'\0' &&
2018 if (
STREQ(fcurve->rna_path,
"eval_time") ||
2021 key_fcurves.
append(fcurve);
2026 ac, anim_data, key_fcurves, key->
adt->
slot_handle, filter_mode, &key->
id, &action.
id);
2044 reinterpret_cast<ID *
>(key));
2075 if ((filter_mode &
ANIMFILTER_ACTIVE) && grease_pencil->is_layer_active(&layer)) {
2086 static_cast<void *
>(&layer),
2105 const bool name_search = (ac->
ads->
searchstr[0] !=
'\0');
2106 const bool skip_node = name_search &&
2109 if (node.
is_layer() && !skip_node) {
2111 ac, anim_data, grease_pencil, node.
as_layer(), filter_mode);
2116 ListBase tmp_data = {
nullptr,
nullptr};
2117 size_t tmp_items = 0;
2123 ac, &tmp_data, grease_pencil, node_->wrap(), filter_mode);
2128 if ((tmp_items == 0) && !name_search) {
2138 static_cast<void *
>(&node),
2163 ac, anim_data, grease_pencil, node->wrap(), filter_mode);
2232 if (show_animdata) {
2234 ac, anim_data,
reinterpret_cast<ID *
>(grease_pencil), filter_mode);
2238 ListBase tmp_data = {
nullptr,
nullptr};
2239 size_t tmp_items = 0;
2243 if (show_animdata) {
2245 ac, &tmp_data,
reinterpret_cast<ID *
>(grease_pencil), filter_mode);
2250 ac, &tmp_data, grease_pencil, filter_mode);
2255 if (tmp_items == 0) {
2289 Object *ob = base->object;
2333 ListBase tmp_data = {
nullptr,
nullptr};
2334 size_t tmp_items = 0;
2379 ListBase tmp_data = {
nullptr,
nullptr};
2380 size_t tmp_items = 0;
2450 ListBase tmp_data = {
nullptr,
nullptr};
2451 size_t tmp_items = 0;
2495 ListBase tmp_data = {
nullptr,
nullptr};
2496 size_t tmp_items = 0;
2536 for (
bNode *node : ntree->all_nodes()) {
2537 if (node->is_group()) {
2546 reinterpret_cast<bNodeTree *
>(node->id),
2564 if (lineset->linestyle) {
2579 ListBase tmp_data = {
nullptr,
nullptr};
2580 size_t tmp_items = 0;
2591 ac, &tmp_data,
reinterpret_cast<ID *
>(linestyle), filter_mode);
2620 ListBase tmp_data = {
nullptr,
nullptr};
2621 size_t tmp_items = 0;
2638 ac, &tmp_data,
reinterpret_cast<ID *
>(tex), tex->
nodetree, filter_mode);
2671 MTex **mtex =
nullptr;
2676 if (owner_id ==
nullptr) {
2680 switch (
GS(owner_id->
name)) {
2683 mtex =
reinterpret_cast<MTex **
>(&part->
mtex);
2689 printf(
"ERROR: Unsupported owner_id (i.e. texture stack) for filter textures - %s\n",
2699 Tex *tex = (mtex[a]) ? mtex[a]->tex :
nullptr;
2702 if (tex ==
nullptr) {
2719 ListBase tmp_data = {
nullptr,
nullptr};
2720 size_t tmp_items = 0;
2731 ac, &tmp_data,
reinterpret_cast<ID *
>(ma), ma->
nodetree, filter_mode);
2764 for (a = 1; a <= ob->
totcol; a++) {
2798 ID *owner_id = &ob->
id;
2804 if (
id ==
nullptr) {
2809 switch (
GS(
id->name)) {
2812 Tex *tex =
reinterpret_cast<Tex *
>(
id);
2884 ListBase tmp_data = {
nullptr,
nullptr};
2885 size_t tmp_items = 0;
2889 if (psys->part ==
nullptr) {
2897 ac, &tmp_data,
reinterpret_cast<ID *
>(psys->part), filter_mode);
2902 ac, &tmp_data,
reinterpret_cast<ID *
>(psys->part), filter_mode);
2933 ListBase tmp_data = {
nullptr,
nullptr};
2934 size_t tmp_items = 0;
3135 ListBase tmp_data = {
nullptr,
nullptr};
3136 size_t tmp_items = 0;
3171 ListBase tmp_data = {
nullptr,
nullptr};
3172 size_t tmp_items = 0;
3178 void *cdata =
nullptr;
3236 ListBase tmp_data = {
nullptr,
nullptr};
3238 size_t tmp_items = 0;
3317 ListBase tmp_data = {
nullptr,
nullptr};
3318 size_t tmp_items = 0;
3329 ac, &tmp_data,
reinterpret_cast<ID *
>(wo), wo->
nodetree, filter_mode);
3359 ListBase tmp_data = {
nullptr,
nullptr};
3360 size_t tmp_items = 0;
3366 void *cdata =
nullptr;
3423 ListBase tmp_data = {
nullptr,
nullptr};
3424 size_t tmp_items = 0;
3445 ac, &tmp_data,
reinterpret_cast<ID *
>(sce), ntree, filter_mode);
3484 ListBase tmp_data = {
nullptr,
nullptr};
3485 size_t tmp_items = 0;
3535 if (base->
object ==
nullptr) {
3582 if (ob->
data !=
nullptr) {
3624 const Base *b1 = *((
const Base **)base1_ptr);
3625 const Base *b2 = *((
const Base **)base2_ptr);
3635 size_t *r_usable_bases)
3641 size_t num_bases = 0;
3647 sorted_bases[num_bases++] = base;
3655 *r_usable_bases = num_bases;
3656 return sorted_bases;
3673 printf(
"Dope Sheet Error: No scene!\n");
3675 printf(
"\tPointer = %p, Name = '%s'\n",
3730 (object_bases->
first != object_bases->
last))
3734 Base **sorted_bases;
3740 for (
size_t i = 0;
i < num_bases;
i++) {
3785 ads = &saction->
ads;
3827 switch (channel->
type) {
3834 ac, anim_data,
static_cast<Scene *
>(channel->
data), filter_mode);
3839 ac, anim_data,
static_cast<Base *
>(channel->
data), filter_mode);
3844 ac, anim_data,
static_cast<CacheFile *
>(channel->
data), filter_mode);
3852 printf(
"ERROR: Unsupported channel type (%d) in animdata_filter_animchan()\n",
3922 if (!
data || !anim_data) {
3952 "This code assumes the Action editor shows the Action of the active object");
3957 ac, anim_data, action, slot_handle, filter_mode,
reinterpret_cast<ID *
>(obact));
4057 printf(
"ANIM_animdata_filter() - Invalid datatype argument ANIMCONT_NONE\n");
Functions and classes to work with Actions.
Functions to deal with Armatures.
C++ functions to deal with Armature collections (i.e. the successor of bone layers).
Blender kernel action and pose functionality.
bPoseChannel * BKE_pose_channel_find_name(const bPose *pose, const char *name)
AnimData * BKE_animdata_from_id(const ID *id)
bool BKE_collection_has_object_recursive(Collection *collection, Object *ob)
ScrArea * CTX_wm_area(const bContext *C)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
SpaceLink * CTX_wm_space_data(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Main * CTX_data_main(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
#define DRIVER_TARGETS_USED_LOOPER_BEGIN(dvar)
#define DRIVER_TARGETS_LOOPER_END
Low-level operations for grease pencil.
std::optional< std::string > BKE_keyblock_curval_rnapath_get(const Key *key, const KeyBlock *kb)
Key * BKE_key_from_object(Object *ob)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
ListBase * BKE_view_layer_object_bases_get(ViewLayer *view_layer)
LibraryForeachIDCallbackFlag
struct MaskLayer * BKE_mask_layer_active(struct Mask *mask)
General operations, lookup, etc. for materials.
Material * BKE_object_material_get(Object *ob, short act)
void void void BKE_modifiers_foreach_ID_link(Object *ob, IDWalkFunc walk, void *user_data)
#define BLI_array_alloca(arr, realsize)
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
GSet * BLI_gset_ptr_new(const char *info)
void BLI_gset_free(GSet *gs, GSetKeyFreeFP keyfreefp)
bool BLI_gset_add(GSet *gs, void *key)
int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void void BLI_movelisttolist(ListBase *dst, ListBase *src) ATTR_NONNULL(1
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int bool bool bool size_t size_t size_t int BLI_string_max_possible_word_count(int str_len) ATTR_WARN_UNUSED_RESULT
int char char * BLI_strncasestr(const char *s, const char *find, size_t len) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
int char char int int int BLI_strcasecmp_natural(const char *s1, const char *s2) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
int bool bool BLI_str_endswith(const char *__restrict str, const char *__restrict end) ATTR_NONNULL(1
bool bool int BLI_string_find_split_words(const char *str, size_t str_maxlen, char delim, int r_words[][2], int words_max) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
int char * BLI_strcasestr(const char *s, const char *find) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
bool bool BLI_str_quoted_substr(const char *__restrict str, const char *__restrict prefix, char *result, size_t result_maxncpy)
#define UNUSED_VARS_NDEBUG(...)
@ ADS_FILTER_NOLIGHTPROBE
@ ADS_FILTER_DRIVER_FALLBACK_AS_ERROR
@ ADS_FILTER_NOMOVIECLIPS
@ ADS_FILTER_NOCACHEFILES
@ ADS_FILTER_NOPOINTCLOUD
@ ADS_FILTER_ONLY_SLOTS_OF_ACTIVE
@ ADS_FLAG_SUMMARY_COLLAPSED
@ ADT_CURVES_ALWAYS_VISIBLE
@ ADT_NLA_SKEYS_COLLAPSED
@ DTAR_FLAG_FALLBACK_USED
@ GREASE_PENCIL_ANIM_CHANNEL_EXPANDED
@ BASE_ENABLED_AND_VISIBLE_IN_DEFAULT_VIEWPORT
@ BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT
Object is a sort of wrapper for general info.
#define BASE_SELECTED(v3d, base)
@ USER_ANIM_ONLY_SHOW_SELECTED_CURVE_KEYS
#define EXPANDED_ADT(adt)
#define FILTER_SPK_OBJD(spk)
#define FILTER_CACHEFILE_OBJD(cf)
#define FILTER_LIGHTPROBE_OBJD(probe)
@ ANIMTYPE_SPECIALDATA__UNUSED
@ ANIMTYPE_GREASE_PENCIL_DATABLOCK
@ ANIMTYPE_GREASE_PENCIL_LAYER
@ ANIMTYPE_FILLACT_LAYERED
@ ANIMTYPE_GREASE_PENCIL_LAYER_GROUP
#define EXPANDED_MCLIP(clip)
#define FILTER_NTREE_DATA(ntree)
#define FILTER_SKE_OBJD(key)
#define FILTER_MESH_OBJD(me)
#define EDITABLE_GPL(gpl)
#define EXPANDED_SCEC(sce)
#define SEL_MASKLAY(masklay)
#define FILTER_ARM_OBJD(arm)
#define EDITABLE_AGRP(agrp)
#define EXPANDED_AGRP(ac, agrp)
#define FILTER_CAM_OBJD(ca)
@ ALE_GREASE_PENCIL_GROUP
#define FILTER_LATTICE_OBJD(lt)
#define FILTER_CURVES_OBJD(ha)
#define EXPANDED_ACTC(actc)
#define FILTER_LAM_OBJD(la)
#define EXPANDED_OBJC(ob)
#define EDITABLE_SHAPEKEY(kb)
#define EDITABLE_FCU(fcu)
#define EDITABLE_MASK(masklay)
#define FILTER_CUR_OBJD(cu)
#define FILTER_MAT_OBJD(ma)
#define EDITABLE_NLT(nlt)
#define FILTER_WOR_SCED(wo)
#define FILTER_MBALL_OBJD(mb)
#define FILTER_LS_SCED(linestyle)
#define EXPANDED_DRVD(adt)
#define EXPANDED_MASK(mask)
#define SEL_ANIMDATA(adt)
#define FILTER_POINTS_OBJD(pt)
#define EXPANDED_GPD(gpd)
#define FILTER_TEX_DATA(tex)
#define FILTER_VOLUME_OBJD(vo)
@ ANIMFILTER_DATA_VISIBLE
@ ANIMFILTER_CURVE_VISIBLE
@ ANIMFILTER_LIST_VISIBLE
@ ANIMFILTER_LIST_CHANNELS
@ ANIMFILTER_TMP_IGNORE_ONLYSEL
#define FILTER_PART_OBJD(part)
Read Guarded memory(de)allocation.
const bAnimChannelType * ANIM_channel_get_typeinfo(const bAnimListElem *ale)
static size_t animdata_filter_ds_scene(bAnimContext *ac, ListBase *anim_data, Scene *sce, eAnimFilter_Flags filter_mode)
#define ANIMCHANNEL_NEW_CHANNEL(bmain, channel_data, channel_type, owner_id, fcurve_owner_id)
static size_t animdata_filter_dopesheet_ob(bAnimContext *ac, ListBase *anim_data, Base *base, eAnimFilter_Flags filter_mode)
static Key * actedit_get_shapekeys(bAnimContext *ac)
static size_t animfilter_block_data(bAnimContext *ac, ListBase *anim_data, ID *id, const eAnimFilter_Flags filter_mode)
bool ANIM_animdata_can_have_greasepencil(const eAnimCont_Types type)
static bool nlaedit_get_context(bAnimContext *ac, SpaceNla *snla)
static size_t animdata_filter_dopesheet_movieclips(bAnimContext *ac, ListBase *anim_data, const eAnimFilter_Flags filter_mode)
static size_t animdata_filter_grease_pencil_layers_data(bAnimContext *ac, ListBase *anim_data, GreasePencil *grease_pencil, const eAnimFilter_Flags filter_mode)
static bool animdata_filter_base_is_ok(bAnimContext *ac, Base *base, const eObjectMode object_mode, const eAnimFilter_Flags filter_mode)
static size_t animdata_filter_ds_obanim(bAnimContext *ac, ListBase *anim_data, Object *ob, eAnimFilter_Flags filter_mode)
static size_t animdata_filter_ds_movieclip(bAnimContext *ac, ListBase *anim_data, MovieClip *clip, eAnimFilter_Flags filter_mode)
static size_t animdata_filter_ds_nodetree_group(bAnimContext *ac, ListBase *anim_data, ID *owner_id, bNodeTree *ntree, eAnimFilter_Flags filter_mode)
static bool name_matches_dopesheet_filter(const bDopeSheet *ads, const char *name)
static size_t animdata_filter_ds_particles(bAnimContext *ac, ListBase *anim_data, Object *ob, eAnimFilter_Flags filter_mode)
static size_t animfilter_fcurves_span(bAnimContext *ac, ListBase *anim_data, Span< FCurve * > fcurves, const animrig::slot_handle_t slot_handle, const eAnimFilter_Flags filter_mode, ID *animated_id, ID *fcurve_owner_id)
#define ANIMCHANNEL_SELOK(test_func)
static size_t animdata_filter_mask(bAnimContext *ac, ListBase *anim_data, void *, eAnimFilter_Flags filter_mode)
static bool fcurve_span_selection_matters(const eAnimFilter_Flags filter_mode)
static size_t animdata_filter_ds_gpencil(bAnimContext *ac, ListBase *anim_data, bGPdata *gpd, eAnimFilter_Flags filter_mode)
static size_t animdata_filter_ds_materials(bAnimContext *ac, ListBase *anim_data, Object *ob, const eAnimFilter_Flags filter_mode)
static size_t animfilter_nla_controls(bAnimContext *ac, ListBase *anim_data, AnimData *adt, eAnimFilter_Flags filter_mode, ID *owner_id)
static size_t animdata_filter_grease_pencil(bAnimContext *ac, ListBase *anim_data, const eAnimFilter_Flags filter_mode)
static size_t animdata_filter_grease_pencil_layer(bAnimContext *ac, ListBase *anim_data, GreasePencil *grease_pencil, blender::bke::greasepencil::Layer &layer, const eAnimFilter_Flags filter_mode)
static size_t animdata_filter_gpencil_layers_data_legacy(bAnimContext *ac, ListBase *anim_data, bGPdata *gpd, const eAnimFilter_Flags filter_mode)
static size_t animdata_filter_ds_textures(bAnimContext *ac, ListBase *anim_data, ID *owner_id, const eAnimFilter_Flags filter_mode)
static size_t animdata_filter_ds_modifiers(bAnimContext *ac, ListBase *anim_data, Object *ob, const eAnimFilter_Flags filter_mode)
static size_t animdata_filter_grease_pencil_layer_node_recursive(bAnimContext *ac, ListBase *anim_data, GreasePencil *grease_pencil, blender::bke::greasepencil::TreeNode &node, eAnimFilter_Flags filter_mode)
bool ANIM_animdata_get_context(const bContext *C, bAnimContext *ac)
static void key_data_from_adt(bAnimListElem &ale, AnimData *adt)
#define ANIMCHANNEL_ACTIVEOK(ale)
static size_t animdata_filter_ds_material(bAnimContext *ac, ListBase *anim_data, Material *ma, eAnimFilter_Flags filter_mode)
static size_t animdata_filter_remove_invalid(ListBase *anim_data)
static size_t animdata_filter_ds_texture(bAnimContext *ac, ListBase *anim_data, Tex *tex, ID *owner_id, eAnimFilter_Flags filter_mode)
static short animdata_filter_dopesheet_summary(bAnimContext *ac, ListBase *anim_data, const eAnimFilter_Flags filter_mode, size_t *items)
bool ANIM_animdata_context_getdata(bAnimContext *ac)
static void animfilter_modifier_idpoin_cb(void *afm_ptr, Object *ob, ID **idpoin, LibraryForeachIDCallbackFlag)
static size_t animdata_filter_grease_pencil_data(bAnimContext *ac, ListBase *anim_data, GreasePencil *grease_pencil, eAnimFilter_Flags filter_mode)
static size_t animdata_filter_shapekey(bAnimContext *ac, ListBase *anim_data, Key *key, const eAnimFilter_Flags filter_mode)
static size_t animfilter_fcurves(bAnimContext *ac, ListBase *anim_data, FCurve *first, eAnim_ChannelType fcurve_type, const eAnimFilter_Flags filter_mode, void *owner, ID *owner_id, ID *fcurve_owner_id)
static int ds_base_sorting_cmp(const void *base1_ptr, const void *base2_ptr)
static bool skip_fcurve_with_name(bAnimContext *ac, FCurve *fcu, eAnim_ChannelType channel_type, void *owner, ID *owner_id)
static size_t animdata_filter_ds_obdata(bAnimContext *ac, ListBase *anim_data, Object *ob, eAnimFilter_Flags filter_mode)
static bool fcurve_has_errors(bAnimContext *ac, const FCurve *fcu)
static size_t animdata_filter_ds_nodetree(bAnimContext *ac, ListBase *anim_data, ID *owner_id, bNodeTree *ntree, const eAnimFilter_Flags filter_mode)
#define END_ANIMFILTER_SUBCHANNELS
static bAnimListElem * make_new_animlistelem(Main *bmain, void *data, const eAnim_ChannelType datatype, ID *owner_id, ID *fcurve_owner_id)
static size_t animfilter_act_group(bAnimContext *ac, ListBase *anim_data, bAction *act, animrig::slot_handle_t slot_handle, bActionGroup *agrp, eAnimFilter_Flags filter_mode, ID *owner_id)
static bool fcurve_span_must_be_selected(const eAnimFilter_Flags filter_mode)
static size_t animdata_filter_ds_world(bAnimContext *ac, ListBase *anim_data, Scene *sce, World *wo, eAnimFilter_Flags filter_mode)
static bool skip_fcurve_selected_data(bAnimContext *ac, FCurve *fcu, ID *owner_id, const eAnimFilter_Flags filter_mode)
static size_t animdata_filter_remove_duplis(ListBase *anim_data)
static size_t animfilter_action_slots(bAnimContext *ac, ListBase *anim_data, animrig::Action &action, const eAnimFilter_Flags filter_mode, ID *owner_id)
static size_t animdata_filter_animchan(bAnimContext *ac, ListBase *anim_data, bAnimListElem *channel, const eAnimFilter_Flags filter_mode)
size_t ANIM_animfilter_action_slot(bAnimContext *ac, ListBase *anim_data, animrig::Action &action, animrig::Slot &slot, const eAnimFilter_Flags filter_mode, ID *animated_id)
static FCurve * animfilter_fcurve_next(bAnimContext *ac, FCurve *first, eAnim_ChannelType channel_type, const eAnimFilter_Flags filter_mode, void *owner, ID *owner_id)
static size_t animdata_filter_ds_cachefile(bAnimContext *ac, ListBase *anim_data, CacheFile *cache_file, eAnimFilter_Flags filter_mode)
static size_t animdata_filter_dopesheet(bAnimContext *ac, ListBase *anim_data, eAnimFilter_Flags filter_mode)
static size_t animdata_filter_ds_keyanim(bAnimContext *ac, ListBase *anim_data, Object *ob, Key *key, eAnimFilter_Flags filter_mode)
#define BEGIN_ANIMFILTER_SUBCHANNELS(expanded_check)
static size_t animfilter_nla(bAnimContext *ac, ListBase *anim_data, AnimData *adt, const eAnimFilter_Flags filter_mode, ID *owner_id)
static size_t animdata_filter_ds_linestyle(bAnimContext *ac, ListBase *anim_data, Scene *sce, eAnimFilter_Flags filter_mode)
static bool graphedit_get_context(bAnimContext *ac, SpaceGraph *sipo)
size_t ANIM_animdata_filter(bAnimContext *ac, ListBase *anim_data, const eAnimFilter_Flags filter_mode, void *data, const eAnimCont_Types datatype)
#define ANIMDATA_FILTER_CASES(id, adtOk, nlaOk, driversOk, nlaKeysOk, legacyActionOk, layeredActionOk)
#define ANIMCHANNEL_NEW_CHANNEL_FULL(bmain, channel_data, channel_type, owner_id, fcurve_owner_id, ale_statement)
static bool actedit_get_context(bAnimContext *ac, SpaceAction *saction)
static bool ale_name_matches_dopesheet_filter(const bDopeSheet &ads, bAnimListElem &ale)
static Base ** animdata_filter_ds_sorted_bases(bAnimContext *ac, const Scene *scene, ViewLayer *view_layer, const eAnimFilter_Flags filter_mode, size_t *r_usable_bases)
static size_t animfilter_action(bAnimContext *ac, ListBase *anim_data, animrig::Action &action, const animrig::slot_handle_t slot_handle, const eAnimFilter_Flags filter_mode, ID *owner_id)
static size_t animdata_filter_dopesheet_scene(bAnimContext *ac, ListBase *anim_data, Scene *sce, eAnimFilter_Flags filter_mode)
static size_t animdata_filter_mask_data(bAnimContext *ac, ListBase *anim_data, Mask *mask, const eAnimFilter_Flags filter_mode)
#define ANIMCHANNEL_SELEDITOK(test_func)
#define ANIM_CHAN_NAME_SIZE
ListBase * ED_context_get_markers(const bContext *C)
BMesh const char void * data
void append(const T &value)
bool is_action_legacy() const
bool is_action_layered() const
blender::Span< const Slot * > slots() const
Slot * slot_for_handle(slot_handle_t handle)
blender::Span< const FCurve * > fcurves() const
blender::Span< const bActionGroup * > channel_groups() const
static constexpr slot_handle_t unassigned
const LayerGroup & as_group() const
const Layer & as_layer() const
#define ID_IS_LINKED(_id)
#define ID_IS_EDITABLE(_id)
#define ID_REAL_USERS(id)
#define ID_IS_OVERRIDE_LIBRARY(_id)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
const animrig::Channelbag * channelbag_for_action_slot(const Action &action, slot_handle_t slot_handle)
ID * action_slot_get_id_best_guess(Main &bmain, Slot &slot, ID *primary_id)
decltype(::ActionSlot::handle) slot_handle_t
Span< FCurve * > fcurves_for_action_slot(Action &action, slot_handle_t slot_handle)
bool bone_is_visible_pchan(const bArmature *armature, const bPoseChannel *pchan)
FCurve * fcurve_find_in_assigned_slot(AnimData &adt, const FCurveDescriptor &fcurve_descriptor)
bNode * node_find_node_by_name(bNodeTree &ntree, StringRefNull name)
Editing * editing_get(const Scene *scene)
Strip * get_strip_by_name(ListBase *seqbase, const char *name, bool recursive)
float wrap(float value, float max, float min)
GreasePencilLayerTreeNode base
GreasePencilLayerTreeNode base
GreasePencilLayerTreeGroup * root_group_ptr
struct bNodeTree * nodetree
struct bNodeTree * nodetree
struct bNodeTree * nodetree
struct bNodeTree * nodetree
struct bNodeTree * nodetree
struct ActionChannelbag * channelbag
void(* name)(bAnimListElem *ale, char *name)
eAnimEdit_Context dopesheet_mode
eGraphEdit_Mode grapheditor_mode
struct Collection * filter_grp
eAnimFilter_Flags filter_mode