Skip to content
This repository has been archived by the owner on Sep 20, 2024. It is now read-only.

Commit

Permalink
Merge pull request #5836 from BigRoy/chore/maya_remove_renderlayer_ob…
Browse files Browse the repository at this point in the history
…servers
  • Loading branch information
mkolar authored Nov 24, 2023
2 parents 9c4d502 + 90c8922 commit f6723fa
Show file tree
Hide file tree
Showing 2 changed files with 0 additions and 200 deletions.
190 changes: 0 additions & 190 deletions openpype/hosts/maya/api/lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,6 @@
INT_FPS = {15, 24, 25, 30, 48, 50, 60, 44100, 48000}
FLOAT_FPS = {23.98, 23.976, 29.97, 47.952, 59.94}

RENDERLIKE_INSTANCE_FAMILIES = ["rendering", "vrayscene"]


DISPLAY_LIGHTS_ENUM = [
{"label": "Use Project Settings", "value": "project_settings"},
Expand Down Expand Up @@ -3021,194 +3019,6 @@ def _cleanOldShelf(self):
cmds.shelfLayout(self.name, p="ShelfLayout")


def _get_render_instances():
"""Return all 'render-like' instances.
This returns list of instance sets that needs to receive information
about render layer changes.
Returns:
list: list of instances
"""
objectset = cmds.ls("*.id", long=True, exactType="objectSet",
recursive=True, objectsOnly=True)

instances = []
for objset in objectset:
if not cmds.attributeQuery("id", node=objset, exists=True):
continue

id_attr = "{}.id".format(objset)
if cmds.getAttr(id_attr) != "pyblish.avalon.instance":
continue

has_family = cmds.attributeQuery("family",
node=objset,
exists=True)
if not has_family:
continue

if cmds.getAttr(
"{}.family".format(objset)) in RENDERLIKE_INSTANCE_FAMILIES:
instances.append(objset)

return instances


renderItemObserverList = []


class RenderSetupListObserver:
"""Observer to catch changes in render setup layers."""

def listItemAdded(self, item):
print("--- adding ...")
self._add_render_layer(item)

def listItemRemoved(self, item):
print("--- removing ...")
self._remove_render_layer(item.name())

def _add_render_layer(self, item):
render_sets = _get_render_instances()
layer_name = item.name()

for render_set in render_sets:
members = cmds.sets(render_set, query=True) or []

namespace_name = "_{}".format(render_set)
if not cmds.namespace(exists=namespace_name):
index = 1
namespace_name = "_{}".format(render_set)
try:
cmds.namespace(rm=namespace_name)
except RuntimeError:
# namespace is not empty, so we leave it untouched
pass
orignal_namespace_name = namespace_name
while(cmds.namespace(exists=namespace_name)):
namespace_name = "{}{}".format(
orignal_namespace_name, index)
index += 1

namespace = cmds.namespace(add=namespace_name)

if members:
# if set already have namespaced members, use the same
# namespace as others.
namespace = members[0].rpartition(":")[0]
else:
namespace = namespace_name

render_layer_set_name = "{}:{}".format(namespace, layer_name)
if render_layer_set_name in members:
continue
print(" - creating set for {}".format(layer_name))
maya_set = cmds.sets(n=render_layer_set_name, empty=True)
cmds.sets(maya_set, forceElement=render_set)
rio = RenderSetupItemObserver(item)
print("- adding observer for {}".format(item.name()))
item.addItemObserver(rio.itemChanged)
renderItemObserverList.append(rio)

def _remove_render_layer(self, layer_name):
render_sets = _get_render_instances()

for render_set in render_sets:
members = cmds.sets(render_set, query=True)
if not members:
continue

# all sets under set should have the same namespace
namespace = members[0].rpartition(":")[0]
render_layer_set_name = "{}:{}".format(namespace, layer_name)

if render_layer_set_name in members:
print(" - removing set for {}".format(layer_name))
cmds.delete(render_layer_set_name)


class RenderSetupItemObserver:
"""Handle changes in render setup items."""

def __init__(self, item):
self.item = item
self.original_name = item.name()

def itemChanged(self, *args, **kwargs):
"""Item changed callback."""
if self.item.name() == self.original_name:
return

render_sets = _get_render_instances()

for render_set in render_sets:
members = cmds.sets(render_set, query=True)
if not members:
continue

# all sets under set should have the same namespace
namespace = members[0].rpartition(":")[0]
render_layer_set_name = "{}:{}".format(
namespace, self.original_name)

if render_layer_set_name in members:
print(" <> renaming {} to {}".format(self.original_name,
self.item.name()))
cmds.rename(render_layer_set_name,
"{}:{}".format(
namespace, self.item.name()))
self.original_name = self.item.name()


renderListObserver = RenderSetupListObserver()


def add_render_layer_change_observer():
import maya.app.renderSetup.model.renderSetup as renderSetup

rs = renderSetup.instance()
render_sets = _get_render_instances()

layers = rs.getRenderLayers()
for render_set in render_sets:
members = cmds.sets(render_set, query=True)
if not members:
continue
# all sets under set should have the same namespace
namespace = members[0].rpartition(":")[0]
for layer in layers:
render_layer_set_name = "{}:{}".format(namespace, layer.name())
if render_layer_set_name not in members:
continue
rio = RenderSetupItemObserver(layer)
print("- adding observer for {}".format(layer.name()))
layer.addItemObserver(rio.itemChanged)
renderItemObserverList.append(rio)


def add_render_layer_observer():
import maya.app.renderSetup.model.renderSetup as renderSetup

print("> adding renderSetup observer ...")
rs = renderSetup.instance()
rs.addListObserver(renderListObserver)
pass


def remove_render_layer_observer():
import maya.app.renderSetup.model.renderSetup as renderSetup

print("< removing renderSetup observer ...")
rs = renderSetup.instance()
try:
rs.removeListObserver(renderListObserver)
except ValueError:
# no observer set yet
pass


def update_content_on_context_change():
"""
This will update scene content to match new asset on context change
Expand Down
10 changes: 0 additions & 10 deletions openpype/hosts/maya/api/pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -580,20 +580,11 @@ def on_save():
lib.set_id(node, new_id, overwrite=False)


def _update_render_layer_observers():
# Helper to trigger update for all renderlayer observer logic
lib.remove_render_layer_observer()
lib.add_render_layer_observer()
lib.add_render_layer_change_observer()


def on_open():
"""On scene open let's assume the containers have changed."""

from openpype.widgets import popup

utils.executeDeferred(_update_render_layer_observers)

# Validate FPS after update_task_from_path to
# ensure it is using correct FPS for the asset
lib.validate_fps()
Expand Down Expand Up @@ -630,7 +621,6 @@ def on_new():
with lib.suspended_refresh():
lib.set_context_settings()

utils.executeDeferred(_update_render_layer_observers)
_remove_workfile_lock()


Expand Down

0 comments on commit f6723fa

Please sign in to comment.