MetaBox/Scripts/Animation/epic_pose_wrangler/v2/extensions/generate_inbetweens.py

72 lines
2.7 KiB
Python
Raw Permalink Normal View History

2025-01-14 03:06:35 +08:00
# Copyright Epic Games, Inc. All Rights Reserved.
from functools import partial
from epic_pose_wrangler.v2.model import base_extension
from epic_pose_wrangler.v2.extensions import copy_paste_trs
class GenerateInbetweens(base_extension.PoseWranglerExtension):
__category__ = "Core Extensions"
@property
def view(self):
if self._view is not None:
return self._view
from PySide2 import QtWidgets
self._view = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout()
self._view.setLayout(layout)
label = QtWidgets.QLabel("Copy/Paste Driven Transforms")
layout.addWidget(label)
button_layout = QtWidgets.QHBoxLayout()
layout.addLayout(button_layout)
generate_inbetweens_button = QtWidgets.QPushButton("Generate Inbetweens")
button_layout.addWidget(generate_inbetweens_button)
spin_label = QtWidgets.QLabel("Pose Count: ")
button_layout.addWidget(spin_label)
spin_box = QtWidgets.QSpinBox()
spin_box.setMinimum(1)
spin_box.setSingleStep(1)
spin_box.setValue(1)
button_layout.addWidget(spin_box)
generate_inbetweens_button.clicked.connect(partial(self.generate_inbetweens, lambda: spin_box.value()))
return self._view
def generate_inbetweens(self, count=1, pose_prefix="pose"):
"""
Generate inbetween poses between the current position and the default pose
:param count :type int: number of poses to generate
:param pose_prefix :type: name of the pose
"""
context = self.api.get_context()
if callable(count):
count = count()
solver = context.current_solver
copy_paste_trs_action = self.api.get_extension_by_type(copy_paste_trs.BakePosesToTimeline)
copy_paste_trs_action.copy_driven_trs(solver=solver)
copy_paste_trs_action.copy_driver_trs(solver=solver)
# Calculate the multiplier increment based on the number of desired poses
multiplier_increment = 1.0 / float((count + 1))
# Set the start multiplier
multiplier = 1.0
# Iterate through the number of desired poses
for i in range(count):
# Generate the new multiplier
multiplier -= multiplier_increment
# Paste the driver and driven translate, rotate and scale based on the new multiplier
# Note: Driver only gets rotate and scale applied to it.
copy_paste_trs_action.paste_driven_trs(multiplier)
copy_paste_trs_action.paste_driver_trs(multiplier)
# Create a new pose at this position
self.api.create_pose(pose_name="{pose_prefix}_{i}".format(pose_prefix=pose_prefix, i=i), solver=solver)