65 auto store_animated_pchans = [&](
const FCurve * ,
const char *bone_name) {
66 if (backed_up_bone_names.
contains(bone_name)) {
72 if (pchan ==
nullptr) {
77 if (is_bone_selection_relevant && !selected_bone_names.
contains(bone_name)) {
82 chan_bak->
pchan = pchan;
83 chan_bak->
olddata = blender::dna::shallow_copy(*chan_bak->
pchan);
94 backed_up_bone_names.
add_new(bone_name);
107 bool all_bones_selected =
true;
109 for (
Object *obj : objects) {
113 selected_bones.
add(pose_bone);
116 all_bones_selected =
false;
122 if (all_bones_selected) {
126 return selected_bones;
133 pose_backup->
backups = {
nullptr,
nullptr};
135 for (
Object *ob : objects) {
145 pose_backup->
backups = {
nullptr,
nullptr};
149 for (
Object *ob : objects) {
165 *chan_bak->pchan = blender::dna::shallow_copy(chan_bak->olddata);
167 if (chan_bak->oldprops) {
170 if (chan_bak->old_system_properties) {
186 if (chan_bak->oldprops) {
189 if (chan_bak->old_system_properties) {
201 ob->
runtime->pose_backup = pose_backup;
206 if (ob->
runtime->pose_backup ==
nullptr) {
215 if (ob->
runtime->pose_backup ==
nullptr) {
220 ob->
runtime->pose_backup =
nullptr;
Functions and classes to work with Actions.
Functions to work with animation poses.
Blender kernel action and pose functionality.
bPoseChannel * BKE_pose_channel_find_name(const bPose *pose, const char *name)
void IDP_FreeProperty(IDProperty *prop)
IDProperty * IDP_CopyProperty(const IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void IDP_SyncGroupValues(IDProperty *dest, const IDProperty *src) ATTR_NONNULL()
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
bool contains(const Key &key) const
void add_new(const Key &key)
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
Slot & get_best_pose_slot_for_id(const ID &id, Action &pose_data)
void BKE_action_find_fcurves_with_bones(bAction *action, blender::animrig::slot_handle_t slot_handle, FoundFCurveCallback callback)
blender::Set< std::string > BoneNameSet
BoneNameSet BKE_pose_channel_find_selected_names(const Object *object)
void BKE_pose_backup_clear(Object *ob)
bool BKE_pose_backup_restore_on_object(Object *ob)
PoseBackup * BKE_pose_backup_create_all_bones(blender::Span< Object * > objects, const bAction *action)
bool BKE_pose_backup_is_selection_relevant(const PoseBackup *pose_backup)
void BKE_pose_backup_restore(const PoseBackup *pbd)
static void pose_backup_create(const Object *ob, bAction *action, const BoneNameSet &selected_bone_names, PoseBackup &pose_backup)
void BKE_pose_backup_free(PoseBackup *pbd)
PoseBackup * BKE_pose_backup_create_selected_bones(blender::Span< Object * > objects, const bAction *action)
static blender::Set< bPoseChannel * > armature_find_selected_pose_bones(blender::Span< Object * > objects)
void BKE_pose_backup_create_on_object(Object *ob, const bAction *action)
ObjectRuntimeHandle * runtime
bool is_bone_selection_relevant
IDProperty * old_system_properties
IDProperty * system_properties