18#define DNA_DEPRECATED_ALLOW
66#include "RNA_prototypes.hh"
110 std::optional<Library *> ,
118 const bAction *dna_action_src =
reinterpret_cast<const bAction *
>(id_src);
122 FCurve *fcurve_dst, *fcurve_src;
132 fcurve_src = fcurve_src->
next)
145 group_dst && group_src;
146 group_dst = group_dst->
next, group_src = group_src->
next)
148 if (fcurve_src->
grp == group_src) {
149 fcurve_dst->
grp = group_dst;
170 for (
int i : action_src.
layers().index_range()) {
184 for (
int i : action_src.
slots().index_range()) {
185 action_dst.
slot_array[i] = MEM_new<animrig::Slot>(__func__, *action_src.
slot(i));
203 MEM_delete(keyframe_data);
263 for (
ID *slot_user : slot->users(*bmain)) {
278 bool should_invalidate =
false;
281 for (
ID *slot_user : slot->runtime_users()) {
282 ID *old_pointer = slot_user;
285 should_invalidate |= (slot_user != old_pointer);
289 if (should_invalidate) {
313#ifdef WITH_ANIM_BAKLAVA
326 for (
FCurve *fcurve : fcurves) {
332static void write_strip_keyframe_data(
BlendWriter *writer,
337 auto channelbags = strip_keyframe_data.
channelbags();
341 write_channelbag(writer, *channelbag);
345static void write_strip_keyframe_data_array(
349 writer, strip_keyframe_data_array.
size(), strip_keyframe_data_array.
data());
352 write_strip_keyframe_data(writer, *keyframe_data);
371 write_strips(writer, layer->strips());
382 shallow_copy.
runtime =
nullptr;
403static void action_blend_write_make_legacy_channel_groups_listbase(
419 group->channels = {
nullptr,
nullptr};
422 group->channels = {fcurves.
first(), fcurves.
last()};
427 const int last_index = channel_groups.
size() - 1;
428 for (
int index : channel_groups.index_range()) {
429 channel_groups[index]->prev = (index > 0) ? channel_groups[index - 1] : nullptr;
430 channel_groups[index]->next = (index < last_index) ? channel_groups[index + 1] : nullptr;
433 listbase.
first = channel_groups[0];
434 listbase.
last = channel_groups[last_index];
437static void action_blend_write_clear_legacy_channel_groups_listbase(
ListBase &listbase)
440 group->prev =
nullptr;
441 group->next =
nullptr;
442 group->channels = {
nullptr,
nullptr};
462static void action_blend_write_make_legacy_fcurves_listbase(
ListBase &listbase,
471 const int last_index = fcurves.
size() - 1;
472 for (
int index : fcurves.index_range()) {
473 fcurves[index]->prev = (index > 0) ? fcurves[index - 1] : nullptr;
474 fcurves[index]->next = (index < last_index) ? fcurves[index + 1] : nullptr;
477 listbase.
first = fcurves[0];
478 listbase.
last = fcurves[last_index];
481static void action_blend_write_clear_legacy_fcurves_listbase(
ListBase &listbase)
484 fcurve->prev =
nullptr;
485 fcurve->next =
nullptr;
496#ifdef WITH_ANIM_BAKLAVA
501 if (do_write_forward_compat) {
504 "Layered Action should not have legacy data");
506 "Layered Action should not have legacy data");
516 action_blend_write_make_legacy_fcurves_listbase(action.
curves, bag->
fcurves());
525 "Action should not have layers, built without Baklava experimental feature");
527 "Action should not have layers, built without Baklava experimental feature");
529 "Action should not have slots, built without Baklava experimental feature");
531 "Action should not have slots, built without Baklava experimental feature");
541#ifdef WITH_ANIM_BAKLAVA
544 write_layers(writer, action.
layers());
545 write_slots(writer, action.
slots());
547 if (do_write_forward_compat) {
560 action_blend_write_clear_legacy_channel_groups_listbase(action.
groups);
561 action_blend_write_clear_legacy_fcurves_listbase(action.
curves);
578#ifdef WITH_ANIM_BAKLAVA
602 fcurve->
prev =
nullptr;
603 fcurve->
next =
nullptr;
619 read_channelbag(reader, channelbag->wrap());
632 read_strip_keyframe_data(reader, keyframe_data->wrap());
641 for (
int layer_idx = 0; layer_idx < action.
layer_array_num; layer_idx++) {
646 reader, layer->strip_array_num,
reinterpret_cast<void **
>(&layer->strip_array));
647 for (
int strip_idx = 0; strip_idx < layer->strip_array_num; strip_idx++) {
657 if (layer->strip_array[strip_idx] ==
nullptr) {
658 layer->strip_array[strip_idx] = &animrig::Strip::create(action,
659 animrig::Strip::Type::Keyframe);
672 action.
slot_array[i]->wrap().blend_read_post();
688#ifdef WITH_ANIM_BAKLAVA
689 read_strip_keyframe_data_array(reader, action);
690 read_layers(reader, action);
691 read_slots(reader, action);
726#ifndef WITH_ANIM_BAKLAVA
730 agrp->channel_bag =
nullptr;
746 const bool is_single_frame = action && action->wrap().has_single_frame();
833 if ((grp == agrp) && (
select)) {
837 grp->flag &= ~AGRP_ACTIVE;
848 const bTheme *btheme =
static_cast<const bTheme *
>(
U.themes.first);
862 else if (grp->
cs.
solid[0] == 0) {
874 BLI_assert_msg(pchan,
"cannot 'set action group colors from posebone' without a posebone");
891 if (effective_color) {
896 memcpy(&grp->
cs, effective_color,
sizeof(grp->
cs));
905 if (
ELEM(
nullptr, act, name)) {
930 if (
ELEM(
nullptr, act, agrp, fcurve)) {
938 fcurve->
next = fcurve->
prev =
nullptr;
972 for (grp = agrp->
prev; grp; grp = grp->
prev) {
988 if (grp ==
nullptr) {
1021 ListBase ungrouped = {
nullptr,
nullptr};
1049 if (
ELEM(
nullptr, act, fcu)) {
1105 agrp->
flag &= ~AGRP_TEMP;
1118 if (
ELEM(
nullptr, pose, name) || (name[0] ==
'\0')) {
1134 if (pose ==
nullptr) {
1205 if (
ELEM(
nullptr, ob, ob->
pose, arm)) {
1211 if ((pchan->bone) && (pchan->bone == arm->
act_bone)) {
1230 if (
ELEM(
nullptr, ob, ob->
pose, arm)) {
1240 if (pchan->
bone !=
nullptr) {
1255 if (!
STREQ(name_flip, name)) {
1278 const bool copy_constraints)
1302 outPose->
ikdata =
nullptr;
1316 if (pchan->custom_tx) {
1319 if (pchan->bbone_prev) {
1322 if (pchan->bbone_next) {
1326 if (copy_constraints) {
1330 pchan->constraints = listb;
1341 pchan->draw_data =
nullptr;
1348 if (copy_constraints) {
1401 if ((data->rootbone == 0) || (data->rootbone > level)) {
1443 if (pchan->bbone_prev == unlinked_pchan) {
1444 pchan->bbone_prev =
nullptr;
1446 if (pchan->bbone_next == unlinked_pchan) {
1447 pchan->bbone_next =
nullptr;
1449 if (pchan->custom_tx == unlinked_pchan) {
1450 pchan->custom_tx =
nullptr;
1456 bool (*filter_fn)(
const char *bone_name,
void *user_data),
1465 pchan_next = pchan->
next;
1467 if (filter_fn(pchan->
name, user_data)) {
1479 ListBase targets = {
nullptr,
nullptr};
1482 if (ct->tar == ob) {
1483 if (ct->subtarget[0]) {
1484 if (filter_fn(ct->subtarget, user_data)) {
1486 ct->subtarget[0] = 0;
1528 pchan->
mpath =
nullptr;
1535 pchan->
prop =
nullptr;
1547 memset(runtime, 0,
sizeof(*runtime));
1553 memset(runtime, 0,
sizeof(*runtime));
1666 pchan->
prop =
nullptr;
1668 if (pchan_from->
prop) {
1693 pose->
flag &= ~POSE_CONSTRAINTS_TIMEDEPEND;
1696 pchan->constflag = 0;
1701 switch (con->type) {
1707 if (data->tar ==
nullptr || (data->tar->type ==
OB_ARMATURE && data->subtarget[0] == 0))
1715 if (data->rootbone < 0) {
1724 parchan = parchan->
parent;
1731 for (
short index = 0; chain_bone && (data->rootbone == 0 || index < data->rootbone);
1735 chain_bone = chain_bone->
parent;
1763 pose->
flag &= ~POSE_CONSTRAINTS_NEED_UPDATE_FLAGS;
1778 name =
DATA_(
"Group");
1806 if (pchan->agrp_index == idx) {
1807 pchan->agrp_index = 0;
1809 else if (pchan->agrp_index > idx) {
1810 pchan->agrp_index--;
1851 if (selected_bones_only && pchan->bone !=
nullptr && (pchan->bone->flag &
BONE_SELECTED) == 0)
1859 pchan->size[0] = pchan->size[1] = pchan->size[2] = 1.0f;
1861 pchan->roll1 = pchan->roll2 = 0.0f;
1862 pchan->curve_in_x = pchan->curve_in_z = 0.0f;
1863 pchan->curve_out_x = pchan->curve_out_z = 0.0f;
1864 pchan->ease1 = pchan->ease2 = 0.0f;
1906 if (to ==
nullptr || from ==
nullptr) {
1908 &
LOG,
"Pose copy error, pose to:%p from:%p", (
void *)to, (
void *)from);
1919 if (pchanto !=
nullptr) {
1939 const int32_t action_slot_handle,
1947 if (groupname && groupname[0]) {
1949 Action &action = act->wrap();
1951 ChannelBag *cbag = channelbag_for_action_slot(action, action_slot_handle);
1962 workob->
runtime = &workob_runtime;
1965 copy_m4_m4(workob->
runtime->object_to_world.ptr(), ob->object_to_world().ptr());
1984 workob->
pose = pose;
2028 workob->
adt =
nullptr;
2036 if (pose ==
nullptr) {
2044 const SessionUID *session_uid = &pchan->runtime.session_uid;
2046 printf(
"Pose channel %s does not have UID generated.\n", pchan->name);
2051 printf(
"Pose channel %s has duplicate UID generated.\n", pchan->name);
2064 BLI_assert(pose !=
nullptr && arm !=
nullptr);
2085 if (bone !=
nullptr) {
2126 pchan->bone =
nullptr;
2150 pchan->draw_data =
nullptr;
2153 if (pose->
ikparam !=
nullptr) {
2168 if (!pose || !arm) {
2173 bool rebuild =
false;
2184 if (
UNLIKELY(pchan->bone ==
nullptr)) {
2189 pchan->bone->flag &= ~BONE_SELECTED;
2190 pchan->bone->flag |= pchan->selectflag;
Functions and classes to work with Actions.
Functions for backward compatibility with the legacy Action API.
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.
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_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)
#define PBONE_VISIBLE(arm, bone)
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_)
int BKE_lib_query_foreachid_process_flags_get(const LibraryForeachIDData *data)
Main * BKE_lib_query_foreachid_process_main_get(const LibraryForeachIDData *data)
@ IDWALK_DO_DEPRECATED_POINTERS
#define BKE_LIB_FOREACHID_PROCESS_ID(data_, id_, cb_flag_)
#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)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void void void void void void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src) ATTR_NONNULL(1
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void void BLI_movelisttolist(struct ListBase *dst, struct ListBase *src) ATTR_NONNULL(1
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_insertlinkbefore(struct ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT 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 unit_m4(float m[4][4])
void copy_m4_m4(float m1[4][4], const float m2[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(dst, 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
void * BLO_read_struct_by_name_array(BlendDataReader *reader, const char *struct_name, uint32_t items_num, const void *old_address)
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)
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)
void BLO_read_pointer_array(BlendDataReader *reader, int array_size, void **ptr_p)
#define BLO_read_struct(reader, struct_name, ptr_p)
bool BLO_write_is_undo(BlendWriter *writer)
#define BLO_write_struct_at_address(writer, struct_name, address, data_ptr)
void BLO_write_pointer_array(BlendWriter *writer, uint num, const void *data_ptr)
#define BLT_I18NCONTEXT_ID_ACTION
#define CLOG_ERROR(clg_ref,...)
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_id_tag_update_ex(Main *bmain, ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
@ ID_RECALC_ANIMATION_NO_FLUSH
#define ID_IS_LINKED(_id)
@ ITASC_INITIAL_REITERATION
@ POSE_CONSTRAINTS_NEED_UPDATE_FLAGS
@ POSE_CONSTRAINTS_TIMEDEPEND
@ CONSTRAINT_TYPE_SPLINEIK
@ CONSTRAINT_TYPE_KINEMATIC
@ CONSTRAINT_TYPE_FOLLOWPATH
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)
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 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 bActionGroup * > channel_groups() const
blender::Span< const FCurve * > fcurves() const
Layer * duplicate_with_shallow_strip_copies(StringRefNull allocation_name) const
static void users_invalidate(Main &bmain)
blender::Span< const ChannelBag * > channelbags() const
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_dupallocN)(const void *vmemh)
ccl_device_inline float4 select(const int4 mask, const float4 a, const float4 b)
Vector< bActionGroup * > channel_groups_all(bAction *action)
void assert_baklava_phase_1_invariants(const Action &action)
const BoneColor & ANIM_bonecolor_posebone_get(const bPoseChannel *pose_bone)
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRefNull prop_name, int32_t value, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_INT, set its name and value.
static void action_blend_read_data(BlendDataReader *reader, ID *id)
static void action_copy_data(Main *, std::optional< Library * >, ID *id_dst, const ID *id_src, const int flag)
static IDProperty * action_asset_type_property(const bAction *action)
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 action_free_data(ID *id)
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 FCurve ** fcurve_array
struct bActionGroup ** group_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 * channel_bag
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
struct bPoseChannel_Runtime runtime
struct bPoseChannel * bbone_prev
struct bPoseChannel * child
bPoseChannel ** chan_array