diff options
Diffstat (limited to 'pose_library/conversion.py')
-rw-r--r-- | pose_library/conversion.py | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/pose_library/conversion.py b/pose_library/conversion.py new file mode 100644 index 00000000..43a5d3a4 --- /dev/null +++ b/pose_library/conversion.py @@ -0,0 +1,78 @@ +# ##### 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 ##### + +""" +Pose Library - Conversion of old pose libraries. +""" + +from typing import Optional +from collections.abc import Collection + +if "pose_creation" not in locals(): + from . import pose_creation +else: + import importlib + + pose_creation = importlib.reload(pose_creation) + +import bpy +from bpy.types import ( + Action, + TimelineMarker, +) + + +def convert_old_poselib(old_poselib: Action) -> Collection[Action]: + """Convert an old-style pose library to a set of pose Actions. + + Old pose libraries were one Action with multiple pose markers. Each pose + marker will be converted to an Action by itself and marked as asset. + """ + + pose_assets = [ + action + for marker in old_poselib.pose_markers + if (action := convert_old_pose(old_poselib, marker)) + ] + + # Mark all Actions as assets in one go. Ideally this would be done on an + # appropriate frame in the scene (to set up things like the background + # colour), but the old-style poselib doesn't contain such information. All + # we can do is just render on the current frame. + bpy.ops.asset.mark({'selected_ids': pose_assets}) + + return pose_assets + + +def convert_old_pose(old_poselib: Action, marker: TimelineMarker) -> Optional[Action]: + """Convert an old-style pose library pose to a pose action.""" + + frame: int = marker.frame + action: Optional[Action] = None + + for fcurve in old_poselib.fcurves: + key = pose_creation.find_keyframe(fcurve, frame) + if not key: + continue + + if action is None: + action = bpy.data.actions.new(marker.name) + + pose_creation.create_single_key_fcurve(action, fcurve, key) + + return action |