#====================== BEGIN GPL LICENSE BLOCK ====================== # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # #======================= END GPL LICENSE BLOCK ======================== # #============================================= # Keyframing functions #============================================= def get_keyed_frames(rig): frames = [] if rig.animation_data: if rig.animation_data.action: fcus = rig.animation_data.action.fcurves for fc in fcus: for kp in fc.keyframe_points: if kp.co[0] not in frames: frames.append(kp.co[0]) frames.sort() return frames def bones_in_frame(f, rig, *args): """ True if one of the bones listed in args is animated at frame f :param f: the frame :param rig: the rig :param args: bone names :return: """ if rig.animation_data and rig.animation_data.action: fcus = rig.animation_data.action.fcurves else: return False for fc in fcus: animated_frames = [kp.co[0] for kp in fc.keyframe_points] for bone in args: if bone in fc.data_path.split('"') and f in animated_frames: return True return False def overwrite_prop_animation(rig, bone, prop_name, value, frames): act = rig.animation_data.action if not act: return bone_name = bone.name curve = None for fcu in act.fcurves: words = fcu.data_path.split('"') if words[0] == "pose.bones[" and words[1] == bone_name and words[-2] == prop_name: curve = fcu break if not curve: return for kp in curve.keyframe_points: if kp.co[0] in frames: kp.co[1] = value