mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-04 01:45:11 +01:00
157 lines
5.6 KiB
Python
157 lines
5.6 KiB
Python
import os
|
|
|
|
from avalon import api, pipeline
|
|
from avalon import unreal as avalon_unreal
|
|
from avalon.unreal import lib
|
|
from avalon.unreal import pipeline as unreal_pipeline
|
|
import unreal
|
|
|
|
|
|
class StaticMeshFBXLoader(api.Loader):
|
|
"""Load Unreal StaticMesh from FBX"""
|
|
|
|
families = ["model", "unrealStaticMesh"]
|
|
label = "Import FBX Static Mesh"
|
|
representations = ["fbx"]
|
|
icon = "cube"
|
|
color = "orange"
|
|
|
|
def load(self, context, name, namespace, data):
|
|
"""
|
|
Load and containerise representation into Content Browser.
|
|
|
|
This is two step process. First, import FBX to temporary path and
|
|
then call `containerise()` on it - this moves all content to new
|
|
directory and then it will create AssetContainer there and imprint it
|
|
with metadata. This will mark this path as container.
|
|
|
|
Args:
|
|
context (dict): application context
|
|
name (str): subset name
|
|
namespace (str): in Unreal this is basically path to container.
|
|
This is not passed here, so namespace is set
|
|
by `containerise()` because only then we know
|
|
real path.
|
|
data (dict): Those would be data to be imprinted. This is not used
|
|
now, data are imprinted by `containerise()`.
|
|
|
|
Returns:
|
|
list(str): list of container content
|
|
"""
|
|
|
|
# Create directory for asset and avalon container
|
|
root = "/Game/Avalon/Assets"
|
|
asset = context.get('asset').get('name')
|
|
suffix = "_CON"
|
|
if asset:
|
|
asset_name = "{}_{}".format(asset, name)
|
|
else:
|
|
asset_name = "{}".format(name)
|
|
|
|
tools = unreal.AssetToolsHelpers().get_asset_tools()
|
|
asset_dir, container_name = tools.create_unique_asset_name(
|
|
"{}/{}/{}".format(root, asset, name), suffix="")
|
|
|
|
container_name += suffix
|
|
|
|
unreal.EditorAssetLibrary.make_directory(asset_dir)
|
|
|
|
task = unreal.AssetImportTask()
|
|
|
|
task.set_editor_property('filename', self.fname)
|
|
task.set_editor_property('destination_path', asset_dir)
|
|
task.set_editor_property('destination_name', asset_name)
|
|
task.set_editor_property('replace_existing', False)
|
|
task.set_editor_property('automated', True)
|
|
task.set_editor_property('save', True)
|
|
|
|
# set import options here
|
|
options = unreal.FbxImportUI()
|
|
options.set_editor_property(
|
|
'automated_import_should_detect_type', False)
|
|
options.set_editor_property('import_animations', False)
|
|
|
|
task.options = options
|
|
unreal.AssetToolsHelpers.get_asset_tools().import_asset_tasks([task]) # noqa: E501
|
|
|
|
# Create Asset Container
|
|
lib.create_avalon_container(
|
|
container=container_name, path=asset_dir)
|
|
|
|
data = {
|
|
"schema": "avalon-core:container-2.0",
|
|
"id": pipeline.AVALON_CONTAINER_ID,
|
|
"asset": asset,
|
|
"namespace": asset_dir,
|
|
"container_name": container_name,
|
|
"asset_name": asset_name,
|
|
"loader": str(self.__class__.__name__),
|
|
"representation": context["representation"]["_id"],
|
|
"parent": context["representation"]["parent"],
|
|
"family": context["representation"]["context"]["family"]
|
|
}
|
|
unreal_pipeline.imprint(
|
|
"{}/{}".format(asset_dir, container_name), data)
|
|
|
|
asset_content = unreal.EditorAssetLibrary.list_assets(
|
|
asset_dir, recursive=True, include_folder=True
|
|
)
|
|
|
|
for a in asset_content:
|
|
unreal.EditorAssetLibrary.save_asset(a)
|
|
|
|
return asset_content
|
|
|
|
def update(self, container, representation):
|
|
name = container["name"]
|
|
source_path = api.get_representation_path(representation)
|
|
destination_path = container["namespace"]
|
|
|
|
task = unreal.AssetImportTask()
|
|
|
|
task.set_editor_property('filename', source_path)
|
|
task.set_editor_property('destination_path', destination_path)
|
|
# strip suffix
|
|
task.set_editor_property('destination_name', name)
|
|
task.set_editor_property('replace_existing', True)
|
|
task.set_editor_property('automated', True)
|
|
task.set_editor_property('save', True)
|
|
|
|
# set import options here
|
|
options = unreal.FbxImportUI()
|
|
options.set_editor_property(
|
|
'automated_import_should_detect_type', False)
|
|
options.set_editor_property('import_animations', False)
|
|
|
|
task.options = options
|
|
# do import fbx and replace existing data
|
|
unreal.AssetToolsHelpers.get_asset_tools().import_asset_tasks([task])
|
|
container_path = "{}/{}".format(container["namespace"],
|
|
container["objectName"])
|
|
# update metadata
|
|
unreal_pipeline.imprint(
|
|
container_path,
|
|
{
|
|
"representation": str(representation["_id"]),
|
|
"parent": str(representation["parent"])
|
|
})
|
|
|
|
asset_content = unreal.EditorAssetLibrary.list_assets(
|
|
destination_path, recursive=True, include_folder=True
|
|
)
|
|
|
|
for a in asset_content:
|
|
unreal.EditorAssetLibrary.save_asset(a)
|
|
|
|
def remove(self, container):
|
|
path = container["namespace"]
|
|
parent_path = os.path.dirname(path)
|
|
|
|
unreal.EditorAssetLibrary.delete_directory(path)
|
|
|
|
asset_content = unreal.EditorAssetLibrary.list_assets(
|
|
parent_path, recursive=False
|
|
)
|
|
|
|
if len(asset_content) == 0:
|
|
unreal.EditorAssetLibrary.delete_directory(parent_path)
|