Allow to define department layers scoped only to a particular department layer type, e.g. "shot" versus "asset". This way, you can scope same layer names for both shot and asset at different orders if they have differing target scopes

This commit is contained in:
Roy Nieterau 2025-12-10 16:55:44 +01:00
parent 31e6b5a139
commit 4eece5e6e9
2 changed files with 57 additions and 31 deletions

View file

@ -2,6 +2,7 @@ from operator import attrgetter
import dataclasses
import os
import platform
from collections import defaultdict
from typing import Any, Dict, List
import pyblish.api
@ -278,19 +279,23 @@ class CollectUSDLayerContributions(pyblish.api.InstancePlugin,
# level, you can add itdirectly 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
contribution_layers: Dict[str, int] = {
contribution_layers: Dict[str, Dict[str, int]] = {
# asset layers
"model": 100,
"assembly": 150,
"groom": 175,
"look": 200,
"rig": 300,
"asset": {
"model": 100,
"assembly": 150,
"groom": 175,
"look": 200,
"rig": 300,
},
# shot layers
"layout": 200,
"animation": 300,
"simulation": 400,
"fx": 500,
"lighting": 600,
"shot": {
"layout": 200,
"animation": 300,
"simulation": 400,
"fx": 500,
"lighting": 600,
}
}
# Default profiles to set certain instance attribute defaults based on
# profiles in settings
@ -305,12 +310,13 @@ class CollectUSDLayerContributions(pyblish.api.InstancePlugin,
cls.enabled = plugin_settings.get("enabled", cls.enabled)
# Define contribution layers via settings
contribution_layers = {}
# Define contribution layers via settings by their scope
contribution_layers = defaultdict(dict)
for entry in plugin_settings.get("contribution_layers", []):
contribution_layers[entry["name"]] = int(entry["order"])
for scope in entry.get("scope", []):
contribution_layers[scope][entry["name"]] = int(entry["order"])
if contribution_layers:
cls.contribution_layers = contribution_layers
cls.contribution_layers = dict(contribution_layers)
cls.profiles = plugin_settings.get("profiles", [])
@ -489,14 +495,14 @@ class CollectUSDLayerContributions(pyblish.api.InstancePlugin,
profile = {}
# Define defaults
default_enabled = profile.get("contribution_enabled", True)
default_enabled: bool = profile.get("contribution_enabled", True)
default_contribution_layer = profile.get(
"contribution_layer", None)
default_apply_as_variant = profile.get(
default_apply_as_variant: bool = profile.get(
"contribution_apply_as_variant", False)
default_target_product = profile.get(
default_target_product: str = profile.get(
"contribution_target_product", "usdAsset")
default_init_as = (
default_init_as: str = (
"asset"
if profile.get("contribution_target_product") == "usdAsset"
else "shot")
@ -509,6 +515,12 @@ class CollectUSDLayerContributions(pyblish.api.InstancePlugin,
visible = publish_attributes.get("contribution_enabled", True)
variant_visible = visible and publish_attributes.get(
"contribution_apply_as_variant", True)
init_as: str = publish_attributes.get(
"contribution_target_product_init", default_init_as)
contribution_layers = cls.contribution_layers.get(
init_as, {}
)
return [
UISeparatorDef("usd_container_settings1"),
@ -558,7 +570,7 @@ class CollectUSDLayerContributions(pyblish.api.InstancePlugin,
"predefined ordering.\nA higher order (further down "
"the list) will contribute as a stronger opinion."
),
items=list(cls.contribution_layers.keys()),
items=list(contribution_layers.keys()),
default=default_contribution_layer,
visible=visible),
BoolDef("contribution_apply_as_variant",
@ -606,7 +618,11 @@ class CollectUSDLayerContributions(pyblish.api.InstancePlugin,
# Update attributes if any of the following plug-in attributes
# change:
keys = ["contribution_enabled", "contribution_apply_as_variant"]
keys = {
"contribution_enabled",
"contribution_apply_as_variant",
"contribution_target_product_init",
}
for instance_change in event["changes"]:
instance = instance_change["instance"]

View file

@ -74,9 +74,19 @@ class CollectFramesFixDefModel(BaseSettingsModel):
)
def usd_contribution_layer_types():
return [
{"value": "asset", "label": "Asset"},
{"value": "shot", "label": "Shot"},
]
class ContributionLayersModel(BaseSettingsModel):
_layout = "compact"
name: str = SettingsField(title="Name")
scope: list[str] = SettingsField(
title="Scope",
enum_resolver=usd_contribution_layer_types)
order: str = SettingsField(
title="Order",
description="Higher order means a higher strength and stacks the "
@ -1345,17 +1355,17 @@ DEFAULT_PUBLISH_VALUES = {
"enabled": True,
"contribution_layers": [
# Asset layers
{"name": "model", "order": 100},
{"name": "assembly", "order": 150},
{"name": "groom", "order": 175},
{"name": "look", "order": 200},
{"name": "rig", "order": 300},
{"name": "model", "order": 100, "scope": ["asset"]},
{"name": "assembly", "order": 150, "scope": ["asset"]},
{"name": "groom", "order": 175, "scope": ["asset"]},
{"name": "look", "order": 200, "scope": ["asset"]},
{"name": "rig", "order": 300, "scope": ["asset"]},
# Shot layers
{"name": "layout", "order": 200},
{"name": "animation", "order": 300},
{"name": "simulation", "order": 400},
{"name": "fx", "order": 500},
{"name": "lighting", "order": 600},
{"name": "layout", "order": 200, "scope": ["shot"]},
{"name": "animation", "order": 300, "scope": ["shot"]},
{"name": "simulation", "order": 400, "scope": ["shot"]},
{"name": "fx", "order": 500, "scope": ["shot"]},
{"name": "lighting", "order": 600, "scope": ["shot"]},
],
"profiles": [
{