Changeset View
Changeset View
Standalone View
Standalone View
rigify/utils/animation.py
- This file was added.
| #====================== 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 ======================== | |||||
| # <pep8 compliant> | |||||
| #============================================= | |||||
| # 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 | |||||