From 61ed277655d432da341c1ee4b72af4fc04bb5c9e Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 1 Jul 2024 20:48:02 +0200 Subject: [PATCH] Expose contribution department layers and strengths to settings --- .../extract_usd_layer_contributions.py | 51 ++++++++++++------- server/settings/publish_plugins.py | 47 +++++++++++++++++ 2 files changed, 80 insertions(+), 18 deletions(-) diff --git a/client/ayon_core/plugins/publish/extract_usd_layer_contributions.py b/client/ayon_core/plugins/publish/extract_usd_layer_contributions.py index d7279dcf8d..e4f12e0621 100644 --- a/client/ayon_core/plugins/publish/extract_usd_layer_contributions.py +++ b/client/ayon_core/plugins/publish/extract_usd_layer_contributions.py @@ -1,7 +1,7 @@ from operator import attrgetter import dataclasses import os -from typing import Optional +from typing import Optional, Dict import pyblish.api from pxr import Sdf @@ -41,21 +41,6 @@ from ayon_core.pipeline import publish # directly from the publisher at that particular order. Future publishes will # then see the existing contribution and will persist adding it to future # bootstraps at that order -# TODO: Avoid hardcoded ordering - might need to be set through settings? -LAYER_ORDERS = { - # asset layers - "model": 100, - "assembly": 150, - "groom": 175, - "look": 200, - "rig": 300, - # shot layers - "layout": 200, - "animation": 300, - "simulation": 400, - "fx": 500, - "lighting": 600, -} # This global toggle is here mostly for debugging purposes and should usually # be True so that new publishes merge and extend on previous contributions. @@ -271,6 +256,34 @@ class CollectUSDLayerContributions(pyblish.api.InstancePlugin, label = "Collect USD Layer Contributions (Asset/Shot)" families = ["usd"] + contribution_layers: Dict[str, int] = { + # asset layers + "model": 100, + "assembly": 150, + "groom": 175, + "look": 200, + "rig": 300, + # shot layers + "layout": 200, + "animation": 300, + "simulation": 400, + "fx": 500, + "lighting": 600, + } + + @classmethod + def apply_settings(cls, project_setting): + plugin_settings = project_setting["core"]["publish"].get( + "CollectUSDLayerContributions", {} + ) + + # Define contribution layers via settings + contribution_layers = {} + for entry in plugin_settings.get("contribution_layers", []): + contribution_layers[entry["name"]] = entry["order"] + if contribution_layers: + cls.contribution_layers = contribution_layers + def process(self, instance): attr_values = self.get_attr_values_from_data(instance.data) @@ -291,7 +304,9 @@ class CollectUSDLayerContributions(pyblish.api.InstancePlugin, attr_values[key] = attr_values[key].format(**data) # Define contribution - order = LAYER_ORDERS.get(attr_values["contribution_layer"], 0) + order = self.contribution_layers.get( + attr_values["contribution_layer"], 0 + ) if attr_values["contribution_apply_as_variant"]: contribution = VariantContribution( @@ -477,7 +492,7 @@ class CollectUSDLayerContributions(pyblish.api.InstancePlugin, "predefined ordering.\nA higher order (further down " "the list) will contribute as a stronger opinion." ), - items=list(LAYER_ORDERS.keys()), + items=list(cls.contribution_layers.keys()), default="model"), BoolDef("contribution_apply_as_variant", label="Add as variant", diff --git a/server/settings/publish_plugins.py b/server/settings/publish_plugins.py index 1b3d382f01..edaac88274 100644 --- a/server/settings/publish_plugins.py +++ b/server/settings/publish_plugins.py @@ -57,6 +57,30 @@ class CollectFramesFixDefModel(BaseSettingsModel): True, title="Show 'Rewrite latest version' toggle" ) + + +class ContributionLayersModel(BaseSettingsModel): + _layout = "compact" + name: str = SettingsField(title="Name") + order: str = SettingsField( + title="Order", + description="Higher order means a higher strength and stacks the " + "layer on top.") + + +class CollectUSDLayerContributionsModel(ValidateBaseModel): + contribution_layers: list[ContributionLayersModel] = SettingsField( + title="Department Layer Orders", + description=( + "Define available department layers and their strength " + "ordering inside the USD contribution workflow." + ) + ) + + @validator("contribution_layers") + def validate_unique_outputs(cls, value): + ensure_unique_names(value) + return value class PluginStateByHostModelProfile(BaseSettingsModel): @@ -792,6 +816,10 @@ class PublishPuginsModel(BaseSettingsModel): default_factory=CollectFramesFixDefModel, title="Collect Frames to Fix", ) + CollectUSDLayerContributions: CollectUSDLayerContributionsModel = SettingsField( + default_factory=CollectUSDLayerContributionsModel, + title="Collect USD Layer Contributions", + ) ValidateEditorialAssetName: ValidateBaseModel = SettingsField( default_factory=ValidateBaseModel, title="Validate Editorial Asset Name" @@ -884,6 +912,25 @@ DEFAULT_PUBLISH_VALUES = { "enabled": True, "rewrite_version_enable": True }, + "CollectUSDLayerContributions": { + "enabled": True, + "optional": False, + "active": True, + "contribution_layers": [ + # Asset layers + {"name": "model", "order": 100}, + {"name": "assembly", "order": 150}, + {"name": "groom", "order": 175}, + {"name": "look", "order": 300}, + {"name": "rig", "order": 100}, + # Shot layers + {"name": "layout", "order": 200}, + {"name": "animation", "order": 300}, + {"name": "simulation", "order": 400}, + {"name": "fx", "order": 500}, + {"name": "lighting", "order": 600}, + ], + }, "ValidateEditorialAssetName": { "enabled": True, "optional": False,