18#define DNA_DEPRECATED_ALLOW
120 std::optional<Library *> ,
128 const bAction *dna_action_src =
reinterpret_cast<const bAction *
>(id_src);
132 FCurve *fcurve_dst, *fcurve_src;
142 fcurve_src = fcurve_src->
next)
155 group_dst && group_src;
156 group_dst = group_dst->
next, group_src = group_src->
next)
158 if (fcurve_src->
grp == group_src) {
159 fcurve_dst->
grp = group_dst;
180 for (
int i : action_src.
layers().index_range()) {
194 for (
int i : action_src.
slots().index_range()) {
195 action_dst.
slot_array[
i] = MEM_new<animrig::Slot>(__func__, *action_src.
slot(
i));
213 MEM_delete(keyframe_data);
273 if (slot_user_cache_is_known_clean) {
274 bool should_invalidate =
false;
276 for (
ID *&slot_user : slot->runtime_users()) {
277 ID *
const old_pointer = slot_user;
284 should_invalidate |= (slot_user != old_pointer);
288 if (should_invalidate) {
297 "pointers were changed while IDWALK_READONLY flag was set");
323 for (
FCurve *fcurve : fcurves) {
334 auto channelbags = strip_keyframe_data.
channelbags();
346 writer, strip_keyframe_data_array.
size(), strip_keyframe_data_array.
data());
379 shallow_copy.
runtime =
nullptr;
416 group->channels = {
nullptr,
nullptr};
419 group->channels = {fcurves.
first(), fcurves.
last()};
424 const int last_index = channel_groups.
size() - 1;
426 channel_groups[index]->prev = (index > 0) ? channel_groups[index - 1] :
nullptr;
427 channel_groups[index]->next = (index < last_index) ? channel_groups[index + 1] :
nullptr;
430 listbase.
first = channel_groups[0];
431 listbase.
last = channel_groups[last_index];
437 group->prev =
nullptr;
438 group->next =
nullptr;
439 group->channels = {
nullptr,
nullptr};
468 const int last_index = fcurves.
size() - 1;
470 fcurves[index]->prev = (index > 0) ? fcurves[index - 1] :
nullptr;
471 fcurves[index]->next = (index < last_index) ? fcurves[index + 1] :
nullptr;
474 listbase.
first = fcurves[0];
475 listbase.
last = fcurves[last_index];
481 fcurve->prev =
nullptr;
482 fcurve->next =
nullptr;
496 if (do_write_forward_compat) {
499 "Layered Action should not have legacy data");
501 "Layered Action should not have legacy data");
538 if (do_write_forward_compat) {
592 fcurve->
prev =
nullptr;
593 fcurve->
next =
nullptr;
631 for (
int layer_idx = 0; layer_idx < action.
layer_array_num; layer_idx++) {
637 for (
int strip_idx = 0; strip_idx < layer->
strip_array_num; strip_idx++) {
648 layer->
strip_array[strip_idx] = &animrig::Strip::create(action,
649 animrig::Strip::Type::Keyframe);
721 const bool is_single_frame = action && action->wrap().has_single_frame();
809 if ((grp == agrp) && (
select)) {
824 const bTheme *btheme =
static_cast<const bTheme *
>(
U.themes.first);
838 else if (grp->
cs.
solid[0] == 0) {
850 BLI_assert_msg(pchan,
"cannot 'set action group colors from posebone' without a posebone");
867 if (effective_color) {
872 memcpy(&grp->
cs, effective_color,
sizeof(grp->
cs));
906 if (
ELEM(
nullptr, act, agrp, fcurve)) {
914 fcurve->
next = fcurve->
prev =
nullptr;
948 for (grp = agrp->
prev; grp; grp = grp->
prev) {
964 if (grp ==
nullptr) {
997 ListBase ungrouped = {
nullptr,
nullptr};
1025 if (
ELEM(
nullptr, act, fcu)) {
1110 if (pose ==
nullptr) {
1181 if (
ELEM(
nullptr, ob, ob->
pose, arm)) {
1187 if ((pchan->bone) && (pchan->bone == arm->
act_bone)) {
1206 if (
ELEM(
nullptr, ob, ob->
pose, arm)) {
1216 if (pchan->
bone !=
nullptr) {
1254 const bool copy_constraints)
1278 outPose->
ikdata =
nullptr;
1292 if (pchan->custom_tx) {
1295 if (pchan->bbone_prev) {
1298 if (pchan->bbone_next) {
1302 if (copy_constraints) {
1306 pchan->constraints = listb;
1316 if (pchan->system_properties) {
1320 pchan->draw_data =
nullptr;
1327 if (copy_constraints) {
1380 if ((
data->rootbone == 0) || (
data->rootbone > level)) {
1416 float r_pose_orientation[3][3])
1431 float r_pose_space_pivot[3])
1462 if (pchan->bbone_prev == unlinked_pchan) {
1463 pchan->bbone_prev =
nullptr;
1465 if (pchan->bbone_next == unlinked_pchan) {
1466 pchan->bbone_next =
nullptr;
1468 if (pchan->custom_tx == unlinked_pchan) {
1469 pchan->custom_tx =
nullptr;
1475 bool (*filter_fn)(
const char *bone_name,
void *user_data),
1484 pchan_next = pchan->
next;
1486 if (filter_fn(pchan->
name, user_data)) {
1498 ListBase targets = {
nullptr,
nullptr};
1501 if (ct->tar == ob) {
1502 if (ct->subtarget[0]) {
1503 if (filter_fn(ct->subtarget, user_data)) {
1505 ct->subtarget[0] = 0;
1547 pchan->
mpath =
nullptr;
1554 pchan->
prop =
nullptr;
1689 pchan->
prop =
nullptr;
1691 if (pchan_from->
prop) {
1727 pchan->constflag = 0;
1732 switch (con->type) {
1746 if (
data->rootbone < 0) {
1755 parchan = parchan->
parent;
1762 for (
short index = 0; chain_bone && (
data->rootbone == 0 || index <
data->rootbone);
1766 chain_bone = chain_bone->
parent;
1837 if (pchan->agrp_index == idx) {
1838 pchan->agrp_index = 0;
1840 else if (pchan->agrp_index > idx) {
1841 pchan->agrp_index--;
1882 if (selected_bones_only && pchan->bone !=
nullptr && (pchan->flag &
POSE_SELECTED) == 0) {
1889 pchan->scale[0] = pchan->scale[1] = pchan->scale[2] = 1.0f;
1891 pchan->roll1 = pchan->roll2 = 0.0f;
1892 pchan->curve_in_x = pchan->curve_in_z = 0.0f;
1893 pchan->curve_out_x = pchan->curve_out_z = 0.0f;
1894 pchan->ease1 = pchan->ease2 = 0.0f;
1936 if (to ==
nullptr || from ==
nullptr) {
1938 &
LOG,
"Pose copy error, pose to:%p from:%p", (
void *)to, (
void *)from);
1949 if (pchanto !=
nullptr) {
1969 const int32_t action_slot_handle,
1977 if (groupname && groupname[0]) {
1979 Action &action = act->wrap();
1992 workob->
runtime = &workob_runtime;
1995 copy_m4_m4(workob->
runtime->object_to_world.ptr(), ob->object_to_world().ptr());
2014 workob->
pose = pose;
2058 workob->
adt =
nullptr;
2066 if (pose ==
nullptr) {
2074 const SessionUID *session_uid = &pchan->runtime.session_uid;
2076 printf(
"Pose channel %s does not have UID generated.\n", pchan->name);
2081 printf(
"Pose channel %s has duplicate UID generated.\n", pchan->name);
2104 if (chan->system_properties) {
2148 pchan->bone =
nullptr;
2174 pchan->draw_data =
nullptr;
2177 if (pose->
ikparam !=
nullptr) {
2192 if (!pose || !arm) {
2197 bool rebuild =
false;
2208 if (
UNLIKELY(pchan->bone ==
nullptr)) {
2216 if (pchan->custom && pchan->custom->type ==
OB_ARMATURE) {
2217 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
void * BKE_id_new(Main *bmain, short type, const char *name)
@ LIB_ID_CREATE_NO_USER_REFCOUNT
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)
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)
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_m3_m4(float m1[3][3], const float m2[4][4])
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)
#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)
#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_TRANSFORM_AT_CUSTOM_TX
@ 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)
void BKE_pose_channel_transform_orientation(const bArmature *arm, const bPoseChannel *pose_bone, float r_pose_orientation[3][3])
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)
static bool transform_follows_custom_tx(const bArmature *arm, const bPoseChannel *pchan)
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)
void BKE_pose_blend_write(BlendWriter *writer, bPose *pose)
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)
void BKE_pose_channel_transform_location(const bArmature *arm, const bPoseChannel *pose_bone, float r_pose_space_pivot[3])
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)
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
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_selected(const bArmature *armature, const Bone *bone)
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