18#define DNA_DEPRECATED_ALLOW
121 std::optional<Library *> ,
129 const bAction *dna_action_src =
reinterpret_cast<const bAction *
>(id_src);
133 FCurve *fcurve_dst, *fcurve_src;
143 fcurve_src = fcurve_src->
next)
156 group_dst && group_src;
157 group_dst = group_dst->
next, group_src = group_src->
next)
159 if (fcurve_src->
grp == group_src) {
160 fcurve_dst->
grp = group_dst;
181 for (
int i : action_src.
layers().index_range()) {
195 for (
int i : action_src.
slots().index_range()) {
196 action_dst.
slot_array[
i] = MEM_new<animrig::Slot>(__func__, *action_src.
slot(
i));
214 MEM_delete(keyframe_data);
275 if (slot_user_cache_is_known_clean) {
276 bool should_invalidate =
false;
278 for (
ID *&slot_user : slot->runtime_users()) {
279 ID *
const old_pointer = slot_user;
286 should_invalidate |= (slot_user != old_pointer);
290 if (should_invalidate) {
298 "pointers were changed while IDWALK_READONLY flag was set");
334 for (
FCurve *fcurve : fcurves) {
345 auto channelbags = strip_keyframe_data.
channelbags();
357 writer, strip_keyframe_data_array.
size(), strip_keyframe_data_array.
data());
390 shallow_copy.
runtime =
nullptr;
427 group->channels = {
nullptr,
nullptr};
430 group->channels = {fcurves.
first(), fcurves.
last()};
435 const int last_index = channel_groups.
size() - 1;
437 channel_groups[index]->prev = (index > 0) ? channel_groups[index - 1] :
nullptr;
438 channel_groups[index]->next = (index < last_index) ? channel_groups[index + 1] :
nullptr;
441 listbase.
first = channel_groups[0];
442 listbase.
last = channel_groups[last_index];
448 group->prev =
nullptr;
449 group->next =
nullptr;
450 group->channels = {
nullptr,
nullptr};
479 const int last_index = fcurves.
size() - 1;
481 fcurves[index]->prev = (index > 0) ? fcurves[index - 1] :
nullptr;
482 fcurves[index]->next = (index < last_index) ? fcurves[index + 1] :
nullptr;
485 listbase.
first = fcurves[0];
486 listbase.
last = fcurves[last_index];
492 fcurve->prev =
nullptr;
493 fcurve->next =
nullptr;
507 if (do_write_forward_compat) {
510 "Layered Action should not have legacy data");
512 "Layered Action should not have legacy data");
549 if (do_write_forward_compat) {
603 fcurve->
prev =
nullptr;
604 fcurve->
next =
nullptr;
642 for (
int layer_idx = 0; layer_idx < action.
layer_array_num; layer_idx++) {
648 for (
int strip_idx = 0; strip_idx < layer->
strip_array_num; strip_idx++) {
659 layer->
strip_array[strip_idx] = &animrig::Strip::create(action,
660 animrig::Strip::Type::Keyframe);
745 const bool is_single_frame = action && action->wrap().has_single_frame();
832 if ((grp == agrp) && (
select)) {
847 const bTheme *btheme =
static_cast<const bTheme *
>(
U.themes.first);
861 else if (grp->
cs.
solid[0] == 0) {
873 BLI_assert_msg(pchan,
"cannot 'set action group colors from posebone' without a posebone");
890 if (effective_color) {
895 memcpy(&grp->
cs, effective_color,
sizeof(grp->
cs));
904 if (
ELEM(
nullptr, act, name)) {
929 if (
ELEM(
nullptr, act, agrp, fcurve)) {
937 fcurve->
next = fcurve->
prev =
nullptr;
971 for (grp = agrp->
prev; grp; grp = grp->
prev) {
987 if (grp ==
nullptr) {
1020 ListBase ungrouped = {
nullptr,
nullptr};
1048 if (
ELEM(
nullptr, act, fcu)) {
1117 if (
ELEM(
nullptr, pose, name) || (name[0] ==
'\0')) {
1133 if (pose ==
nullptr) {
1204 if (
ELEM(
nullptr, ob, ob->
pose, arm)) {
1210 if ((pchan->bone) && (pchan->bone == arm->
act_bone)) {
1229 if (
ELEM(
nullptr, ob, ob->
pose, arm)) {
1241 if (pchan->
bone !=
nullptr) {
1258 if (!
STREQ(name_flip, name)) {
1281 const bool copy_constraints)
1305 outPose->
ikdata =
nullptr;
1319 if (pchan->custom_tx) {
1322 if (pchan->bbone_prev) {
1325 if (pchan->bbone_next) {
1329 if (copy_constraints) {
1333 pchan->constraints = listb;
1343 if (pchan->system_properties) {
1347 pchan->draw_data =
nullptr;
1354 if (copy_constraints) {
1407 if ((
data->rootbone == 0) || (
data->rootbone > level)) {
1449 if (pchan->bbone_prev == unlinked_pchan) {
1450 pchan->bbone_prev =
nullptr;
1452 if (pchan->bbone_next == unlinked_pchan) {
1453 pchan->bbone_next =
nullptr;
1455 if (pchan->custom_tx == unlinked_pchan) {
1456 pchan->custom_tx =
nullptr;
1462 bool (*filter_fn)(
const char *bone_name,
void *user_data),
1471 pchan_next = pchan->
next;
1473 if (filter_fn(pchan->
name, user_data)) {
1485 ListBase targets = {
nullptr,
nullptr};
1488 if (ct->tar == ob) {
1489 if (ct->subtarget[0]) {
1490 if (filter_fn(ct->subtarget, user_data)) {
1492 ct->subtarget[0] = 0;
1534 pchan->
mpath =
nullptr;
1541 pchan->
prop =
nullptr;
1676 pchan->
prop =
nullptr;
1678 if (pchan_from->
prop) {
1714 pchan->constflag = 0;
1719 switch (con->type) {
1733 if (
data->rootbone < 0) {
1742 parchan = parchan->
parent;
1749 for (
short index = 0; chain_bone && (
data->rootbone == 0 || index <
data->rootbone);
1753 chain_bone = chain_bone->
parent;
1796 name =
DATA_(
"Group");
1824 if (pchan->agrp_index == idx) {
1825 pchan->agrp_index = 0;
1827 else if (pchan->agrp_index > idx) {
1828 pchan->agrp_index--;
1869 if (selected_bones_only && pchan->bone !=
nullptr && (pchan->bone->flag &
BONE_SELECTED) == 0)
1877 pchan->scale[0] = pchan->scale[1] = pchan->scale[2] = 1.0f;
1879 pchan->roll1 = pchan->roll2 = 0.0f;
1880 pchan->curve_in_x = pchan->curve_in_z = 0.0f;
1881 pchan->curve_out_x = pchan->curve_out_z = 0.0f;
1882 pchan->ease1 = pchan->ease2 = 0.0f;
1924 if (to ==
nullptr || from ==
nullptr) {
1926 &
LOG,
"Pose copy error, pose to:%p from:%p", (
void *)to, (
void *)from);
1937 if (pchanto !=
nullptr) {
1957 const int32_t action_slot_handle,
1965 if (groupname && groupname[0]) {
1967 Action &action = act->wrap();
1980 workob->
runtime = &workob_runtime;
1983 copy_m4_m4(workob->
runtime->object_to_world.ptr(), ob->object_to_world().ptr());
2002 workob->
pose = pose;
2046 workob->
adt =
nullptr;
2054 if (pose ==
nullptr) {
2062 const SessionUID *session_uid = &pchan->runtime.session_uid;
2064 printf(
"Pose channel %s does not have UID generated.\n", pchan->name);
2069 printf(
"Pose channel %s has duplicate UID generated.\n", pchan->name);
2082 BLI_assert(pose !=
nullptr && arm !=
nullptr);
2105 if (bone !=
nullptr) {
2146 pchan->bone =
nullptr;
2172 pchan->draw_data =
nullptr;
2175 if (pose->
ikparam !=
nullptr) {
2190 if (!pose || !arm) {
2195 bool rebuild =
false;
2206 if (
UNLIKELY(pchan->bone ==
nullptr)) {
2212 pchan->bone->flag |= pchan->selectflag;
2219 if (pchan->custom && pchan->custom->type ==
OB_ARMATURE) {
2220 pchan->custom =
nullptr;
Functions and classes to work with Actions.
Functions for backward compatibility with the legacy Action API.
Functions to deal with Armatures.
C++ functions to deal with Armature collections (i.e. the successor of bone layers).
bool ANIM_bone_in_visible_collection(const bArmature *armature, const Bone *bone)
C++ part of the BoneColor DNA struct.
Versioning of old animation data. Most animation versioning code lives in the versioning_xxx....
void BIK_clear_data(struct bPose *pose)
Blender kernel action and pose functionality.
bool BKE_animdata_action_ensure_idroot(const ID *owner, bAction *action)
void animviz_free_motionpath(struct bMotionPath *mpath)
void animviz_motionpath_blend_write(struct BlendWriter *writer, struct bMotionPath *mpath)
void animviz_motionpath_blend_read_data(struct BlendDataReader *reader, struct bMotionPath *mpath)
struct bMotionPath * animviz_copy_motionpath(const struct bMotionPath *mpath_src)
void BKE_time_markers_blend_read(BlendDataReader *reader, ListBase &markers)
void BKE_copy_time_markers(ListBase &markers_dst, const ListBase &markers_src, int flag)
void BKE_animsys_evaluate_animdata(struct ID *id, struct AnimData *adt, const struct AnimationEvalContext *anim_eval_context, eAnimData_Recalc recalc, bool flush_to_original)
void animsys_evaluate_action_group(struct PointerRNA *ptr, struct bAction *act, struct bActionGroup *agrp, const struct AnimationEvalContext *anim_eval_context)
void BKE_time_markers_blend_write(BlendWriter *writer, ListBase &markers)
Bone * BKE_armature_find_bone_name(bArmature *arm, const char *name)
void BKE_asset_metadata_idprop_ensure(AssetMetaData *asset_data, IDProperty *prop)
void BKE_constraints_free_ex(struct ListBase *list, bool do_id_user)
void BKE_constraint_targets_flush(struct bConstraint *con, struct ListBase *targets, bool no_copy)
void BKE_constraint_blend_write(struct BlendWriter *writer, struct ListBase *conlist)
int BKE_constraint_targets_get(struct bConstraint *con, struct ListBase *r_targets)
void BKE_constraints_copy(struct ListBase *dst, const struct ListBase *src, bool do_extern)
void BKE_constraint_blend_read_data(struct BlendDataReader *reader, struct ID *id_owner, struct ListBase *lb)
void BKE_constraints_copy_ex(struct ListBase *dst, const struct ListBase *src, int flag, bool do_extern)
FCurve * BKE_fcurve_copy(const FCurve *fcu)
void BKE_fcurve_blend_write_data(BlendWriter *writer, FCurve *fcu)
void BKE_fcurve_blend_write_listbase(BlendWriter *writer, ListBase *fcurves)
void BKE_fcurve_blend_read_data_listbase(BlendDataReader *reader, ListBase *fcurves)
void BKE_fcurves_free(ListBase *list)
void BKE_fcurve_free(FCurve *fcu)
void BKE_fcurve_blend_read_data(BlendDataReader *reader, FCurve *fcu)
#define IDP_BlendDataRead(reader, prop)
void IDP_FreeProperty(IDProperty *prop)
IDProperty * IDP_CopyProperty_ex(const IDProperty *prop, int flag) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
IDProperty * IDP_CopyProperty(const IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void IDP_BlendWrite(BlendWriter *writer, const IDProperty *prop)
void IDP_FreeProperty_ex(IDProperty *prop, bool do_id_user)
@ IDTYPE_FLAGS_NO_ANIMDATA
@ LIB_ID_CREATE_NO_USER_REFCOUNT
void * BKE_id_new(Main *bmain, short type, const char *name)
void BKE_id_blend_write(BlendWriter *writer, ID *id)
#define BKE_LIB_FOREACHID_PROCESS_IDSUPER(data_, id_super_, cb_flag_)
LibraryForeachIDCallbackFlag
Main * BKE_lib_query_foreachid_process_main_get(const LibraryForeachIDData *data)
#define BKE_LIB_FOREACHID_PROCESS_ID(data_, id_, cb_flag_)
LibraryForeachIDFlag BKE_lib_query_foreachid_process_flags_get(const LibraryForeachIDData *data)
@ IDWALK_DO_DEPRECATED_POINTERS
#define BKE_LIB_FOREACHID_PROCESS_ID_NOCHECK(data_, id_, cb_flag_)
General operations, lookup, etc. for blender objects.
void BKE_object_workob_clear(Object *workob)
void BKE_previewimg_blend_write(BlendWriter *writer, const PreviewImage *prv)
void BKE_previewimg_free(PreviewImage **prv)
void BKE_previewimg_blend_read(BlendDataReader *reader, PreviewImage *prv)
void BKE_previewimg_id_copy(ID *new_id, const ID *old_id)
#define BLI_assert_msg(a, msg)
BLI_INLINE void BLI_endian_switch_int16(short *val) ATTR_NONNULL(1)
void * BLI_gset_lookup(const GSet *gs, const void *key) ATTR_WARN_UNUSED_RESULT
GHash * BLI_ghash_str_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void BLI_gset_insert(GSet *gs, void *key)
GSet * BLI_gset_new(GSetHashFP hashfp, GSetCmpFP cmpfp, const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
bool BLI_ghash_remove(GHash *gh, const void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_insert(GHash *gh, void *key, void *val)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
void BLI_gset_free(GSet *gs, GSetKeyFreeFP keyfreefp)
int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_findlink(const ListBase *listbase, int number) 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 void BLI_listbase_clear(ListBase *lb)
void * BLI_findstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
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)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void void void void void BLI_duplicatelist(ListBase *dst, const ListBase *src) ATTR_NONNULL(1
void BLI_insertlinkbefore(ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1)
MINLINE void rgba_uchar_args_set(unsigned char col[4], unsigned char r, unsigned char g, unsigned char b, unsigned char a)
void copy_m4_m4(float m1[4][4], const float m2[4][4])
void unit_m4(float m[4][4])
void unit_axis_angle(float axis[3], float *angle)
void copy_qt_qt(float q[4], const float a[4])
MINLINE void copy_v4_v4_uchar(unsigned char r[4], const unsigned char a[4])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void copy_v3_fl(float r[3], float f)
MINLINE void zero_v3(float r[3])
bool BLI_session_uid_is_generated(const SessionUID *uid)
uint BLI_session_uid_ghash_hash(const void *uid_v)
bool BLI_session_uid_ghash_compare(const void *lhs_v, const void *rhs_v)
SessionUID BLI_session_uid_generate(void)
char * STRNCPY(char(&dst)[N], const char *src)
#define STRNCPY_UTF8(dst, src)
size_t BLI_string_flip_side_name(char *name_dst, const char *name_src, bool strip_number, size_t name_dst_maxncpy) ATTR_NONNULL(1
void BLI_uniquename(const struct ListBase *list, void *vlink, const char *defname, char delim, int name_offset, size_t name_maxncpy) ATTR_NONNULL(1
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
Main * BLO_read_lib_get_main(BlendLibReader *reader)
void BLO_write_struct_by_name(BlendWriter *writer, const char *struct_name, const void *data_ptr)
#define BLO_write_id_struct(writer, struct_name, id_address, id)
#define BLO_write_struct(writer, struct_name, data_ptr)
void * BLO_read_struct_by_name_array(BlendDataReader *reader, const char *struct_name, int64_t items_num, const void *old_address)
bool BLO_read_lib_is_undo(BlendLibReader *reader)
bool BLO_read_requires_endian_switch(BlendDataReader *reader)
#define BLO_read_struct_list(reader, struct_name, list)
#define BLO_read_struct(reader, struct_name, ptr_p)
void BLO_write_pointer_array(BlendWriter *writer, int64_t num, const void *data_ptr)
void BLO_read_pointer_array(BlendDataReader *reader, int64_t array_size, void **ptr_p)
bool BLO_write_is_undo(BlendWriter *writer)
#define BLO_write_struct_at_address(writer, struct_name, address, data_ptr)
#define BLT_I18NCONTEXT_ID_ACTION
#define CLOG_ERROR(clg_ref,...)
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
@ ID_RECALC_ANIMATION_NO_FLUSH
@ ITASC_INITIAL_REITERATION
@ POSE_CONSTRAINTS_NEED_UPDATE_FLAGS
@ POSE_CONSTRAINTS_TIMEDEPEND
@ CONSTRAINT_TYPE_SPLINEIK
@ CONSTRAINT_TYPE_KINEMATIC
@ CONSTRAINT_TYPE_FOLLOWPATH
#define DNA_struct_default_get(struct_name)
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
void BKE_pose_channels_remove(Object *ob, bool(*filter_fn)(const char *bone_name, void *user_data), void *user_data)
void BKE_pose_channels_free(bPose *pose)
void action_group_colors_set_from_posebone(bActionGroup *grp, const bPoseChannel *pchan)
bPoseChannel * BKE_pose_channel_active_if_bonecoll_visible(Object *ob)
bool BKE_pose_channels_is_valid(const bPose *pose)
void BKE_pose_channel_runtime_reset(bPoseChannel_Runtime *runtime)
void BKE_pose_free_data(bPose *pose)
void BKE_pose_blend_read_after_liblink(BlendLibReader *reader, Object *ob, bPose *pose)
void BKE_pose_tag_recalc(Main *bmain, bPose *pose)
void BKE_pose_channel_copy_data(bPoseChannel *pchan, const bPoseChannel *pchan_from)
void BKE_pose_remove_group_index(bPose *pose, const int index)
bool BKE_pose_copy_result(bPose *to, bPose *from)
void action_group_colors_set(bActionGroup *grp, const BoneColor *color)
void BKE_pose_remove_group(bPose *pose, bActionGroup *grp, const int index)
bActionGroup * get_active_actiongroup(bAction *act)
void set_active_action_group(bAction *act, bActionGroup *agrp, short select)
void BKE_pose_channel_runtime_free(bPoseChannel_Runtime *runtime)
static bool pose_channel_in_IK_chain(Object *ob, bPoseChannel *pchan, int level)
void BKE_pose_tag_update_constraint_flags(bPose *pose)
void action_groups_clear_tempflags(bAction *act)
void BKE_pose_ikparam_init(bPose *pose)
static void pose_channels_remove_internal_links(Object *ob, bPoseChannel *unlinked_pchan)
bool BKE_pose_is_bonecoll_visible(const bArmature *arm, const bPoseChannel *pchan)
void BKE_pose_free_data_ex(bPose *pose, bool do_id_user)
void BKE_pose_itasc_init(bItasc *itasc)
void BKE_pose_copy_pchan_result(bPoseChannel *pchanto, const bPoseChannel *pchanfrom)
bPoseChannel * BKE_pose_channel_get_mirrored(const bPose *pose, const char *name)
void BKE_pose_channel_free(bPoseChannel *pchan)
bPoseChannel * BKE_pose_channel_active(Object *ob, const bool check_bonecoll)
void BKE_pose_channels_hash_ensure(bPose *pose)
bActionGroup * BKE_pose_add_group(bPose *pose, const char *name)
void BKE_pose_free_ex(bPose *pose, bool do_id_user)
void BKE_action_groups_reconstruct(bAction *act)
void BKE_pose_channel_session_uid_generate(bPoseChannel *pchan)
bPoseChannel * BKE_pose_channel_ensure(bPose *pose, const char *name)
void action_groups_add_channel(bAction *act, bActionGroup *agrp, FCurve *fcurve)
void BKE_pose_copy_data_ex(bPose **dst, const bPose *src, const int flag, const bool copy_constraints)
void what_does_obaction(Object *ob, Object *workob, bPose *pose, bAction *act, const int32_t action_slot_handle, char groupname[], const AnimationEvalContext *anim_eval_context)
bPoseChannel * BKE_pose_channel_active_or_first_selected(Object *ob)
void BKE_action_fcurves_clear(bAction *act)
bPoseChannel * BKE_pose_channel_find_name(const bPose *pose, const char *name)
void BKE_pose_blend_read_data(BlendDataReader *reader, ID *id_owner, bPose *pose)
void BKE_pose_free(bPose *pose)
void action_groups_remove_channel(bAction *act, FCurve *fcu)
bool BKE_pose_channel_in_IK_chain(Object *ob, bPoseChannel *pchan)
void BKE_pose_channel_free_bbone_cache(bPoseChannel_Runtime *runtime)
void BKE_pose_channel_runtime_reset_on_copy(bPoseChannel_Runtime *runtime)
void BKE_pose_channels_free_ex(bPose *pose, bool do_id_user)
void BKE_pose_blend_write(BlendWriter *writer, bPose *pose, bArmature *arm)
bAction * BKE_action_add(Main *bmain, const char name[])
void BKE_pose_update_constraint_flags(bPose *pose)
const char * BKE_pose_ikparam_get_name(bPose *pose)
bActionGroup * action_groups_add_new(bAction *act, const char name[])
void BKE_pose_channels_hash_free(bPose *pose)
void action_group_colors_sync(bActionGroup *grp, const bActionGroup *ref_grp)
bActionGroup * BKE_action_group_find_name(bAction *act, const char name[])
void BKE_pose_check_uids_unique_and_report(const bPose *pose)
void BKE_pose_channel_free_ex(bPoseChannel *pchan, bool do_id_user)
void BKE_pose_copy_data(bPose **dst, const bPose *src, const bool copy_constraints)
void BKE_pose_rest(bPose *pose, bool selected_bones_only)
BMesh const char void * data
constexpr const T * data() const
constexpr const T & first() const
constexpr int64_t size() const
constexpr const T & last(const int64_t n=0) const
constexpr IndexRange index_range() const
constexpr bool is_empty() const
const Layer * layer(int64_t index) const
const Slot * slot(int64_t index) const
blender::Span< const Layer * > layers() const
bool is_action_layered() const
blender::Span< const Slot * > slots() const
Span< const StripKeyframeData * > strip_keyframe_data() const
const ThemeWireColor * effective_color() const
const bActionGroup * channel_group_find(StringRef name) const
blender::Span< const FCurve * > fcurves() const
blender::Span< const bActionGroup * > channel_groups() const
Layer * duplicate_with_shallow_strip_copies(StringRefNull allocation_name) const
static void users_invalidate(Main &bmain)
blender::Span< const Channelbag * > channelbags() const
#define ID_IS_LINKED(_id)
DEG_id_tag_update_ex(cb_data->bmain, cb_data->owner_id, ID_RECALC_TAG_FOR_UNDO|ID_RECALC_SYNC_TO_EVAL)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
Vector< bActionGroup * > channel_groups_all(bAction *action)
bool action_is_layered(const bAction &dna_action)
void assert_baklava_phase_1_invariants(const Action &action)
const animrig::Channelbag * channelbag_for_action_slot(const Action &action, slot_handle_t slot_handle)
const BoneColor & ANIM_bonecolor_posebone_get(const bPoseChannel *pose_bone)
bool bone_is_visible_pchan(const bArmature *armature, const bPoseChannel *pchan)
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRef prop_name, int32_t value, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_INT, set its name and value.
static void write_strips(BlendWriter *writer, Span< animrig::Strip * > strips)
static void action_blend_read_data(BlendDataReader *reader, ID *id)
static void action_init_data(ID *action_id)
static void read_layers(BlendDataReader *reader, animrig::Action &action)
static void write_layers(BlendWriter *writer, Span< animrig::Layer * > layers)
static void action_copy_data(Main *, std::optional< Library * >, ID *id_dst, const ID *id_src, const int flag)
static void read_slots(BlendDataReader *reader, animrig::Action &action)
static void read_strip_keyframe_data_array(BlendDataReader *reader, animrig::Action &action)
static void action_blend_write_make_legacy_fcurves_listbase(ListBase &listbase, const Span< FCurve * > fcurves)
static void read_strip_keyframe_data(BlendDataReader *reader, animrig::StripKeyframeData &strip_keyframe_data)
static void write_slots(BlendWriter *writer, Span< animrig::Slot * > slots)
static void action_blend_write_clear_legacy_channel_groups_listbase(ListBase &listbase)
static IDProperty * action_asset_type_property(const bAction *action)
static void write_strip_keyframe_data(BlendWriter *writer, animrig::StripKeyframeData &strip_keyframe_data)
static void action_asset_metadata_ensure(void *asset_ptr, AssetMetaData *asset_data)
static void action_blend_write(BlendWriter *writer, ID *id, const void *id_address)
static void write_strip_keyframe_data_array(BlendWriter *writer, Span< animrig::StripKeyframeData * > strip_keyframe_data_array)
static void action_blend_write_make_legacy_channel_groups_listbase(ListBase &listbase, const Span< bActionGroup * > channel_groups)
static void action_free_data(ID *id)
static void read_channelbag(BlendDataReader *reader, animrig::Channelbag &channelbag)
static void write_channelbag(BlendWriter *writer, animrig::Channelbag &channelbag)
static void action_blend_write_clear_legacy_fcurves_listbase(ListBase &listbase)
static void action_foreach_id(ID *id, LibraryForeachIDData *data)
static AssetTypeInfo AssetType_AC
float wrap(float value, float max, float min)
PointerRNA RNA_id_pointer_create(ID *id)
struct bActionGroup ** group_array
struct FCurve ** fcurve_array
struct ActionStrip ** strip_array
ActionSlotRuntimeHandle * runtime
struct ActionChannelbag ** channelbag_array
bool is_action_slot_to_id_map_dirty
ObjectRuntimeHandle * runtime
struct bActionGroup * prev
struct bActionGroup * next
struct ActionChannelbag * channelbag
struct ActionSlot ** slot_array
struct ActionStripKeyframeData ** strip_keyframe_data_array
struct ActionLayer ** layer_array
int strip_keyframe_data_array_num
struct Mat4 * bbone_deform_mats
struct bPoseChannel_BBoneSegmentBoundary * bbone_segment_boundaries
struct DualQuat * bbone_dual_quats
struct Mat4 * bbone_pose_mats
struct Mat4 * bbone_rest_mats
float custom_scale_xyz[3]
bPoseChannelDrawData * draw_data
float custom_rotation_euler[3]
struct bPoseChannel * parent
struct bPoseChannel * custom_tx
struct bPoseChannel * bbone_next
struct bPoseChannel * next
float custom_translation[3]
float custom_shape_wire_width
IDProperty * system_properties
struct bPoseChannel_Runtime runtime
struct bPoseChannel * bbone_prev
struct bPoseChannel * child
bPoseChannel ** chan_array