mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-01 16:34:53 +01:00
Fixed Unreal support for templates
This commit is contained in:
parent
c16a204879
commit
a290d77a41
1 changed files with 43 additions and 7 deletions
|
|
@ -6,7 +6,9 @@ from pathlib import Path
|
||||||
from openpype.lib import (
|
from openpype.lib import (
|
||||||
PreLaunchHook,
|
PreLaunchHook,
|
||||||
ApplicationLaunchFailed,
|
ApplicationLaunchFailed,
|
||||||
ApplicationNotFound
|
ApplicationNotFound,
|
||||||
|
get_workdir_data,
|
||||||
|
get_workfile_template_key
|
||||||
)
|
)
|
||||||
from openpype.hosts.unreal.api import lib as unreal_lib
|
from openpype.hosts.unreal.api import lib as unreal_lib
|
||||||
|
|
||||||
|
|
@ -25,13 +27,45 @@ class UnrealPrelaunchHook(PreLaunchHook):
|
||||||
|
|
||||||
self.signature = "( {} )".format(self.__class__.__name__)
|
self.signature = "( {} )".format(self.__class__.__name__)
|
||||||
|
|
||||||
|
def _get_work_filename(self):
|
||||||
|
# Use last workfile if was found
|
||||||
|
last_workfile = self.data.get("last_workfile_path")
|
||||||
|
if last_workfile and os.path.exists(last_workfile):
|
||||||
|
return os.path.basename(last_workfile)
|
||||||
|
|
||||||
|
# Prepare data for fill data and for getting workfile template key
|
||||||
|
task_name = self.data["task_name"]
|
||||||
|
anatomy = self.data["anatomy"]
|
||||||
|
asset_doc = self.data["asset_doc"]
|
||||||
|
project_doc = self.data["project_doc"]
|
||||||
|
|
||||||
|
asset_tasks = asset_doc.get("data", {}).get("tasks") or {}
|
||||||
|
task_info = asset_tasks.get(task_name) or {}
|
||||||
|
task_type = task_info.get("type")
|
||||||
|
|
||||||
|
workdir_data = get_workdir_data(
|
||||||
|
project_doc, asset_doc, task_name, self.host_name
|
||||||
|
)
|
||||||
|
# QUESTION raise exception if version is part of filename template?
|
||||||
|
workdir_data["version"] = 1
|
||||||
|
workdir_data["ext"] = "uproject"
|
||||||
|
|
||||||
|
# Get workfile template key for current context
|
||||||
|
workfile_template_key = get_workfile_template_key(
|
||||||
|
task_type,
|
||||||
|
self.host_name,
|
||||||
|
project_name=project_doc["name"]
|
||||||
|
)
|
||||||
|
# Fill templates
|
||||||
|
filled_anatomy = anatomy.format(workdir_data)
|
||||||
|
|
||||||
|
# Return filename
|
||||||
|
return filled_anatomy[workfile_template_key]["file"]
|
||||||
|
|
||||||
def execute(self):
|
def execute(self):
|
||||||
"""Hook entry method."""
|
"""Hook entry method."""
|
||||||
asset_name = self.data["asset_name"]
|
|
||||||
task_name = self.data["task_name"]
|
|
||||||
workdir = self.launch_context.env["AVALON_WORKDIR"]
|
workdir = self.launch_context.env["AVALON_WORKDIR"]
|
||||||
engine_version = self.app_name.split("/")[-1].replace("-", ".")
|
engine_version = self.app_name.split("/")[-1].replace("-", ".")
|
||||||
unreal_project_name = f"{asset_name}_{task_name}"
|
|
||||||
try:
|
try:
|
||||||
if int(engine_version.split(".")[0]) < 4 and \
|
if int(engine_version.split(".")[0]) < 4 and \
|
||||||
int(engine_version.split(".")[1]) < 26:
|
int(engine_version.split(".")[1]) < 26:
|
||||||
|
|
@ -45,6 +79,8 @@ class UnrealPrelaunchHook(PreLaunchHook):
|
||||||
# so lets keep it quite.
|
# so lets keep it quite.
|
||||||
...
|
...
|
||||||
|
|
||||||
|
unreal_project_filename = self._get_work_filename()
|
||||||
|
unreal_project_name = os.path.splitext(unreal_project_filename)[0]
|
||||||
# Unreal is sensitive about project names longer then 20 chars
|
# Unreal is sensitive about project names longer then 20 chars
|
||||||
if len(unreal_project_name) > 20:
|
if len(unreal_project_name) > 20:
|
||||||
self.log.warning((
|
self.log.warning((
|
||||||
|
|
@ -55,7 +91,7 @@ class UnrealPrelaunchHook(PreLaunchHook):
|
||||||
# of the project name. This is because project name is then used
|
# of the project name. This is because project name is then used
|
||||||
# in various places inside c++ code and there variable names cannot
|
# in various places inside c++ code and there variable names cannot
|
||||||
# start with non-alpha. We append 'P' before project name to solve it.
|
# start with non-alpha. We append 'P' before project name to solve it.
|
||||||
# 😱
|
# 😱
|
||||||
if not unreal_project_name[:1].isalpha():
|
if not unreal_project_name[:1].isalpha():
|
||||||
self.log.warning((
|
self.log.warning((
|
||||||
"Project name doesn't start with alphabet "
|
"Project name doesn't start with alphabet "
|
||||||
|
|
@ -89,10 +125,10 @@ class UnrealPrelaunchHook(PreLaunchHook):
|
||||||
ue4_path = unreal_lib.get_editor_executable_path(
|
ue4_path = unreal_lib.get_editor_executable_path(
|
||||||
Path(detected[engine_version]))
|
Path(detected[engine_version]))
|
||||||
|
|
||||||
self.launch_context.launch_args.append(ue4_path.as_posix())
|
self.launch_context.launch_args = [ue4_path.as_posix()]
|
||||||
project_path.mkdir(parents=True, exist_ok=True)
|
project_path.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
project_file = project_path / f"{unreal_project_name}.uproject"
|
project_file = project_path / unreal_project_filename
|
||||||
if not project_file.is_file():
|
if not project_file.is_file():
|
||||||
engine_path = detected[engine_version]
|
engine_path = detected[engine_version]
|
||||||
self.log.info((
|
self.log.info((
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue