72 lines
2.7 KiB
Python
72 lines
2.7 KiB
Python
|
# 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)
|