[Automated] Merged develop into main

This commit is contained in:
ynbot 2023-06-09 17:28:00 +02:00 committed by GitHub
commit 0c64b8551a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
69 changed files with 845 additions and 579 deletions

View file

@ -35,6 +35,7 @@ body:
label: Version
description: What version are you running? Look to OpenPype Tray
options:
- 3.15.10-nightly.2
- 3.15.10-nightly.1
- 3.15.9
- 3.15.9-nightly.2
@ -134,7 +135,6 @@ body:
- 3.14.3-nightly.3
- 3.14.3-nightly.2
- 3.14.3-nightly.1
- 3.14.2
validations:
required: true
- type: dropdown

View file

@ -855,12 +855,13 @@ def get_output_link_versions(project_name, version_id, fields=None):
return conn.find(query_filter, _prepare_fields(fields))
def get_last_versions(project_name, subset_ids, fields=None):
def get_last_versions(project_name, subset_ids, active=None, fields=None):
"""Latest versions for entered subset_ids.
Args:
project_name (str): Name of project where to look for queried entities.
subset_ids (Iterable[Union[str, ObjectId]]): List of subset ids.
active (Optional[bool]): If True only active versions are returned.
fields (Optional[Iterable[str]]): Fields that should be returned. All
fields are returned if 'None' is passed.
@ -899,12 +900,21 @@ def get_last_versions(project_name, subset_ids, fields=None):
if name_needed:
group_item["name"] = {"$last": "$name"}
aggregate_filter = {
"type": "version",
"parent": {"$in": subset_ids}
}
if active is False:
aggregate_filter["data.active"] = active
elif active is True:
aggregate_filter["$or"] = [
{"data.active": {"$exists": 0}},
{"data.active": active},
]
aggregation_pipeline = [
# Find all versions of those subsets
{"$match": {
"type": "version",
"parent": {"$in": subset_ids}
}},
{"$match": aggregate_filter},
# Sorting versions all together
{"$sort": {"name": 1}},
# Group them by "parent", but only take the last

View file

@ -1,37 +0,0 @@
from openpype.lib import PreLaunchHook
from openpype.pipeline.colorspace import get_imageio_config
from openpype.pipeline.template_data import get_template_data
class PreLaunchHostSetOCIO(PreLaunchHook):
"""Set OCIO environment for the host"""
order = 0
app_groups = ["substancepainter"]
def execute(self):
"""Hook entry method."""
anatomy_data = get_template_data(
project_doc=self.data["project_doc"],
asset_doc=self.data["asset_doc"],
task_name=self.data["task_name"],
host_name=self.host_name,
system_settings=self.data["system_settings"]
)
ocio_config = get_imageio_config(
project_name=self.data["project_doc"]["name"],
host_name=self.host_name,
project_settings=self.data["project_settings"],
anatomy_data=anatomy_data,
anatomy=self.data["anatomy"]
)
if ocio_config:
ocio_path = ocio_config["path"]
self.log.info(f"Setting OCIO config path: {ocio_path}")
self.launch_context.env["OCIO"] = ocio_path
else:
self.log.debug("OCIO not set or enabled")

View file

@ -1,12 +1,27 @@
from openpype.lib import PreLaunchHook
from openpype.pipeline.colorspace import get_imageio_config
from openpype.pipeline.colorspace import (
get_imageio_config
)
from openpype.pipeline.template_data import get_template_data_with_names
class FusionPreLaunchOCIO(PreLaunchHook):
"""Set OCIO environment variable for Fusion"""
app_groups = ["fusion"]
class OCIOEnvHook(PreLaunchHook):
"""Set OCIO environment variable for hosts that use OpenColorIO."""
order = 0
hosts = [
"substancepainter",
"fusion",
"blender",
"aftereffects",
"max",
"houdini",
"maya",
"nuke",
"hiero",
"resolve"
]
def execute(self):
"""Hook entry method."""
@ -26,7 +41,13 @@ class FusionPreLaunchOCIO(PreLaunchHook):
anatomy_data=template_data,
anatomy=self.data["anatomy"]
)
ocio_path = config_data["path"]
self.log.info(f"Setting OCIO config path: {ocio_path}")
self.launch_context.env["OCIO"] = ocio_path
if config_data:
ocio_path = config_data["path"]
self.log.info(
f"Setting OCIO environment to config path: {ocio_path}")
self.launch_context.env["OCIO"] = ocio_path
else:
self.log.debug("OCIO not set or enabled")

View file

@ -10,6 +10,7 @@ from qtpy import QtCore, QtWidgets
from openpype import style
from openpype.lib import Logger, StringTemplate
from openpype.pipeline import LegacyCreator, LoaderPlugin
from openpype.pipeline.colorspace import get_remapped_colorspace_to_native
from openpype.settings import get_current_project_settings
from . import constants
@ -701,6 +702,7 @@ class ClipLoader(LoaderPlugin):
]
_mapping = None
_host_settings = None
def apply_settings(cls, project_settings, system_settings):
@ -769,15 +771,26 @@ class ClipLoader(LoaderPlugin):
Returns:
str: native colorspace name defined in mapping or None
"""
# TODO: rewrite to support only pipeline's remapping
if not cls._host_settings:
cls._host_settings = get_current_project_settings()["flame"]
# [Deprecated] way of remapping
if not cls._mapping:
settings = get_current_project_settings()["flame"]
mapping = settings["imageio"]["profilesMapping"]["inputs"]
mapping = (
cls._host_settings["imageio"]["profilesMapping"]["inputs"])
cls._mapping = {
input["ocioName"]: input["flameName"]
for input in mapping
}
return cls._mapping.get(input_colorspace)
native_name = cls._mapping.get(input_colorspace)
if not native_name:
native_name = get_remapped_colorspace_to_native(
input_colorspace, "flame", cls._host_settings["imageio"])
return native_name
class OpenClipSolver(flib.MediaInfoFile):

View file

@ -47,6 +47,17 @@ class FlamePrelaunch(PreLaunchHook):
imageio_flame = project_settings["flame"]["imageio"]
# Check whether 'enabled' key from host imageio settings exists
# so we can tell if host is using the new colormanagement framework.
# If the 'enabled' isn't found we want 'colormanaged' set to True
# because prior to the key existing we always did colormanagement for
# Flame
colormanaged = imageio_flame.get("enabled")
# if key was not found, set to True
# ensuring backward compatibility
if colormanaged is None:
colormanaged = True
# get user name and host name
user_name = get_openpype_username()
user_name = user_name.replace(".", "_")
@ -68,9 +79,7 @@ class FlamePrelaunch(PreLaunchHook):
"FrameWidth": int(width),
"FrameHeight": int(height),
"AspectRatio": float((width / height) * _db_p_data["pixelAspect"]),
"FrameRate": self._get_flame_fps(fps),
"FrameDepth": str(imageio_flame["project"]["frameDepth"]),
"FieldDominance": str(imageio_flame["project"]["fieldDominance"])
"FrameRate": self._get_flame_fps(fps)
}
data_to_script = {
@ -78,7 +87,6 @@ class FlamePrelaunch(PreLaunchHook):
"host_name": _env.get("FLAME_WIRETAP_HOSTNAME") or hostname,
"volume_name": volume_name,
"group_name": _env.get("FLAME_WIRETAP_GROUP"),
"color_policy": str(imageio_flame["project"]["colourPolicy"]),
# from project
"project_name": project_name,
@ -86,6 +94,16 @@ class FlamePrelaunch(PreLaunchHook):
"project_data": project_data
}
# add color management data
if colormanaged:
project_data.update({
"FrameDepth": str(imageio_flame["project"]["frameDepth"]),
"FieldDominance": str(
imageio_flame["project"]["fieldDominance"])
})
data_to_script["color_policy"] = str(
imageio_flame["project"]["colourPolicy"])
self.log.info(pformat(dict(_env)))
self.log.info(pformat(data_to_script))

View file

@ -23,11 +23,17 @@ except ImportError:
from openpype.client import get_project
from openpype.settings import get_project_settings
from openpype.pipeline import legacy_io, Anatomy
from openpype.pipeline import (
get_current_project_name, legacy_io, Anatomy
)
from openpype.pipeline.load import filter_containers
from openpype.lib import Logger
from . import tags
from openpype.pipeline.colorspace import (
get_imageio_config
)
class DeprecatedWarning(DeprecationWarning):
pass
@ -1047,6 +1053,18 @@ def apply_colorspace_project():
imageio = get_project_settings(project_name)["hiero"]["imageio"]
presets = imageio.get("workfile")
# backward compatibility layer
# TODO: remove this after some time
config_data = get_imageio_config(
project_name=get_current_project_name(),
host_name="hiero"
)
if config_data:
presets.update({
"ocioConfigName": "custom"
})
# save the workfile as subversion "comment:_colorspaceChange"
split_current_file = os.path.splitext(current_file)
copy_current_file = current_file

View file

@ -6,7 +6,7 @@ from operator import attrgetter
import json
from openpype.host import HostBase, IWorkfileHost, ILoadHost, INewPublisher
from openpype.host import HostBase, IWorkfileHost, ILoadHost, IPublishHost
import pyblish.api
from openpype.pipeline import (
register_creator_plugin_path,
@ -28,7 +28,7 @@ CREATE_PATH = os.path.join(PLUGINS_DIR, "create")
INVENTORY_PATH = os.path.join(PLUGINS_DIR, "inventory")
class MaxHost(HostBase, IWorkfileHost, ILoadHost, INewPublisher):
class MaxHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost):
name = "max"
menu = None

View file

@ -1,6 +1,7 @@
"""Standalone helper functions"""
import os
from pprint import pformat
import sys
import platform
import uuid
@ -3239,75 +3240,6 @@ def iter_shader_edits(relationships, shader_nodes, nodes_by_id, label=None):
def set_colorspace():
"""Set Colorspace from project configuration
"""
project_name = os.getenv("AVALON_PROJECT")
imageio = get_project_settings(project_name)["maya"]["imageio"]
# Maya 2022+ introduces new OCIO v2 color management settings that
# can override the old color managenement preferences. OpenPype has
# separate settings for both so we fall back when necessary.
use_ocio_v2 = imageio["colorManagementPreference_v2"]["enabled"]
required_maya_version = 2022
maya_version = int(cmds.about(version=True))
maya_supports_ocio_v2 = maya_version >= required_maya_version
if use_ocio_v2 and not maya_supports_ocio_v2:
# Fallback to legacy behavior with a warning
log.warning("Color Management Preference v2 is enabled but not "
"supported by current Maya version: {} (< {}). Falling "
"back to legacy settings.".format(
maya_version, required_maya_version)
)
use_ocio_v2 = False
if use_ocio_v2:
root_dict = imageio["colorManagementPreference_v2"]
else:
root_dict = imageio["colorManagementPreference"]
if not isinstance(root_dict, dict):
msg = "set_colorspace(): argument should be dictionary"
log.error(msg)
log.debug(">> root_dict: {}".format(root_dict))
# enable color management
cmds.colorManagementPrefs(e=True, cmEnabled=True)
cmds.colorManagementPrefs(e=True, ocioRulesEnabled=True)
# set config path
custom_ocio_config = False
if root_dict.get("configFilePath"):
unresolved_path = root_dict["configFilePath"]
ocio_paths = unresolved_path[platform.system().lower()]
resolved_path = None
for ocio_p in ocio_paths:
resolved_path = str(ocio_p).format(**os.environ)
if not os.path.exists(resolved_path):
continue
if resolved_path:
filepath = str(resolved_path).replace("\\", "/")
cmds.colorManagementPrefs(e=True, configFilePath=filepath)
cmds.colorManagementPrefs(e=True, cmConfigFileEnabled=True)
log.debug("maya '{}' changed to: {}".format(
"configFilePath", resolved_path))
custom_ocio_config = True
else:
cmds.colorManagementPrefs(e=True, cmConfigFileEnabled=False)
cmds.colorManagementPrefs(e=True, configFilePath="")
# If no custom OCIO config file was set we make sure that Maya 2022+
# either chooses between Maya's newer default v2 or legacy config based
# on OpenPype setting to use ocio v2 or not.
if maya_supports_ocio_v2 and not custom_ocio_config:
if use_ocio_v2:
# Use Maya 2022+ default OCIO v2 config
log.info("Setting default Maya OCIO v2 config")
cmds.colorManagementPrefs(edit=True, configFilePath="")
else:
# Set the Maya default config file path
log.info("Setting default Maya OCIO v1 legacy config")
cmds.colorManagementPrefs(edit=True, configFilePath="legacy")
# set color spaces for rendering space and view transforms
def _colormanage(**kwargs):
@ -3324,17 +3256,74 @@ def set_colorspace():
except RuntimeError as exc:
log.error(exc)
if use_ocio_v2:
_colormanage(renderingSpaceName=root_dict["renderSpace"])
_colormanage(displayName=root_dict["displayName"])
_colormanage(viewName=root_dict["viewName"])
else:
_colormanage(renderingSpaceName=root_dict["renderSpace"])
if maya_supports_ocio_v2:
_colormanage(viewName=root_dict["viewTransform"])
_colormanage(displayName="legacy")
project_name = os.getenv("AVALON_PROJECT")
imageio = get_project_settings(project_name)["maya"]["imageio"]
# ocio compatibility variables
ocio_v2_maya_version = 2022
maya_version = int(cmds.about(version=True))
ocio_v2_support = use_ocio_v2 = maya_version >= ocio_v2_maya_version
root_dict = {}
use_workfile_settings = imageio.get("workfile", {}).get("enabled")
if use_workfile_settings:
# TODO: deprecated code from 3.15.5 - remove
# Maya 2022+ introduces new OCIO v2 color management settings that
# can override the old color management preferences. OpenPype has
# separate settings for both so we fall back when necessary.
use_ocio_v2 = imageio["colorManagementPreference_v2"]["enabled"]
if use_ocio_v2 and not ocio_v2_support:
# Fallback to legacy behavior with a warning
log.warning(
"Color Management Preference v2 is enabled but not "
"supported by current Maya version: {} (< {}). Falling "
"back to legacy settings.".format(
maya_version, ocio_v2_maya_version)
)
if use_ocio_v2:
root_dict = imageio["colorManagementPreference_v2"]
else:
_colormanage(viewTransformName=root_dict["viewTransform"])
root_dict = imageio["colorManagementPreference"]
if not isinstance(root_dict, dict):
msg = "set_colorspace(): argument should be dictionary"
log.error(msg)
else:
root_dict = imageio["workfile"]
log.debug(">> root_dict: {}".format(pformat(root_dict)))
if root_dict:
# enable color management
cmds.colorManagementPrefs(e=True, cmEnabled=True)
cmds.colorManagementPrefs(e=True, ocioRulesEnabled=True)
# backward compatibility
# TODO: deprecated code from 3.15.5 - refactor to use new settings
view_name = root_dict.get("viewTransform")
if view_name is None:
view_name = root_dict.get("viewName")
if use_ocio_v2:
# Use Maya 2022+ default OCIO v2 config
log.info("Setting default Maya OCIO v2 config")
cmds.colorManagementPrefs(edit=True, configFilePath="")
# set rendering space and view transform
_colormanage(renderingSpaceName=root_dict["renderSpace"])
_colormanage(viewName=view_name)
_colormanage(displayName=root_dict["displayName"])
else:
# Set the Maya default config file path
log.info("Setting default Maya OCIO v1 legacy config")
cmds.colorManagementPrefs(edit=True, configFilePath="legacy")
# set rendering space and view transform
_colormanage(renderingSpaceName=root_dict["renderSpace"])
_colormanage(viewTransformName=view_name)
@contextlib.contextmanager

View file

@ -273,6 +273,11 @@ class FileNodeLoader(load.LoaderPlugin):
project_name, host_name,
project_settings=project_settings
)
# ignore if host imageio is not enabled
if not config_data:
return
file_rules = get_imageio_file_rules(
project_name, host_name,
project_settings=project_settings

View file

@ -364,6 +364,17 @@ class ValidateRenderSettings(pyblish.api.InstancePlugin):
cmds.setAttr("defaultRenderGlobals.animation", True)
# Repair prefix
if renderer == "arnold":
multipart = cmds.getAttr("defaultArnoldDriver.mergeAOVs")
if multipart:
separator_variations = [
"_<RenderPass>",
"<RenderPass>_",
"<RenderPass>",
]
for variant in separator_variations:
default_prefix = default_prefix.replace(variant, "")
if renderer != "renderman":
node = render_attrs["node"]
prefix_attr = render_attrs["prefix"]

View file

@ -39,6 +39,7 @@ from openpype.settings import (
from openpype.modules import ModulesManager
from openpype.pipeline.template_data import get_template_data_with_names
from openpype.pipeline import (
get_current_project_name,
discover_legacy_creator_plugins,
legacy_io,
Anatomy,
@ -2001,63 +2002,72 @@ class WorkfileSettings(object):
"Attention! Viewer nodes {} were erased."
"It had wrong color profile".format(erased_viewers))
def set_root_colorspace(self, nuke_colorspace):
def set_root_colorspace(self, imageio_host):
''' Adds correct colorspace to root
Arguments:
nuke_colorspace (dict): adjustmensts from presets
imageio_host (dict): host colorspace configurations
'''
workfile_settings = nuke_colorspace["workfile"]
config_data = get_imageio_config(
project_name=get_current_project_name(),
host_name="nuke"
)
# resolve config data if they are enabled in host
config_data = None
if nuke_colorspace.get("ocio_config", {}).get("enabled"):
# switch ocio config to custom config
workfile_settings["OCIO_config"] = "custom"
workfile_settings["colorManagement"] = "OCIO"
workfile_settings = imageio_host["workfile"]
# get resolved ocio config path
config_data = get_imageio_config(
legacy_io.active_project(), "nuke"
)
if not config_data:
# TODO: backward compatibility for old projects - remove later
# perhaps old project overrides is having it set to older version
# with use of `customOCIOConfigPath`
if workfile_settings.get("customOCIOConfigPath"):
unresolved_path = workfile_settings["customOCIOConfigPath"]
ocio_paths = unresolved_path[platform.system().lower()]
# first set OCIO
if self._root_node["colorManagement"].value() \
not in str(workfile_settings["colorManagement"]):
self._root_node["colorManagement"].setValue(
str(workfile_settings["colorManagement"]))
resolved_path = None
for ocio_p in ocio_paths:
resolved_path = str(ocio_p).format(**os.environ)
if not os.path.exists(resolved_path):
continue
# we dont need the key anymore
workfile_settings.pop("colorManagement")
if resolved_path:
# set values to root
self._root_node["colorManagement"].setValue("OCIO")
self._root_node["OCIO_config"].setValue("custom")
self._root_node["customOCIOConfigPath"].setValue(
resolved_path)
else:
# no ocio config found and no custom path used
if self._root_node["colorManagement"].value() \
not in str(workfile_settings["colorManagement"]):
self._root_node["colorManagement"].setValue(
str(workfile_settings["colorManagement"]))
# second set ocio version
if self._root_node["OCIO_config"].value() \
not in str(workfile_settings["OCIO_config"]):
self._root_node["OCIO_config"].setValue(
str(workfile_settings["OCIO_config"]))
# second set ocio version
if self._root_node["OCIO_config"].value() \
not in str(workfile_settings["OCIO_config"]):
self._root_node["OCIO_config"].setValue(
str(workfile_settings["OCIO_config"]))
# we dont need the key anymore
workfile_settings.pop("OCIO_config")
else:
# set values to root
self._root_node["colorManagement"].setValue("OCIO")
# third set ocio custom path
if config_data:
self._root_node["customOCIOConfigPath"].setValue(
str(config_data["path"]).replace("\\", "/")
)
# backward compatibility, remove in case it exists
workfile_settings.pop("customOCIOConfigPath")
# we dont need the key anymore
workfile_settings.pop("customOCIOConfigPath")
workfile_settings.pop("colorManagement")
workfile_settings.pop("OCIO_config")
# then set the rest
for knob, value in workfile_settings.items():
for knob, value_ in workfile_settings.items():
# skip unfilled ocio config path
# it will be dict in value
if isinstance(value, dict):
if isinstance(value_, dict):
continue
if self._root_node[knob].value() not in value:
self._root_node[knob].setValue(str(value))
if self._root_node[knob].value() not in value_:
self._root_node[knob].setValue(str(value_))
log.debug("nuke.root()['{}'] changed to: {}".format(
knob, value))
knob, value_))
def set_writes_colorspace(self):
''' Adds correct colorspace to write node dict

View file

@ -237,15 +237,25 @@ def _install_menu():
menu.addSeparator()
if not ASSIST:
# only add parent if nuke version is 14 or higher
# known issue with no solution yet
menu.addCommand(
"Create...",
lambda: host_tools.show_publisher(
parent=(
main_window if nuke.NUKE_VERSION_RELEASE >= 14 else None
),
tab="create"
)
)
# only add parent if nuke version is 14 or higher
# known issue with no solution yet
menu.addCommand(
"Publish...",
lambda: host_tools.show_publisher(
parent=(
main_window if nuke.NUKE_VERSION_RELEASE >= 14 else None
),
tab="publish"
)
)

View file

@ -23,7 +23,7 @@ class NukeRenderLocal(publish.Extractor,
order = pyblish.api.ExtractorOrder
label = "Render Local"
hosts = ["nuke"]
families = ["render.local", "prerender.local", "still.local"]
families = ["render.local", "prerender.local", "image.local"]
def process(self, instance):
child_nodes = (
@ -136,9 +136,9 @@ class NukeRenderLocal(publish.Extractor,
families.remove('prerender.local')
families.insert(0, "prerender")
instance.data["anatomyData"]["family"] = "prerender"
elif "still.local" in families:
elif "image.local" in families:
instance.data['family'] = 'image'
families.remove('still.local')
families.remove('image.local')
instance.data["anatomyData"]["family"] = "image"
instance.data["families"] = families

View file

@ -487,7 +487,22 @@ or updating already created. Publishing will create OTIO file.
)
# get video stream data
video_stream = media_data["streams"][0]
video_streams = []
audio_streams = []
for stream in media_data["streams"]:
codec_type = stream.get("codec_type")
if codec_type == "audio":
audio_streams.append(stream)
elif codec_type == "video":
video_streams.append(stream)
if not video_streams:
raise ValueError(
"Could not find video stream in source file."
)
video_stream = video_streams[0]
return_data = {
"video": True,
"start_frame": 0,
@ -500,12 +515,7 @@ or updating already created. Publishing will create OTIO file.
}
# get audio streams data
audio_stream = [
stream for stream in media_data["streams"]
if stream["codec_type"] == "audio"
]
if audio_stream:
if audio_streams:
return_data["audio"] = True
except Exception as exc:

View file

@ -51,7 +51,7 @@ IMAGE_EXTENSIONS = {
".jng", ".jpeg", ".jpeg-ls", ".jpeg", ".2000", ".jpg", ".xr",
".jpeg", ".xt", ".jpeg-hdr", ".kra", ".mng", ".miff", ".nrrd",
".ora", ".pam", ".pbm", ".pgm", ".ppm", ".pnm", ".pcx", ".pgf",
".pictor", ".png", ".psb", ".psp", ".qtvr", ".ras",
".pictor", ".png", ".psd", ".psb", ".psp", ".qtvr", ".ras",
".rgbe", ".logluv", ".tiff", ".sgi", ".tga", ".tiff", ".tiff/ep",
".tiff/it", ".ufo", ".ufp", ".wbmp", ".webp", ".xbm", ".xcf",
".xpm", ".xwd"

View file

@ -825,7 +825,8 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin):
).format(source))
family = "render"
if "prerender" in instance.data["families"]:
if ("prerender" in instance.data["families"] or
"prerender.farm" in instance.data["families"]):
family = "prerender"
families = [family]

View file

@ -18,6 +18,10 @@ from openpype.pipeline import Anatomy
log = Logger.get_logger(__name__)
class CashedData:
remapping = None
@contextlib.contextmanager
def _make_temp_json_file():
"""Wrapping function for json temp file
@ -92,6 +96,11 @@ def get_imageio_colorspace_from_filepath(
)
config_data = get_imageio_config(
project_name, host_name, project_settings)
# in case host color management is not enabled
if not config_data:
return None
file_rules = get_imageio_file_rules(
project_name, host_name, project_settings)
@ -324,7 +333,7 @@ def get_imageio_config(
Defaults to None.
Returns:
dict or bool: config path data or None
dict: config path data or empty dict
"""
project_settings = project_settings or get_project_settings(project_name)
anatomy = anatomy or Anatomy(project_name)
@ -335,25 +344,69 @@ def get_imageio_config(
anatomy_data = get_template_data_from_session()
formatting_data = deepcopy(anatomy_data)
# add project roots to anatomy data
formatting_data["root"] = anatomy.roots
formatting_data["platform"] = platform.system().lower()
# get colorspace settings
# check if global settings group is having activate_global_color_management
# key at all. If it does't then default it to False
# this is for backward compatibility only
# TODO: in future rewrite this to be more explicit
imageio_global, imageio_host = _get_imageio_settings(
project_settings, host_name)
activate_color_management = (
imageio_global.get("activate_global_color_management", False)
# for already saved overrides from previous version
# TODO: remove this in future - backward compatibility
or imageio_host.get("ocio_config").get("enabled")
)
if not activate_color_management:
# if global settings are disabled return empty dict because
# it is expected that no colorspace management is needed
log.info(
"Colorspace management is disabled globally."
)
return {}
# check if host settings group is having activate_host_color_management
# if it does not have activation key then default it to True so it uses
# global settings
# this is for backward compatibility
# TODO: in future rewrite this to be more explicit
activate_host_color_management = imageio_host.get(
"activate_host_color_management", True)
if not activate_host_color_management:
# if host settings are disabled return False because
# it is expected that no colorspace management is needed
log.info(
"Colorspace management for host '{}' is disabled.".format(
host_name)
)
return {}
config_host = imageio_host.get("ocio_config", {})
if config_host.get("enabled"):
# get config path from either global or host_name
# depending on override flag
# TODO: in future rewrite this to be more explicit
config_data = None
override_global_config = (
config_host.get("override_global_config")
# for already saved overrides from previous version
# TODO: remove this in future - backward compatibility
or config_host.get("enabled")
)
if override_global_config:
config_data = _get_config_data(
config_host["filepath"], formatting_data
)
else:
config_data = None
if not config_data:
# get config path from either global or host_name
# get config path from global
config_global = imageio_global["ocio_config"]
config_data = _get_config_data(
config_global["filepath"], formatting_data
@ -437,17 +490,79 @@ def get_imageio_file_rules(project_name, host_name, project_settings=None):
# get file rules from global and host_name
frules_global = imageio_global["file_rules"]
activate_global_rules = (
frules_global.get("activate_global_file_rules", False)
# TODO: remove this in future - backward compatibility
or frules_global.get("enabled")
)
global_rules = frules_global["rules"]
if not activate_global_rules:
log.info(
"Colorspace global file rules are disabled."
)
global_rules = {}
# host is optional, some might not have any settings
frules_host = imageio_host.get("file_rules", {})
# compile file rules dictionary
file_rules = {}
if frules_global["enabled"]:
file_rules.update(frules_global["rules"])
if frules_host and frules_host["enabled"]:
file_rules.update(frules_host["rules"])
activate_host_rules = (
frules_host.get("activate_host_rules")
# TODO: remove this in future - backward compatibility
or frules_host.get("enabled")
)
return file_rules
# return host rules if activated or global rules
return frules_host["rules"] if activate_host_rules else global_rules
def get_remapped_colorspace_to_native(
ocio_colorspace_name, host_name, imageio_host_settings):
"""Return native colorspace name.
Args:
ocio_colorspace_name (str | None): ocio colorspace name
Returns:
str: native colorspace name defined in remapping or None
"""
if not CashedData.remapping.get(host_name, {}).get("to_native"):
remapping_rules = imageio_host_settings["remapping"]["rules"]
CashedData.remapping[host_name] = {
"to_native": {
rule["ocio_name"]: input["host_native_name"]
for rule in remapping_rules
}
}
return CashedData.remapping[host_name]["to_native"].get(
ocio_colorspace_name)
def get_remapped_colorspace_from_native(
host_native_colorspace_name, host_name, imageio_host_settings):
"""Return ocio colorspace name remapped from host native used name.
Args:
host_native_colorspace_name (str): host native colorspace name
Returns:
str: ocio colorspace name defined in remapping or None
"""
if not CashedData.remapping.get(host_name, {}).get("from_native"):
remapping_rules = imageio_host_settings["remapping"]["rules"]
CashedData.remapping[host_name] = {
"from_native": {
input["host_native_name"]: rule["ocio_name"]
for rule in remapping_rules
}
}
return CashedData.remapping[host_name]["from_native"].get(
host_native_colorspace_name)
def _get_imageio_settings(project_settings, host_name):

View file

@ -331,6 +331,11 @@ class ColormanagedPyblishPluginMixin(object):
project_settings=project_settings_,
anatomy_data=anatomy_data
)
# in case host color management is not enabled
if not config_data:
return None
file_rules = get_imageio_file_rules(
project_name, host_name,
project_settings=project_settings_
@ -387,6 +392,11 @@ class ColormanagedPyblishPluginMixin(object):
if colorspace_settings is None:
colorspace_settings = self.get_colorspace_settings(context)
# in case host color management is not enabled
if not colorspace_settings:
self.log.warning("Host's colorspace management is disabled.")
return
# unpack colorspace settings
config_data, file_rules = colorspace_settings

View file

@ -1,11 +1,12 @@
{
"imageio": {
"activate_host_color_management": true,
"ocio_config": {
"enabled": false,
"override_global_config": false,
"filepath": []
},
"file_rules": {
"enabled": false,
"activate_host_rules": false,
"rules": {}
}
},

View file

@ -5,12 +5,13 @@
"base_file_unit_scale": 0.01
},
"imageio": {
"activate_host_color_management": true,
"ocio_config": {
"enabled": false,
"override_global_config": false,
"filepath": []
},
"file_rules": {
"enabled": false,
"activate_host_rules": false,
"rules": {}
}
},

View file

@ -1,11 +1,12 @@
{
"imageio": {
"activate_host_color_management": true,
"ocio_config": {
"enabled": false,
"override_global_config": false,
"filepath": []
},
"file_rules": {
"enabled": false,
"activate_host_rules": false,
"rules": {}
}
},

View file

@ -1,11 +1,15 @@
{
"imageio": {
"activate_host_color_management": true,
"remapping": {
"rules": []
},
"ocio_config": {
"enabled": false,
"override_global_config": false,
"filepath": []
},
"file_rules": {
"enabled": false,
"activate_host_rules": false,
"rules": {}
},
"project": {

View file

@ -1,20 +1,13 @@
{
"imageio": {
"activate_host_color_management": true,
"ocio_config": {
"enabled": false,
"override_global_config": false,
"filepath": []
},
"file_rules": {
"enabled": false,
"activate_host_rules": false,
"rules": {}
},
"ocio": {
"enabled": false,
"configFilePath": {
"windows": [],
"darwin": [],
"linux": []
}
}
},
"copy_fusion_settings": {

View file

@ -1,5 +1,6 @@
{
"imageio": {
"activate_global_color_management": false,
"ocio_config": {
"filepath": [
"{OPENPYPE_ROOT}/vendor/bin/ocioconfig/OpenColorIOConfigs/aces_1.2/config.ocio",
@ -7,7 +8,7 @@
]
},
"file_rules": {
"enabled": false,
"activate_global_file_rules": false,
"rules": {
"example": {
"pattern": ".*(beauty).*",

View file

@ -1,11 +1,12 @@
{
"imageio": {
"activate_host_color_management": true,
"ocio_config": {
"enabled": false,
"override_global_config": false,
"filepath": []
},
"file_rules": {
"enabled": false,
"activate_host_rules": false,
"rules": {}
}
},

View file

@ -1,20 +1,16 @@
{
"imageio": {
"activate_host_color_management": true,
"ocio_config": {
"enabled": false,
"override_global_config": false,
"filepath": []
},
"file_rules": {
"enabled": false,
"activate_host_rules": false,
"rules": {}
},
"workfile": {
"ocioConfigName": "nuke-default",
"ocioconfigpath": {
"windows": [],
"darwin": [],
"linux": []
},
"workingSpace": "linear",
"sixteenBitLut": "sRGB",
"eightBitLut": "sRGB",

View file

@ -1,11 +1,12 @@
{
"imageio": {
"activate_host_color_management": true,
"ocio_config": {
"enabled": false,
"override_global_config": false,
"filepath": []
},
"file_rules": {
"enabled": false,
"activate_host_rules": false,
"rules": {}
}
},

View file

@ -1,12 +1,23 @@
{
"imageio": {
"activate_host_color_management": true,
"ocio_config": {
"override_global_config": false,
"filepath": []
},
"file_rules": {
"activate_host_rules": false,
"rules": {}
}
},
"RenderSettings": {
"default_render_image_folder": "renders/3dsmax",
"aov_separator": "underscore",
"image_format": "exr",
"multipass": true
},
"PointCloud":{
"attribute":{
"PointCloud": {
"attribute": {
"Age": "age",
"Radius": "radius",
"Position": "position",

View file

@ -410,31 +410,28 @@
]
},
"imageio": {
"activate_host_color_management": true,
"ocio_config": {
"enabled": false,
"override_global_config": false,
"filepath": []
},
"file_rules": {
"enabled": false,
"activate_host_rules": false,
"rules": {}
},
"workfile": {
"enabled": false,
"renderSpace": "ACEScg",
"displayName": "sRGB",
"viewName": "ACES 1.0 SDR-video"
},
"colorManagementPreference_v2": {
"enabled": true,
"configFilePath": {
"windows": [],
"darwin": [],
"linux": []
},
"renderSpace": "ACEScg",
"displayName": "sRGB",
"viewName": "ACES 1.0 SDR-video"
},
"colorManagementPreference": {
"configFilePath": {
"windows": [],
"darwin": [],
"linux": []
},
"renderSpace": "scene-linear Rec 709/sRGB",
"viewTransform": "sRGB gamma"
}
@ -456,6 +453,10 @@
"destination-path": []
}
},
"include_handles": {
"include_handles_default": false,
"per_task_type": []
},
"scriptsmenu": {
"name": "OpenPype Tools",
"definition": [
@ -1556,10 +1557,6 @@
}
]
},
"include_handles": {
"include_handles_default": false,
"per_task_type": []
},
"templated_workfile_build": {
"profiles": []
},

View file

@ -9,12 +9,13 @@
}
},
"imageio": {
"activate_host_color_management": true,
"ocio_config": {
"enabled": false,
"override_global_config": false,
"filepath": []
},
"file_rules": {
"enabled": false,
"activate_host_rules": false,
"rules": {}
},
"viewer": {
@ -26,11 +27,6 @@
"workfile": {
"colorManagement": "Nuke",
"OCIO_config": "nuke-default",
"customOCIOConfigPath": {
"windows": [],
"darwin": [],
"linux": []
},
"workingSpaceLUT": "linear",
"monitorLut": "sRGB",
"int8Lut": "sRGB",
@ -148,7 +144,7 @@
},
{
"plugins": [
"CreateWriteStill"
"CreateWriteImage"
],
"nukeNodeClass": "Write",
"knobs": [
@ -563,15 +559,7 @@
"load": {
"LoadImage": {
"enabled": true,
"_representations": [
"exr",
"dpx",
"jpg",
"jpeg",
"png",
"psd",
"tiff"
],
"_representations": [],
"node_name_template": "{class_name}_{ext}"
},
"LoadClip": {

View file

@ -1,11 +1,15 @@
{
"imageio": {
"activate_host_color_management": true,
"remapping": {
"rules": []
},
"ocio_config": {
"enabled": false,
"override_global_config": false,
"filepath": []
},
"file_rules": {
"enabled": false,
"activate_host_rules": false,
"rules": {}
}
},

View file

@ -1,12 +1,16 @@
{
"launch_openpype_menu_on_start": false,
"imageio": {
"activate_host_color_management": true,
"remapping": {
"rules": []
},
"ocio_config": {
"enabled": false,
"override_global_config": false,
"filepath": []
},
"file_rules": {
"enabled": false,
"activate_host_rules": false,
"rules": {}
}
},

View file

@ -1,11 +1,12 @@
{
"imageio": {
"activate_host_color_management": true,
"ocio_config": {
"enabled": true,
"override_global_config": true,
"filepath": []
},
"file_rules": {
"enabled": true,
"activate_host_rules": true,
"rules": {}
}
},

View file

@ -1,11 +1,12 @@
{
"imageio": {
"activate_host_color_management": true,
"ocio_config": {
"enabled": false,
"override_global_config": false,
"filepath": []
},
"file_rules": {
"enabled": false,
"activate_host_rules": false,
"rules": {}
}
},

View file

@ -1,11 +1,12 @@
{
"imageio": {
"activate_host_color_management": true,
"ocio_config": {
"enabled": false,
"override_global_config": false,
"filepath": []
},
"file_rules": {
"enabled": false,
"activate_host_rules": false,
"rules": {}
}
},

View file

@ -1,11 +1,12 @@
{
"imageio": {
"activate_host_color_management": true,
"ocio_config": {
"enabled": false,
"override_global_config": false,
"filepath": []
},
"file_rules": {
"enabled": false,
"activate_host_rules": false,
"rules": {}
}
},

View file

@ -1,11 +1,12 @@
{
"imageio": {
"activate_host_color_management": true,
"ocio_config": {
"enabled": false,
"override_global_config": false,
"filepath": []
},
"file_rules": {
"enabled": false,
"activate_host_rules": false,
"rules": {}
}
},

View file

@ -8,18 +8,14 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"label": "Color Management (OCIO managed)",
"collapsible": true,
"is_group": true,
"children": [
{
"type": "schema",
"name": "schema_imageio_config"
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
"type": "template",
"name": "template_host_color_management_ocio"
}
]
},
{

View file

@ -34,18 +34,14 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"label": "Color Management (OCIO managed)",
"collapsible": true,
"is_group": true,
"children": [
{
"type": "schema",
"name": "schema_imageio_config"
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
"type": "template",
"name": "template_host_color_management_ocio"
}
]
},
{

View file

@ -8,18 +8,14 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"label": "Color Management (derived to OCIO)",
"collapsible": true,
"is_group": true,
"children": [
{
"type": "schema",
"name": "schema_imageio_config"
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
"type": "template",
"name": "template_host_color_management_derived"
}
]
},
{

View file

@ -8,16 +8,13 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"label": "Color Management (remapped to OCIO)",
"collapsible": true,
"is_group": true,
"children": [
{
"type": "schema",
"name": "schema_imageio_config"
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
"type": "template",
"name": "template_host_color_management_remapped"
},
{
"key": "project",
@ -47,10 +44,14 @@
}
]
},
{
"type": "label",
"label": "Profile names mapping settings is deprecated use <a href=\"settings://project_settings/flame/imageio/remapping\"><b>./imagio/remapping</b></a> instead"
},
{
"key": "profilesMapping",
"type": "dict",
"label": "Profile names mapping",
"label": "Profile names mapping [deprecated]",
"collapsible": true,
"children": [
{
@ -362,7 +363,7 @@
},
{
"key": "colorspace_out",
"label": "Output color (imageio)",
"label": "Output color",
"type": "text",
"default": "linear"
},

View file

@ -8,41 +8,13 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"label": "Color Management (OCIO managed)",
"collapsible": true,
"is_group": true,
"children": [
{
"type": "schema",
"name": "schema_imageio_config"
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
},
{
"key": "ocio",
"type": "dict",
"label": "OpenColorIO (OCIO)",
"collapsible": true,
"checkbox_key": "enabled",
"children": [
{
"type": "boolean",
"key": "enabled",
"label": "Set OCIO variable for Fusion"
},
{
"type": "label",
"label": "<b style='color:red'>'configFilePath'</b> will be deprecated. <br>Please move values to : <i>project_settings/{app}/imageio/ocio_config/filepath</i>."
},
{
"type": "path",
"key": "configFilePath",
"label": "OCIO Config File Path",
"multiplatform": true,
"multipath": true
}
]
"type": "template",
"name": "template_host_color_management_ocio"
}
]
},

View file

@ -8,9 +8,18 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"label": "Color Management",
"is_group": true,
"children": [
{
"type": "label",
"label": "It's important to note that once color management is activated on a project, all hosts will be color managed by default. <br>The OpenColorIO (OCIO) config file is used either from the global settings or from the host's overrides. It's worth <br>noting that the order of the defined configuration paths matters, with higher priority given to paths listed earlier in <br>the configuration list.<br><br>To avoid potential issues, ensure that the OCIO configuration path is not an absolute path and includes at least <br>the root token (Anatomy). This helps ensure that the configuration path remains valid across different environments and <br>avoids any hard-coding of paths that may be specific to one particular system.<br><br><b><a href='https://ayon.ynput.io/docs/admin_colorspace' style=\"color:#00d6a1\";>Related documentation.</a></b>"
},
{
"type": "boolean",
"key": "activate_global_color_management",
"label": "Enable Color Management"
},
{
"key": "ocio_config",
"type": "dict",
@ -27,8 +36,44 @@
]
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
"key": "file_rules",
"type": "dict",
"label": "File Rules (OCIO v1 only)",
"collapsible": true,
"children": [
{
"type": "boolean",
"key": "activate_global_file_rules",
"label": "Enable File Rules"
},
{
"key": "rules",
"label": "Rules",
"type": "dict-modifiable",
"highlight_content": true,
"collapsible": false,
"object_type": {
"type": "dict",
"children": [
{
"key": "pattern",
"label": "Regex pattern",
"type": "text"
},
{
"key": "colorspace",
"label": "Colorspace name",
"type": "text"
},
{
"key": "ext",
"label": "File extension",
"type": "text"
}
]
}
}
]
}
]

View file

@ -8,18 +8,14 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"label": "Color Management (OCIO managed)",
"collapsible": true,
"is_group": true,
"children": [
{
"type": "schema",
"name": "schema_imageio_config"
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
"type": "template",
"name": "template_host_color_management_ocio"
}
]
},
{

View file

@ -8,17 +8,13 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"is_group": true,
"label": "Color Management (OCIO managed)",
"collapsible": true,
"is_group": true,
"children": [
{
"type": "schema",
"name": "schema_imageio_config"
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
"type": "template",
"name": "template_host_color_management_ocio"
},
{
"key": "workfile",
@ -26,10 +22,6 @@
"label": "Workfile",
"collapsible": false,
"children": [
{
"type": "label",
"label": "<b style='color:red'>'ocioconfigpath'</b> will be deprecated. <br>Please move values to : <i>project_settings/{app}/imageio/ocio_config/filepath</i>."
},
{
"type": "form",
"children": [
@ -55,19 +47,9 @@
},
{
"cg-config-v1.0.0_aces-v1.3_ocio-v2.1": "cg-config-v1.0.0_aces-v1.3_ocio-v2.1 (14)"
},
{
"custom": "custom"
}
]
},
{
"type": "path",
"key": "ocioconfigpath",
"label": "Custom OCIO path",
"multiplatform": true,
"multipath": true
},
{
"type": "text",
"key": "workingSpace",

View file

@ -8,18 +8,14 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"label": "Color Management (OCIO managed)",
"collapsible": true,
"is_group": true,
"children": [
{
"type": "schema",
"name": "schema_imageio_config"
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
"type": "template",
"name": "template_host_color_management_ocio"
}
]
},
{
@ -35,4 +31,4 @@
"name": "schema_houdini_publish"
}
]
}
}

View file

@ -5,6 +5,19 @@
"label": "Max",
"is_file": true,
"children": [
{
"key": "imageio",
"type": "dict",
"label": "Color Management (OCIO managed)",
"collapsible": true,
"is_group": true,
"children": [
{
"type": "template",
"name": "template_host_color_management_ocio"
}
]
},
{
"type": "dict",
"collapsible": true,

View file

@ -48,40 +48,25 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"label": "Color Management (OCIO managed)",
"collapsible": true,
"is_group": true,
"children": [
{
"type": "schema",
"name": "schema_imageio_config"
"type": "template",
"name": "template_host_color_management_ocio"
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
},
{
"key": "colorManagementPreference_v2",
"key": "workfile",
"type": "dict",
"label": "Color Management Preference v2 (Maya 2022+)",
"label": "Workfile",
"collapsible": true,
"checkbox_key": "enabled",
"children": [
{
"type": "boolean",
"key": "enabled",
"label": "Use Color Management Preference v2"
},
{
"type": "label",
"label": "<b style='color:red'>'configFilePath'</b> will be deprecated. <br>Please move values to : <i>project_settings/{app}/imageio/ocio_config/filepath</i>."
},
{
"type": "path",
"key": "configFilePath",
"label": "OCIO Config File Path",
"multiplatform": true,
"multipath": true
"label": "Enabled"
},
{
"type": "text",
@ -101,31 +86,57 @@
]
},
{
"key": "colorManagementPreference",
"type": "dict",
"label": "Color Management Preference (legacy)",
"type": "collapsible-wrap",
"label": "<b>[Deprecated] please migrate all to 'Workfile' and enable it.</b>",
"collapsible": true,
"collapsed": true,
"children": [
{
"type": "label",
"label": "<b style='color:red'>'configFilePath'</b> will be deprecated. <br>Please move values to : <i>project_settings/{app}/imageio/ocio_config/filepath</i>."
"key": "colorManagementPreference_v2",
"type": "dict",
"label": "[DEPRECATED] Color Management Preference v2 (Maya 2022+)",
"collapsible": true,
"checkbox_key": "enabled",
"children": [
{
"type": "boolean",
"key": "enabled",
"label": "Use Color Management Preference v2"
},
{
"type": "text",
"key": "renderSpace",
"label": "Rendering Space"
},
{
"type": "text",
"key": "displayName",
"label": "Display"
},
{
"type": "text",
"key": "viewName",
"label": "View"
}
]
},
{
"type": "path",
"key": "configFilePath",
"label": "OCIO Config File Path",
"multiplatform": true,
"multipath": true
},
{
"type": "text",
"key": "renderSpace",
"label": "Rendering Space"
},
{
"type": "text",
"key": "viewTransform",
"label": "Viewer Transform"
"key": "colorManagementPreference",
"type": "dict",
"label": "[DEPRECATED] Color Management Preference (legacy)",
"collapsible": true,
"children": [
{
"type": "text",
"key": "renderSpace",
"label": "Rendering Space"
},
{
"type": "text",
"key": "viewTransform",
"label": "Viewer Transform (workfile/viewName)"
}
]
}
]
}

View file

@ -8,18 +8,14 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"label": "Color Management (remapped to OCIO)",
"collapsible": true,
"is_group": true,
"children": [
{
"type": "schema",
"name": "schema_imageio_config"
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
"type": "template",
"name": "template_host_color_management_remapped"
}
]
},
{

View file

@ -13,18 +13,14 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"label": "Color Management (remapped to OCIO)",
"collapsible": true,
"is_group": true,
"children": [
{
"type": "schema",
"name": "schema_imageio_config"
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
"type": "template",
"name": "template_host_color_management_remapped"
}
]
},
{

View file

@ -8,18 +8,13 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"label": "Color Management (OCIO managed)",
"is_group": true,
"children": [
{
"type": "schema",
"name": "schema_imageio_config"
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
"type": "template",
"name": "template_host_color_management_ocio"
}
]
},
{

View file

@ -8,18 +8,14 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"label": "Color Management (derived to OCIO)",
"collapsible": true,
"is_group": true,
"children": [
{
"type": "schema",
"name": "schema_imageio_config"
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
"type": "template",
"name": "template_host_color_management_derived"
}
]
},
{

View file

@ -8,18 +8,14 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"label": "Color Management (derived to OCIO)",
"collapsible": true,
"is_group": true,
"children": [
{
"type": "schema",
"name": "schema_imageio_config"
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
"type": "template",
"name": "template_host_color_management_derived"
}
]
},
{

View file

@ -8,18 +8,14 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"label": "Color Management (OCIO managed)",
"collapsible": true,
"is_group": true,
"children": [
{
"type": "schema",
"name": "schema_imageio_config"
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
"type": "template",
"name": "template_host_color_management_ocio"
}
]
},
{

View file

@ -8,18 +8,14 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"label": "Color Management (derived to OCIO)",
"collapsible": true,
"is_group": true,
"children": [
{
"type": "schema",
"name": "schema_imageio_config"
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
"type": "template",
"name": "template_host_color_management_derived"
}
]
},
{

View file

@ -1,21 +0,0 @@
{
"key": "ocio_config",
"type": "dict",
"label": "OCIO config",
"collapsible": true,
"checkbox_key": "enabled",
"children": [
{
"type": "boolean",
"key": "enabled",
"label": "Enabled"
},
{
"type": "path",
"key": "filepath",
"label": "Config path",
"multiplatform": false,
"multipath": true
}
]
}

View file

@ -1,41 +0,0 @@
{
"key": "file_rules",
"type": "dict",
"label": "File Rules",
"collapsible": true,
"checkbox_key": "enabled",
"children": [
{
"type": "boolean",
"key": "enabled",
"label": "Enabled"
},
{
"key": "rules",
"label": "Rules",
"type": "dict-modifiable",
"highlight_content": true,
"collapsible": false,
"object_type": {
"type": "dict",
"children": [
{
"key": "pattern",
"label": "Regex pattern",
"type": "text"
},
{
"key": "colorspace",
"label": "Colorspace name",
"type": "text"
},
{
"key": "ext",
"label": "File extension",
"type": "text"
}
]
}
}
]
}

View file

@ -1,21 +1,13 @@
{
"key": "imageio",
"type": "dict",
"label": "Color Management (ImageIO)",
"label": "Color Management (OCIO managed)",
"collapsible": true,
"is_group": true,
"children": [
{
"type": "label",
"label": "<b style='color:red'>'Custom OCIO config path'</b> has deprecated. <br> If you need to set custom config, just enable and add path into 'OCIO config'. <br>Anatomy keys are supported.</i>."
},
{
"type": "schema",
"name": "schema_imageio_config"
},
{
"type": "schema",
"name": "schema_imageio_file_rules"
"type": "template",
"name": "template_host_color_management_ocio"
},
{
"key": "viewer",
@ -102,19 +94,9 @@
},
{
"cg-config-v1.0.0_aces-v1.3_ocio-v2.1": "cg-config-v1.0.0_aces-v1.3_ocio-v2.1 (14)"
},
{
"custom": "custom"
}
]
},
{
"type": "path",
"key": "customOCIOConfigPath",
"label": "Custom OCIO config path",
"multiplatform": true,
"multipath": true
},
{
"type": "text",
"key": "workingSpaceLUT",

View file

@ -0,0 +1,29 @@
[
{
"key": "remapping",
"type": "dict",
"label": "Remapping colorspace names",
"collapsible": true,
"children": [
{
"type": "list",
"key": "rules",
"object_type": {
"type": "dict",
"children": [
{
"type": "text",
"key": "host_native_name",
"label": "Application native colorspace name"
},
{
"type": "text",
"key": "ocio_name",
"label": "OCIO colorspace name"
}
]
}
}
]
}
]

View file

@ -0,0 +1,19 @@
[
{
"type": "label",
"label": "The application does not include any built-in color management capabilities, OpenPype offers a solution <br>to this limitation by deriving valid colorspace names for the OpenColorIO (OCIO) color management <br>system from file paths, using File Rules feature only during Publishing.<br><br><b><a href='https://ayon.ynput.io/docs/admin_colorspace#derived-colorspace' style=\"color:#00d6a1\";>Related documentation.</a></b>"
},
{
"type": "boolean",
"key": "activate_host_color_management",
"label": "Enable Color Management"
},
{
"type": "template",
"name": "template_imageio_config"
},
{
"type": "template",
"name": "template_imageio_file_rules"
}
]

View file

@ -0,0 +1,19 @@
[
{
"type": "label",
"label": "Colorspace management for the application can be controlled through OpenPype settings. <br>Specifically, the configured OpenColorIO (OCIO) config path is utilized in the application's workfile. <br>Additionally, the File Rules feature can be leveraged for both publishing and loading procedures.<br><br><b><a href='https://ayon.ynput.io/docs/admin_colorspace#remapped-internal-colorspace' style=\"color:#00d6a1\";>Related documentation.</a></b>"
},
{
"type": "boolean",
"key": "activate_host_color_management",
"label": "Enable Color Management"
},
{
"type": "template",
"name": "template_imageio_config"
},
{
"type": "template",
"name": "template_imageio_file_rules"
}
]

View file

@ -0,0 +1,23 @@
[
{
"type": "label",
"label": "The application includes internal color management functionality, but it does not offer external control <br>over this feature. To address this limitation, OpenPype uses mapping rules to remap the native <br>colorspace names used in the internal color management system to the OpenColorIO (OCIO) <br>color management system. Remapping feature is used in Publishing and Loading procedures.<br><br><b><a href='https://ayon.ynput.io/docs/admin_colorspace#remapped-internal-colorspace' style=\"color:#00d6a1\";>Related documentation.</a></b>."
},
{
"type": "boolean",
"key": "activate_host_color_management",
"label": "Enable Color Management"
},
{
"type": "template",
"name": "template_colorspace_remapping"
},
{
"type": "template",
"name": "template_imageio_config"
},
{
"type": "template",
"name": "template_imageio_file_rules"
}
]

View file

@ -0,0 +1,22 @@
[
{
"key": "ocio_config",
"type": "dict",
"label": "OCIO config",
"collapsible": true,
"children": [
{
"type": "boolean",
"key": "override_global_config",
"label": "Override global OCIO config"
},
{
"type": "path",
"key": "filepath",
"label": "Config path",
"multiplatform": false,
"multipath": true
}
]
}
]

View file

@ -0,0 +1,42 @@
[
{
"key": "file_rules",
"type": "dict",
"label": "File Rules (OCIO v1 only)",
"collapsible": true,
"children": [
{
"type": "boolean",
"key": "activate_host_rules",
"label": "Activate Host File Rules"
},
{
"key": "rules",
"label": "Rules",
"type": "dict-modifiable",
"highlight_content": true,
"collapsible": false,
"object_type": {
"type": "dict",
"children": [
{
"key": "pattern",
"label": "Regex pattern",
"type": "text"
},
{
"key": "colorspace",
"label": "Colorspace name",
"type": "text"
},
{
"key": "ext",
"label": "File extension",
"type": "text"
}
]
}
}
]
}
]

View file

@ -446,6 +446,7 @@ class SubsetsModel(BaseRepresentationModel, TreeModel):
last_versions_by_subset_id = get_last_versions(
project_name,
subset_ids,
active=True,
fields=["_id", "parent", "name", "type", "data", "schema"]
)

View file

@ -123,10 +123,14 @@ class VersionDelegate(QtWidgets.QStyledItemDelegate):
project_name = self.dbcon.active_project()
# Add all available versions to the editor
parent_id = item["version_document"]["parent"]
version_docs = list(sorted(
get_versions(project_name, subset_ids=[parent_id]),
key=lambda item: item["name"]
))
version_docs = [
version_doc
for version_doc in sorted(
get_versions(project_name, subset_ids=[parent_id]),
key=lambda item: item["name"]
)
if version_doc["data"].get("active", True)
]
hero_versions = list(
get_hero_versions(

View file

@ -26,7 +26,7 @@ log = logging.getLogger(__name__)
class TestPipelinePublishPlugins(TestPipeline):
""" Testing Pipeline pubish_plugins.py
""" Testing Pipeline publish_plugins.py
Example:
cd to OpenPype repo root dir
@ -37,7 +37,7 @@ class TestPipelinePublishPlugins(TestPipeline):
# files are the same as those used in `test_pipeline_colorspace`
TEST_FILES = [
(
"1d7t9_cVKeZRVF0ppCHiE5MJTTtTlJgBe",
"1Lf-mFxev7xiwZCWfImlRcw7Fj8XgNQMh",
"test_pipeline_colorspace.zip",
""
)
@ -140,7 +140,7 @@ class TestPipelinePublishPlugins(TestPipeline):
config_data, file_rules = plugin.get_colorspace_settings(context)
assert config_data["template"] == expected_config_template, (
"Returned config tempate is not "
"Returned config template is not "
f"matching {expected_config_template}"
)
assert file_rules == expected_file_rules, (
@ -193,11 +193,11 @@ class TestPipelinePublishPlugins(TestPipeline):
colorspace_data_hiero = representation_hiero.get("colorspaceData")
assert colorspace_data_nuke, (
"Colorspace data were not created in prepresentation"
"Colorspace data were not created in representation"
f"matching {representation_nuke}"
)
assert colorspace_data_hiero, (
"Colorspace data were not created in prepresentation"
"Colorspace data were not created in representation"
f"matching {representation_hiero}"
)

View file

@ -31,7 +31,7 @@ class TestPipelineColorspace(TestPipeline):
TEST_FILES = [
(
"1d7t9_cVKeZRVF0ppCHiE5MJTTtTlJgBe",
"1Lf-mFxev7xiwZCWfImlRcw7Fj8XgNQMh",
"test_pipeline_colorspace.zip",
""
)
@ -120,7 +120,7 @@ class TestPipelineColorspace(TestPipeline):
)
assert config_data["template"] == expected_template, (
f"Config template \'{config_data['template']}\' doesn't match "
f"expected tempalte \'{expected_template}\'"
f"expected template \'{expected_template}\'"
)
def test_parse_colorspace_from_filepath(