mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-01 16:34:53 +01:00
Merge branch 'develop' into enhancement/OP-7940_render_workfile_attributes
# Conflicts: # server_addon/deadline/server/version.py
This commit is contained in:
commit
86a0678f3c
4 changed files with 59 additions and 33 deletions
|
|
@ -2778,9 +2778,37 @@ def bake_to_world_space(nodes,
|
||||||
list: The newly created and baked node names.
|
list: The newly created and baked node names.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
@contextlib.contextmanager
|
||||||
|
def _unlock_attr(attr):
|
||||||
|
"""Unlock attribute during context if it is locked"""
|
||||||
|
if not cmds.getAttr(attr, lock=True):
|
||||||
|
# If not locked, do nothing
|
||||||
|
yield
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
cmds.setAttr(attr, lock=False)
|
||||||
|
yield
|
||||||
|
finally:
|
||||||
|
cmds.setAttr(attr, lock=True)
|
||||||
|
|
||||||
def _get_attrs(node):
|
def _get_attrs(node):
|
||||||
"""Workaround for buggy shape attribute listing with listAttr"""
|
"""Workaround for buggy shape attribute listing with listAttr
|
||||||
|
|
||||||
|
This will only return keyable settable attributes that have an
|
||||||
|
incoming connections (those that have a reason to be baked).
|
||||||
|
|
||||||
|
Technically this *may* fail to return attributes driven by complex
|
||||||
|
expressions for which maya makes no connections, e.g. doing actual
|
||||||
|
`setAttr` calls in expressions.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
node (str): The node to list attributes for.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
list: Keyable attributes with incoming connections.
|
||||||
|
The attribute may be locked.
|
||||||
|
|
||||||
|
"""
|
||||||
attrs = cmds.listAttr(node,
|
attrs = cmds.listAttr(node,
|
||||||
write=True,
|
write=True,
|
||||||
scalar=True,
|
scalar=True,
|
||||||
|
|
@ -2805,14 +2833,14 @@ def bake_to_world_space(nodes,
|
||||||
|
|
||||||
return valid_attrs
|
return valid_attrs
|
||||||
|
|
||||||
transform_attrs = set(["t", "r", "s",
|
transform_attrs = {"t", "r", "s",
|
||||||
"tx", "ty", "tz",
|
"tx", "ty", "tz",
|
||||||
"rx", "ry", "rz",
|
"rx", "ry", "rz",
|
||||||
"sx", "sy", "sz"])
|
"sx", "sy", "sz"}
|
||||||
|
|
||||||
world_space_nodes = []
|
world_space_nodes = []
|
||||||
with delete_after() as delete_bin:
|
with ExitStack() as stack:
|
||||||
|
delete_bin = stack.enter_context(delete_after())
|
||||||
# Create the duplicate nodes that are in world-space connected to
|
# Create the duplicate nodes that are in world-space connected to
|
||||||
# the originals
|
# the originals
|
||||||
for node in nodes:
|
for node in nodes:
|
||||||
|
|
@ -2824,23 +2852,26 @@ def bake_to_world_space(nodes,
|
||||||
name=new_name,
|
name=new_name,
|
||||||
renameChildren=True)[0] # noqa
|
renameChildren=True)[0] # noqa
|
||||||
|
|
||||||
# Connect all attributes on the node except for transform
|
# Parent new node to world
|
||||||
# attributes
|
if cmds.listRelatives(new_node, parent=True):
|
||||||
attrs = _get_attrs(node)
|
new_node = cmds.parent(new_node, world=True)[0]
|
||||||
attrs = set(attrs) - transform_attrs if attrs else []
|
|
||||||
|
|
||||||
|
# Temporarily unlock and passthrough connect all attributes
|
||||||
|
# so we can bake them over time
|
||||||
|
# Skip transform attributes because we will constrain them later
|
||||||
|
attrs = set(_get_attrs(node)) - transform_attrs
|
||||||
for attr in attrs:
|
for attr in attrs:
|
||||||
orig_node_attr = '{0}.{1}'.format(node, attr)
|
orig_node_attr = "{}.{}".format(node, attr)
|
||||||
new_node_attr = '{0}.{1}'.format(new_node, attr)
|
new_node_attr = "{}.{}".format(new_node, attr)
|
||||||
|
|
||||||
# unlock to avoid connection errors
|
|
||||||
cmds.setAttr(new_node_attr, lock=False)
|
|
||||||
|
|
||||||
|
# unlock during context to avoid connection errors
|
||||||
|
stack.enter_context(_unlock_attr(new_node_attr))
|
||||||
cmds.connectAttr(orig_node_attr,
|
cmds.connectAttr(orig_node_attr,
|
||||||
new_node_attr,
|
new_node_attr,
|
||||||
force=True)
|
force=True)
|
||||||
|
|
||||||
# If shapes are also baked then connect those keyable attributes
|
# If shapes are also baked then also temporarily unlock and
|
||||||
|
# passthrough connect all shape attributes for baking
|
||||||
if shape:
|
if shape:
|
||||||
children_shapes = cmds.listRelatives(new_node,
|
children_shapes = cmds.listRelatives(new_node,
|
||||||
children=True,
|
children=True,
|
||||||
|
|
@ -2855,25 +2886,19 @@ def bake_to_world_space(nodes,
|
||||||
children_shapes):
|
children_shapes):
|
||||||
attrs = _get_attrs(orig_shape)
|
attrs = _get_attrs(orig_shape)
|
||||||
for attr in attrs:
|
for attr in attrs:
|
||||||
orig_node_attr = '{0}.{1}'.format(orig_shape, attr)
|
orig_node_attr = "{}.{}".format(orig_shape, attr)
|
||||||
new_node_attr = '{0}.{1}'.format(new_shape, attr)
|
new_node_attr = "{}.{}".format(new_shape, attr)
|
||||||
|
|
||||||
# unlock to avoid connection errors
|
|
||||||
cmds.setAttr(new_node_attr, lock=False)
|
|
||||||
|
|
||||||
|
# unlock during context to avoid connection errors
|
||||||
|
stack.enter_context(_unlock_attr(new_node_attr))
|
||||||
cmds.connectAttr(orig_node_attr,
|
cmds.connectAttr(orig_node_attr,
|
||||||
new_node_attr,
|
new_node_attr,
|
||||||
force=True)
|
force=True)
|
||||||
|
|
||||||
# Parent to world
|
# Constraint transforms
|
||||||
if cmds.listRelatives(new_node, parent=True):
|
|
||||||
new_node = cmds.parent(new_node, world=True)[0]
|
|
||||||
|
|
||||||
# Unlock transform attributes so constraint can be created
|
|
||||||
for attr in transform_attrs:
|
for attr in transform_attrs:
|
||||||
cmds.setAttr('{0}.{1}'.format(new_node, attr), lock=False)
|
transform_attr = "{}.{}".format(new_node, attr)
|
||||||
|
stack.enter_context(_unlock_attr(transform_attr))
|
||||||
# Constraints
|
|
||||||
delete_bin.extend(cmds.parentConstraint(node, new_node, mo=False))
|
delete_bin.extend(cmds.parentConstraint(node, new_node, mo=False))
|
||||||
delete_bin.extend(cmds.scaleConstraint(node, new_node, mo=False))
|
delete_bin.extend(cmds.scaleConstraint(node, new_node, mo=False))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -542,7 +542,8 @@ def _load_modules():
|
||||||
module_dirs.insert(0, current_dir)
|
module_dirs.insert(0, current_dir)
|
||||||
|
|
||||||
addons_dir = os.path.join(os.path.dirname(current_dir), "addons")
|
addons_dir = os.path.join(os.path.dirname(current_dir), "addons")
|
||||||
module_dirs.append(addons_dir)
|
if os.path.exists(addons_dir):
|
||||||
|
module_dirs.append(addons_dir)
|
||||||
|
|
||||||
ignored_host_names = set(IGNORED_HOSTS_IN_AYON)
|
ignored_host_names = set(IGNORED_HOSTS_IN_AYON)
|
||||||
ignored_current_dir_filenames = set(IGNORED_DEFAULT_FILENAMES)
|
ignored_current_dir_filenames = set(IGNORED_DEFAULT_FILENAMES)
|
||||||
|
|
|
||||||
|
|
@ -87,7 +87,7 @@ class MayaSubmitDeadlineModel(BaseSettingsModel):
|
||||||
title="Disable Strict Error Check profiles"
|
title="Disable Strict Error Check profiles"
|
||||||
)
|
)
|
||||||
|
|
||||||
@validator("limit", "scene_patches")
|
@validator("scene_patches")
|
||||||
def validate_unique_names(cls, value):
|
def validate_unique_names(cls, value):
|
||||||
ensure_unique_names(value)
|
ensure_unique_names(value)
|
||||||
return value
|
return value
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
__version__ = "0.2.6"
|
__version__ = "0.2.7"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue