Merge branch 'develop' into enhancement/3dsmax-use-custom-modifier-attributes

This commit is contained in:
Kayla Man 2023-06-14 14:05:23 +08:00
commit 971f682dfc
68 changed files with 1208 additions and 572 deletions

View file

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

View file

@ -1,6 +1,399 @@
# Changelog
## [3.15.10](https://github.com/ynput/OpenPype/tree/3.15.10)
[Full Changelog](https://github.com/ynput/OpenPype/compare/3.15.9...3.15.10)
### **🆕 New features**
<details>
<summary>ImageIO: Adding ImageIO activation toggle to all hosts <a href="https://github.com/ynput/OpenPype/pull/4700">#4700</a></summary>
Colorspace management can now be enabled at the project level, although it is disabled by default. Once enabled, all hosts will use the OCIO config file defined in the settings. If settings are disabled, the system switches to DCC's native color space management, and we do not store colorspace information at the representative level.
___
</details>
<details>
<summary>Redshift Proxy Support in 3dsMax <a href="https://github.com/ynput/OpenPype/pull/4625">#4625</a></summary>
Redshift Proxy Support for 3dsMax.
- [x] Creator
- [x] Loader
- [x] Extractor
- [x] Validator
- [x] Add documentation
___
</details>
<details>
<summary>Houdini farm publishing and rendering <a href="https://github.com/ynput/OpenPype/pull/4825">#4825</a></summary>
Deadline Farm publishing and Rendering for Houdini
- [x] Mantra
- [x] Karma(including usd renders)
- [x] Arnold
- [x] Elaborate Redshift ROP for deadline submission
- [x] fix the existing bug in Redshift ROP
- [x] Vray
- [x] add docs
___
</details>
<details>
<summary>Feature: Blender hook to execute python scripts at launch <a href="https://github.com/ynput/OpenPype/pull/4905">#4905</a></summary>
Hook to allow hooks to add path to a python script that will be executed when Blender starts.
___
</details>
<details>
<summary>Feature: Resolve: Open last workfile on launch through .scriptlib <a href="https://github.com/ynput/OpenPype/pull/5047">#5047</a></summary>
Added implementation to Resolve integration to open last workfile on launch.
___
</details>
<details>
<summary>General: Remove default windowFlags from publisher <a href="https://github.com/ynput/OpenPype/pull/5089">#5089</a></summary>
The default windowFlags is making the publisher window (in Linux at least) only show the close button and it's frustrating as many times you just want to minimize the window and get back to the validation after. Removing that line I get what I'd expect.**Before:****After:**
___
</details>
<details>
<summary>General: Show user who created the workfile on the details pane of workfile manager <a href="https://github.com/ynput/OpenPype/pull/5093">#5093</a></summary>
New PR for https://github.com/ynput/OpenPype/pull/5087, which was closed after merging `next-minor` branch and then realizing we don't need to target it as it was decided it's not required to support windows. More info on that PR discussion.Small addition to add name of the `user` who created the workfile on the details pane of the workfile manager:
___
</details>
<details>
<summary>Loader: Hide inactive versions in UI <a href="https://github.com/ynput/OpenPype/pull/5100">#5100</a></summary>
Hide versions with `active` set to `False` in Loader UI.
___
</details>
### **🚀 Enhancements**
<details>
<summary>Maya: Repair RenderPass token when merging AOVs. <a href="https://github.com/ynput/OpenPype/pull/5055">#5055</a></summary>
Validator was flagging that `<RenderPass>` was in the image prefix, but did not repair the issue.
___
</details>
<details>
<summary>Maya: Improve error feedback when no renderable cameras exist for ASS family. <a href="https://github.com/ynput/OpenPype/pull/5092">#5092</a></summary>
When collecting cameras for `ass` family, this improves the error message when no cameras are renderable.
___
</details>
<details>
<summary>Nuke: Custom script to set frame range of read nodes <a href="https://github.com/ynput/OpenPype/pull/5039">#5039</a></summary>
Adding option to set frame range specifically for the read nodes in Openpype Panel. User can set up their preferred frame range with the frame range dialog, which can be showed after clicking `Set Frame Range (Read Node)` in Openpype Tools
___
</details>
<details>
<summary>Update extract review letterbox docs <a href="https://github.com/ynput/OpenPype/pull/5074">#5074</a></summary>
Update Extract Review - Letter Box section in Docs. Letterbox type description is removed.
___
</details>
<details>
<summary>Project pack: Documents only skips roots validation <a href="https://github.com/ynput/OpenPype/pull/5082">#5082</a></summary>
Single roots validation is skipped if only documents are extracted.
___
</details>
<details>
<summary>Nuke: custom settings for write node without publish <a href="https://github.com/ynput/OpenPype/pull/5084">#5084</a></summary>
Set Render Output and other settings to write nodes for non-publish purposes.
___
</details>
### **🐛 Bug fixes**
<details>
<summary>Maya: Deadline servers <a href="https://github.com/ynput/OpenPype/pull/5052">#5052</a></summary>
Fix working with multiple Deadline servers in Maya.
- Pools (primary and secondary) attributes were not recreated correctly.
- Order of collector plugins were wrong, so collected data was not injected into render instances.
- Server attribute was not converted to string so comparing with settings was incorrect.
- Improve debug logging for where the webservice url is getting fetched from.
___
</details>
<details>
<summary>Maya: Fix Load Reference. <a href="https://github.com/ynput/OpenPype/pull/5091">#5091</a></summary>
Fix bug introduced with https://github.com/ynput/OpenPype/pull/4751 where `cmds.ls` returns a list.
___
</details>
<details>
<summary>3dsmax: Publishing Deadline jobs from RedShift <a href="https://github.com/ynput/OpenPype/pull/4960">#4960</a></summary>
Fix the bug of being uable to publish deadline jobs from RedshiftUse Current File instead of Published Scene for just Redshift.
- add save scene before rendering to ensure the scene is saved after the modification.
- add separated aov files option to allow users to choose to have aovs in render output
- add validator for render publish to aovid overriding the previous renders
___
</details>
<details>
<summary>Houdini: Fix missing frame range for pointcache and camera exports <a href="https://github.com/ynput/OpenPype/pull/5026">#5026</a></summary>
Fix missing frame range for pointcache and camera exports on published version.
___
</details>
<details>
<summary>Global: collect_frame_fix plugin fix and cleanup <a href="https://github.com/ynput/OpenPype/pull/5064">#5064</a></summary>
Previous implementation https://github.com/ynput/OpenPype/pull/5036 was broken this is fixing the issue where attribute is found in instance data although the settings were disabled for the plugin.
___
</details>
<details>
<summary>Hiero: Fix apply settings Clip Load <a href="https://github.com/ynput/OpenPype/pull/5073">#5073</a></summary>
Changed `apply_settings` to classmethod which fixes the issue with settings.
___
</details>
<details>
<summary>Resolve: Make sure scripts dir exists <a href="https://github.com/ynput/OpenPype/pull/5078">#5078</a></summary>
Make sure the scripts directory exists before looping over it's content.
___
</details>
<details>
<summary>removing info knob from nuke creators <a href="https://github.com/ynput/OpenPype/pull/5083">#5083</a></summary>
- removing instance node if removed via publisher
- removing info knob since it is not needed any more (was there only for the transition phase)
___
</details>
<details>
<summary>Tray: Fix restart arguments on update <a href="https://github.com/ynput/OpenPype/pull/5085">#5085</a></summary>
Fix arguments on restart.
___
</details>
<details>
<summary>Maya: bug fix on repair action in Arnold Scene Source CBID Validator <a href="https://github.com/ynput/OpenPype/pull/5096">#5096</a></summary>
Fix the bug of not being able to use repair action in Arnold Scene Source CBID Validator
___
</details>
<details>
<summary>Nuke: batch of small fixes <a href="https://github.com/ynput/OpenPype/pull/5103">#5103</a></summary>
- default settings for `imageio.requiredNodes` **CreateWriteImage**
- default settings for **LoadImage** representations
- **Create** and **Publish** menu items with `parent=main_window` (version > 14)
___
</details>
<details>
<summary>Deadline: make prerender check safer <a href="https://github.com/ynput/OpenPype/pull/5104">#5104</a></summary>
Prerender wasn't correctly recognized and was replaced with just 'render' family.In Nuke it is correctly `prerender.farm` in families, which wasn't handled here. It resulted into using `render` in templates even if `render` and `prerender` templates were split.
___
</details>
<details>
<summary>General: Sort launcher actions alphabetically <a href="https://github.com/ynput/OpenPype/pull/5106">#5106</a></summary>
The launcher actions weren't being sorted by its label but its name (which on the case of the apps it's the version number) and thus the order wasn't consistent and we kept getting a different order on every launch. From my debugging session, this was the result of what the `actions` variable held after the `filter_compatible_actions` function before these changes:
```
(Pdb) for p in actions: print(p.order, p.name)
0 14-02
0 14-02
0 14-02
0 14-02
0 14-02
0 19-5-493
0 2023
0 3-41
0 6-01
```This caused already a couple bugs from our artists thinking they had launched Nuke X and instead launched Nuke and telling us their Nuke was missing nodes**Before:****After:**
___
</details>
<details>
<summary>TrayPublisher: Editorial video stream discovery <a href="https://github.com/ynput/OpenPype/pull/5120">#5120</a></summary>
Editorial create plugin in traypublisher does not expect that first stream in input is video.
___
</details>
### **🔀 Refactored code**
<details>
<summary>3dsmax: Move from deprecated interface <a href="https://github.com/ynput/OpenPype/pull/5117">#5117</a></summary>
`INewPublisher` interface is deprecated, this PR is changing the use to `IPublishHost` instead.
___
</details>
### **Merged pull requests**
<details>
<summary>add movalex as a contributor for code <a href="https://github.com/ynput/OpenPype/pull/5076">#5076</a></summary>
Adds @movalex as a contributor for code.
This was requested by mkolar [in this comment](https://github.com/ynput/OpenPype/pull/4916#issuecomment-1571498425)
[skip ci]
___
</details>
<details>
<summary>3dsmax: refactor load plugins <a href="https://github.com/ynput/OpenPype/pull/5079">#5079</a></summary>
___
</details>
## [3.15.9](https://github.com/ynput/OpenPype/tree/3.15.9)

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

@ -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

@ -274,16 +274,18 @@ class ValidateRenderSettings(pyblish.api.InstancePlugin):
# go through definitions and test if such node.attribute exists.
# if so, compare its value from the one required.
for attribute, data in cls.get_nodes(instance, renderer).items():
for data in cls.get_nodes(instance, renderer):
for node in data["nodes"]:
try:
render_value = cmds.getAttr(
"{}.{}".format(node, attribute)
"{}.{}".format(node, data["attribute"])
)
except RuntimeError:
invalid = True
cls.log.error(
"Cannot get value of {}.{}".format(node, attribute)
"Cannot get value of {}.{}".format(
node, data["attribute"]
)
)
else:
if render_value not in data["values"]:
@ -291,7 +293,10 @@ class ValidateRenderSettings(pyblish.api.InstancePlugin):
cls.log.error(
"Invalid value {} set on {}.{}. Expecting "
"{}".format(
render_value, node, attribute, data["values"]
render_value,
node,
data["attribute"],
data["values"]
)
)
@ -305,7 +310,7 @@ class ValidateRenderSettings(pyblish.api.InstancePlugin):
"{}_render_attributes".format(renderer)
) or []
)
result = {}
result = []
for attr, values in OrderedDict(validation_settings).items():
values = [convert_to_int_or_float(v) for v in values if v]
@ -335,7 +340,13 @@ class ValidateRenderSettings(pyblish.api.InstancePlugin):
)
continue
result[attribute_name] = {"nodes": nodes, "values": values}
result.append(
{
"attribute": attribute_name,
"nodes": nodes,
"values": values
}
)
return result
@ -350,11 +361,11 @@ class ValidateRenderSettings(pyblish.api.InstancePlugin):
"{aov_separator}", instance.data.get("aovSeparator", "_")
)
for attribute, data in cls.get_nodes(instance, renderer).items():
for data in cls.get_nodes(instance, renderer):
if not data["values"]:
continue
for node in data["nodes"]:
lib.set_attribute(attribute, data["values"][0], node)
lib.set_attribute(data["attribute"], data["values"][0], node)
with lib.renderlayer(layer_node):
default = lib.RENDER_ATTRS['default']

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

@ -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

@ -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

@ -828,6 +828,7 @@ class CreateWidget(QtWidgets.QWidget):
if success:
self._set_creator(self._selected_creator)
self.variant_input.setText(variant)
self._controller.emit_card_message("Creation finished...")
self._last_thumbnail_path = None
self._thumbnail_widget.set_current_thumbnails()

View file

@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
"""Package declaring Pype version."""
__version__ = "3.15.10-nightly.2"
__version__ = "3.15.11-nightly.2"

View file

@ -1,6 +1,6 @@
[tool.poetry]
name = "OpenPype"
version = "3.15.9" # OpenPype
version = "3.15.10" # OpenPype
description = "Open VFX and Animation pipeline with support."
authors = ["OpenPype Team <info@openpype.io>"]
license = "MIT License"

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(

View file

@ -196,6 +196,8 @@ if [ "$disable_submodule_update" == 1 ]; then
echo -e "${BIGreen}>>>${RST} Fixing libs ..."
mv "$openpype_root/build/OpenPype $openpype_version.app/Contents/MacOS/dependencies/cx_Freeze" "$openpype_root/build/OpenPype $openpype_version.app/Contents/MacOS/lib/" || { echo -e "${BIRed}!!!>${RST} ${BIYellow}Can't move cx_Freeze libs${RST}"; return 1; }
# force hide icon from Dock
defaults write "$openpype_root/build/OpenPype $openpype_version.app/Contents/Info" LSUIElement 1
# fix code signing issue
echo -e "${BIGreen}>>>${RST} Fixing code signatures ...\c"