This repository has been archived by the owner on Sep 20, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 129
Maya: Render Creator has configurable options. #3097
Merged
antirotor
merged 106 commits into
develop
from
enhancement/OP-2040_Maya_Render_creator-should-have-configurable-options
Aug 1, 2022
Merged
Changes from 104 commits
Commits
Show all changes
106 commits
Select commit
Hold shift + click to select a range
ed76a59
Remove unused code
BigRoy f3ac88f
Move deadline url logic closer together
BigRoy 542f634
Re-use "read" logic from avalon.maya
BigRoy f18b12e
Bugfix: use 'renderer' variable that was defined to correctly capture…
BigRoy 20c4f86
Preserve logic to get renderer from in the renderlayer
BigRoy a2c05a9
Simplify subset detection code
BigRoy 47622d5
Don't collect aov_separator from settings twice
BigRoy 9f5eb07
Don't provide render instance to override render products aov separat…
BigRoy 44003cc
Move logic closer together
BigRoy ae35f0e
Refactor the "set_default_render_settings" logic out of CreateRender
BigRoy 5429181
Move more logic to the RenderSettings class
BigRoy 17be6f0
Use log instead of print
BigRoy 8b0f60e
Collect the AOV separator for Render Products in Layer Data
BigRoy 0516bb0
Fix Redshift appending .<aov> even when <aov> or <renderpass> was exp…
BigRoy f8e8ce5
Add docstring
BigRoy 862167f
Fix types
BigRoy ee3a363
Move RenderSettings into its on api
BigRoy fc0891c
Cleanup render_settings.py imports + newline end of file
BigRoy 1177ee2
Refactor Maya Create Render Schema
8c4d44f
add renderer settings
b64b0a6
add function to grab Arnold settings
5d56323
add redshift settings function
b62fa74
replace redshift settings setters with method
2a76f12
Merge remote-tracking branch 'origin/pr/2643' into Enhancement/OP-204…
7ea7a0f
remove extra code in render creator
854ec3b
add missing get_asset()
3f48859
remove unused function
0bc8ad9
change placement of redshift settings function
71434de
remove unused refactored function
50e60ac
removed unused refactored vray settings func
6f58d72
add/cleanup refactored redshift settings function
105fb3e
remove refactored default renderer settings func
2cd4229
remove unused import
54ff5a8
remove extra import
2867a2f
fix redshift comment
675c7a0
replace avalon CreatorError with OP's impl.
74cc823
remove unused import
4d4ca19
remove redundant code
9faa7e0
Rename file to match convention.
24a1dea
Append render settings schema.
c853e84
Add comment about pools
b5004ae
Add comment about pool_names source
05ed9c5
Redshift function cleanup.
5969124
Arnold function cleanup.
47e70d3
add comment about vray file format setting
b902b2a
Remove unnecessary checkbox
61b59ef
add checkbox to render settings to apply render settings on creation
998eb0e
remove redundant schema settings
365a6b3
add menu item to OpenPype menu
a33a905
modify project settings schema defaults for maya
18693cf
fix function argument, add renderer
d3d2757
Fix Arnold function missing arguments.
09a941a
Fix Redshift function missing arguments.
6299b01
Fix accidental typo.
1e251ac
Remove trailing space.
7a63e52
Append Arnold render settings from project settings.
14a3483
Add Maya window function call to initalize render objects.
79d7700
fix asset var name, add relevant comments
fb424f6
replace render settings workaround with function call
190c499
Merge branch 'develop' into enhancement/OP-2040_Maya_Render_creator-s…
6645be2
minor style/import fixes
2cdea36
Remove avalon import.
e0b0e30
replace avalon dependency with legacy_io
302e493
Change import position.
103cd8c
Move settings getter function
2bb96a9
Append aov handling
f6d4423
Get renderer from within settings function
ad6f562
Remove unused parameter
e4324a1
Move get_asset()
bf1daa4
style fix
bb67065
few style changes
antirotor ae0708b
Force resetting render settings
6809d37
Propagate further attributes.
e65798b
Merge remote-tracking branch 'origin/develop' into enhancement/OP-204…
b1d4969
Add variable for additional attributes
e9426df
Fix dictionary bug.
4260f8a
Attr as list to workaround ftrack limitation
12a1e9e
Handle additional attributes for MtoA
dc95b5a
Import missing library
888d700
Merge remote-tracking branch 'origin/develop' into enhancement/OP-204…
201aa69
Fix missing deadline import/logic
a06bfc1
Style fix
3780b37
Remove avalon-core.
2a78532
Update openpype/hosts/maya/plugins/publish/validate_render_single_cam…
7e10150
Remove unnecessary var statement.
9c4791b
Update openpype/settings/defaults/project_settings/maya.json
f395e65
Update openpype/settings/defaults/project_settings/maya.json
ecdade9
Update openpype/settings/defaults/project_settings/maya.json
af5a27d
Merge branch 'develop' into enhancement/OP-2040_Maya_Render_creator-s…
2657ff2
Replace deprecated functions
c7bf29d
Style fixes
a39eef0
Fix frame range reset.
6e77634
Fix attribute type check bug.
1cf6045
Merge remote-tracking branch 'origin/develop' into enhancement/OP-204…
a26fd83
Propagate render settings key to grey out apply button.
58309c3
Remove Mental Ray related code.
54bb85b
Remove unnecessary comment.
8d7b9af
Grab image prefixes from settings.
c53b7bb
Remove unnecessary unused function.
d63d0cf
Remove incorrect code.
a11ef9f
Append frame reset feature, handle prefix key properly
9967cd0
Append settings propagation to render instance creator.
1f12697
Style fixes.
487830f
Style fix
498ee1d
Fix schema to store as lists
84a6c14
Handle additional attributes
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,216 @@ | ||
# -*- coding: utf-8 -*- | ||
"""Class for handling Render Settings.""" | ||
from maya import cmds # noqa | ||
import maya.mel as mel | ||
import six | ||
import sys | ||
|
||
from openpype.api import ( | ||
get_project_settings, | ||
get_current_project_settings | ||
) | ||
|
||
from openpype.pipeline import legacy_io | ||
from openpype.pipeline import CreatorError | ||
from openpype.pipeline.context_tools import get_current_project_asset | ||
from openpype.hosts.maya.api.commands import reset_frame_range | ||
|
||
|
||
class RenderSettings(object): | ||
|
||
_image_prefix_nodes = { | ||
'vray': 'vraySettings.fileNamePrefix', | ||
'arnold': 'defaultRenderGlobals.imageFilePrefix', | ||
'renderman': 'defaultRenderGlobals.imageFilePrefix', | ||
'redshift': 'defaultRenderGlobals.imageFilePrefix' | ||
} | ||
|
||
_image_prefixes = { | ||
'vray': get_current_project_settings()["maya"]["RenderSettings"]["vray_renderer"]["image_prefix"], # noqa | ||
'arnold': get_current_project_settings()["maya"]["RenderSettings"]["arnold_renderer"]["image_prefix"], # noqa | ||
'renderman': 'maya/<Scene>/<layer>/<layer>{aov_separator}<aov>', | ||
'redshift': get_current_project_settings()["maya"]["RenderSettings"]["redshift_renderer"]["image_prefix"] # noqa | ||
} | ||
|
||
_aov_chars = { | ||
"dot": ".", | ||
"dash": "-", | ||
"underscore": "_" | ||
} | ||
|
||
@classmethod | ||
def get_image_prefix_attr(cls, renderer): | ||
return cls._image_prefix_nodes[renderer] | ||
|
||
def __init__(self, project_settings=None): | ||
self._project_settings = project_settings | ||
if not self._project_settings: | ||
self._project_settings = get_project_settings( | ||
legacy_io.Session["AVALON_PROJECT"] | ||
) | ||
|
||
def set_default_renderer_settings(self, renderer=None): | ||
"""Set basic settings based on renderer.""" | ||
if not renderer: | ||
renderer = cmds.getAttr( | ||
'defaultRenderGlobals.currentRenderer').lower() | ||
|
||
asset_doc = get_current_project_asset() | ||
# project_settings/maya/create/CreateRender/aov_separator | ||
try: | ||
aov_separator = self._aov_chars[( | ||
self._project_settings["maya"] | ||
["create"] | ||
["CreateRender"] | ||
["aov_separator"] | ||
)] | ||
except KeyError: | ||
aov_separator = "_" | ||
reset_frame = self._project_settings["maya"]["RenderSettings"]["reset_current_frame"] # noqa | ||
|
||
if reset_frame: | ||
start_frame = cmds.getAttr("defaultRenderGlobals.startFrame") | ||
cmds.currentTime(start_frame, edit=True) | ||
|
||
if renderer in self._image_prefix_nodes: | ||
prefix = self._image_prefixes[renderer] | ||
prefix = prefix.replace("{aov_separator}", aov_separator) | ||
cmds.setAttr(self._image_prefix_nodes[renderer], | ||
prefix, type="string") # noqa | ||
else: | ||
print("{0} isn't a supported renderer to autoset settings.".format(renderer)) # noqa | ||
|
||
# TODO: handle not having res values in the doc | ||
width = asset_doc["data"].get("resolutionWidth") | ||
height = asset_doc["data"].get("resolutionHeight") | ||
|
||
if renderer == "arnold": | ||
# set renderer settings for Arnold from project settings | ||
self._set_arnold_settings(width, height) | ||
|
||
if renderer == "vray": | ||
self._set_vray_settings(aov_separator, width, height) | ||
|
||
if renderer == "redshift": | ||
self._set_redshift_settings(width, height) | ||
|
||
def _set_arnold_settings(self, width, height): | ||
"""Sets settings for Arnold.""" | ||
from mtoa.core import createOptions # noqa | ||
from mtoa.aovs import AOVInterface # noqa | ||
createOptions() | ||
arnold_render_presets = self._project_settings["maya"]["RenderSettings"]["arnold_renderer"] # noqa | ||
# Force resetting settings and AOV list to avoid having to deal with | ||
# AOV checking logic, for now. | ||
# This is a work around because the standard | ||
# function to revert render settings does not reset AOVs list in MtoA | ||
# Fetch current aovs in case there's any. | ||
current_aovs = AOVInterface().getAOVs() | ||
# Remove fetched AOVs | ||
AOVInterface().removeAOVs(current_aovs) | ||
mel.eval("unifiedRenderGlobalsRevertToDefault") | ||
img_ext = arnold_render_presets["image_format"] | ||
img_prefix = arnold_render_presets["image_prefix"] | ||
aovs = arnold_render_presets["aov_list"] | ||
img_tiled = arnold_render_presets["tiled"] | ||
multi_exr = arnold_render_presets["multilayer_exr"] | ||
additional_options = arnold_render_presets["additional_options"] | ||
for aov in aovs: | ||
AOVInterface('defaultArnoldRenderOptions').addAOV(aov) | ||
|
||
cmds.setAttr("defaultResolution.width", width) | ||
cmds.setAttr("defaultResolution.height", height) | ||
|
||
self._set_global_output_settings() | ||
|
||
cmds.setAttr( | ||
"defaultRenderGlobals.imageFilePrefix", img_prefix, type="string") | ||
|
||
cmds.setAttr( | ||
"defaultArnoldDriver.ai_translator", img_ext, type="string") | ||
|
||
cmds.setAttr( | ||
"defaultArnoldDriver.exrTiled", img_tiled) | ||
|
||
cmds.setAttr( | ||
"defaultArnoldDriver.mergeAOVs", multi_exr) | ||
# Passes additional options in from the schema as a list | ||
# but converts it to a dictionary because ftrack doesn't | ||
# allow fullstops in custom attributes. Then checks for | ||
# type of MtoA attribute passed to adjust the `setAttr` | ||
# command accordingly. | ||
for item in additional_options: | ||
attribute, value = item | ||
if (cmds.getAttr(str(attribute), type=True)) == "long": | ||
cmds.setAttr(str(attribute), int(value)) | ||
elif (cmds.getAttr(str(attribute), type=True)) == "bool": | ||
cmds.setAttr(str(attribute), int(value), type = "Boolean") # noqa | ||
elif (cmds.getAttr(str(attribute), type=True)) == "string": | ||
cmds.setAttr(str(attribute), str(value), type = "string") # noqa | ||
reset_frame_range() | ||
|
||
def _set_redshift_settings(self, width, height): | ||
"""Sets settings for Redshift.""" | ||
redshift_render_presets = ( | ||
self._project_settings | ||
["maya"] | ||
["RenderSettings"] | ||
["redshift_renderer"] | ||
) | ||
img_ext = redshift_render_presets.get("image_format") | ||
self._set_global_output_settings() | ||
cmds.setAttr("redshiftOptions.imageFormat", img_ext) | ||
cmds.setAttr("defaultResolution.width", width) | ||
cmds.setAttr("defaultResolution.height", height) | ||
|
||
def _set_vray_settings(self, aov_separator, width, height): | ||
# type: (str, int, int) -> None | ||
"""Sets important settings for Vray.""" | ||
settings = cmds.ls(type="VRaySettingsNode") | ||
node = settings[0] if settings else cmds.createNode("VRaySettingsNode") | ||
|
||
# Set aov separator | ||
# First we need to explicitly set the UI items in Render Settings | ||
# because that is also what V-Ray updates to when that Render Settings | ||
# UI did initialize before and refreshes again. | ||
MENU = "vrayRenderElementSeparator" | ||
if cmds.optionMenuGrp(MENU, query=True, exists=True): | ||
items = cmds.optionMenuGrp(MENU, query=True, ill=True) | ||
separators = [cmds.menuItem(i, query=True, label=True) for i in items] # noqa: E501 | ||
try: | ||
sep_idx = separators.index(aov_separator) | ||
except ValueError as e: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. local variable 'e' is assigned to but never used |
||
six.reraise( | ||
CreatorError, | ||
CreatorError( | ||
"AOV character {} not in {}".format( | ||
aov_separator, separators)), | ||
sys.exc_info()[2]) | ||
|
||
cmds.optionMenuGrp(MENU, edit=True, select=sep_idx + 1) | ||
|
||
# Set the render element attribute as string. This is also what V-Ray | ||
# sets whenever the `vrayRenderElementSeparator` menu items switch | ||
cmds.setAttr( | ||
"{}.fileNameRenderElementSeparator".format(node), | ||
aov_separator, | ||
type="string" | ||
) | ||
|
||
# Set render file format to exr | ||
cmds.setAttr("{}.imageFormatStr".format(node), "exr", type="string") | ||
|
||
# animType | ||
cmds.setAttr("{}.animType".format(node), 1) | ||
|
||
# resolution | ||
cmds.setAttr("{}.width".format(node), width) | ||
cmds.setAttr("{}.height".format(node), height) | ||
|
||
@staticmethod | ||
def _set_global_output_settings(): | ||
# enable animation | ||
cmds.setAttr("defaultRenderGlobals.outFormatControl", 0) | ||
cmds.setAttr("defaultRenderGlobals.animation", 1) | ||
cmds.setAttr("defaultRenderGlobals.putFrameBeforeExt", 1) | ||
cmds.setAttr("defaultRenderGlobals.extensionPadding", 4) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,7 +10,7 @@ | |
from openpype.settings import get_project_settings | ||
from openpype.pipeline import legacy_io | ||
from openpype.tools.utils import host_tools | ||
from openpype.hosts.maya.api import lib | ||
from openpype.hosts.maya.api import lib, lib_rendersettings | ||
from .lib import get_main_window, IS_HEADLESS | ||
from .commands import reset_frame_range | ||
|
||
|
@@ -44,6 +44,7 @@ def deferred(): | |
parent="MayaWindow" | ||
) | ||
|
||
renderer = cmds.getAttr('defaultRenderGlobals.currentRenderer').lower() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. local variable 'renderer' is assigned to but never used |
||
# Create context menu | ||
context_label = "{}, {}".format( | ||
legacy_io.Session["AVALON_ASSET"], | ||
|
@@ -98,6 +99,13 @@ def deferred(): | |
|
||
cmds.menuItem(divider=True) | ||
|
||
cmds.menuItem( | ||
"Set Render Settings", | ||
command=lambda *args: lib_rendersettings.RenderSettings().set_default_renderer_settings() # noqa | ||
) | ||
|
||
cmds.menuItem(divider=True) | ||
|
||
cmds.menuItem( | ||
"Work Files...", | ||
command=lambda *args: host_tools.show_workfiles( | ||
|
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we move the
mtoa
import here? Technically you can install Maya without Arnold so I'd rather not have it required by forcing the import on top level.Also, since this file also has other renderers implemented I'd avoid importing
createOptions
into this module but instead just doimport mtoa.core
andmtoa.core.createOptions()
to remain explicit.Additionally, be aware that the call to
createOptions
required the mtoa plug-in to currently be loaded in the Plug-in Manager.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you Roy those are good points I'll do that!