58 if (ob->
data != &
id) {
72 for (
int i = 0; i < related_ids.size(); i++) {
73 ID *related_id = related_ids[i];
81 related_ids.append_non_duplicates(owner_id);
85 switch (
GS(related_id->
name)) {
93 related_ids.append_non_duplicates(data);
96 if (!particle_system) {
102 related_ids.append_non_duplicates(&particle_system->part->id);
109 Key *key = (
Key *)related_id;
112 related_ids.append_non_duplicates(key->
from);
120 related_ids.append_non_duplicates(&mat->
nodetree->
id);
134 bool object_uses_particle_settings =
false;
136 if (!particle_system) {
139 if (&particle_system->part->id != related_id) {
142 object_uses_particle_settings =
true;
145 if (object_uses_particle_settings) {
146 related_ids.append_non_duplicates(&ob->
id);
160 related_ids.append_non_duplicates(&
node_tree->id);
167 related_ids.append_non_duplicates(&key->
id);
183 for (
ID *related_id : related_ids) {
198 if (adt ==
nullptr) {
199 printf(
"ERROR: data-block type is not animatable (ID = %s)\n", (
id) ? (id->name) :
"<None>");
205 if (adt->
action ==
nullptr) {
210 if (action ==
nullptr) {
212 char actname[
sizeof(
id->name) - 2];
259 if (
ELEM(
nullptr, adt, fcu)) {
319 if (adt->
action !=
nullptr) {
339 if (filtering_enabled) {
342 ListBase anim_data = {
nullptr,
nullptr};
352 fcu->
flag &= ~FCURVE_DISABLED;
360 if (filtering_enabled) {
367 const int array_index)
389 for (
int layer_idx = action.
layer_array_num - 1; layer_idx >= 0; layer_idx--) {
393 for (
const Strip *strip : layer->strips()) {
394 switch (strip->type()) {
395 case Strip::Type::Keyframe: {
398 if (!channelbag_for_slot) {
401 const FCurve *fcu = channelbag_for_slot->fcurve_find({rna_path, array_index});
Functions and classes to work with Actions.
Functions to work with AnimData.
Blender kernel action and pose functionality.
void action_groups_remove_channel(bAction *act, FCurve *fcu)
bAction * BKE_action_add(Main *bmain, const char name[])
AnimData * BKE_animdata_ensure_id(ID *id)
void BKE_fcurve_free(FCurve *fcu)
Key * BKE_key_from_id(ID *id)
ID * BKE_id_owner_get(ID *id, const bool debug_relationship_assert=true)
#define FOREACH_MAIN_LISTBASE_ID_END
#define FOREACH_MAIN_LISTBASE_ID_BEGIN(_lb, _id)
General operations, lookup, etc. for materials.
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define SNPRINTF(dst, format,...)
#define UNUSED_VARS_NDEBUG(...)
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
@ ID_RECALC_ANIMATION_NO_FLUSH
#define ID_REAL_USERS(id)
#define USER_EXPERIMENTAL_TEST(userdef, member)
@ ANIMFILTER_DATA_VISIBLE
void ANIM_animdata_freelist(ListBase *anim_data)
size_t ANIM_animdata_filter(bAnimContext *ac, ListBase *anim_data, const eAnimFilter_Flags filter_mode, void *data, const eAnimCont_Types datatype)
void append_non_duplicates(const T &value)
const Layer * layer(int64_t index) const
bool is_action_legacy() const
bool is_action_layered() const
Slot * slot_for_handle(slot_handle_t handle)
const ChannelBag * channelbag_for_slot(const Slot &slot) const
bool action_fcurve_remove(Action &action, FCurve &fcu)
Vector< ID * > find_related_ids(Main &bmain, ID &id)
bAction * id_action_ensure(Main *bmain, ID *id)
static void add_object_data_users(const Main &bmain, const ID &id, Vector< ID * > &related_ids)
Action * get_action(ID &animated_id)
void reevaluate_fcurve_errors(bAnimContext *ac)
bool animdata_remove_empty_action(AnimData *adt)
bool assign_action(bAction *action, ID &animated_id)
static bAction * find_related_action(Main &bmain, ID &id)
const FCurve * fcurve_find_by_rna_path(const AnimData &adt, StringRefNull rna_path, int array_index)
void animdata_fcurve_delete(bAnimContext *ac, AnimData *adt, FCurve *fcu)
bNodeTree * node_tree_from_id(ID *id)
PointerRNA RNA_id_pointer_create(ID *id)
bool RNA_path_resolve_property(const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
struct bNodeTree * nodetree