From 8e10029d2af496858987808630edf8d6c749c530 Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Mon, 31 May 2021 17:33:44 +0100 Subject: [PATCH 01/38] Improved model assets handling --- openpype/hosts/blender/api/plugin.py | 30 +-- .../blender/plugins/create/create_model.py | 32 ++- .../hosts/blender/plugins/load/load_model.py | 226 ++++++++---------- .../plugins/publish/collect_instances.py | 26 +- .../blender/plugins/publish/extract_blend.py | 19 +- 5 files changed, 164 insertions(+), 169 deletions(-) diff --git a/openpype/hosts/blender/api/plugin.py b/openpype/hosts/blender/api/plugin.py index de30da3319..4d82fb3f76 100644 --- a/openpype/hosts/blender/api/plugin.py +++ b/openpype/hosts/blender/api/plugin.py @@ -5,8 +5,8 @@ from typing import Dict, List, Optional import bpy -from avalon import api -import avalon.blender +from avalon import api, blender +from avalon.blender.pipeline import AVALON_CONTAINERS from openpype.api import PypeCreatorMixin VALID_EXTENSIONS = [".blend", ".json", ".abc"] @@ -27,25 +27,17 @@ def get_unique_number( asset: str, subset: str ) -> str: """Return a unique number based on the asset name.""" - avalon_containers = [ - c for c in bpy.data.collections - if c.name == 'AVALON_CONTAINERS' - ] - containers = [] - # First, add the children of avalon containers - for c in avalon_containers: - containers.extend(c.children) - # then keep looping to include all the children - for c in containers: - containers.extend(c.children) - container_names = [ - c.name for c in containers - ] + avalon_container = bpy.data.collections.get(AVALON_CONTAINERS) + if not avalon_container: + return "01" + asset_groups = avalon_container.objects + + container_names = [c.name for c in asset_groups] count = 1 - name = f"{asset}_{count:0>2}_{subset}_CON" + name = f"{asset}_{count:0>2}_{subset}" while name in container_names: count += 1 - name = f"{asset}_{count:0>2}_{subset}_CON" + name = f"{asset}_{count:0>2}_{subset}" return f"{count:0>2}" @@ -102,7 +94,7 @@ def get_local_collection_with_name(name): return None -class Creator(PypeCreatorMixin, avalon.blender.Creator): +class Creator(PypeCreatorMixin, blender.Creator): pass diff --git a/openpype/hosts/blender/plugins/create/create_model.py b/openpype/hosts/blender/plugins/create/create_model.py index 921d86513b..223896944b 100644 --- a/openpype/hosts/blender/plugins/create/create_model.py +++ b/openpype/hosts/blender/plugins/create/create_model.py @@ -4,10 +4,11 @@ import bpy from avalon import api from avalon.blender import lib -import openpype.hosts.blender.api.plugin +from avalon.blender.pipeline import AVALON_INSTANCES +from openpype.hosts.blender.api import plugin -class CreateModel(openpype.hosts.blender.api.plugin.Creator): +class CreateModel(plugin.Creator): """Polygonal static geometry""" name = "modelMain" @@ -16,17 +17,30 @@ class CreateModel(openpype.hosts.blender.api.plugin.Creator): icon = "cube" def process(self): + # Get Instance Containter or create it if it does not exist + instances = bpy.data.collections.get(AVALON_INSTANCES) + if not instances: + instances = bpy.data.collections.new(name = AVALON_INSTANCES) + bpy.context.scene.collection.children.link(instances) + # Create instance object asset = self.data["asset"] subset = self.data["subset"] - name = openpype.hosts.blender.api.plugin.asset_name(asset, subset) - collection = bpy.data.collections.new(name=name) - bpy.context.scene.collection.children.link(collection) + name = plugin.asset_name(asset, subset) + asset_group = bpy.data.objects.new(name=name, object_data = None) + instances.objects.link(asset_group) self.data['task'] = api.Session.get('AVALON_TASK') - lib.imprint(collection, self.data) + lib.imprint(asset_group, self.data) + # Add selected objects to instance if (self.options or {}).get("useSelection"): - for obj in lib.get_selection(): - collection.objects.link(obj) + bpy.context.view_layer.objects.active = asset_group + selected = lib.get_selection() + for obj in selected: + obj.select_set(True) + selected.append(asset_group) + context = plugin.create_blender_context( + active = asset_group, selected = selected) + bpy.ops.object.parent_set(context, keep_transform=True) - return collection + return asset_group diff --git a/openpype/hosts/blender/plugins/load/load_model.py b/openpype/hosts/blender/plugins/load/load_model.py index 35a241b98e..7e757f5433 100644 --- a/openpype/hosts/blender/plugins/load/load_model.py +++ b/openpype/hosts/blender/plugins/load/load_model.py @@ -1,13 +1,16 @@ """Load a model asset in Blender.""" -import logging from pathlib import Path from pprint import pformat from typing import Dict, List, Optional -from avalon import api, blender import bpy -import openpype.hosts.blender.api.plugin as plugin + +from avalon import api +from avalon.blender.pipeline import AVALON_CONTAINERS +from avalon.blender.pipeline import AVALON_CONTAINER_ID +from avalon.blender.pipeline import AVALON_PROPERTY +from openpype.hosts.blender.api import plugin class BlendModelLoader(plugin.AssetLoader): @@ -24,52 +27,78 @@ class BlendModelLoader(plugin.AssetLoader): icon = "code-fork" color = "orange" - def _remove(self, objects, container): - for obj in list(objects): - for material_slot in list(obj.material_slots): - bpy.data.materials.remove(material_slot.material) - bpy.data.meshes.remove(obj.data) + def _remove(self, asset_group): + objects = list(asset_group.children) + empties = [] - bpy.data.collections.remove(container) + for obj in objects: + if obj.type == 'MESH': + for material_slot in list(obj.material_slots): + bpy.data.materials.remove(material_slot.material) + bpy.data.meshes.remove(obj.data) + elif obj.type == 'EMPTY': + objects.extend(obj.children) + empties.append(obj) - def _process( - self, libpath, lib_container, container_name, - parent_collection - ): + for empty in empties: + bpy.data.objects.remove(empty) + + def _process(self, libpath, asset_group, group_name): relative = bpy.context.preferences.filepaths.use_relative_paths with bpy.data.libraries.load( libpath, link=True, relative=relative - ) as (_, data_to): - data_to.collections = [lib_container] + ) as (data_from, data_to): + data_to.objects = data_from.objects - parent = parent_collection + parent = bpy.context.scene.collection - if parent is None: - parent = bpy.context.scene.collection + empties = [obj for obj in data_to.objects if obj.type == 'EMPTY'] - parent.children.link(bpy.data.collections[lib_container]) + container = None - model_container = parent.children[lib_container].make_local() - model_container.name = container_name + for empty in empties: + if empty.get(AVALON_PROPERTY): + container = empty + break - for obj in model_container.objects: - local_obj = plugin.prepare_data(obj, container_name) - plugin.prepare_data(local_obj.data, container_name) + assert container, "No asset group found" - for material_slot in local_obj.material_slots: - plugin.prepare_data(material_slot.material, container_name) + # Children must be linked before parents, + # otherwise the hierarchy will break + objects = [] + nodes = list(container.children) - if not obj.get(blender.pipeline.AVALON_PROPERTY): - local_obj[blender.pipeline.AVALON_PROPERTY] = dict() + for obj in nodes: + obj.parent = asset_group - avalon_info = local_obj[blender.pipeline.AVALON_PROPERTY] - avalon_info.update({"container_name": container_name}) + for obj in nodes: + objects.append(obj) + nodes.extend(list(obj.children)) - model_container.pop(blender.pipeline.AVALON_PROPERTY) + objects.reverse() + + for obj in objects: + parent.objects.link(obj) + + for obj in objects: + local_obj = plugin.prepare_data(obj, group_name) + if obj.type != 'EMPTY': + plugin.prepare_data(local_obj.data, group_name) + + for material_slot in local_obj.material_slots: + plugin.prepare_data(material_slot.material, group_name) + + if not obj.get(AVALON_PROPERTY): + local_obj[AVALON_PROPERTY] = dict() + + avalon_info = local_obj[AVALON_PROPERTY] + avalon_info.update({"container_name": group_name}) + + objects.reverse() bpy.ops.object.select_all(action='DESELECT') - return model_container + return objects def process_asset( self, context: dict, name: str, namespace: Optional[str] = None, @@ -82,50 +111,41 @@ class BlendModelLoader(plugin.AssetLoader): context: Full parenthood of representation to load options: Additional settings dictionary """ - libpath = self.fname asset = context["asset"]["name"] subset = context["subset"]["name"] - lib_container = plugin.asset_name( - asset, subset - ) - unique_number = plugin.get_unique_number( - asset, subset - ) + asset_name = plugin.asset_name(asset, subset) + unique_number = plugin.get_unique_number(asset, subset) + group_name = plugin.asset_name(asset, subset, unique_number) namespace = namespace or f"{asset}_{unique_number}" - container_name = plugin.asset_name( - asset, subset, unique_number - ) - container = bpy.data.collections.new(lib_container) - container.name = container_name - blender.pipeline.containerise_existing( - container, - name, - namespace, - context, - self.__class__.__name__, - ) + avalon_container = bpy.data.collections.get(AVALON_CONTAINERS) + if not avalon_container: + avalon_container = bpy.data.collections.new(name=AVALON_CONTAINERS) + bpy.context.scene.collection.children.link(avalon_container) - metadata = container.get(blender.pipeline.AVALON_PROPERTY) + asset_group = bpy.data.objects.new(group_name, object_data=None) + avalon_container.objects.link(asset_group) - metadata["libpath"] = libpath - metadata["lib_container"] = lib_container + objects = self._process(libpath, asset_group, group_name) - obj_container = self._process( - libpath, lib_container, container_name, None) + bpy.context.scene.collection.objects.link(asset_group) - metadata["obj_container"] = obj_container + asset_group[AVALON_PROPERTY] = { + "schema": "openpype:container-2.0", + "id": AVALON_CONTAINER_ID, + "name": name, + "namespace": namespace or '', + "loader": str(self.__class__.__name__), + "representation": str(context["representation"]["_id"]), + "libpath": libpath, + "asset_name": asset_name, + "parent": str(context["representation"]["parent"]), + "family": context["representation"]["context"]["family"] + } - # Save the list of objects in the metadata container - metadata["objects"] = obj_container.all_objects - - metadata["parent"] = str(context["representation"]["parent"]) - metadata["family"] = context["representation"]["context"]["family"] - - nodes = list(container.objects) - nodes.append(container) + nodes = objects self[:] = nodes return nodes @@ -137,13 +157,9 @@ class BlendModelLoader(plugin.AssetLoader): If the objects of the collection are used in another collection they will not be removed, only unlinked. Normally this should not be the case though. - - Warning: - No nested collections are supported at the moment! """ - collection = bpy.data.collections.get( - container["objectName"] - ) + object_name = container["objectName"] + asset_group = bpy.data.objects.get(object_name) libpath = Path(api.get_representation_path(representation)) extension = libpath.suffix.lower() @@ -153,12 +169,9 @@ class BlendModelLoader(plugin.AssetLoader): pformat(representation, indent=2), ) - assert collection, ( + assert asset_group, ( f"The asset is not loaded: {container['objectName']}" ) - assert not (collection.children), ( - "Nested collections are not supported." - ) assert libpath, ( "No existing library file found for {container['objectName']}" ) @@ -169,45 +182,30 @@ class BlendModelLoader(plugin.AssetLoader): f"Unsupported file: {libpath}" ) - collection_metadata = collection.get( - blender.pipeline.AVALON_PROPERTY) - collection_libpath = collection_metadata["libpath"] - lib_container = collection_metadata["lib_container"] + metadata = asset_group.get(AVALON_PROPERTY) + group_libpath = metadata["libpath"] - obj_container = plugin.get_local_collection_with_name( - collection_metadata["obj_container"].name - ) - objects = obj_container.all_objects - - container_name = obj_container.name - - normalized_collection_libpath = ( - str(Path(bpy.path.abspath(collection_libpath)).resolve()) + normalized_group_libpath = ( + str(Path(bpy.path.abspath(group_libpath)).resolve()) ) normalized_libpath = ( str(Path(bpy.path.abspath(str(libpath))).resolve()) ) self.log.debug( - "normalized_collection_libpath:\n %s\nnormalized_libpath:\n %s", - normalized_collection_libpath, + "normalized_group_libpath:\n %s\nnormalized_libpath:\n %s", + normalized_group_libpath, normalized_libpath, ) - if normalized_collection_libpath == normalized_libpath: + if normalized_group_libpath == normalized_libpath: self.log.info("Library already loaded, not updating...") return - parent = plugin.get_parent_collection(obj_container) + self._remove(asset_group) - self._remove(objects, obj_container) + self._process(str(libpath), asset_group, object_name) - obj_container = self._process( - str(libpath), lib_container, container_name, parent) - - # Save the list of objects in the metadata container - collection_metadata["obj_container"] = obj_container - collection_metadata["objects"] = obj_container.all_objects - collection_metadata["libpath"] = str(libpath) - collection_metadata["representation"] = str(representation["_id"]) + metadata["libpath"] = str(libpath) + metadata["representation"] = str(representation["_id"]) def remove(self, container: Dict) -> bool: """Remove an existing container from a Blender scene. @@ -218,29 +216,15 @@ class BlendModelLoader(plugin.AssetLoader): Returns: bool: Whether the container was deleted. - - Warning: - No nested collections are supported at the moment! """ - collection = bpy.data.collections.get( - container["objectName"] - ) - if not collection: + object_name = container["objectName"] + asset_group = bpy.data.objects.get(object_name) + + if not asset_group: return False - assert not (collection.children), ( - "Nested collections are not supported." - ) - collection_metadata = collection.get( - blender.pipeline.AVALON_PROPERTY) + self._remove(asset_group) - obj_container = plugin.get_local_collection_with_name( - collection_metadata["obj_container"].name - ) - objects = obj_container.all_objects - - self._remove(objects, obj_container) - - bpy.data.collections.remove(collection) + bpy.data.objects.remove(asset_group) return True diff --git a/openpype/hosts/blender/plugins/publish/collect_instances.py b/openpype/hosts/blender/plugins/publish/collect_instances.py index 1d3693216d..09a60d9725 100644 --- a/openpype/hosts/blender/plugins/publish/collect_instances.py +++ b/openpype/hosts/blender/plugins/publish/collect_instances.py @@ -5,6 +5,7 @@ import json import pyblish.api from avalon.blender.pipeline import AVALON_PROPERTY +from avalon.blender.pipeline import AVALON_INSTANCES class CollectInstances(pyblish.api.ContextPlugin): @@ -15,24 +16,25 @@ class CollectInstances(pyblish.api.ContextPlugin): order = pyblish.api.CollectorOrder @staticmethod - def get_collections() -> Generator: + def get_asset_groups() -> Generator: """Return all 'model' collections. Check if the family is 'model' and if it doesn't have the representation set. If the representation is set, it is a loaded model and we don't want to publish it. """ - for collection in bpy.data.collections: - avalon_prop = collection.get(AVALON_PROPERTY) or dict() + instances = bpy.data.collections.get(AVALON_INSTANCES) + for obj in instances.objects: + avalon_prop = obj.get(AVALON_PROPERTY) or dict() if avalon_prop.get('id') == 'pyblish.avalon.instance': - yield collection + yield obj def process(self, context): """Collect the models from the current Blender scene.""" - collections = self.get_collections() + asset_groups = self.get_asset_groups() - for collection in collections: - avalon_prop = collection[AVALON_PROPERTY] + for group in asset_groups: + avalon_prop = group[AVALON_PROPERTY] asset = avalon_prop['asset'] family = avalon_prop['family'] subset = avalon_prop['subset'] @@ -46,9 +48,13 @@ class CollectInstances(pyblish.api.ContextPlugin): asset=asset, task=task, ) - members = list(collection.objects) - members.append(collection) - instance[:] = members + objects = list(group.children) + members = set() + for obj in objects: + objects.extend(list(obj.children)) + members.add(obj) + members.add(group) + instance[:] = list(members) self.log.debug(json.dumps(instance.data, indent=4)) for obj in instance: self.log.debug(obj) diff --git a/openpype/hosts/blender/plugins/publish/extract_blend.py b/openpype/hosts/blender/plugins/publish/extract_blend.py index 890c8b5ffd..60ef20e31c 100644 --- a/openpype/hosts/blender/plugins/publish/extract_blend.py +++ b/openpype/hosts/blender/plugins/publish/extract_blend.py @@ -1,6 +1,8 @@ import os -import avalon.blender.workio +import bpy + +# import avalon.blender.workio import openpype.api @@ -22,15 +24,12 @@ class ExtractBlend(openpype.api.Extractor): # Perform extraction self.log.info("Performing extraction..") - # Just save the file to a temporary location. At least for now it's no - # problem to have (possibly) extra stuff in the file. - avalon.blender.workio.save_file(filepath, copy=True) - # - # # Store reference for integration - # if "files" not in instance.data: - # instance.data["files"] = list() - # - # # instance.data["files"].append(filename) + data_blocks = set() + + for obj in instance: + data_blocks.add(obj) + + bpy.data.libraries.write(filepath, data_blocks) if "representations" not in instance.data: instance.data["representations"] = [] From ef3319b3e8f559887412ccfce1df0e4822947323 Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Mon, 31 May 2021 17:39:46 +0100 Subject: [PATCH 02/38] Hound fixes --- openpype/hosts/blender/plugins/create/create_model.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openpype/hosts/blender/plugins/create/create_model.py b/openpype/hosts/blender/plugins/create/create_model.py index 223896944b..e318cd07da 100644 --- a/openpype/hosts/blender/plugins/create/create_model.py +++ b/openpype/hosts/blender/plugins/create/create_model.py @@ -20,14 +20,14 @@ class CreateModel(plugin.Creator): # Get Instance Containter or create it if it does not exist instances = bpy.data.collections.get(AVALON_INSTANCES) if not instances: - instances = bpy.data.collections.new(name = AVALON_INSTANCES) + instances = bpy.data.collections.new(name=AVALON_INSTANCES) bpy.context.scene.collection.children.link(instances) # Create instance object asset = self.data["asset"] subset = self.data["subset"] name = plugin.asset_name(asset, subset) - asset_group = bpy.data.objects.new(name=name, object_data = None) + asset_group = bpy.data.objects.new(name=name, object_data=None) instances.objects.link(asset_group) self.data['task'] = api.Session.get('AVALON_TASK') lib.imprint(asset_group, self.data) @@ -40,7 +40,7 @@ class CreateModel(plugin.Creator): obj.select_set(True) selected.append(asset_group) context = plugin.create_blender_context( - active = asset_group, selected = selected) + active=asset_group, selected=selected) bpy.ops.object.parent_set(context, keep_transform=True) return asset_group From 0fd34c6acad71f76d4aacfcd3abaa0ecd052246d Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Wed, 2 Jun 2021 10:49:57 +0100 Subject: [PATCH 03/38] Fixed FBX and ABC extraction and loading --- .../blender/plugins/publish/extract_abc.py | 60 ++++--------- .../blender/plugins/publish/extract_fbx.py | 52 +++++------- .../load/load_alembic_geometrycache.py | 85 +++++++++++-------- .../plugins/load/load_alembic_staticmesh.py | 67 ++++++++------- .../unreal/plugins/load/load_staticmeshfbx.py | 61 +++++++------ 5 files changed, 150 insertions(+), 175 deletions(-) diff --git a/openpype/hosts/blender/plugins/publish/extract_abc.py b/openpype/hosts/blender/plugins/publish/extract_abc.py index a6315908fc..97123c5967 100644 --- a/openpype/hosts/blender/plugins/publish/extract_abc.py +++ b/openpype/hosts/blender/plugins/publish/extract_abc.py @@ -1,12 +1,13 @@ import os -import openpype.api -import openpype.hosts.blender.api.plugin +from openpype import api +from openpype.hosts.blender.api import plugin +from avalon.blender.pipeline import AVALON_PROPERTY import bpy -class ExtractABC(openpype.api.Extractor): +class ExtractABC(api.Extractor): """Extract as ABC.""" label = "Extract ABC" @@ -16,7 +17,6 @@ class ExtractABC(openpype.api.Extractor): def process(self, instance): # Define extract output file path - stagingdir = self.staging_dir(instance) filename = f"{instance.name}.abc" filepath = os.path.join(stagingdir, filename) @@ -28,57 +28,29 @@ class ExtractABC(openpype.api.Extractor): # Perform extraction self.log.info("Performing extraction..") - collections = [ - obj for obj in instance if type(obj) is bpy.types.Collection] - - assert len(collections) == 1, "There should be one and only one " \ - "collection collected for this asset" - - old_active_layer_collection = view_layer.active_layer_collection - - layers = view_layer.layer_collection.children - - # Get the layer collection from the collection we need to export. - # This is needed because in Blender you can only set the active - # collection with the layer collection, and there is no way to get - # the layer collection from the collection - # (but there is the vice versa). - layer_collections = [ - layer for layer in layers if layer.collection == collections[0]] - - assert len(layer_collections) == 1 - - view_layer.active_layer_collection = layer_collections[0] - - old_scale = scene.unit_settings.scale_length - bpy.ops.object.select_all(action='DESELECT') - selected = list() + selected = [] + asset_group = None for obj in instance: - try: - obj.select_set(True) - selected.append(obj) - except: - continue + obj.select_set(True) + selected.append(obj) + if obj.get(AVALON_PROPERTY): + asset_group = obj - new_context = openpype.hosts.blender.api.plugin.create_blender_context( - active=selected[0], selected=selected) - - # We set the scale of the scene for the export - scene.unit_settings.scale_length = 0.01 + context = plugin.create_blender_context( + active=asset_group, selected=selected) # We export the abc bpy.ops.wm.alembic_export( - new_context, + context, filepath=filepath, - selected=True + selected=True, + flatten=True ) - view_layer.active_layer_collection = old_active_layer_collection - - scene.unit_settings.scale_length = old_scale + bpy.ops.object.select_all(action='DESELECT') if "representations" not in instance.data: instance.data["representations"] = [] diff --git a/openpype/hosts/blender/plugins/publish/extract_fbx.py b/openpype/hosts/blender/plugins/publish/extract_fbx.py index dc74348949..c8e2473cf5 100644 --- a/openpype/hosts/blender/plugins/publish/extract_fbx.py +++ b/openpype/hosts/blender/plugins/publish/extract_fbx.py @@ -1,11 +1,13 @@ import os -import openpype.api +from openpype import api +from openpype.hosts.blender.api import plugin +from avalon.blender.pipeline import AVALON_PROPERTY import bpy -class ExtractFBX(openpype.api.Extractor): +class ExtractFBX(api.Extractor): """Extract as FBX.""" label = "Extract FBX" @@ -15,56 +17,40 @@ class ExtractFBX(openpype.api.Extractor): def process(self, instance): # Define extract output file path - stagingdir = self.staging_dir(instance) filename = f"{instance.name}.fbx" filepath = os.path.join(stagingdir, filename) - context = bpy.context - scene = context.scene - view_layer = context.view_layer + scene = bpy.context.scene # Perform extraction self.log.info("Performing extraction..") - collections = [ - obj for obj in instance if type(obj) is bpy.types.Collection] + bpy.ops.object.select_all(action='DESELECT') - assert len(collections) == 1, "There should be one and only one " \ - "collection collected for this asset" + selected = [] + asset_group = None - old_active_layer_collection = view_layer.active_layer_collection + for obj in instance: + obj.select_set(True) + selected.append(obj) + if obj.get(AVALON_PROPERTY): + asset_group = obj - layers = view_layer.layer_collection.children - - # Get the layer collection from the collection we need to export. - # This is needed because in Blender you can only set the active - # collection with the layer collection, and there is no way to get - # the layer collection from the collection - # (but there is the vice versa). - layer_collections = [ - layer for layer in layers if layer.collection == collections[0]] - - assert len(layer_collections) == 1 - - view_layer.active_layer_collection = layer_collections[0] - - old_scale = scene.unit_settings.scale_length - - # We set the scale of the scene for the export - scene.unit_settings.scale_length = 0.01 + context = plugin.create_blender_context( + active=asset_group, selected=selected) # We export the fbx bpy.ops.export_scene.fbx( + context, filepath=filepath, - use_active_collection=True, + use_active_collection=False, + use_selection=True, mesh_smooth_type='FACE', add_leaf_bones=False ) - view_layer.active_layer_collection = old_active_layer_collection - - scene.unit_settings.scale_length = old_scale + bpy.ops.object.select_all(action='DESELECT') if "representations" not in instance.data: instance.data["representations"] = [] diff --git a/openpype/hosts/unreal/plugins/load/load_alembic_geometrycache.py b/openpype/hosts/unreal/plugins/load/load_alembic_geometrycache.py index a9279bf6e0..ad37a7a068 100644 --- a/openpype/hosts/unreal/plugins/load/load_alembic_geometrycache.py +++ b/openpype/hosts/unreal/plugins/load/load_alembic_geometrycache.py @@ -15,6 +15,46 @@ class PointCacheAlembicLoader(api.Loader): icon = "cube" color = "orange" + def get_task( + self, filename, asset_dir, asset_name, replace, frame_start, frame_end + ): + task = unreal.AssetImportTask() + options = unreal.AbcImportSettings() + gc_settings = unreal.AbcGeometryCacheSettings() + conversion_settings = unreal.AbcConversionSettings() + sampling_settings = unreal.AbcSamplingSettings() + + task.set_editor_property('filename', filename) + task.set_editor_property('destination_path', asset_dir) + task.set_editor_property('destination_name', asset_name) + task.set_editor_property('replace_existing', replace) + task.set_editor_property('automated', True) + task.set_editor_property('save', True) + + # set import options here + # Unreal 4.24 ignores the settings. It works with Unreal 4.26 + options.set_editor_property( + 'import_type', unreal.AlembicImportType.GEOMETRY_CACHE) + + gc_settings.set_editor_property('flatten_tracks', False) + + conversion_settings.set_editor_property('flip_u', False) + conversion_settings.set_editor_property('flip_v', True) + conversion_settings.set_editor_property( + 'scale', unreal.Vector(x=100.0, y=100.0, z=100.0)) + conversion_settings.set_editor_property( + 'rotation', unreal.Vector(x=-90.0, y=0.0, z=180.0)) + + sampling_settings.set_editor_property('frame_start', frame_start) + sampling_settings.set_editor_property('frame_end', frame_end) + + options.geometry_cache_settings = gc_settings + options.conversion_settings = conversion_settings + options.sampling_settings = sampling_settings + task.options = options + + return task + def load(self, context, name, namespace, data): """ Load and containerise representation into Content Browser. @@ -55,25 +95,17 @@ class PointCacheAlembicLoader(api.Loader): unreal.EditorAssetLibrary.make_directory(asset_dir) - task = unreal.AssetImportTask() + frame_start = context.get('asset').get('data').get('frameStart') + frame_end = context.get('asset').get('data').get('frameEnd') - task.set_editor_property('filename', self.fname) - task.set_editor_property('destination_path', asset_dir) - task.set_editor_property('destination_name', asset_name) - task.set_editor_property('replace_existing', False) - task.set_editor_property('automated', True) - task.set_editor_property('save', True) + # If frame start and end are the same, we increse the end frame by + # one, otherwise Unreal will not import it + if frame_start == frame_end: + frame_end += 1 - # set import options here - # Unreal 4.24 ignores the settings. It works with Unreal 4.26 - options = unreal.AbcImportSettings() - options.set_editor_property( - 'import_type', unreal.AlembicImportType.GEOMETRY_CACHE) + task = self.get_task( + self.fname, asset_dir, asset_name, False, frame_start, frame_end) - options.geometry_cache_settings.set_editor_property( - 'flatten_tracks', False) - - task.options = options unreal.AssetToolsHelpers.get_asset_tools().import_asset_tasks([task]) # noqa: E501 # Create Asset Container @@ -109,28 +141,11 @@ class PointCacheAlembicLoader(api.Loader): source_path = api.get_representation_path(representation) destination_path = container["namespace"] - task = unreal.AssetImportTask() + task = self.get_task(source_path, destination_path, name, True) - task.set_editor_property('filename', source_path) - task.set_editor_property('destination_path', destination_path) - # strip suffix - task.set_editor_property('destination_name', name) - task.set_editor_property('replace_existing', True) - task.set_editor_property('automated', True) - task.set_editor_property('save', True) - - # set import options here - # Unreal 4.24 ignores the settings. It works with Unreal 4.26 - options = unreal.AbcImportSettings() - options.set_editor_property( - 'import_type', unreal.AlembicImportType.GEOMETRY_CACHE) - - options.geometry_cache_settings.set_editor_property( - 'flatten_tracks', False) - - task.options = options # do import fbx and replace existing data unreal.AssetToolsHelpers.get_asset_tools().import_asset_tasks([task]) + container_path = "{}/{}".format(container["namespace"], container["objectName"]) # update metadata diff --git a/openpype/hosts/unreal/plugins/load/load_alembic_staticmesh.py b/openpype/hosts/unreal/plugins/load/load_alembic_staticmesh.py index 12b9320f72..ccec31b832 100644 --- a/openpype/hosts/unreal/plugins/load/load_alembic_staticmesh.py +++ b/openpype/hosts/unreal/plugins/load/load_alembic_staticmesh.py @@ -15,6 +15,39 @@ class StaticMeshAlembicLoader(api.Loader): icon = "cube" color = "orange" + def get_task(self, filename, asset_dir, asset_name, replace): + task = unreal.AssetImportTask() + options = unreal.AbcImportSettings() + sm_settings = unreal.AbcStaticMeshSettings() + conversion_settings = unreal.AbcConversionSettings() + + task.set_editor_property('filename', filename) + task.set_editor_property('destination_path', asset_dir) + task.set_editor_property('destination_name', asset_name) + task.set_editor_property('replace_existing', replace) + task.set_editor_property('automated', True) + task.set_editor_property('save', True) + + # set import options here + # Unreal 4.24 ignores the settings. It works with Unreal 4.26 + options.set_editor_property( + 'import_type', unreal.AlembicImportType.STATIC_MESH) + + sm_settings.set_editor_property('merge_meshes', True) + + conversion_settings.set_editor_property('flip_u', False) + conversion_settings.set_editor_property('flip_v', True) + conversion_settings.set_editor_property( + 'scale', unreal.Vector(x=100.0, y=100.0, z=100.0)) + conversion_settings.set_editor_property( + 'rotation', unreal.Vector(x=-90.0, y=0.0, z=180.0)) + + options.static_mesh_settings = sm_settings + options.conversion_settings = conversion_settings + task.options = options + + return task + def load(self, context, name, namespace, data): """ Load and containerise representation into Content Browser. @@ -55,22 +88,8 @@ class StaticMeshAlembicLoader(api.Loader): unreal.EditorAssetLibrary.make_directory(asset_dir) - task = unreal.AssetImportTask() + task = self.get_task(self.fname, asset_dir, asset_name, False) - task.set_editor_property('filename', self.fname) - task.set_editor_property('destination_path', asset_dir) - task.set_editor_property('destination_name', asset_name) - task.set_editor_property('replace_existing', False) - task.set_editor_property('automated', True) - task.set_editor_property('save', True) - - # set import options here - # Unreal 4.24 ignores the settings. It works with Unreal 4.26 - options = unreal.AbcImportSettings() - options.set_editor_property( - 'import_type', unreal.AlembicImportType.STATIC_MESH) - - task.options = options unreal.AssetToolsHelpers.get_asset_tools().import_asset_tasks([task]) # noqa: E501 # Create Asset Container @@ -106,25 +125,11 @@ class StaticMeshAlembicLoader(api.Loader): source_path = api.get_representation_path(representation) destination_path = container["namespace"] - task = unreal.AssetImportTask() + task = self.get_task(source_path, destination_path, name, True) - task.set_editor_property('filename', source_path) - task.set_editor_property('destination_path', destination_path) - # strip suffix - task.set_editor_property('destination_name', name) - task.set_editor_property('replace_existing', True) - task.set_editor_property('automated', True) - task.set_editor_property('save', True) - - # set import options here - # Unreal 4.24 ignores the settings. It works with Unreal 4.26 - options = unreal.AbcImportSettings() - options.set_editor_property( - 'import_type', unreal.AlembicImportType.STATIC_MESH) - - task.options = options # do import fbx and replace existing data unreal.AssetToolsHelpers.get_asset_tools().import_asset_tasks([task]) + container_path = "{}/{}".format(container["namespace"], container["objectName"]) # update metadata diff --git a/openpype/hosts/unreal/plugins/load/load_staticmeshfbx.py b/openpype/hosts/unreal/plugins/load/load_staticmeshfbx.py index dcb566fa4c..d25f84ea69 100644 --- a/openpype/hosts/unreal/plugins/load/load_staticmeshfbx.py +++ b/openpype/hosts/unreal/plugins/load/load_staticmeshfbx.py @@ -15,6 +15,31 @@ class StaticMeshFBXLoader(api.Loader): icon = "cube" color = "orange" + def get_task(self, filename, asset_dir, asset_name, replace): + task = unreal.AssetImportTask() + options = unreal.FbxImportUI() + import_data = unreal.FbxStaticMeshImportData() + + task.set_editor_property('filename', filename) + task.set_editor_property('destination_path', asset_dir) + task.set_editor_property('destination_name', asset_name) + task.set_editor_property('replace_existing', replace) + task.set_editor_property('automated', True) + task.set_editor_property('save', True) + + # set import options here + options.set_editor_property( + 'automated_import_should_detect_type', False) + options.set_editor_property('import_animations', False) + + import_data.set_editor_property('combine_meshes', True) + import_data.set_editor_property('remove_degenerates', False) + + options.static_mesh_import_data = import_data + task.options = options + + return task + def load(self, context, name, namespace, data): """ Load and containerise representation into Content Browser. @@ -55,22 +80,8 @@ class StaticMeshFBXLoader(api.Loader): unreal.EditorAssetLibrary.make_directory(asset_dir) - task = unreal.AssetImportTask() + task = self.get_task(self.fname, asset_dir, asset_name, False) - task.set_editor_property('filename', self.fname) - task.set_editor_property('destination_path', asset_dir) - task.set_editor_property('destination_name', asset_name) - task.set_editor_property('replace_existing', False) - task.set_editor_property('automated', True) - task.set_editor_property('save', True) - - # set import options here - options = unreal.FbxImportUI() - options.set_editor_property( - 'automated_import_should_detect_type', False) - options.set_editor_property('import_animations', False) - - task.options = options unreal.AssetToolsHelpers.get_asset_tools().import_asset_tasks([task]) # noqa: E501 # Create Asset Container @@ -102,29 +113,15 @@ class StaticMeshFBXLoader(api.Loader): return asset_content def update(self, container, representation): - name = container["name"] + name = container["asset_name"] source_path = api.get_representation_path(representation) destination_path = container["namespace"] - task = unreal.AssetImportTask() + task = self.get_task(source_path, destination_path, name, True) - task.set_editor_property('filename', source_path) - task.set_editor_property('destination_path', destination_path) - # strip suffix - task.set_editor_property('destination_name', name) - task.set_editor_property('replace_existing', True) - task.set_editor_property('automated', True) - task.set_editor_property('save', True) - - # set import options here - options = unreal.FbxImportUI() - options.set_editor_property( - 'automated_import_should_detect_type', False) - options.set_editor_property('import_animations', False) - - task.options = options # do import fbx and replace existing data unreal.AssetToolsHelpers.get_asset_tools().import_asset_tasks([task]) + container_path = "{}/{}".format(container["namespace"], container["objectName"]) # update metadata From f19bcc61bbb4869e65cc296ada175f22d7542542 Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Thu, 3 Jun 2021 14:21:23 +0100 Subject: [PATCH 04/38] Added support for loading FBX models in Blender and fixed alembic --- openpype/hosts/blender/api/plugin.py | 2 +- .../hosts/blender/plugins/load/load_abc.py | 220 +++++++-------- .../blender/plugins/load/load_fbx_model.py | 250 ++++++++++++++++++ .../hosts/blender/plugins/load/load_model.py | 2 + .../blender/plugins/publish/extract_abc.py | 2 +- 5 files changed, 368 insertions(+), 108 deletions(-) create mode 100644 openpype/hosts/blender/plugins/load/load_fbx_model.py diff --git a/openpype/hosts/blender/api/plugin.py b/openpype/hosts/blender/api/plugin.py index 4d82fb3f76..f3cf2b88cd 100644 --- a/openpype/hosts/blender/api/plugin.py +++ b/openpype/hosts/blender/api/plugin.py @@ -44,7 +44,7 @@ def get_unique_number( def prepare_data(data, container_name): name = data.name local_data = data.make_local() - local_data.name = f"{name}:{container_name}" + local_data.name = f"{container_name}:{name}" return local_data diff --git a/openpype/hosts/blender/plugins/load/load_abc.py b/openpype/hosts/blender/plugins/load/load_abc.py index 4248cffd69..7261e002f1 100644 --- a/openpype/hosts/blender/plugins/load/load_abc.py +++ b/openpype/hosts/blender/plugins/load/load_abc.py @@ -4,9 +4,14 @@ from pathlib import Path from pprint import pformat from typing import Dict, List, Optional -from avalon import api, blender import bpy -import openpype.hosts.blender.api.plugin as plugin + +from avalon import api +from avalon.blender import lib +from avalon.blender.pipeline import AVALON_CONTAINERS +from avalon.blender.pipeline import AVALON_CONTAINER_ID +from avalon.blender.pipeline import AVALON_PROPERTY +from openpype.hosts.blender.api import plugin class CacheModelLoader(plugin.AssetLoader): @@ -21,59 +26,94 @@ class CacheModelLoader(plugin.AssetLoader): families = ["model", "pointcache"] representations = ["abc"] - label = "Link Alembic" + label = "Load Alembic" icon = "code-fork" color = "orange" - def _remove(self, objects, container): - for obj in list(objects): + def _remove(self, asset_group): + objects = list(asset_group.children) + empties = [] + + for obj in objects: if obj.type == 'MESH': + for material_slot in list(obj.material_slots): + bpy.data.materials.remove(material_slot.material) bpy.data.meshes.remove(obj.data) elif obj.type == 'EMPTY': - bpy.data.objects.remove(obj) + objects.extend(obj.children) + empties.append(obj) - bpy.data.collections.remove(container) + for empty in empties: + bpy.data.objects.remove(empty) - def _process(self, libpath, container_name, parent_collection): + def _process(self, libpath, asset_group, group_name): bpy.ops.object.select_all(action='DESELECT') - view_layer = bpy.context.view_layer - view_layer_collection = view_layer.active_layer_collection.collection + collection = bpy.context.view_layer.active_layer_collection.collection relative = bpy.context.preferences.filepaths.use_relative_paths + context = plugin.create_blender_context() bpy.ops.wm.alembic_import( + context, filepath=libpath, relative_path=relative ) - parent = parent_collection + parent = bpy.context.scene.collection - if parent is None: - parent = bpy.context.scene.collection + imported = lib.get_selection() - model_container = bpy.data.collections.new(container_name) - parent.children.link(model_container) - for obj in bpy.context.selected_objects: - model_container.objects.link(obj) - view_layer_collection.objects.unlink(obj) + empties = [obj for obj in imported if obj.type == 'EMPTY'] + container = None + + for empty in empties: + if not empty.parent: + container = empty + break + + assert container, "No asset group found" + + # Children must be linked before parents, + # otherwise the hierarchy will break + objects = [] + nodes = list(container.children) + + for obj in nodes: + obj.parent = asset_group + + bpy.data.objects.remove(container) + + for obj in nodes: + objects.append(obj) + nodes.extend(list(obj.children)) + + objects.reverse() + + for obj in objects: + parent.objects.link(obj) + collection.objects.unlink(obj) + + for obj in objects: name = obj.name - obj.name = f"{name}:{container_name}" + obj.name = f"{group_name}:{name}" + if obj.type != 'EMPTY': + name_data = obj.data.name + obj.data.name = f"{group_name}:{name_data}" - # Groups are imported as Empty objects in Blender - if obj.type == 'MESH': - data_name = obj.data.name - obj.data.name = f"{data_name}:{container_name}" + for material_slot in obj.material_slots: + name_mat = material_slot.material.name + material_slot.material.name = f"{group_name}:{name_mat}" - if not obj.get(blender.pipeline.AVALON_PROPERTY): - obj[blender.pipeline.AVALON_PROPERTY] = dict() + if not obj.get(AVALON_PROPERTY): + obj[AVALON_PROPERTY] = dict() - avalon_info = obj[blender.pipeline.AVALON_PROPERTY] - avalon_info.update({"container_name": container_name}) + avalon_info = obj[AVALON_PROPERTY] + avalon_info.update({"container_name": group_name}) bpy.ops.object.select_all(action='DESELECT') - return model_container + return objects def process_asset( self, context: dict, name: str, namespace: Optional[str] = None, @@ -91,43 +131,37 @@ class CacheModelLoader(plugin.AssetLoader): asset = context["asset"]["name"] subset = context["subset"]["name"] - lib_container = plugin.asset_name( - asset, subset - ) - unique_number = plugin.get_unique_number( - asset, subset - ) + asset_name = plugin.asset_name(asset, subset) + unique_number = plugin.get_unique_number(asset, subset) + group_name = plugin.asset_name(asset, subset, unique_number) namespace = namespace or f"{asset}_{unique_number}" - container_name = plugin.asset_name( - asset, subset, unique_number - ) - container = bpy.data.collections.new(lib_container) - container.name = container_name - blender.pipeline.containerise_existing( - container, - name, - namespace, - context, - self.__class__.__name__, - ) + avalon_container = bpy.data.collections.get(AVALON_CONTAINERS) + if not avalon_container: + avalon_container = bpy.data.collections.new(name=AVALON_CONTAINERS) + bpy.context.scene.collection.children.link(avalon_container) - container_metadata = container.get( - blender.pipeline.AVALON_PROPERTY) + asset_group = bpy.data.objects.new(group_name, object_data=None) + avalon_container.objects.link(asset_group) - container_metadata["libpath"] = libpath - container_metadata["lib_container"] = lib_container + objects = self._process(libpath, asset_group, group_name) - obj_container = self._process( - libpath, container_name, None) + bpy.context.scene.collection.objects.link(asset_group) - container_metadata["obj_container"] = obj_container + asset_group[AVALON_PROPERTY] = { + "schema": "openpype:container-2.0", + "id": AVALON_CONTAINER_ID, + "name": name, + "namespace": namespace or '', + "loader": str(self.__class__.__name__), + "representation": str(context["representation"]["_id"]), + "libpath": libpath, + "asset_name": asset_name, + "parent": str(context["representation"]["parent"]), + "family": context["representation"]["context"]["family"] + } - # Save the list of objects in the metadata container - container_metadata["objects"] = obj_container.all_objects - - nodes = list(container.objects) - nodes.append(container) + nodes = objects self[:] = nodes return nodes @@ -143,9 +177,8 @@ class CacheModelLoader(plugin.AssetLoader): Warning: No nested collections are supported at the moment! """ - collection = bpy.data.collections.get( - container["objectName"] - ) + object_name = container["objectName"] + asset_group = bpy.data.objects.get(object_name) libpath = Path(api.get_representation_path(representation)) extension = libpath.suffix.lower() @@ -155,12 +188,9 @@ class CacheModelLoader(plugin.AssetLoader): pformat(representation, indent=2), ) - assert collection, ( + assert asset_group, ( f"The asset is not loaded: {container['objectName']}" ) - assert not (collection.children), ( - "Nested collections are not supported." - ) assert libpath, ( "No existing library file found for {container['objectName']}" ) @@ -171,43 +201,32 @@ class CacheModelLoader(plugin.AssetLoader): f"Unsupported file: {libpath}" ) - collection_metadata = collection.get( - blender.pipeline.AVALON_PROPERTY) - collection_libpath = collection_metadata["libpath"] + metadata = asset_group.get(AVALON_PROPERTY) + group_libpath = metadata["libpath"] - obj_container = plugin.get_local_collection_with_name( - collection_metadata["obj_container"].name - ) - objects = obj_container.all_objects - - container_name = obj_container.name - - normalized_collection_libpath = ( - str(Path(bpy.path.abspath(collection_libpath)).resolve()) + normalized_group_libpath = ( + str(Path(bpy.path.abspath(group_libpath)).resolve()) ) normalized_libpath = ( str(Path(bpy.path.abspath(str(libpath))).resolve()) ) self.log.debug( - "normalized_collection_libpath:\n %s\nnormalized_libpath:\n %s", - normalized_collection_libpath, + "normalized_group_libpath:\n %s\nnormalized_libpath:\n %s", + normalized_group_libpath, normalized_libpath, ) - if normalized_collection_libpath == normalized_libpath: + if normalized_group_libpath == normalized_libpath: self.log.info("Library already loaded, not updating...") return - parent = plugin.get_parent_collection(obj_container) + mat = asset_group.matrix_basis.copy() + self._remove(asset_group) - self._remove(objects, obj_container) + self._process(str(libpath), asset_group, object_name) + asset_group.matrix_basis = mat - obj_container = self._process( - str(libpath), container_name, parent) - - collection_metadata["obj_container"] = obj_container - collection_metadata["objects"] = obj_container.all_objects - collection_metadata["libpath"] = str(libpath) - collection_metadata["representation"] = str(representation["_id"]) + metadata["libpath"] = str(libpath) + metadata["representation"] = str(representation["_id"]) def remove(self, container: Dict) -> bool: """Remove an existing container from a Blender scene. @@ -222,25 +241,14 @@ class CacheModelLoader(plugin.AssetLoader): Warning: No nested collections are supported at the moment! """ - collection = bpy.data.collections.get( - container["objectName"] - ) - if not collection: + object_name = container["objectName"] + asset_group = bpy.data.objects.get(object_name) + + if not asset_group: return False - assert not (collection.children), ( - "Nested collections are not supported." - ) - collection_metadata = collection.get( - blender.pipeline.AVALON_PROPERTY) + self._remove(asset_group) - obj_container = plugin.get_local_collection_with_name( - collection_metadata["obj_container"].name - ) - objects = obj_container.all_objects - - self._remove(objects, obj_container) - - bpy.data.collections.remove(collection) + bpy.data.objects.remove(asset_group) return True diff --git a/openpype/hosts/blender/plugins/load/load_fbx_model.py b/openpype/hosts/blender/plugins/load/load_fbx_model.py new file mode 100644 index 0000000000..776217e5f1 --- /dev/null +++ b/openpype/hosts/blender/plugins/load/load_fbx_model.py @@ -0,0 +1,250 @@ +"""Load an asset in Blender from an Alembic file.""" + +from pathlib import Path +from pprint import pformat +from typing import Dict, List, Optional + +import bpy + +from avalon import api +from avalon.blender import lib +from avalon.blender.pipeline import AVALON_CONTAINERS +from avalon.blender.pipeline import AVALON_CONTAINER_ID +from avalon.blender.pipeline import AVALON_PROPERTY +from openpype.hosts.blender.api import plugin + + +class FbxModelLoader(plugin.AssetLoader): + """Load FBX models. + + Stores the imported asset in an empty named after the asset. + """ + + families = ["model"] + representations = ["fbx"] + + label = "Load FBX" + icon = "code-fork" + color = "orange" + + def _remove(self, asset_group): + objects = list(asset_group.children) + empties = [] + + for obj in objects: + if obj.type == 'MESH': + for material_slot in list(obj.material_slots): + if material_slot.material: + bpy.data.materials.remove(material_slot.material) + bpy.data.meshes.remove(obj.data) + elif obj.type == 'EMPTY': + objects.extend(obj.children) + empties.append(obj) + + for empty in empties: + bpy.data.objects.remove(empty) + + def _process(self, libpath, asset_group, group_name): + bpy.ops.object.select_all(action='DESELECT') + + collection = bpy.context.view_layer.active_layer_collection.collection + + context = plugin.create_blender_context() + bpy.ops.import_scene.fbx( + context, + filepath=libpath + ) + + parent = bpy.context.scene.collection + + imported = lib.get_selection() + + empties = [obj for obj in imported if obj.type == 'EMPTY'] + + container = None + + for empty in empties: + if not empty.parent: + container = empty + break + + assert container, "No asset group found" + + # Children must be linked before parents, + # otherwise the hierarchy will break + objects = [] + nodes = list(container.children) + + for obj in nodes: + obj.parent = asset_group + + bpy.data.objects.remove(container) + + for obj in nodes: + objects.append(obj) + nodes.extend(list(obj.children)) + + objects.reverse() + + for obj in objects: + parent.objects.link(obj) + collection.objects.unlink(obj) + + for obj in objects: + name = obj.name + obj.name = f"{group_name}:{name}" + if obj.type != 'EMPTY': + name_data = obj.data.name + obj.data.name = f"{group_name}:{name_data}" + + for material_slot in obj.material_slots: + name_mat = material_slot.material.name + material_slot.material.name = f"{group_name}:{name_mat}" + + if not obj.get(AVALON_PROPERTY): + obj[AVALON_PROPERTY] = dict() + + avalon_info = obj[AVALON_PROPERTY] + avalon_info.update({"container_name": group_name}) + + bpy.ops.object.select_all(action='DESELECT') + + return objects + + def process_asset( + self, context: dict, name: str, namespace: Optional[str] = None, + options: Optional[Dict] = None + ) -> Optional[List]: + """ + Arguments: + name: Use pre-defined name + namespace: Use pre-defined namespace + context: Full parenthood of representation to load + options: Additional settings dictionary + """ + + libpath = self.fname + asset = context["asset"]["name"] + subset = context["subset"]["name"] + + asset_name = plugin.asset_name(asset, subset) + unique_number = plugin.get_unique_number(asset, subset) + group_name = plugin.asset_name(asset, subset, unique_number) + namespace = namespace or f"{asset}_{unique_number}" + + avalon_container = bpy.data.collections.get(AVALON_CONTAINERS) + if not avalon_container: + avalon_container = bpy.data.collections.new(name=AVALON_CONTAINERS) + bpy.context.scene.collection.children.link(avalon_container) + + asset_group = bpy.data.objects.new(group_name, object_data=None) + avalon_container.objects.link(asset_group) + + objects = self._process(libpath, asset_group, group_name) + + bpy.context.scene.collection.objects.link(asset_group) + + asset_group[AVALON_PROPERTY] = { + "schema": "openpype:container-2.0", + "id": AVALON_CONTAINER_ID, + "name": name, + "namespace": namespace or '', + "loader": str(self.__class__.__name__), + "representation": str(context["representation"]["_id"]), + "libpath": libpath, + "asset_name": asset_name, + "parent": str(context["representation"]["parent"]), + "family": context["representation"]["context"]["family"] + } + + nodes = objects + self[:] = nodes + return nodes + + def update(self, container: Dict, representation: Dict): + """Update the loaded asset. + + This will remove all objects of the current collection, load the new + ones and add them to the collection. + If the objects of the collection are used in another collection they + will not be removed, only unlinked. Normally this should not be the + case though. + + Warning: + No nested collections are supported at the moment! + """ + object_name = container["objectName"] + asset_group = bpy.data.objects.get(object_name) + libpath = Path(api.get_representation_path(representation)) + extension = libpath.suffix.lower() + + self.log.info( + "Container: %s\nRepresentation: %s", + pformat(container, indent=2), + pformat(representation, indent=2), + ) + + assert asset_group, ( + f"The asset is not loaded: {container['objectName']}" + ) + assert libpath, ( + "No existing library file found for {container['objectName']}" + ) + assert libpath.is_file(), ( + f"The file doesn't exist: {libpath}" + ) + assert extension in plugin.VALID_EXTENSIONS, ( + f"Unsupported file: {libpath}" + ) + + metadata = asset_group.get(AVALON_PROPERTY) + group_libpath = metadata["libpath"] + + normalized_group_libpath = ( + str(Path(bpy.path.abspath(group_libpath)).resolve()) + ) + normalized_libpath = ( + str(Path(bpy.path.abspath(str(libpath))).resolve()) + ) + self.log.debug( + "normalized_group_libpath:\n %s\nnormalized_libpath:\n %s", + normalized_group_libpath, + normalized_libpath, + ) + if normalized_group_libpath == normalized_libpath: + self.log.info("Library already loaded, not updating...") + return + + mat = asset_group.matrix_basis.copy() + self._remove(asset_group) + + self._process(str(libpath), asset_group, object_name) + asset_group.matrix_basis = mat + + metadata["libpath"] = str(libpath) + metadata["representation"] = str(representation["_id"]) + + def remove(self, container: Dict) -> bool: + """Remove an existing container from a Blender scene. + + Arguments: + container (openpype:container-1.0): Container to remove, + from `host.ls()`. + + Returns: + bool: Whether the container was deleted. + + Warning: + No nested collections are supported at the moment! + """ + object_name = container["objectName"] + asset_group = bpy.data.objects.get(object_name) + + if not asset_group: + return False + + self._remove(asset_group) + + bpy.data.objects.remove(asset_group) + + return True diff --git a/openpype/hosts/blender/plugins/load/load_model.py b/openpype/hosts/blender/plugins/load/load_model.py index 7e757f5433..dd1b76034b 100644 --- a/openpype/hosts/blender/plugins/load/load_model.py +++ b/openpype/hosts/blender/plugins/load/load_model.py @@ -200,9 +200,11 @@ class BlendModelLoader(plugin.AssetLoader): self.log.info("Library already loaded, not updating...") return + mat = asset_group.matrix_basis.copy() self._remove(asset_group) self._process(str(libpath), asset_group, object_name) + asset_group.matrix_basis = mat metadata["libpath"] = str(libpath) metadata["representation"] = str(representation["_id"]) diff --git a/openpype/hosts/blender/plugins/publish/extract_abc.py b/openpype/hosts/blender/plugins/publish/extract_abc.py index 97123c5967..4696da3db4 100644 --- a/openpype/hosts/blender/plugins/publish/extract_abc.py +++ b/openpype/hosts/blender/plugins/publish/extract_abc.py @@ -47,7 +47,7 @@ class ExtractABC(api.Extractor): context, filepath=filepath, selected=True, - flatten=True + flatten=False ) bpy.ops.object.select_all(action='DESELECT') From 4717b4dc0bca85735bcdfea2dee9054d16652297 Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Fri, 4 Jun 2021 11:18:14 +0100 Subject: [PATCH 05/38] Remove linked library when it is not used anymore --- .../hosts/blender/plugins/load/load_model.py | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/openpype/hosts/blender/plugins/load/load_model.py b/openpype/hosts/blender/plugins/load/load_model.py index dd1b76034b..a6ace64254 100644 --- a/openpype/hosts/blender/plugins/load/load_model.py +++ b/openpype/hosts/blender/plugins/load/load_model.py @@ -200,10 +200,23 @@ class BlendModelLoader(plugin.AssetLoader): self.log.info("Library already loaded, not updating...") return + # Check how many assets use the same library + count = 0 + for obj in bpy.data.collections.get(AVALON_CONTAINERS).objects: + if obj.get(AVALON_PROPERTY).get('libpath') == group_libpath: + count += 1 + mat = asset_group.matrix_basis.copy() + self._remove(asset_group) + # If it is the last object to use that library, remove it + if count == 1: + library = bpy.data.libraries.get(bpy.path.basename(group_libpath)) + bpy.data.libraries.remove(library) + self._process(str(libpath), asset_group, object_name) + asset_group.matrix_basis = mat metadata["libpath"] = str(libpath) @@ -221,6 +234,13 @@ class BlendModelLoader(plugin.AssetLoader): """ object_name = container["objectName"] asset_group = bpy.data.objects.get(object_name) + libpath = asset_group.get(AVALON_PROPERTY).get('libpath') + + # Check how many assets use the same library + count = 0 + for obj in bpy.data.collections.get(AVALON_CONTAINERS).objects: + if obj.get(AVALON_PROPERTY).get('libpath') == libpath: + count += 1 if not asset_group: return False @@ -229,4 +249,9 @@ class BlendModelLoader(plugin.AssetLoader): bpy.data.objects.remove(asset_group) + # If it is the last object to use that library, remove it + if count == 1: + library = bpy.data.libraries.get(bpy.path.basename(libpath)) + bpy.data.libraries.remove(library) + return True From 96b3e063ba766ca79bd1c2b5b7b80964cde586bf Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Fri, 4 Jun 2021 11:26:37 +0100 Subject: [PATCH 06/38] Code refinement --- openpype/hosts/blender/plugins/load/load_abc.py | 5 ++--- openpype/hosts/blender/plugins/load/load_fbx_model.py | 5 ++--- openpype/hosts/blender/plugins/load/load_model.py | 11 +++-------- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/openpype/hosts/blender/plugins/load/load_abc.py b/openpype/hosts/blender/plugins/load/load_abc.py index 7261e002f1..522a7fd63a 100644 --- a/openpype/hosts/blender/plugins/load/load_abc.py +++ b/openpype/hosts/blender/plugins/load/load_abc.py @@ -161,9 +161,8 @@ class CacheModelLoader(plugin.AssetLoader): "family": context["representation"]["context"]["family"] } - nodes = objects - self[:] = nodes - return nodes + self[:] = objects + return objects def update(self, container: Dict, representation: Dict): """Update the loaded asset. diff --git a/openpype/hosts/blender/plugins/load/load_fbx_model.py b/openpype/hosts/blender/plugins/load/load_fbx_model.py index 776217e5f1..0e49eada3f 100644 --- a/openpype/hosts/blender/plugins/load/load_fbx_model.py +++ b/openpype/hosts/blender/plugins/load/load_fbx_model.py @@ -157,9 +157,8 @@ class FbxModelLoader(plugin.AssetLoader): "family": context["representation"]["context"]["family"] } - nodes = objects - self[:] = nodes - return nodes + self[:] = objects + return objects def update(self, container: Dict, representation: Dict): """Update the loaded asset. diff --git a/openpype/hosts/blender/plugins/load/load_model.py b/openpype/hosts/blender/plugins/load/load_model.py index a6ace64254..ff2d526d10 100644 --- a/openpype/hosts/blender/plugins/load/load_model.py +++ b/openpype/hosts/blender/plugins/load/load_model.py @@ -29,7 +29,6 @@ class BlendModelLoader(plugin.AssetLoader): def _remove(self, asset_group): objects = list(asset_group.children) - empties = [] for obj in objects: if obj.type == 'MESH': @@ -38,10 +37,7 @@ class BlendModelLoader(plugin.AssetLoader): bpy.data.meshes.remove(obj.data) elif obj.type == 'EMPTY': objects.extend(obj.children) - empties.append(obj) - - for empty in empties: - bpy.data.objects.remove(empty) + bpy.data.objects.remove(obj) def _process(self, libpath, asset_group, group_name): relative = bpy.context.preferences.filepaths.use_relative_paths @@ -145,9 +141,8 @@ class BlendModelLoader(plugin.AssetLoader): "family": context["representation"]["context"]["family"] } - nodes = objects - self[:] = nodes - return nodes + self[:] = objects + return objects def update(self, container: Dict, representation: Dict): """Update the loaded asset. From 015f001d73993886a61ea80b7e00a5d7f14d4f43 Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Wed, 9 Jun 2021 10:44:44 +0100 Subject: [PATCH 07/38] Improved rig assets handling --- .../blender/plugins/create/create_rig.py | 41 ++- .../hosts/blender/plugins/load/load_rig.py | 329 +++++++++--------- .../blender/plugins/publish/extract_fbx.py | 15 +- 3 files changed, 187 insertions(+), 198 deletions(-) diff --git a/openpype/hosts/blender/plugins/create/create_rig.py b/openpype/hosts/blender/plugins/create/create_rig.py index 116fb9f742..45c0f836d1 100644 --- a/openpype/hosts/blender/plugins/create/create_rig.py +++ b/openpype/hosts/blender/plugins/create/create_rig.py @@ -4,10 +4,11 @@ import bpy from avalon import api from avalon.blender import lib -import openpype.hosts.blender.api.plugin +from avalon.blender.pipeline import AVALON_INSTANCES +from openpype.hosts.blender.api import plugin -class CreateRig(openpype.hosts.blender.api.plugin.Creator): +class CreateRig(plugin.Creator): """Artist-friendly rig with controls to direct motion""" name = "rigMain" @@ -16,26 +17,30 @@ class CreateRig(openpype.hosts.blender.api.plugin.Creator): icon = "wheelchair" def process(self): + # Get Instance Containter or create it if it does not exist + instances = bpy.data.collections.get(AVALON_INSTANCES) + if not instances: + instances = bpy.data.collections.new(name=AVALON_INSTANCES) + bpy.context.scene.collection.children.link(instances) + # Create instance object asset = self.data["asset"] subset = self.data["subset"] - name = openpype.hosts.blender.api.plugin.asset_name(asset, subset) - collection = bpy.data.collections.new(name=name) - bpy.context.scene.collection.children.link(collection) + name = plugin.asset_name(asset, subset) + asset_group = bpy.data.objects.new(name=name, object_data=None) + instances.objects.link(asset_group) self.data['task'] = api.Session.get('AVALON_TASK') - lib.imprint(collection, self.data) - - # Add the rig object and all the children meshes to - # a set and link them all at the end to avoid duplicates. - # Blender crashes if trying to link an object that is already linked. - # This links automatically the children meshes if they were not - # selected, and doesn't link them twice if they, insted, - # were manually selected by the user. + lib.imprint(asset_group, self.data) + # Add selected objects to instance if (self.options or {}).get("useSelection"): - for obj in lib.get_selection(): - for child in obj.users_collection[0].children: - collection.children.link(child) - collection.objects.link(obj) + bpy.context.view_layer.objects.active = asset_group + selected = lib.get_selection() + for obj in selected: + obj.select_set(True) + selected.append(asset_group) + context = plugin.create_blender_context( + active=asset_group, selected=selected) + bpy.ops.object.parent_set(context, keep_transform=True) - return collection + return asset_group diff --git a/openpype/hosts/blender/plugins/load/load_rig.py b/openpype/hosts/blender/plugins/load/load_rig.py index b6be8f4cf6..6fa7460d76 100644 --- a/openpype/hosts/blender/plugins/load/load_rig.py +++ b/openpype/hosts/blender/plugins/load/load_rig.py @@ -1,21 +1,20 @@ """Load a rig asset in Blender.""" -import logging from pathlib import Path from pprint import pformat from typing import Dict, List, Optional -from avalon import api, blender import bpy -import openpype.hosts.blender.api.plugin as plugin + +from avalon import api +from avalon.blender.pipeline import AVALON_CONTAINERS +from avalon.blender.pipeline import AVALON_CONTAINER_ID +from avalon.blender.pipeline import AVALON_PROPERTY +from openpype.hosts.blender.api import plugin class BlendRigLoader(plugin.AssetLoader): - """Load rigs from a .blend file. - - Because they come from a .blend file we can simply link the collection that - contains the model. There is no further need to 'containerise' it. - """ + """Load rigs from a .blend file.""" families = ["rig"] representations = ["blend"] @@ -24,105 +23,110 @@ class BlendRigLoader(plugin.AssetLoader): icon = "code-fork" color = "orange" - def _remove(self, objects, obj_container): - for obj in list(objects): - if obj.type == 'ARMATURE': - bpy.data.armatures.remove(obj.data) - elif obj.type == 'MESH': + def _remove(self, asset_group): + objects = list(asset_group.children) + + for obj in objects: + if obj.type == 'MESH': + for material_slot in list(obj.material_slots): + bpy.data.materials.remove(material_slot.material) bpy.data.meshes.remove(obj.data) + elif obj.type == 'ARMATURE': + objects.extend(obj.children) + bpy.data.armatures.remove(obj.data) elif obj.type == 'CURVE': bpy.data.curves.remove(obj.data) + elif obj.type == 'EMPTY': + objects.extend(obj.children) + bpy.data.objects.remove(obj) - for child in obj_container.children: - bpy.data.collections.remove(child) - - bpy.data.collections.remove(obj_container) - - def make_local_and_metadata(self, obj, collection_name): - local_obj = plugin.prepare_data(obj, collection_name) - plugin.prepare_data(local_obj.data, collection_name) - - if not local_obj.get(blender.pipeline.AVALON_PROPERTY): - local_obj[blender.pipeline.AVALON_PROPERTY] = dict() - - avalon_info = local_obj[blender.pipeline.AVALON_PROPERTY] - avalon_info.update({"container_name": collection_name + '_CON'}) - - return local_obj - - def _process( - self, libpath, lib_container, collection_name, - action, parent_collection - ): + def _process(self, libpath, asset_group, group_name, action): relative = bpy.context.preferences.filepaths.use_relative_paths with bpy.data.libraries.load( libpath, link=True, relative=relative - ) as (_, data_to): - data_to.collections = [lib_container] + ) as (data_from, data_to): + data_to.objects = data_from.objects - parent = parent_collection + parent = bpy.context.scene.collection - if parent is None: - parent = bpy.context.scene.collection + empties = [obj for obj in data_to.objects if obj.type == 'EMPTY'] - parent.children.link(bpy.data.collections[lib_container]) + container = None - rig_container = parent.children[lib_container].make_local() - rig_container.name = collection_name + for empty in empties: + if empty.get(AVALON_PROPERTY): + container = empty + break + assert container, "No asset group found" + + # Children must be linked before parents, + # otherwise the hierarchy will break objects = [] - armatures = [ - obj for obj in rig_container.objects - if obj.type == 'ARMATURE' - ] + nodes = list(container.children) - for child in rig_container.children: - local_child = plugin.prepare_data(child, collection_name) - objects.extend(local_child.objects) + for obj in nodes: + obj.parent = asset_group - # for obj in bpy.data.objects: - # obj.select_set(False) + for obj in nodes: + objects.append(obj) + nodes.extend(list(obj.children)) + + objects.reverse() constraints = [] + armatures = [obj for obj in objects if obj.type == 'ARMATURE'] + for armature in armatures: for bone in armature.pose.bones: for constraint in bone.constraints: if hasattr(constraint, 'target'): constraints.append(constraint) - # Link armatures after other objects. - # The armature is unparented for all the non-local meshes, - # when it is made local. for obj in objects: - local_obj = self.make_local_and_metadata(obj, collection_name) + parent.objects.link(obj) - if obj != local_obj: - for constraint in constraints: - if constraint.target == obj: - constraint.target = local_obj + for obj in objects: + local_obj = plugin.prepare_data(obj, group_name) - for armature in armatures: - local_obj = self.make_local_and_metadata(armature, collection_name) + if obj.type == 'MESH': + plugin.prepare_data(local_obj.data, group_name) - if action is not None: - local_obj.animation_data.action = action - elif local_obj.animation_data.action is not None: - plugin.prepare_data( - local_obj.animation_data.action, collection_name) + if obj != local_obj: + for constraint in constraints: + if constraint.target == obj: + constraint.target = local_obj - # Set link the drivers to the local object - if local_obj.data.animation_data: - for d in local_obj.data.animation_data.drivers: - for v in d.driver.variables: - for t in v.targets: - t.id = local_obj + for material_slot in local_obj.material_slots: + plugin.prepare_data(material_slot.material, group_name) + elif obj.type == 'ARMATURE': + plugin.prepare_data(local_obj.data, group_name) - rig_container.pop(blender.pipeline.AVALON_PROPERTY) + if action is not None: + local_obj.animation_data.action = action + elif local_obj.animation_data.action is not None: + plugin.prepare_data( + local_obj.animation_data.action, group_name) + + # Set link the drivers to the local object + if local_obj.data.animation_data: + for d in local_obj.data.animation_data.drivers: + for v in d.driver.variables: + for t in v.targets: + t.id = local_obj + + if not obj.get(AVALON_PROPERTY): + local_obj[AVALON_PROPERTY] = dict() + + avalon_info = local_obj[AVALON_PROPERTY] + avalon_info.update({"container_name": group_name}) + + objects.reverse() bpy.ops.object.select_all(action='DESELECT') - return rig_container + return objects def process_asset( self, context: dict, name: str, namespace: Optional[str] = None, @@ -138,61 +142,48 @@ class BlendRigLoader(plugin.AssetLoader): libpath = self.fname asset = context["asset"]["name"] subset = context["subset"]["name"] - lib_container = plugin.asset_name( - asset, subset - ) - unique_number = plugin.get_unique_number( - asset, subset - ) + + asset_name = plugin.asset_name(asset, subset) + unique_number = plugin.get_unique_number(asset, subset) + group_name = plugin.asset_name(asset, subset, unique_number) namespace = namespace or f"{asset}_{unique_number}" - collection_name = plugin.asset_name( - asset, subset, unique_number - ) - container = bpy.data.collections.new(collection_name) - blender.pipeline.containerise_existing( - container, - name, - namespace, - context, - self.__class__.__name__, - ) + avalon_container = bpy.data.collections.get(AVALON_CONTAINERS) + if not avalon_container: + avalon_container = bpy.data.collections.new(name=AVALON_CONTAINERS) + bpy.context.scene.collection.children.link(avalon_container) - metadata = container.get(blender.pipeline.AVALON_PROPERTY) + asset_group = bpy.data.objects.new(group_name, object_data=None) + avalon_container.objects.link(asset_group) - metadata["libpath"] = libpath - metadata["lib_container"] = lib_container + objects = self._process(libpath, asset_group, group_name, None) - obj_container = self._process( - libpath, lib_container, collection_name, None, None) + bpy.context.scene.collection.objects.link(asset_group) - metadata["obj_container"] = obj_container - # Save the list of objects in the metadata container - metadata["objects"] = obj_container.all_objects + asset_group[AVALON_PROPERTY] = { + "schema": "openpype:container-2.0", + "id": AVALON_CONTAINER_ID, + "name": name, + "namespace": namespace or '', + "loader": str(self.__class__.__name__), + "representation": str(context["representation"]["_id"]), + "libpath": libpath, + "asset_name": asset_name, + "parent": str(context["representation"]["parent"]), + "family": context["representation"]["context"]["family"] + } - metadata["parent"] = str(context["representation"]["parent"]) - metadata["family"] = context["representation"]["context"]["family"] - - nodes = list(container.objects) - nodes.append(container) - self[:] = nodes - return nodes + self[:] = objects + return objects def update(self, container: Dict, representation: Dict): """Update the loaded asset. - This will remove all objects of the current collection, load the new - ones and add them to the collection. - If the objects of the collection are used in another collection they - will not be removed, only unlinked. Normally this should not be the - case though. - - Warning: - No nested collections are supported at the moment! + This will remove all children of the asset group, load the new ones + and add them as children of the group. """ - collection = bpy.data.collections.get( - container["objectName"] - ) + object_name = container["objectName"] + asset_group = bpy.data.objects.get(object_name) libpath = Path(api.get_representation_path(representation)) extension = libpath.suffix.lower() @@ -202,12 +193,9 @@ class BlendRigLoader(plugin.AssetLoader): pformat(representation, indent=2), ) - assert collection, ( + assert asset_group, ( f"The asset is not loaded: {container['objectName']}" ) - assert not (collection.children), ( - "Nested collections are not supported." - ) assert libpath, ( "No existing library file found for {container['objectName']}" ) @@ -218,89 +206,84 @@ class BlendRigLoader(plugin.AssetLoader): f"Unsupported file: {libpath}" ) - collection_metadata = collection.get( - blender.pipeline.AVALON_PROPERTY) - collection_libpath = collection_metadata["libpath"] - lib_container = collection_metadata["lib_container"] + metadata = asset_group.get(AVALON_PROPERTY) + group_libpath = metadata["libpath"] - obj_container = plugin.get_local_collection_with_name( - collection_metadata["obj_container"].name - ) - objects = obj_container.all_objects - - container_name = obj_container.name - - normalized_collection_libpath = ( - str(Path(bpy.path.abspath(collection_libpath)).resolve()) + normalized_group_libpath = ( + str(Path(bpy.path.abspath(group_libpath)).resolve()) ) normalized_libpath = ( str(Path(bpy.path.abspath(str(libpath))).resolve()) ) self.log.debug( - "normalized_collection_libpath:\n %s\nnormalized_libpath:\n %s", - normalized_collection_libpath, + "normalized_group_libpath:\n %s\nnormalized_libpath:\n %s", + normalized_group_libpath, normalized_libpath, ) - if normalized_collection_libpath == normalized_libpath: + if normalized_group_libpath == normalized_libpath: self.log.info("Library already loaded, not updating...") return - # Get the armature of the rig - armatures = [obj for obj in objects if obj.type == 'ARMATURE'] - assert(len(armatures) == 1) + # Check how many assets use the same library + count = 0 + for obj in bpy.data.collections.get(AVALON_CONTAINERS).objects: + if obj.get(AVALON_PROPERTY).get('libpath') == group_libpath: + count += 1 + + # # Get the armature of the rig + objects = asset_group.children + armature = [obj for obj in objects if obj.type == 'ARMATURE'][0] action = None - if armatures[0].animation_data and armatures[0].animation_data.action: - action = armatures[0].animation_data.action + if armature.animation_data and armature.animation_data.action: + action = armature.animation_data.action - parent = plugin.get_parent_collection(obj_container) + mat = asset_group.matrix_basis.copy() - self._remove(objects, obj_container) + self._remove(asset_group) - obj_container = self._process( - str(libpath), lib_container, container_name, action, parent) + # If it is the last object to use that library, remove it + if count == 1: + library = bpy.data.libraries.get(bpy.path.basename(group_libpath)) + bpy.data.libraries.remove(library) - # Save the list of objects in the metadata container - collection_metadata["obj_container"] = obj_container - collection_metadata["objects"] = obj_container.all_objects - collection_metadata["libpath"] = str(libpath) - collection_metadata["representation"] = str(representation["_id"]) + self._process(str(libpath), asset_group, object_name, action) - bpy.ops.object.select_all(action='DESELECT') + asset_group.matrix_basis = mat + + metadata["libpath"] = str(libpath) + metadata["representation"] = str(representation["_id"]) def remove(self, container: Dict) -> bool: - """Remove an existing container from a Blender scene. + """Remove an existing asset group from a Blender scene. Arguments: container (openpype:container-1.0): Container to remove, from `host.ls()`. Returns: - bool: Whether the container was deleted. - - Warning: - No nested collections are supported at the moment! + bool: Whether the asset group was deleted. """ + object_name = container["objectName"] + asset_group = bpy.data.objects.get(object_name) + libpath = asset_group.get(AVALON_PROPERTY).get('libpath') - collection = bpy.data.collections.get( - container["objectName"] - ) - if not collection: + # Check how many assets use the same library + count = 0 + for obj in bpy.data.collections.get(AVALON_CONTAINERS).objects: + if obj.get(AVALON_PROPERTY).get('libpath') == libpath: + count += 1 + + if not asset_group: return False - assert not (collection.children), ( - "Nested collections are not supported." - ) - collection_metadata = collection.get( - blender.pipeline.AVALON_PROPERTY) + self._remove(asset_group) - obj_container = plugin.get_local_collection_with_name( - collection_metadata["obj_container"].name - ) - objects = obj_container.all_objects + bpy.data.objects.remove(asset_group) - self._remove(objects, obj_container) - - bpy.data.collections.remove(collection) + # If it is the last object to use that library, remove it + if count == 1: + library = bpy.data.libraries.get(bpy.path.basename(libpath)) + bpy.data.libraries.remove(library) return True diff --git a/openpype/hosts/blender/plugins/publish/extract_fbx.py b/openpype/hosts/blender/plugins/publish/extract_fbx.py index f95a0a3283..b91f2a75ef 100644 --- a/openpype/hosts/blender/plugins/publish/extract_fbx.py +++ b/openpype/hosts/blender/plugins/publish/extract_fbx.py @@ -21,8 +21,6 @@ class ExtractFBX(api.Extractor): filename = f"{instance.name}.fbx" filepath = os.path.join(stagingdir, filename) - scene = bpy.context.scene - # Perform extraction self.log.info("Performing extraction..") @@ -41,12 +39,16 @@ class ExtractFBX(api.Extractor): active=asset_group, selected=selected) new_materials = [] + new_materials_objs = [] + objects = list(asset_group.children) - for obj in collections[0].all_objects: - if obj.type == 'MESH': + for obj in objects: + objects.extend(obj.children) + if obj.type == 'MESH' and len(obj.data.materials) == 0: mat = bpy.data.materials.new(obj.name) obj.data.materials.append(mat) new_materials.append(mat) + new_materials_objs.append(obj) # We export the fbx bpy.ops.export_scene.fbx( @@ -63,9 +65,8 @@ class ExtractFBX(api.Extractor): for mat in new_materials: bpy.data.materials.remove(mat) - for obj in collections[0].all_objects: - if obj.type == 'MESH': - obj.data.materials.pop() + for obj in new_materials_objs: + obj.data.materials.pop() if "representations" not in instance.data: instance.data["representations"] = [] From 3987223870da99fc7ec7d4100e3e6302fe383524 Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Wed, 9 Jun 2021 10:45:22 +0100 Subject: [PATCH 08/38] Added new validators for Blender --- .../publish/validate_no_colons_in _name.py | 39 ++++++++++++++++++ .../publish/validate_transform_zero.py | 40 +++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 openpype/hosts/blender/plugins/publish/validate_no_colons_in _name.py create mode 100644 openpype/hosts/blender/plugins/publish/validate_transform_zero.py diff --git a/openpype/hosts/blender/plugins/publish/validate_no_colons_in _name.py b/openpype/hosts/blender/plugins/publish/validate_no_colons_in _name.py new file mode 100644 index 0000000000..261ff864d5 --- /dev/null +++ b/openpype/hosts/blender/plugins/publish/validate_no_colons_in _name.py @@ -0,0 +1,39 @@ +from typing import List + +import pyblish.api +import openpype.hosts.blender.api.action + + +class ValidateNoColonsInName(pyblish.api.InstancePlugin): + """There cannot be colons in names + + Object or bone names cannot include colons. Other software do not + handle colons correctly. + + """ + + order = openpype.api.ValidateContentsOrder + hosts = ["blender"] + families = ["model", "rig"] + version = (0, 1, 0) + label = "No Colons in names" + actions = [openpype.hosts.blender.api.action.SelectInvalidAction] + + @classmethod + def get_invalid(cls, instance) -> List: + invalid = [] + for obj in [obj for obj in instance]: + if ':' in obj.name: + invalid.append(obj) + if obj.type == 'ARMATURE': + for bone in obj.data.bones: + if ':' in bone.name: + invalid.append(obj) + break + return invalid + + def process(self, instance): + invalid = self.get_invalid(instance) + if invalid: + raise RuntimeError( + f"Objects found with colon in name: {invalid}") diff --git a/openpype/hosts/blender/plugins/publish/validate_transform_zero.py b/openpype/hosts/blender/plugins/publish/validate_transform_zero.py new file mode 100644 index 0000000000..7456dbc423 --- /dev/null +++ b/openpype/hosts/blender/plugins/publish/validate_transform_zero.py @@ -0,0 +1,40 @@ +from typing import List + +import mathutils + +import pyblish.api +import openpype.hosts.blender.api.action + + +class ValidateTransformZero(pyblish.api.InstancePlugin): + """Transforms can't have any values + + To solve this issue, try freezing the transforms. So long + as the transforms, rotation and scale values are zero, + you're all good. + + """ + + order = openpype.api.ValidateContentsOrder + hosts = ["blender"] + families = ["model"] + category = "geometry" + version = (0, 1, 0) + label = "Transform Zero" + actions = [openpype.hosts.blender.api.action.SelectInvalidAction] + + _identity = mathutils.Matrix() + + @classmethod + def get_invalid(cls, instance) -> List: + invalid = [] + for obj in [obj for obj in instance]: + if obj.matrix_basis != cls._identity: + invalid.append(obj) + return invalid + + def process(self, instance): + invalid = self.get_invalid(instance) + if invalid: + raise RuntimeError( + f"Object found in instance is not in Object Mode: {invalid}") From 32c876db85b084b369dde0a633de7c372cf6d3c9 Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Wed, 9 Jun 2021 11:17:26 +0100 Subject: [PATCH 09/38] Changed default display type for asset groups --- openpype/hosts/blender/plugins/create/create_model.py | 1 + openpype/hosts/blender/plugins/create/create_rig.py | 1 + openpype/hosts/blender/plugins/load/load_model.py | 1 + openpype/hosts/blender/plugins/load/load_rig.py | 1 + 4 files changed, 4 insertions(+) diff --git a/openpype/hosts/blender/plugins/create/create_model.py b/openpype/hosts/blender/plugins/create/create_model.py index e318cd07da..ecc6f4bf22 100644 --- a/openpype/hosts/blender/plugins/create/create_model.py +++ b/openpype/hosts/blender/plugins/create/create_model.py @@ -28,6 +28,7 @@ class CreateModel(plugin.Creator): subset = self.data["subset"] name = plugin.asset_name(asset, subset) asset_group = bpy.data.objects.new(name=name, object_data=None) + asset_group.empty_display_type = 'SINGLE_ARROW' instances.objects.link(asset_group) self.data['task'] = api.Session.get('AVALON_TASK') lib.imprint(asset_group, self.data) diff --git a/openpype/hosts/blender/plugins/create/create_rig.py b/openpype/hosts/blender/plugins/create/create_rig.py index 45c0f836d1..0f1c686816 100644 --- a/openpype/hosts/blender/plugins/create/create_rig.py +++ b/openpype/hosts/blender/plugins/create/create_rig.py @@ -28,6 +28,7 @@ class CreateRig(plugin.Creator): subset = self.data["subset"] name = plugin.asset_name(asset, subset) asset_group = bpy.data.objects.new(name=name, object_data=None) + asset_group.empty_display_type = 'SINGLE_ARROW' instances.objects.link(asset_group) self.data['task'] = api.Session.get('AVALON_TASK') lib.imprint(asset_group, self.data) diff --git a/openpype/hosts/blender/plugins/load/load_model.py b/openpype/hosts/blender/plugins/load/load_model.py index ff2d526d10..3f7967cd0d 100644 --- a/openpype/hosts/blender/plugins/load/load_model.py +++ b/openpype/hosts/blender/plugins/load/load_model.py @@ -122,6 +122,7 @@ class BlendModelLoader(plugin.AssetLoader): bpy.context.scene.collection.children.link(avalon_container) asset_group = bpy.data.objects.new(group_name, object_data=None) + asset_group.empty_display_type = 'SINGLE_ARROW' avalon_container.objects.link(asset_group) objects = self._process(libpath, asset_group, group_name) diff --git a/openpype/hosts/blender/plugins/load/load_rig.py b/openpype/hosts/blender/plugins/load/load_rig.py index 6fa7460d76..fe58d0f0a7 100644 --- a/openpype/hosts/blender/plugins/load/load_rig.py +++ b/openpype/hosts/blender/plugins/load/load_rig.py @@ -154,6 +154,7 @@ class BlendRigLoader(plugin.AssetLoader): bpy.context.scene.collection.children.link(avalon_container) asset_group = bpy.data.objects.new(group_name, object_data=None) + asset_group.empty_display_type = 'SINGLE_ARROW' avalon_container.objects.link(asset_group) objects = self._process(libpath, asset_group, group_name, None) From c8c70cc0a79c51659ec4371df3ed5ed431df50a3 Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Wed, 9 Jun 2021 11:21:43 +0100 Subject: [PATCH 10/38] Fixed problem when loading rig and missing material in material slot --- openpype/hosts/blender/plugins/load/load_rig.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/blender/plugins/load/load_rig.py b/openpype/hosts/blender/plugins/load/load_rig.py index fe58d0f0a7..306c4aa03b 100644 --- a/openpype/hosts/blender/plugins/load/load_rig.py +++ b/openpype/hosts/blender/plugins/load/load_rig.py @@ -99,7 +99,8 @@ class BlendRigLoader(plugin.AssetLoader): constraint.target = local_obj for material_slot in local_obj.material_slots: - plugin.prepare_data(material_slot.material, group_name) + if material_slot.material: + plugin.prepare_data(material_slot.material, group_name) elif obj.type == 'ARMATURE': plugin.prepare_data(local_obj.data, group_name) From 6ee64d09ab09e9b834144e16e6c7c5286b421eb8 Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Mon, 21 Jun 2021 11:40:58 +0100 Subject: [PATCH 11/38] Loaders and creators now use Blender main thread to operate --- openpype/hosts/blender/api/plugin.py | 26 +++++++- .../blender/plugins/create/create_model.py | 11 ++-- .../blender/plugins/create/create_rig.py | 11 ++-- .../hosts/blender/plugins/load/load_abc.py | 6 +- .../load/{load_fbx_model.py => load_fbx.py} | 59 +++++++++++++------ .../hosts/blender/plugins/load/load_model.py | 4 +- .../hosts/blender/plugins/load/load_rig.py | 9 +-- 7 files changed, 87 insertions(+), 39 deletions(-) rename openpype/hosts/blender/plugins/load/{load_fbx_model.py => load_fbx.py} (82%) diff --git a/openpype/hosts/blender/api/plugin.py b/openpype/hosts/blender/api/plugin.py index f3cf2b88cd..b0df2d7109 100644 --- a/openpype/hosts/blender/api/plugin.py +++ b/openpype/hosts/blender/api/plugin.py @@ -6,10 +6,11 @@ from typing import Dict, List, Optional import bpy from avalon import api, blender +from avalon.blender import ops from avalon.blender.pipeline import AVALON_CONTAINERS from openpype.api import PypeCreatorMixin -VALID_EXTENSIONS = [".blend", ".json", ".abc"] +VALID_EXTENSIONS = [".blend", ".json", ".abc", ".fbx"] def asset_name( @@ -161,6 +162,15 @@ class AssetLoader(api.Loader): raise NotImplementedError("Must be implemented by a sub-class") def load(self, + context: dict, + name: Optional[str] = None, + namespace: Optional[str] = None, + options: Optional[Dict] = None) -> Optional[bpy.types.Collection]: + """ Run the loader on Blender main thread""" + mti = ops.MainThreadItem(self._load, context, name, namespace, options) + ops.execute_in_main_thread(mti) + + def _load(self, context: dict, name: Optional[str] = None, namespace: Optional[str] = None, @@ -216,10 +226,20 @@ class AssetLoader(api.Loader): return self._get_instance_collection(instance_name, nodes) + def exec_update(self, container: Dict, representation: Dict): + """Must be implemented by a sub-class""" + raise NotImplementedError("Must be implemented by a sub-class") + def update(self, container: Dict, representation: Dict): + """ Run the update on Blender main thread""" + mti = ops.MainThreadItem(self.exec_update, container, representation) + ops.execute_in_main_thread(mti) + + def exec_remove(self, container: Dict) -> bool: """Must be implemented by a sub-class""" raise NotImplementedError("Must be implemented by a sub-class") def remove(self, container: Dict) -> bool: - """Must be implemented by a sub-class""" - raise NotImplementedError("Must be implemented by a sub-class") + """ Run the remove on Blender main thread""" + mti = ops.MainThreadItem(self.exec_remove, container) + ops.execute_in_main_thread(mti) diff --git a/openpype/hosts/blender/plugins/create/create_model.py b/openpype/hosts/blender/plugins/create/create_model.py index ecc6f4bf22..e778f5b74f 100644 --- a/openpype/hosts/blender/plugins/create/create_model.py +++ b/openpype/hosts/blender/plugins/create/create_model.py @@ -3,7 +3,7 @@ import bpy from avalon import api -from avalon.blender import lib +from avalon.blender import lib, ops from avalon.blender.pipeline import AVALON_INSTANCES from openpype.hosts.blender.api import plugin @@ -17,6 +17,11 @@ class CreateModel(plugin.Creator): icon = "cube" def process(self): + """ Run the creator on Blender main thread""" + mti = ops.MainThreadItem(self._process) + ops.execute_in_main_thread(mti) + + def _process(self): # Get Instance Containter or create it if it does not exist instances = bpy.data.collections.get(AVALON_INSTANCES) if not instances: @@ -40,8 +45,6 @@ class CreateModel(plugin.Creator): for obj in selected: obj.select_set(True) selected.append(asset_group) - context = plugin.create_blender_context( - active=asset_group, selected=selected) - bpy.ops.object.parent_set(context, keep_transform=True) + bpy.ops.object.parent_set(keep_transform=True) return asset_group diff --git a/openpype/hosts/blender/plugins/create/create_rig.py b/openpype/hosts/blender/plugins/create/create_rig.py index 0f1c686816..2e1c71f570 100644 --- a/openpype/hosts/blender/plugins/create/create_rig.py +++ b/openpype/hosts/blender/plugins/create/create_rig.py @@ -3,7 +3,7 @@ import bpy from avalon import api -from avalon.blender import lib +from avalon.blender import lib, ops from avalon.blender.pipeline import AVALON_INSTANCES from openpype.hosts.blender.api import plugin @@ -17,6 +17,11 @@ class CreateRig(plugin.Creator): icon = "wheelchair" def process(self): + """ Run the creator on Blender main thread""" + mti = ops.MainThreadItem(self._process) + ops.execute_in_main_thread(mti) + + def _process(self): # Get Instance Containter or create it if it does not exist instances = bpy.data.collections.get(AVALON_INSTANCES) if not instances: @@ -40,8 +45,6 @@ class CreateRig(plugin.Creator): for obj in selected: obj.select_set(True) selected.append(asset_group) - context = plugin.create_blender_context( - active=asset_group, selected=selected) - bpy.ops.object.parent_set(context, keep_transform=True) + bpy.ops.object.parent_set(keep_transform=True) return asset_group diff --git a/openpype/hosts/blender/plugins/load/load_abc.py b/openpype/hosts/blender/plugins/load/load_abc.py index 522a7fd63a..a985ae684d 100644 --- a/openpype/hosts/blender/plugins/load/load_abc.py +++ b/openpype/hosts/blender/plugins/load/load_abc.py @@ -52,9 +52,7 @@ class CacheModelLoader(plugin.AssetLoader): collection = bpy.context.view_layer.active_layer_collection.collection relative = bpy.context.preferences.filepaths.use_relative_paths - context = plugin.create_blender_context() bpy.ops.wm.alembic_import( - context, filepath=libpath, relative_path=relative ) @@ -164,7 +162,7 @@ class CacheModelLoader(plugin.AssetLoader): self[:] = objects return objects - def update(self, container: Dict, representation: Dict): + def exec_update(self, container: Dict, representation: Dict): """Update the loaded asset. This will remove all objects of the current collection, load the new @@ -227,7 +225,7 @@ class CacheModelLoader(plugin.AssetLoader): metadata["libpath"] = str(libpath) metadata["representation"] = str(representation["_id"]) - def remove(self, container: Dict) -> bool: + def exec_remove(self, container: Dict) -> bool: """Remove an existing container from a Blender scene. Arguments: diff --git a/openpype/hosts/blender/plugins/load/load_fbx_model.py b/openpype/hosts/blender/plugins/load/load_fbx.py similarity index 82% rename from openpype/hosts/blender/plugins/load/load_fbx_model.py rename to openpype/hosts/blender/plugins/load/load_fbx.py index 0e49eada3f..f267bef586 100644 --- a/openpype/hosts/blender/plugins/load/load_fbx_model.py +++ b/openpype/hosts/blender/plugins/load/load_fbx.py @@ -7,7 +7,7 @@ from typing import Dict, List, Optional import bpy from avalon import api -from avalon.blender import lib +from avalon.blender import lib, ops from avalon.blender.pipeline import AVALON_CONTAINERS from avalon.blender.pipeline import AVALON_CONTAINER_ID from avalon.blender.pipeline import AVALON_PROPERTY @@ -20,7 +20,7 @@ class FbxModelLoader(plugin.AssetLoader): Stores the imported asset in an empty named after the asset. """ - families = ["model"] + families = ["model", "rig"] representations = ["fbx"] label = "Load FBX" @@ -29,7 +29,6 @@ class FbxModelLoader(plugin.AssetLoader): def _remove(self, asset_group): objects = list(asset_group.children) - empties = [] for obj in objects: if obj.type == 'MESH': @@ -37,23 +36,21 @@ class FbxModelLoader(plugin.AssetLoader): if material_slot.material: bpy.data.materials.remove(material_slot.material) bpy.data.meshes.remove(obj.data) + elif obj.type == 'ARMATURE': + objects.extend(obj.children) + bpy.data.armatures.remove(obj.data) + elif obj.type == 'CURVE': + bpy.data.curves.remove(obj.data) elif obj.type == 'EMPTY': objects.extend(obj.children) - empties.append(obj) + bpy.data.objects.remove(obj) - for empty in empties: - bpy.data.objects.remove(empty) - - def _process(self, libpath, asset_group, group_name): + def _process(self, libpath, asset_group, group_name, action): bpy.ops.object.select_all(action='DESELECT') collection = bpy.context.view_layer.active_layer_collection.collection - context = plugin.create_blender_context() - bpy.ops.import_scene.fbx( - context, - filepath=libpath - ) + bpy.ops.import_scene.fbx(filepath=libpath) parent = bpy.context.scene.collection @@ -97,9 +94,17 @@ class FbxModelLoader(plugin.AssetLoader): name_data = obj.data.name obj.data.name = f"{group_name}:{name_data}" + if obj.type == 'MESH': for material_slot in obj.material_slots: name_mat = material_slot.material.name material_slot.material.name = f"{group_name}:{name_mat}" + elif obj.type == 'ARMATURE': + anim_data = obj.animation_data + if action is not None: + anim_data.action = action + elif anim_data.action is not None: + name_action = anim_data.action.name + anim_data.action.name = f"{group_name}:{name_action}" if not obj.get(AVALON_PROPERTY): obj[AVALON_PROPERTY] = dict() @@ -122,7 +127,6 @@ class FbxModelLoader(plugin.AssetLoader): context: Full parenthood of representation to load options: Additional settings dictionary """ - libpath = self.fname asset = context["asset"]["name"] subset = context["subset"]["name"] @@ -140,7 +144,14 @@ class FbxModelLoader(plugin.AssetLoader): asset_group = bpy.data.objects.new(group_name, object_data=None) avalon_container.objects.link(asset_group) - objects = self._process(libpath, asset_group, group_name) + objects = self._process(libpath, asset_group, group_name, None) + + objects = [] + nodes = list(asset_group.children) + + for obj in nodes: + objects.append(obj) + nodes.extend(list(obj.children)) bpy.context.scene.collection.objects.link(asset_group) @@ -160,7 +171,7 @@ class FbxModelLoader(plugin.AssetLoader): self[:] = objects return objects - def update(self, container: Dict, representation: Dict): + def exec_update(self, container: Dict, representation: Dict): """Update the loaded asset. This will remove all objects of the current collection, load the new @@ -214,16 +225,28 @@ class FbxModelLoader(plugin.AssetLoader): self.log.info("Library already loaded, not updating...") return + # Get the armature of the rig + objects = asset_group.children + armatures = [obj for obj in objects if obj.type == 'ARMATURE'] + action = None + + if armatures: + armature = armatures[0] + + if armature.animation_data and armature.animation_data.action: + action = armature.animation_data.action + mat = asset_group.matrix_basis.copy() self._remove(asset_group) - self._process(str(libpath), asset_group, object_name) + self._process(str(libpath), asset_group, object_name, action) + asset_group.matrix_basis = mat metadata["libpath"] = str(libpath) metadata["representation"] = str(representation["_id"]) - def remove(self, container: Dict) -> bool: + def exec_remove(self, container: Dict) -> bool: """Remove an existing container from a Blender scene. Arguments: diff --git a/openpype/hosts/blender/plugins/load/load_model.py b/openpype/hosts/blender/plugins/load/load_model.py index 3f7967cd0d..37618b164d 100644 --- a/openpype/hosts/blender/plugins/load/load_model.py +++ b/openpype/hosts/blender/plugins/load/load_model.py @@ -145,7 +145,7 @@ class BlendModelLoader(plugin.AssetLoader): self[:] = objects return objects - def update(self, container: Dict, representation: Dict): + def exec_update(self, container: Dict, representation: Dict): """Update the loaded asset. This will remove all objects of the current collection, load the new @@ -218,7 +218,7 @@ class BlendModelLoader(plugin.AssetLoader): metadata["libpath"] = str(libpath) metadata["representation"] = str(representation["_id"]) - def remove(self, container: Dict) -> bool: + def exec_remove(self, container: Dict) -> bool: """Remove an existing container from a Blender scene. Arguments: diff --git a/openpype/hosts/blender/plugins/load/load_rig.py b/openpype/hosts/blender/plugins/load/load_rig.py index 306c4aa03b..3909a1b4aa 100644 --- a/openpype/hosts/blender/plugins/load/load_rig.py +++ b/openpype/hosts/blender/plugins/load/load_rig.py @@ -29,7 +29,8 @@ class BlendRigLoader(plugin.AssetLoader): for obj in objects: if obj.type == 'MESH': for material_slot in list(obj.material_slots): - bpy.data.materials.remove(material_slot.material) + if material_slot.material: + bpy.data.materials.remove(material_slot.material) bpy.data.meshes.remove(obj.data) elif obj.type == 'ARMATURE': objects.extend(obj.children) @@ -178,7 +179,7 @@ class BlendRigLoader(plugin.AssetLoader): self[:] = objects return objects - def update(self, container: Dict, representation: Dict): + def exec_update(self, container: Dict, representation: Dict): """Update the loaded asset. This will remove all children of the asset group, load the new ones @@ -232,7 +233,7 @@ class BlendRigLoader(plugin.AssetLoader): if obj.get(AVALON_PROPERTY).get('libpath') == group_libpath: count += 1 - # # Get the armature of the rig + # Get the armature of the rig objects = asset_group.children armature = [obj for obj in objects if obj.type == 'ARMATURE'][0] @@ -256,7 +257,7 @@ class BlendRigLoader(plugin.AssetLoader): metadata["libpath"] = str(libpath) metadata["representation"] = str(representation["_id"]) - def remove(self, container: Dict) -> bool: + def exec_remove(self, container: Dict) -> bool: """Remove an existing asset group from a Blender scene. Arguments: From 395b4fe3bd09953673d99dcebc9f9a69b74b7bf9 Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Mon, 21 Jun 2021 11:47:02 +0100 Subject: [PATCH 12/38] Hound fixes --- openpype/hosts/blender/api/plugin.py | 16 ++++++++-------- openpype/hosts/blender/plugins/load/load_fbx.py | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/openpype/hosts/blender/api/plugin.py b/openpype/hosts/blender/api/plugin.py index b0df2d7109..08e688f484 100644 --- a/openpype/hosts/blender/api/plugin.py +++ b/openpype/hosts/blender/api/plugin.py @@ -162,19 +162,19 @@ class AssetLoader(api.Loader): raise NotImplementedError("Must be implemented by a sub-class") def load(self, - context: dict, - name: Optional[str] = None, - namespace: Optional[str] = None, - options: Optional[Dict] = None) -> Optional[bpy.types.Collection]: + context: dict, + name: Optional[str] = None, + namespace: Optional[str] = None, + options: Optional[Dict] = None) -> Optional[bpy.types.Collection]: """ Run the loader on Blender main thread""" mti = ops.MainThreadItem(self._load, context, name, namespace, options) ops.execute_in_main_thread(mti) def _load(self, - context: dict, - name: Optional[str] = None, - namespace: Optional[str] = None, - options: Optional[Dict] = None) -> Optional[bpy.types.Collection]: + context: dict, + name: Optional[str] = None, + namespace: Optional[str] = None, + options: Optional[Dict] = None) -> Optional[bpy.types.Collection]: """Load asset via database Arguments: diff --git a/openpype/hosts/blender/plugins/load/load_fbx.py b/openpype/hosts/blender/plugins/load/load_fbx.py index f267bef586..aa96584c58 100644 --- a/openpype/hosts/blender/plugins/load/load_fbx.py +++ b/openpype/hosts/blender/plugins/load/load_fbx.py @@ -7,7 +7,7 @@ from typing import Dict, List, Optional import bpy from avalon import api -from avalon.blender import lib, ops +from avalon.blender import lib from avalon.blender.pipeline import AVALON_CONTAINERS from avalon.blender.pipeline import AVALON_CONTAINER_ID from avalon.blender.pipeline import AVALON_PROPERTY From acf4c8bf1946a52f784b1faa256a0113a62f5724 Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Tue, 29 Jun 2021 11:18:51 +0100 Subject: [PATCH 13/38] Fixed validator name --- ...lidate_no_colons_in _name.py => validate_no_colons_in_name.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename openpype/hosts/blender/plugins/publish/{validate_no_colons_in _name.py => validate_no_colons_in_name.py} (100%) diff --git a/openpype/hosts/blender/plugins/publish/validate_no_colons_in _name.py b/openpype/hosts/blender/plugins/publish/validate_no_colons_in_name.py similarity index 100% rename from openpype/hosts/blender/plugins/publish/validate_no_colons_in _name.py rename to openpype/hosts/blender/plugins/publish/validate_no_colons_in_name.py From 6ad2daeee9f7407bd56f587d9bc76cbd1302ea58 Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Thu, 1 Jul 2021 15:02:01 +0100 Subject: [PATCH 14/38] Fixed a problem when loading the same object multiple times --- openpype/hosts/blender/plugins/load/load_model.py | 6 ++++-- openpype/hosts/blender/plugins/load/load_rig.py | 8 +++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/openpype/hosts/blender/plugins/load/load_model.py b/openpype/hosts/blender/plugins/load/load_model.py index 37618b164d..3087edb573 100644 --- a/openpype/hosts/blender/plugins/load/load_model.py +++ b/openpype/hosts/blender/plugins/load/load_model.py @@ -78,13 +78,13 @@ class BlendModelLoader(plugin.AssetLoader): for obj in objects: local_obj = plugin.prepare_data(obj, group_name) - if obj.type != 'EMPTY': + if local_obj.type != 'EMPTY': plugin.prepare_data(local_obj.data, group_name) for material_slot in local_obj.material_slots: plugin.prepare_data(material_slot.material, group_name) - if not obj.get(AVALON_PROPERTY): + if not local_obj.get(AVALON_PROPERTY): local_obj[AVALON_PROPERTY] = dict() avalon_info = local_obj[AVALON_PROPERTY] @@ -92,6 +92,8 @@ class BlendModelLoader(plugin.AssetLoader): objects.reverse() + bpy.data.orphans_purge(do_local_ids = False) + bpy.ops.object.select_all(action='DESELECT') return objects diff --git a/openpype/hosts/blender/plugins/load/load_rig.py b/openpype/hosts/blender/plugins/load/load_rig.py index 3909a1b4aa..e57b97972b 100644 --- a/openpype/hosts/blender/plugins/load/load_rig.py +++ b/openpype/hosts/blender/plugins/load/load_rig.py @@ -91,7 +91,7 @@ class BlendRigLoader(plugin.AssetLoader): for obj in objects: local_obj = plugin.prepare_data(obj, group_name) - if obj.type == 'MESH': + if local_obj.type == 'MESH': plugin.prepare_data(local_obj.data, group_name) if obj != local_obj: @@ -102,7 +102,7 @@ class BlendRigLoader(plugin.AssetLoader): for material_slot in local_obj.material_slots: if material_slot.material: plugin.prepare_data(material_slot.material, group_name) - elif obj.type == 'ARMATURE': + elif local_obj.type == 'ARMATURE': plugin.prepare_data(local_obj.data, group_name) if action is not None: @@ -118,7 +118,7 @@ class BlendRigLoader(plugin.AssetLoader): for t in v.targets: t.id = local_obj - if not obj.get(AVALON_PROPERTY): + if not local_obj.get(AVALON_PROPERTY): local_obj[AVALON_PROPERTY] = dict() avalon_info = local_obj[AVALON_PROPERTY] @@ -126,6 +126,8 @@ class BlendRigLoader(plugin.AssetLoader): objects.reverse() + bpy.data.orphans_purge(do_local_ids = False) + bpy.ops.object.select_all(action='DESELECT') return objects From b7ef4b34c632361e32458e73752db72dae2b5fa9 Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Thu, 1 Jul 2021 15:06:59 +0100 Subject: [PATCH 15/38] Hound fixes --- openpype/hosts/blender/plugins/load/load_model.py | 2 +- openpype/hosts/blender/plugins/load/load_rig.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/blender/plugins/load/load_model.py b/openpype/hosts/blender/plugins/load/load_model.py index 3087edb573..405ecc52b5 100644 --- a/openpype/hosts/blender/plugins/load/load_model.py +++ b/openpype/hosts/blender/plugins/load/load_model.py @@ -92,7 +92,7 @@ class BlendModelLoader(plugin.AssetLoader): objects.reverse() - bpy.data.orphans_purge(do_local_ids = False) + bpy.data.orphans_purge(do_local_ids=False) bpy.ops.object.select_all(action='DESELECT') diff --git a/openpype/hosts/blender/plugins/load/load_rig.py b/openpype/hosts/blender/plugins/load/load_rig.py index e57b97972b..03538605bf 100644 --- a/openpype/hosts/blender/plugins/load/load_rig.py +++ b/openpype/hosts/blender/plugins/load/load_rig.py @@ -126,7 +126,7 @@ class BlendRigLoader(plugin.AssetLoader): objects.reverse() - bpy.data.orphans_purge(do_local_ids = False) + bpy.data.orphans_purge(do_local_ids=False) bpy.ops.object.select_all(action='DESELECT') From 9ad9c5b52ee3d09e7c6fb6ee7c42280210dc9c7d Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Wed, 7 Jul 2021 10:55:04 +0100 Subject: [PATCH 16/38] Fixed problem with missing attribute in avalon properties --- openpype/hosts/blender/plugins/load/load_abc.py | 3 ++- openpype/hosts/blender/plugins/load/load_fbx.py | 3 ++- openpype/hosts/blender/plugins/load/load_model.py | 3 ++- openpype/hosts/blender/plugins/load/load_rig.py | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/openpype/hosts/blender/plugins/load/load_abc.py b/openpype/hosts/blender/plugins/load/load_abc.py index a985ae684d..92656fac9e 100644 --- a/openpype/hosts/blender/plugins/load/load_abc.py +++ b/openpype/hosts/blender/plugins/load/load_abc.py @@ -156,7 +156,8 @@ class CacheModelLoader(plugin.AssetLoader): "libpath": libpath, "asset_name": asset_name, "parent": str(context["representation"]["parent"]), - "family": context["representation"]["context"]["family"] + "family": context["representation"]["context"]["family"], + "objectName": group_name } self[:] = objects diff --git a/openpype/hosts/blender/plugins/load/load_fbx.py b/openpype/hosts/blender/plugins/load/load_fbx.py index aa96584c58..b80dc69adc 100644 --- a/openpype/hosts/blender/plugins/load/load_fbx.py +++ b/openpype/hosts/blender/plugins/load/load_fbx.py @@ -165,7 +165,8 @@ class FbxModelLoader(plugin.AssetLoader): "libpath": libpath, "asset_name": asset_name, "parent": str(context["representation"]["parent"]), - "family": context["representation"]["context"]["family"] + "family": context["representation"]["context"]["family"], + "objectName": group_name } self[:] = objects diff --git a/openpype/hosts/blender/plugins/load/load_model.py b/openpype/hosts/blender/plugins/load/load_model.py index 405ecc52b5..5ddbdecf01 100644 --- a/openpype/hosts/blender/plugins/load/load_model.py +++ b/openpype/hosts/blender/plugins/load/load_model.py @@ -141,7 +141,8 @@ class BlendModelLoader(plugin.AssetLoader): "libpath": libpath, "asset_name": asset_name, "parent": str(context["representation"]["parent"]), - "family": context["representation"]["context"]["family"] + "family": context["representation"]["context"]["family"], + "objectName": group_name } self[:] = objects diff --git a/openpype/hosts/blender/plugins/load/load_rig.py b/openpype/hosts/blender/plugins/load/load_rig.py index 03538605bf..236672391c 100644 --- a/openpype/hosts/blender/plugins/load/load_rig.py +++ b/openpype/hosts/blender/plugins/load/load_rig.py @@ -175,7 +175,8 @@ class BlendRigLoader(plugin.AssetLoader): "libpath": libpath, "asset_name": asset_name, "parent": str(context["representation"]["parent"]), - "family": context["representation"]["context"]["family"] + "family": context["representation"]["context"]["family"], + "objectName": group_name } self[:] = objects From 78e10b9d1a8bc1d4a48b2263a0fee0603c80868a Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Wed, 7 Jul 2021 10:56:28 +0100 Subject: [PATCH 17/38] Improved layout assets handling --- openpype/hosts/blender/api/plugin.py | 12 +- .../blender/plugins/create/create_layout.py | 38 +- .../hosts/blender/plugins/load/load_layout.py | 664 ------------------ .../blender/plugins/load/load_layout_blend.py | 337 +++++++++ .../blender/plugins/load/load_layout_json.py | 243 +++++++ .../hosts/blender/plugins/load/load_model.py | 39 +- .../hosts/blender/plugins/load/load_rig.py | 44 +- .../blender/plugins/publish/extract_layout.py | 80 +-- 8 files changed, 733 insertions(+), 724 deletions(-) delete mode 100644 openpype/hosts/blender/plugins/load/load_layout.py create mode 100644 openpype/hosts/blender/plugins/load/load_layout_blend.py create mode 100644 openpype/hosts/blender/plugins/load/load_layout_json.py diff --git a/openpype/hosts/blender/api/plugin.py b/openpype/hosts/blender/api/plugin.py index 08e688f484..a126f5702f 100644 --- a/openpype/hosts/blender/api/plugin.py +++ b/openpype/hosts/blender/api/plugin.py @@ -31,9 +31,9 @@ def get_unique_number( avalon_container = bpy.data.collections.get(AVALON_CONTAINERS) if not avalon_container: return "01" - asset_groups = avalon_container.objects + asset_groups = avalon_container.all_objects - container_names = [c.name for c in asset_groups] + container_names = [c.name for c in asset_groups if c.type == 'EMPTY'] count = 1 name = f"{asset}_{count:0>2}_{subset}" while name in container_names: @@ -220,11 +220,11 @@ class AssetLoader(api.Loader): # loader=self.__class__.__name__, # ) - asset = context["asset"]["name"] - subset = context["subset"]["name"] - instance_name = asset_name(asset, subset, unique_number) + '_CON' + # asset = context["asset"]["name"] + # subset = context["subset"]["name"] + # instance_name = asset_name(asset, subset, unique_number) + '_CON' - return self._get_instance_collection(instance_name, nodes) + # return self._get_instance_collection(instance_name, nodes) def exec_update(self, container: Dict, representation: Dict): """Must be implemented by a sub-class""" diff --git a/openpype/hosts/blender/plugins/create/create_layout.py b/openpype/hosts/blender/plugins/create/create_layout.py index 5404cec587..831261f027 100644 --- a/openpype/hosts/blender/plugins/create/create_layout.py +++ b/openpype/hosts/blender/plugins/create/create_layout.py @@ -3,11 +3,12 @@ import bpy from avalon import api -from avalon.blender import lib -import openpype.hosts.blender.api.plugin +from avalon.blender import lib, ops +from avalon.blender.pipeline import AVALON_INSTANCES +from openpype.hosts.blender.api import plugin -class CreateLayout(openpype.hosts.blender.api.plugin.Creator): +class CreateLayout(plugin.Creator): """Layout output for character rigs""" name = "layoutMain" @@ -16,13 +17,34 @@ class CreateLayout(openpype.hosts.blender.api.plugin.Creator): icon = "cubes" def process(self): + """ Run the creator on Blender main thread""" + mti = ops.MainThreadItem(self._process) + ops.execute_in_main_thread(mti) + def _process(self): + # Get Instance Containter or create it if it does not exist + instances = bpy.data.collections.get(AVALON_INSTANCES) + if not instances: + instances = bpy.data.collections.new(name=AVALON_INSTANCES) + bpy.context.scene.collection.children.link(instances) + + # Create instance object asset = self.data["asset"] subset = self.data["subset"] - name = openpype.hosts.blender.api.plugin.asset_name(asset, subset) - collection = bpy.context.collection - collection.name = name + name = plugin.asset_name(asset, subset) + asset_group = bpy.data.objects.new(name=name, object_data=None) + asset_group.empty_display_type = 'SINGLE_ARROW' + instances.objects.link(asset_group) self.data['task'] = api.Session.get('AVALON_TASK') - lib.imprint(collection, self.data) + lib.imprint(asset_group, self.data) - return collection + # Add selected objects to instance + if (self.options or {}).get("useSelection"): + bpy.context.view_layer.objects.active = asset_group + selected = lib.get_selection() + for obj in selected: + obj.select_set(True) + selected.append(asset_group) + bpy.ops.object.parent_set(keep_transform=True) + + return asset_group diff --git a/openpype/hosts/blender/plugins/load/load_layout.py b/openpype/hosts/blender/plugins/load/load_layout.py deleted file mode 100644 index 2092be9139..0000000000 --- a/openpype/hosts/blender/plugins/load/load_layout.py +++ /dev/null @@ -1,664 +0,0 @@ -"""Load a layout in Blender.""" - -import json -from logging import log, warning -import math - -import logging -from pathlib import Path -from pprint import pformat -from typing import Dict, List, Optional - -from avalon import api, blender, pipeline -import bpy -import openpype.hosts.blender.api.plugin as plugin -from openpype.lib import get_creator_by_name - - -class BlendLayoutLoader(plugin.AssetLoader): - """Load layout from a .blend file.""" - - families = ["layout"] - representations = ["blend"] - - label = "Link Layout" - icon = "code-fork" - color = "orange" - - def _remove(self, objects, obj_container): - for obj in list(objects): - if obj.type == 'ARMATURE': - bpy.data.armatures.remove(obj.data) - elif obj.type == 'MESH': - bpy.data.meshes.remove(obj.data) - elif obj.type == 'CAMERA': - bpy.data.cameras.remove(obj.data) - elif obj.type == 'CURVE': - bpy.data.curves.remove(obj.data) - - for element_container in obj_container.children: - for child in element_container.children: - bpy.data.collections.remove(child) - bpy.data.collections.remove(element_container) - - bpy.data.collections.remove(obj_container) - - def _process(self, libpath, lib_container, container_name, actions): - relative = bpy.context.preferences.filepaths.use_relative_paths - with bpy.data.libraries.load( - libpath, link=True, relative=relative - ) as (_, data_to): - data_to.collections = [lib_container] - - scene = bpy.context.scene - - scene.collection.children.link(bpy.data.collections[lib_container]) - - layout_container = scene.collection.children[lib_container].make_local() - layout_container.name = container_name - - objects_local_types = ['MESH', 'CAMERA', 'CURVE'] - - objects = [] - armatures = [] - - containers = list(layout_container.children) - - for container in layout_container.children: - if container.name == blender.pipeline.AVALON_CONTAINERS: - containers.remove(container) - - for container in containers: - container.make_local() - objects.extend([ - obj for obj in container.objects - if obj.type in objects_local_types - ]) - armatures.extend([ - obj for obj in container.objects - if obj.type == 'ARMATURE' - ]) - containers.extend(list(container.children)) - - # Link meshes first, then armatures. - # The armature is unparented for all the non-local meshes, - # when it is made local. - for obj in objects + armatures: - local_obj = obj.make_local() - if obj.data: - obj.data.make_local() - - if not local_obj.get(blender.pipeline.AVALON_PROPERTY): - local_obj[blender.pipeline.AVALON_PROPERTY] = dict() - - avalon_info = local_obj[blender.pipeline.AVALON_PROPERTY] - avalon_info.update({"container_name": container_name}) - - action = actions.get(local_obj.name, None) - - if local_obj.type == 'ARMATURE' and action is not None: - local_obj.animation_data.action = action - - layout_container.pop(blender.pipeline.AVALON_PROPERTY) - - bpy.ops.object.select_all(action='DESELECT') - - return layout_container - - def process_asset( - self, context: dict, name: str, namespace: Optional[str] = None, - options: Optional[Dict] = None - ) -> Optional[List]: - """ - Arguments: - name: Use pre-defined name - namespace: Use pre-defined namespace - context: Full parenthood of representation to load - options: Additional settings dictionary - """ - - libpath = self.fname - asset = context["asset"]["name"] - subset = context["subset"]["name"] - lib_container = plugin.asset_name( - asset, subset - ) - unique_number = plugin.get_unique_number( - asset, subset - ) - namespace = namespace or f"{asset}_{unique_number}" - container_name = plugin.asset_name( - asset, subset, unique_number - ) - - container = bpy.data.collections.new(lib_container) - container.name = container_name - blender.pipeline.containerise_existing( - container, - name, - namespace, - context, - self.__class__.__name__, - ) - - container_metadata = container.get( - blender.pipeline.AVALON_PROPERTY) - - container_metadata["libpath"] = libpath - container_metadata["lib_container"] = lib_container - - obj_container = self._process( - libpath, lib_container, container_name, {}) - - container_metadata["obj_container"] = obj_container - - # Save the list of objects in the metadata container - container_metadata["objects"] = obj_container.all_objects - - # nodes = list(container.objects) - # nodes.append(container) - nodes = [container] - self[:] = nodes - return nodes - - def update(self, container: Dict, representation: Dict): - """Update the loaded asset. - - This will remove all objects of the current collection, load the new - ones and add them to the collection. - If the objects of the collection are used in another collection they - will not be removed, only unlinked. Normally this should not be the - case though. - - Warning: - No nested collections are supported at the moment! - """ - collection = bpy.data.collections.get( - container["objectName"] - ) - - libpath = Path(api.get_representation_path(representation)) - extension = libpath.suffix.lower() - - self.log.info( - "Container: %s\nRepresentation: %s", - pformat(container, indent=2), - pformat(representation, indent=2), - ) - - assert collection, ( - f"The asset is not loaded: {container['objectName']}" - ) - assert not (collection.children), ( - "Nested collections are not supported." - ) - assert libpath, ( - "No existing library file found for {container['objectName']}" - ) - assert libpath.is_file(), ( - f"The file doesn't exist: {libpath}" - ) - assert extension in plugin.VALID_EXTENSIONS, ( - f"Unsupported file: {libpath}" - ) - - collection_metadata = collection.get( - blender.pipeline.AVALON_PROPERTY) - collection_libpath = collection_metadata["libpath"] - objects = collection_metadata["objects"] - lib_container = collection_metadata["lib_container"] - obj_container = collection_metadata["obj_container"] - - normalized_collection_libpath = ( - str(Path(bpy.path.abspath(collection_libpath)).resolve()) - ) - normalized_libpath = ( - str(Path(bpy.path.abspath(str(libpath))).resolve()) - ) - self.log.debug( - "normalized_collection_libpath:\n %s\nnormalized_libpath:\n %s", - normalized_collection_libpath, - normalized_libpath, - ) - if normalized_collection_libpath == normalized_libpath: - self.log.info("Library already loaded, not updating...") - return - - actions = {} - - for obj in objects: - if obj.type == 'ARMATURE': - if obj.animation_data and obj.animation_data.action: - actions[obj.name] = obj.animation_data.action - - self._remove(objects, obj_container) - - obj_container = self._process( - str(libpath), lib_container, collection.name, actions) - - # Save the list of objects in the metadata container - collection_metadata["obj_container"] = obj_container - collection_metadata["objects"] = obj_container.all_objects - collection_metadata["libpath"] = str(libpath) - collection_metadata["representation"] = str(representation["_id"]) - - bpy.ops.object.select_all(action='DESELECT') - - def remove(self, container: Dict) -> bool: - """Remove an existing container from a Blender scene. - - Arguments: - container (openpype:container-1.0): Container to remove, - from `host.ls()`. - - Returns: - bool: Whether the container was deleted. - - Warning: - No nested collections are supported at the moment! - """ - - collection = bpy.data.collections.get( - container["objectName"] - ) - if not collection: - return False - assert not (collection.children), ( - "Nested collections are not supported." - ) - - collection_metadata = collection.get( - blender.pipeline.AVALON_PROPERTY) - objects = collection_metadata["objects"] - obj_container = collection_metadata["obj_container"] - - self._remove(objects, obj_container) - - bpy.data.collections.remove(collection) - - return True - - -class UnrealLayoutLoader(plugin.AssetLoader): - """Load layout published from Unreal.""" - - families = ["layout"] - representations = ["json"] - - label = "Link Layout" - icon = "code-fork" - color = "orange" - - animation_creator_name = "CreateAnimation" - - def _remove_objects(self, objects): - for obj in list(objects): - if obj.type == 'ARMATURE': - bpy.data.armatures.remove(obj.data) - elif obj.type == 'MESH': - bpy.data.meshes.remove(obj.data) - elif obj.type == 'CAMERA': - bpy.data.cameras.remove(obj.data) - elif obj.type == 'CURVE': - bpy.data.curves.remove(obj.data) - else: - self.log.error( - f"Object {obj.name} of type {obj.type} not recognized.") - - def _remove_collections(self, collection): - if collection.children: - for child in collection.children: - self._remove_collections(child) - bpy.data.collections.remove(child) - - def _remove(self, layout_container): - layout_container_metadata = layout_container.get( - blender.pipeline.AVALON_PROPERTY) - - if layout_container.children: - for child in layout_container.children: - child_container = child.get(blender.pipeline.AVALON_PROPERTY) - child_container['objectName'] = child.name - api.remove(child_container) - - for c in bpy.data.collections: - metadata = c.get('avalon') - if metadata: - print("metadata.get('id')") - print(metadata.get('id')) - if metadata and metadata.get('id') == 'pyblish.avalon.instance': - print("metadata.get('dependencies')") - print(metadata.get('dependencies')) - print("layout_container_metadata.get('representation')") - print(layout_container_metadata.get('representation')) - if metadata.get('dependencies') == layout_container_metadata.get('representation'): - - for child in c.children: - bpy.data.collections.remove(child) - bpy.data.collections.remove(c) - break - - def _get_loader(self, loaders, family): - name = "" - if family == 'rig': - name = "BlendRigLoader" - elif family == 'model': - name = "BlendModelLoader" - - if name == "": - return None - - for loader in loaders: - if loader.__name__ == name: - return loader - - return None - - def set_transform(self, obj, transform): - location = transform.get('translation') - rotation = transform.get('rotation') - scale = transform.get('scale') - - # Y position is inverted in sign because Unreal and Blender have the - # Y axis mirrored - obj.location = ( - location.get('x'), - location.get('y'), - location.get('z') - ) - obj.rotation_euler = ( - rotation.get('x'), - rotation.get('y'), - rotation.get('z') - ) - obj.scale = ( - scale.get('x'), - scale.get('y'), - scale.get('z') - ) - - def _process( - self, libpath, layout_container, container_name, representation, - actions, parent_collection - ): - with open(libpath, "r") as fp: - data = json.load(fp) - - scene = bpy.context.scene - layout_collection = bpy.data.collections.new(container_name) - scene.collection.children.link(layout_collection) - - parent = parent_collection - - if parent is None: - parent = scene.collection - - all_loaders = api.discover(api.Loader) - - avalon_container = bpy.data.collections.get( - blender.pipeline.AVALON_CONTAINERS) - - for element in data: - reference = element.get('reference') - family = element.get('family') - - loaders = api.loaders_from_representation(all_loaders, reference) - loader = self._get_loader(loaders, family) - - if not loader: - continue - - instance_name = element.get('instance_name') - - element_container = api.load( - loader, - reference, - namespace=instance_name - ) - - if not element_container: - continue - - avalon_container.children.unlink(element_container) - layout_container.children.link(element_container) - - element_metadata = element_container.get( - blender.pipeline.AVALON_PROPERTY) - - # Unlink the object's collection from the scene collection and - # link it in the layout collection - element_collection = element_metadata.get('obj_container') - scene.collection.children.unlink(element_collection) - layout_collection.children.link(element_collection) - - objects = element_metadata.get('objects') - element_metadata['instance_name'] = instance_name - - objects_to_transform = [] - - creator_plugin = get_creator_by_name(self.animation_creator_name) - if not creator_plugin: - raise ValueError("Creator plugin \"{}\" was not found.".format( - self.animation_creator_name - )) - - if family == 'rig': - for o in objects: - if o.type == 'ARMATURE': - objects_to_transform.append(o) - # Create an animation subset for each rig - o.select_set(True) - asset = api.Session["AVALON_ASSET"] - c = api.create( - creator_plugin, - name="animation_" + element_collection.name, - asset=asset, - options={"useSelection": True}, - data={"dependencies": representation}) - scene.collection.children.unlink(c) - parent.children.link(c) - o.select_set(False) - break - elif family == 'model': - objects_to_transform = objects - - for o in objects_to_transform: - self.set_transform(o, element.get('transform')) - - if actions: - if o.type == 'ARMATURE': - action = actions.get(instance_name, None) - - if action: - if o.animation_data is None: - o.animation_data_create() - o.animation_data.action = action - - return layout_collection - - def process_asset(self, - context: dict, - name: str, - namespace: Optional[str] = None, - options: Optional[Dict] = None): - """ - Arguments: - name: Use pre-defined name - namespace: Use pre-defined namespace - context: Full parenthood of representation to load - options: Additional settings dictionary - """ - libpath = self.fname - asset = context["asset"]["name"] - subset = context["subset"]["name"] - lib_container = plugin.asset_name( - asset, subset - ) - unique_number = plugin.get_unique_number( - asset, subset - ) - namespace = namespace or f"{asset}_{unique_number}" - container_name = plugin.asset_name( - asset, subset, unique_number - ) - - layout_container = bpy.data.collections.new(container_name) - blender.pipeline.containerise_existing( - layout_container, - name, - namespace, - context, - self.__class__.__name__, - ) - - container_metadata = layout_container.get( - blender.pipeline.AVALON_PROPERTY) - - container_metadata["libpath"] = libpath - container_metadata["lib_container"] = lib_container - - layout_collection = self._process( - libpath, layout_container, container_name, - str(context["representation"]["_id"]), None, None) - - container_metadata["obj_container"] = layout_collection - - # Save the list of objects in the metadata container - container_metadata["objects"] = layout_collection.all_objects - - nodes = [layout_container] - self[:] = nodes - return nodes - - def update(self, container: Dict, representation: Dict): - """Update the loaded asset. - - This will remove all objects of the current collection, load the new - ones and add them to the collection. - If the objects of the collection are used in another collection they - will not be removed, only unlinked. Normally this should not be the - case though. - """ - layout_container = bpy.data.collections.get( - container["objectName"] - ) - if not layout_container: - return False - - libpath = Path(api.get_representation_path(representation)) - extension = libpath.suffix.lower() - - self.log.info( - "Container: %s\nRepresentation: %s", - pformat(container, indent=2), - pformat(representation, indent=2), - ) - - assert layout_container, ( - f"The asset is not loaded: {container['objectName']}" - ) - assert libpath, ( - "No existing library file found for {container['objectName']}" - ) - assert libpath.is_file(), ( - f"The file doesn't exist: {libpath}" - ) - assert extension in plugin.VALID_EXTENSIONS, ( - f"Unsupported file: {libpath}" - ) - - layout_container_metadata = layout_container.get( - blender.pipeline.AVALON_PROPERTY) - collection_libpath = layout_container_metadata["libpath"] - lib_container = layout_container_metadata["lib_container"] - obj_container = plugin.get_local_collection_with_name( - layout_container_metadata["obj_container"].name - ) - objects = obj_container.all_objects - - container_name = obj_container.name - - normalized_collection_libpath = ( - str(Path(bpy.path.abspath(collection_libpath)).resolve()) - ) - normalized_libpath = ( - str(Path(bpy.path.abspath(str(libpath))).resolve()) - ) - self.log.debug( - "normalized_collection_libpath:\n %s\nnormalized_libpath:\n %s", - normalized_collection_libpath, - normalized_libpath, - ) - if normalized_collection_libpath == normalized_libpath: - self.log.info("Library already loaded, not updating...") - return - - actions = {} - - for obj in objects: - if obj.type == 'ARMATURE': - if obj.animation_data and obj.animation_data.action: - obj_cont_name = obj.get( - blender.pipeline.AVALON_PROPERTY).get('container_name') - obj_cont = plugin.get_local_collection_with_name( - obj_cont_name) - element_metadata = obj_cont.get( - blender.pipeline.AVALON_PROPERTY) - instance_name = element_metadata.get('instance_name') - actions[instance_name] = obj.animation_data.action - - self._remove(layout_container) - - bpy.data.collections.remove(obj_container) - - creator_plugin = get_creator_by_name(self.setdress_creator_name) - if not creator_plugin: - raise ValueError("Creator plugin \"{}\" was not found.".format( - self.setdress_creator_name - )) - - parent = api.create( - creator_plugin, - name="animation", - asset=api.Session["AVALON_ASSET"], - options={"useSelection": True}, - data={"dependencies": str(representation["_id"])}) - - layout_collection = self._process( - libpath, layout_container, container_name, - str(representation["_id"]), actions, parent) - - layout_container_metadata["obj_container"] = layout_collection - layout_container_metadata["objects"] = layout_collection.all_objects - layout_container_metadata["libpath"] = str(libpath) - layout_container_metadata["representation"] = str( - representation["_id"]) - - def remove(self, container: Dict) -> bool: - """Remove an existing container from a Blender scene. - - Arguments: - container (openpype:container-1.0): Container to remove, - from `host.ls()`. - - Returns: - bool: Whether the container was deleted. - """ - layout_container = bpy.data.collections.get( - container["objectName"] - ) - if not layout_container: - return False - - layout_container_metadata = layout_container.get( - blender.pipeline.AVALON_PROPERTY) - obj_container = plugin.get_local_collection_with_name( - layout_container_metadata["obj_container"].name - ) - - self._remove(layout_container) - - bpy.data.collections.remove(obj_container) - bpy.data.collections.remove(layout_container) - - return True diff --git a/openpype/hosts/blender/plugins/load/load_layout_blend.py b/openpype/hosts/blender/plugins/load/load_layout_blend.py new file mode 100644 index 0000000000..85cb4dfbd3 --- /dev/null +++ b/openpype/hosts/blender/plugins/load/load_layout_blend.py @@ -0,0 +1,337 @@ +"""Load a layout in Blender.""" + +from pathlib import Path +from pprint import pformat +from typing import Dict, List, Optional + +import bpy + +from avalon import api +from avalon.blender.pipeline import AVALON_CONTAINERS +from avalon.blender.pipeline import AVALON_CONTAINER_ID +from avalon.blender.pipeline import AVALON_PROPERTY +from openpype.hosts.blender.api import plugin + + +class BlendLayoutLoader(plugin.AssetLoader): + """Load layout from a .blend file.""" + + families = ["layout"] + representations = ["blend"] + + label = "Link Layout" + icon = "code-fork" + color = "orange" + + def _remove(self, asset_group): + objects = list(asset_group.children) + + for obj in objects: + if obj.type == 'MESH': + for material_slot in list(obj.material_slots): + if material_slot.material: + bpy.data.materials.remove(material_slot.material) + bpy.data.meshes.remove(obj.data) + elif obj.type == 'ARMATURE': + objects.extend(obj.children) + bpy.data.armatures.remove(obj.data) + elif obj.type == 'CURVE': + bpy.data.curves.remove(obj.data) + elif obj.type == 'EMPTY': + objects.extend(obj.children) + bpy.data.objects.remove(obj) + + def _remove_asset_and_library(self, asset_group): + libpath = asset_group.get(AVALON_PROPERTY).get('libpath') + + # Check how many assets use the same library + count = 0 + for obj in bpy.data.collections.get(AVALON_CONTAINERS).all_objects: + if obj.get(AVALON_PROPERTY).get('libpath') == libpath: + count += 1 + + self._remove(asset_group) + + bpy.data.objects.remove(asset_group) + + # If it is the last object to use that library, remove it + if count == 1: + library = bpy.data.libraries.get(bpy.path.basename(libpath)) + bpy.data.libraries.remove(library) + + def _process(self, libpath, asset_group, group_name, actions): + with bpy.data.libraries.load( + libpath, link=True, relative=False + ) as (data_from, data_to): + data_to.objects = data_from.objects + + parent = bpy.context.scene.collection + + empties = [obj for obj in data_to.objects if obj.type == 'EMPTY'] + + container = None + + for empty in empties: + if empty.get(AVALON_PROPERTY): + container = empty + break + + assert container, "No asset group found" + + # Children must be linked before parents, + # otherwise the hierarchy will break + objects = [] + nodes = list(container.children) + + for obj in nodes: + obj.parent = asset_group + + for obj in nodes: + objects.append(obj) + nodes.extend(list(obj.children)) + + objects.reverse() + + constraints = [] + + armatures = [obj for obj in objects if obj.type == 'ARMATURE'] + + for armature in armatures: + for bone in armature.pose.bones: + for constraint in bone.constraints: + if hasattr(constraint, 'target'): + constraints.append(constraint) + + for obj in objects: + parent.objects.link(obj) + + for obj in objects: + local_obj = plugin.prepare_data(obj, group_name) + + action = None + + if actions: + action = actions.get(local_obj.name, None) + + if local_obj.type == 'MESH': + plugin.prepare_data(local_obj.data, group_name) + + if obj != local_obj: + for constraint in constraints: + if constraint.target == obj: + constraint.target = local_obj + + for material_slot in local_obj.material_slots: + if material_slot.material: + plugin.prepare_data(material_slot.material, group_name) + elif local_obj.type == 'ARMATURE': + plugin.prepare_data(local_obj.data, group_name) + + if action is not None: + local_obj.animation_data.action = action + elif local_obj.animation_data.action is not None: + plugin.prepare_data( + local_obj.animation_data.action, group_name) + + # Set link the drivers to the local object + if local_obj.data.animation_data: + for d in local_obj.data.animation_data.drivers: + for v in d.driver.variables: + for t in v.targets: + t.id = local_obj + + if not local_obj.get(AVALON_PROPERTY): + local_obj[AVALON_PROPERTY] = dict() + + avalon_info = local_obj[AVALON_PROPERTY] + avalon_info.update({"container_name": group_name}) + + objects.reverse() + + bpy.data.orphans_purge(do_local_ids=False) + + bpy.ops.object.select_all(action='DESELECT') + + return objects + + def process_asset( + self, context: dict, name: str, namespace: Optional[str] = None, + options: Optional[Dict] = None + ) -> Optional[List]: + """ + Arguments: + name: Use pre-defined name + namespace: Use pre-defined namespace + context: Full parenthood of representation to load + options: Additional settings dictionary + """ + libpath = self.fname + asset = context["asset"]["name"] + subset = context["subset"]["name"] + + asset_name = plugin.asset_name(asset, subset) + unique_number = plugin.get_unique_number(asset, subset) + group_name = plugin.asset_name(asset, subset, unique_number) + namespace = namespace or f"{asset}_{unique_number}" + + avalon_container = bpy.data.collections.get(AVALON_CONTAINERS) + if not avalon_container: + avalon_container = bpy.data.collections.new(name=AVALON_CONTAINERS) + bpy.context.scene.collection.children.link(avalon_container) + + asset_group = bpy.data.objects.new(group_name, object_data=None) + asset_group.empty_display_type = 'SINGLE_ARROW' + avalon_container.objects.link(asset_group) + + objects = self._process(libpath, asset_group, group_name, None) + + for child in asset_group.children: + if child.get(AVALON_PROPERTY): + avalon_container.objects.link(child) + + bpy.context.scene.collection.objects.link(asset_group) + + asset_group[AVALON_PROPERTY] = { + "schema": "openpype:container-2.0", + "id": AVALON_CONTAINER_ID, + "name": name, + "namespace": namespace or '', + "loader": str(self.__class__.__name__), + "representation": str(context["representation"]["_id"]), + "libpath": libpath, + "asset_name": asset_name, + "parent": str(context["representation"]["parent"]), + "family": context["representation"]["context"]["family"], + "objectName": group_name + } + + self[:] = objects + return objects + + def update(self, container: Dict, representation: Dict): + """Update the loaded asset. + + This will remove all objects of the current collection, load the new + ones and add them to the collection. + If the objects of the collection are used in another collection they + will not be removed, only unlinked. Normally this should not be the + case though. + + Warning: + No nested collections are supported at the moment! + """ + object_name = container["objectName"] + asset_group = bpy.data.objects.get(object_name) + libpath = Path(api.get_representation_path(representation)) + extension = libpath.suffix.lower() + + self.log.info( + "Container: %s\nRepresentation: %s", + pformat(container, indent=2), + pformat(representation, indent=2), + ) + + assert asset_group, ( + f"The asset is not loaded: {container['objectName']}" + ) + assert libpath, ( + "No existing library file found for {container['objectName']}" + ) + assert libpath.is_file(), ( + f"The file doesn't exist: {libpath}" + ) + assert extension in plugin.VALID_EXTENSIONS, ( + f"Unsupported file: {libpath}" + ) + + metadata = asset_group.get(AVALON_PROPERTY) + group_libpath = metadata["libpath"] + + normalized_group_libpath = ( + str(Path(bpy.path.abspath(group_libpath)).resolve()) + ) + normalized_libpath = ( + str(Path(bpy.path.abspath(str(libpath))).resolve()) + ) + self.log.debug( + "normalized_group_libpath:\n %s\nnormalized_libpath:\n %s", + normalized_group_libpath, + normalized_libpath, + ) + if normalized_group_libpath == normalized_libpath: + self.log.info("Library already loaded, not updating...") + return + + actions = {} + + for obj in asset_group.children: + obj_meta = obj.get(AVALON_PROPERTY) + if obj_meta.get('family') == 'rig': + rig = None + for child in obj.children: + if child.type == 'ARMATURE': + rig = child + break + if not rig: + raise Exception("No armature in the rig asset group.") + if rig.animation_data and rig.animation_data.action: + instance_name = obj_meta.get('instance_name') + actions[instance_name] = rig.animation_data.action + + mat = asset_group.matrix_basis.copy() + + # Remove the children of the asset_group first + for child in list(asset_group.children): + self._remove_asset_and_library(child) + + # Check how many assets use the same library + count = 0 + for obj in bpy.data.collections.get(AVALON_CONTAINERS).objects: + if obj.get(AVALON_PROPERTY).get('libpath') == group_libpath: + count += 1 + + self._remove(asset_group) + + # If it is the last object to use that library, remove it + if count == 1: + library = bpy.data.libraries.get(bpy.path.basename(group_libpath)) + bpy.data.libraries.remove(library) + + self._process(str(libpath), asset_group, object_name, actions) + + avalon_container = bpy.data.collections.get(AVALON_CONTAINERS) + for child in asset_group.children: + if child.get(AVALON_PROPERTY): + avalon_container.objects.link(child) + + asset_group.matrix_basis = mat + + metadata["libpath"] = str(libpath) + metadata["representation"] = str(representation["_id"]) + + def exec_remove(self, container: Dict) -> bool: + """Remove an existing container from a Blender scene. + + Arguments: + container (openpype:container-1.0): Container to remove, + from `host.ls()`. + + Returns: + bool: Whether the container was deleted. + + Warning: + No nested collections are supported at the moment! + """ + object_name = container["objectName"] + asset_group = bpy.data.objects.get(object_name) + + if not asset_group: + return False + + # Remove the children of the asset_group first + for child in list(asset_group.children): + self._remove_asset_and_library(child) + + self._remove_asset_and_library(asset_group) + + return True diff --git a/openpype/hosts/blender/plugins/load/load_layout_json.py b/openpype/hosts/blender/plugins/load/load_layout_json.py new file mode 100644 index 0000000000..8564b52816 --- /dev/null +++ b/openpype/hosts/blender/plugins/load/load_layout_json.py @@ -0,0 +1,243 @@ +"""Load a layout in Blender.""" + +from pathlib import Path +from pprint import pformat +from typing import Dict, Optional + +import bpy +import json + +from avalon import api +from avalon.blender.pipeline import AVALON_CONTAINERS +from avalon.blender.pipeline import AVALON_CONTAINER_ID +from avalon.blender.pipeline import AVALON_PROPERTY +from openpype.hosts.blender.api import plugin + + +class JsonLayoutLoader(plugin.AssetLoader): + """Load layout published from Unreal.""" + + families = ["layout"] + representations = ["json"] + + label = "Load Layout" + icon = "code-fork" + color = "orange" + + animation_creator_name = "CreateAnimation" + + def _remove(self, asset_group): + objects = list(asset_group.children) + + for obj in objects: + api.remove(obj.get(AVALON_PROPERTY)) + + def _get_loader(self, loaders, family): + name = "" + if family == 'rig': + name = "BlendRigLoader" + elif family == 'model': + name = "BlendModelLoader" + + if name == "": + return None + + for loader in loaders: + if loader.__name__ == name: + return loader + + return None + + def _process(self, libpath, asset_group, actions): + bpy.ops.object.select_all(action='DESELECT') + + with open(libpath, "r") as fp: + data = json.load(fp) + + all_loaders = api.discover(api.Loader) + + for element in data: + reference = element.get('reference') + family = element.get('family') + + loaders = api.loaders_from_representation(all_loaders, reference) + loader = self._get_loader(loaders, family) + + if not loader: + continue + + instance_name = element.get('instance_name') + + action = None + + if actions: + action = actions.get(instance_name, None) + + options = { + 'parent': asset_group, + 'transform': element.get('transform'), + 'action': action + } + + # This should return the loaded asset, but the load call will be + # added to the queue to run in the Blender main thread, so + # at this time it will not return anything. The assets will be + # loaded in the next Blender cycle, so we use the options to + # set the transform, parent and assign the action, if there is one. + api.load( + loader, + reference, + namespace=instance_name, + options=options + ) + + def process_asset(self, + context: dict, + name: str, + namespace: Optional[str] = None, + options: Optional[Dict] = None): + """ + Arguments: + name: Use pre-defined name + namespace: Use pre-defined namespace + context: Full parenthood of representation to load + options: Additional settings dictionary + """ + libpath = self.fname + asset = context["asset"]["name"] + subset = context["subset"]["name"] + + asset_name = plugin.asset_name(asset, subset) + unique_number = plugin.get_unique_number(asset, subset) + group_name = plugin.asset_name(asset, subset, unique_number) + namespace = namespace or f"{asset}_{unique_number}" + + avalon_container = bpy.data.collections.get(AVALON_CONTAINERS) + if not avalon_container: + avalon_container = bpy.data.collections.new(name=AVALON_CONTAINERS) + bpy.context.scene.collection.children.link(avalon_container) + + asset_group = bpy.data.objects.new(group_name, object_data=None) + asset_group.empty_display_type = 'SINGLE_ARROW' + avalon_container.objects.link(asset_group) + + self._process(libpath, asset_group, None) + + bpy.context.scene.collection.objects.link(asset_group) + + asset_group[AVALON_PROPERTY] = { + "schema": "openpype:container-2.0", + "id": AVALON_CONTAINER_ID, + "name": name, + "namespace": namespace or '', + "loader": str(self.__class__.__name__), + "representation": str(context["representation"]["_id"]), + "libpath": libpath, + "asset_name": asset_name, + "parent": str(context["representation"]["parent"]), + "family": context["representation"]["context"]["family"], + "objectName": group_name + } + + self[:] = asset_group.children + return asset_group.children + + def exec_update(self, container: Dict, representation: Dict): + """Update the loaded asset. + + This will remove all objects of the current collection, load the new + ones and add them to the collection. + If the objects of the collection are used in another collection they + will not be removed, only unlinked. Normally this should not be the + case though. + """ + object_name = container["objectName"] + asset_group = bpy.data.objects.get(object_name) + libpath = Path(api.get_representation_path(representation)) + extension = libpath.suffix.lower() + + self.log.info( + "Container: %s\nRepresentation: %s", + pformat(container, indent=2), + pformat(representation, indent=2), + ) + + assert asset_group, ( + f"The asset is not loaded: {container['objectName']}" + ) + assert libpath, ( + "No existing library file found for {container['objectName']}" + ) + assert libpath.is_file(), ( + f"The file doesn't exist: {libpath}" + ) + assert extension in plugin.VALID_EXTENSIONS, ( + f"Unsupported file: {libpath}" + ) + + metadata = asset_group.get(AVALON_PROPERTY) + group_libpath = metadata["libpath"] + + normalized_group_libpath = ( + str(Path(bpy.path.abspath(group_libpath)).resolve()) + ) + normalized_libpath = ( + str(Path(bpy.path.abspath(str(libpath))).resolve()) + ) + self.log.debug( + "normalized_group_libpath:\n %s\nnormalized_libpath:\n %s", + normalized_group_libpath, + normalized_libpath, + ) + if normalized_group_libpath == normalized_libpath: + self.log.info("Library already loaded, not updating...") + return + + actions = {} + + for obj in asset_group.children: + obj_meta = obj.get(AVALON_PROPERTY) + if obj_meta.get('family') == 'rig': + rig = None + for child in obj.children: + if child.type == 'ARMATURE': + rig = child + break + if not rig: + raise Exception("No armature in the rig asset group.") + if rig.animation_data and rig.animation_data.action: + instance_name = obj_meta.get('instance_name') + actions[instance_name] = rig.animation_data.action + + mat = asset_group.matrix_basis.copy() + + self._remove(asset_group) + + self._process(str(libpath), asset_group, actions) + + asset_group.matrix_basis = mat + + metadata["libpath"] = str(libpath) + metadata["representation"] = str(representation["_id"]) + + def exec_remove(self, container: Dict) -> bool: + """Remove an existing container from a Blender scene. + + Arguments: + container (openpype:container-1.0): Container to remove, + from `host.ls()`. + + Returns: + bool: Whether the container was deleted. + """ + object_name = container["objectName"] + asset_group = bpy.data.objects.get(object_name) + + if not asset_group: + return False + + self._remove(asset_group) + + bpy.data.objects.remove(asset_group) + + return True diff --git a/openpype/hosts/blender/plugins/load/load_model.py b/openpype/hosts/blender/plugins/load/load_model.py index 5ddbdecf01..dd48be3db7 100644 --- a/openpype/hosts/blender/plugins/load/load_model.py +++ b/openpype/hosts/blender/plugins/load/load_model.py @@ -40,9 +40,8 @@ class BlendModelLoader(plugin.AssetLoader): bpy.data.objects.remove(obj) def _process(self, libpath, asset_group, group_name): - relative = bpy.context.preferences.filepaths.use_relative_paths with bpy.data.libraries.load( - libpath, link=True, relative=relative + libpath, link=True, relative=False ) as (data_from, data_to): data_to.objects = data_from.objects @@ -127,6 +126,42 @@ class BlendModelLoader(plugin.AssetLoader): asset_group.empty_display_type = 'SINGLE_ARROW' avalon_container.objects.link(asset_group) + bpy.ops.object.select_all(action='DESELECT') + + if options is not None: + parent = options.get('parent') + transform = options.get('transform') + + if parent and transform: + location = transform.get('translation') + rotation = transform.get('rotation') + scale = transform.get('scale') + + # Y position is inverted in sign because Unreal and Blender have the + # Y axis mirrored + asset_group.location = ( + location.get('x'), + location.get('y'), + location.get('z') + ) + asset_group.rotation_euler = ( + rotation.get('x'), + rotation.get('y'), + rotation.get('z') + ) + asset_group.scale = ( + scale.get('x'), + scale.get('y'), + scale.get('z') + ) + + bpy.context.view_layer.objects.active = parent + asset_group.select_set(True) + + bpy.ops.object.parent_set(keep_transform=True) + + bpy.ops.object.select_all(action='DESELECT') + objects = self._process(libpath, asset_group, group_name) bpy.context.scene.collection.objects.link(asset_group) diff --git a/openpype/hosts/blender/plugins/load/load_rig.py b/openpype/hosts/blender/plugins/load/load_rig.py index 236672391c..d12c398794 100644 --- a/openpype/hosts/blender/plugins/load/load_rig.py +++ b/openpype/hosts/blender/plugins/load/load_rig.py @@ -42,9 +42,8 @@ class BlendRigLoader(plugin.AssetLoader): bpy.data.objects.remove(obj) def _process(self, libpath, asset_group, group_name, action): - relative = bpy.context.preferences.filepaths.use_relative_paths with bpy.data.libraries.load( - libpath, link=True, relative=relative + libpath, link=True, relative=False ) as (data_from, data_to): data_to.objects = data_from.objects @@ -161,7 +160,46 @@ class BlendRigLoader(plugin.AssetLoader): asset_group.empty_display_type = 'SINGLE_ARROW' avalon_container.objects.link(asset_group) - objects = self._process(libpath, asset_group, group_name, None) + action = None + + bpy.ops.object.select_all(action='DESELECT') + + if options is not None: + parent = options.get('parent') + transform = options.get('transform') + action = options.get('action') + + if parent and transform: + location = transform.get('translation') + rotation = transform.get('rotation') + scale = transform.get('scale') + + # Y position is inverted in sign because Unreal and Blender have the + # Y axis mirrored + asset_group.location = ( + location.get('x'), + location.get('y'), + location.get('z') + ) + asset_group.rotation_euler = ( + rotation.get('x'), + rotation.get('y'), + rotation.get('z') + ) + asset_group.scale = ( + scale.get('x'), + scale.get('y'), + scale.get('z') + ) + + bpy.context.view_layer.objects.active = parent + asset_group.select_set(True) + + bpy.ops.object.parent_set(keep_transform=True) + + bpy.ops.object.select_all(action='DESELECT') + + objects = self._process(libpath, asset_group, group_name, action) bpy.context.scene.collection.objects.link(asset_group) diff --git a/openpype/hosts/blender/plugins/publish/extract_layout.py b/openpype/hosts/blender/plugins/publish/extract_layout.py index c6c9bf67f5..cd081b4479 100644 --- a/openpype/hosts/blender/plugins/publish/extract_layout.py +++ b/openpype/hosts/blender/plugins/publish/extract_layout.py @@ -3,7 +3,8 @@ import json import bpy -from avalon import blender, io +from avalon import io +from avalon.blender.pipeline import AVALON_PROPERTY import openpype.api @@ -24,52 +25,49 @@ class ExtractLayout(openpype.api.Extractor): json_data = [] - for collection in instance: - for asset in collection.children: - collection = bpy.data.collections[asset.name] - container = bpy.data.collections[asset.name + '_CON'] - metadata = container.get(blender.pipeline.AVALON_PROPERTY) + asset_group = bpy.data.objects[str(instance)] - parent = metadata["parent"] - family = metadata["family"] + for asset in asset_group.children: + metadata = asset.get(AVALON_PROPERTY) - self.log.debug("Parent: {}".format(parent)) - blend = io.find_one( - { - "type": "representation", - "parent": io.ObjectId(parent), - "name": "blend" - }, - projection={"_id": True}) - blend_id = blend["_id"] + parent = metadata["parent"] + family = metadata["family"] - json_element = {} - json_element["reference"] = str(blend_id) - json_element["family"] = family - json_element["instance_name"] = asset.name - json_element["asset_name"] = metadata["lib_container"] - json_element["file_path"] = metadata["libpath"] + self.log.debug("Parent: {}".format(parent)) + blend = io.find_one( + { + "type": "representation", + "parent": io.ObjectId(parent), + "name": "blend" + }, + projection={"_id": True}) + blend_id = blend["_id"] - obj = collection.objects[0] + json_element = {} + json_element["reference"] = str(blend_id) + json_element["family"] = family + json_element["instance_name"] = asset.name + json_element["asset_name"] = metadata["asset_name"] + json_element["file_path"] = metadata["libpath"] - json_element["transform"] = { - "translation": { - "x": obj.location.x, - "y": obj.location.y, - "z": obj.location.z - }, - "rotation": { - "x": obj.rotation_euler.x, - "y": obj.rotation_euler.y, - "z": obj.rotation_euler.z, - }, - "scale": { - "x": obj.scale.x, - "y": obj.scale.y, - "z": obj.scale.z - } + json_element["transform"] = { + "translation": { + "x": asset.location.x, + "y": asset.location.y, + "z": asset.location.z + }, + "rotation": { + "x": asset.rotation_euler.x, + "y": asset.rotation_euler.y, + "z": asset.rotation_euler.z, + }, + "scale": { + "x": asset.scale.x, + "y": asset.scale.y, + "z": asset.scale.z } - json_data.append(json_element) + } + json_data.append(json_element) json_filename = "{}.json".format(instance.name) json_path = os.path.join(stagingdir, json_filename) From 3038abad72f91d7af5c310e4e660ad1ec5f55960 Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Tue, 13 Jul 2021 18:00:17 +0200 Subject: [PATCH 18/38] wip sync with cb code --- openpype/hosts/houdini/api/__init__.py | 97 ++++- openpype/hosts/houdini/api/lib.py | 140 ++++++- openpype/hosts/houdini/api/usd.py | 255 +++++++++++++ .../plugins/create/create_composite.py | 35 ++ .../plugins/create/create_pointcache.py | 1 + .../plugins/create/create_redshift_rop.py | 63 ++++ .../plugins/create/create_remote_publish.py | 22 ++ .../houdini/plugins/create/create_usd.py | 39 ++ .../plugins/create/create_usd_model.py | 39 ++ .../plugins/create/create_usd_workspaces.py | 57 +++ .../plugins/create/create_usdrender.py | 36 ++ .../hosts/houdini/plugins/load/actions.py | 78 ++++ .../houdini/plugins/load/load_alembic.py | 11 +- .../hosts/houdini/plugins/load/load_camera.py | 132 +++++-- .../hosts/houdini/plugins/load/load_image.py | 119 ++++++ .../houdini/plugins/load/load_usd_layer.py | 74 ++++ .../plugins/load/load_usd_reference.py | 74 ++++ .../hosts/houdini/plugins/load/load_vdb.py | 106 ++++++ .../houdini/plugins/load/show_usdview.py | 44 +++ .../plugins/publish/collect_active_state.py | 36 ++ .../houdini/plugins/publish/collect_frames.py | 39 +- .../houdini/plugins/publish/collect_inputs.py | 120 ++++++ .../plugins/publish/collect_instances.py | 9 + .../publish/collect_instances_usd_layered.py | 155 ++++++++ .../plugins/publish/collect_output_node.py | 52 ++- .../plugins/publish/collect_redshift_rop.py | 137 +++++++ .../plugins/publish/collect_remote_publish.py | 30 ++ .../publish/collect_render_products.py | 130 +++++++ .../plugins/publish/collect_usd_bootstrap.py | 117 ++++++ .../plugins/publish/collect_usd_layers.py | 67 ++++ .../plugins/publish/extract_alembic.py | 15 +- .../plugins/publish/extract_composite.py | 36 ++ .../houdini/plugins/publish/extract_usd.py | 37 ++ .../plugins/publish/extract_usd_layered.py | 303 +++++++++++++++ .../plugins/publish/extract_vdb_cache.py | 13 +- .../plugins/publish/increment_current_file.py | 48 +++ .../increment_current_file_deadline.py | 34 ++ .../houdini/plugins/publish/save_scene.py | 37 ++ .../plugins/publish/save_scene_deadline.py | 23 ++ .../publish/submit_houdini_render_deadline.py | 158 ++++++++ .../plugins/publish/submit_remote_publish.py | 152 ++++++++ .../validate_abc_primitive_to_detail.py | 116 ++++++ .../publish/validate_alembic_face_sets.py | 35 ++ .../publish/validate_alembic_input_node.py | 37 +- .../plugins/publish/validate_bypass.py | 9 +- .../plugins/publish/validate_camera_rop.py | 4 +- .../publish/validate_cop_output_node.py | 58 +++ .../publish/validate_file_extension.py | 60 +++ .../plugins/publish/validate_frame_token.py | 50 +++ .../validate_houdini_license_category.py | 28 ++ .../publish/validate_mkpaths_toggled.py | 12 +- .../plugins/publish/validate_no_errors.py | 64 ++++ .../validate_primitive_hierarchy_paths.py | 52 +-- .../publish/validate_remote_publish.py | 43 +++ .../validate_remote_publish_enabled.py | 35 ++ .../publish/validate_sop_output_node.py | 78 ++++ .../validate_usd_layer_path_backslashes.py | 51 +++ .../publish/validate_usd_model_and_shade.py | 75 ++++ .../publish/validate_usd_output_node.py | 50 +++ .../validate_usd_render_product_names.py | 30 ++ .../plugins/publish/validate_usd_setdress.py | 51 +++ .../validate_usd_shade_model_exists.py | 36 ++ .../publish/validate_usd_shade_workspace.py | 60 +++ .../publish/validate_vdb_output_node.py | 68 ++++ .../vendor/husdoutputprocessors/__init__.py | 1 + .../avalon_uri_processor.py | 168 +++++++++ .../stagingdir_processor.py | 90 +++++ openpype/lib/usdlib.py | 347 ++++++++++++++++++ 68 files changed, 4744 insertions(+), 134 deletions(-) create mode 100644 openpype/hosts/houdini/api/usd.py create mode 100644 openpype/hosts/houdini/plugins/create/create_composite.py create mode 100644 openpype/hosts/houdini/plugins/create/create_redshift_rop.py create mode 100644 openpype/hosts/houdini/plugins/create/create_remote_publish.py create mode 100644 openpype/hosts/houdini/plugins/create/create_usd.py create mode 100644 openpype/hosts/houdini/plugins/create/create_usd_model.py create mode 100644 openpype/hosts/houdini/plugins/create/create_usd_workspaces.py create mode 100644 openpype/hosts/houdini/plugins/create/create_usdrender.py create mode 100644 openpype/hosts/houdini/plugins/load/actions.py create mode 100644 openpype/hosts/houdini/plugins/load/load_image.py create mode 100644 openpype/hosts/houdini/plugins/load/load_usd_layer.py create mode 100644 openpype/hosts/houdini/plugins/load/load_usd_reference.py create mode 100644 openpype/hosts/houdini/plugins/load/load_vdb.py create mode 100644 openpype/hosts/houdini/plugins/load/show_usdview.py create mode 100644 openpype/hosts/houdini/plugins/publish/collect_active_state.py create mode 100644 openpype/hosts/houdini/plugins/publish/collect_inputs.py create mode 100644 openpype/hosts/houdini/plugins/publish/collect_instances_usd_layered.py create mode 100644 openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py create mode 100644 openpype/hosts/houdini/plugins/publish/collect_remote_publish.py create mode 100644 openpype/hosts/houdini/plugins/publish/collect_render_products.py create mode 100644 openpype/hosts/houdini/plugins/publish/collect_usd_bootstrap.py create mode 100644 openpype/hosts/houdini/plugins/publish/collect_usd_layers.py create mode 100644 openpype/hosts/houdini/plugins/publish/extract_composite.py create mode 100644 openpype/hosts/houdini/plugins/publish/extract_usd.py create mode 100644 openpype/hosts/houdini/plugins/publish/extract_usd_layered.py create mode 100644 openpype/hosts/houdini/plugins/publish/increment_current_file.py create mode 100644 openpype/hosts/houdini/plugins/publish/increment_current_file_deadline.py create mode 100644 openpype/hosts/houdini/plugins/publish/save_scene.py create mode 100644 openpype/hosts/houdini/plugins/publish/save_scene_deadline.py create mode 100644 openpype/hosts/houdini/plugins/publish/submit_houdini_render_deadline.py create mode 100644 openpype/hosts/houdini/plugins/publish/submit_remote_publish.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_abc_primitive_to_detail.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_alembic_face_sets.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_cop_output_node.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_file_extension.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_frame_token.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_houdini_license_category.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_no_errors.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_remote_publish.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_remote_publish_enabled.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_sop_output_node.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_usd_layer_path_backslashes.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_usd_model_and_shade.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_usd_output_node.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_usd_render_product_names.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_usd_setdress.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_usd_shade_model_exists.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_usd_shade_workspace.py create mode 100644 openpype/hosts/houdini/plugins/publish/validate_vdb_output_node.py create mode 100644 openpype/hosts/houdini/vendor/husdoutputprocessors/__init__.py create mode 100644 openpype/hosts/houdini/vendor/husdoutputprocessors/avalon_uri_processor.py create mode 100644 openpype/hosts/houdini/vendor/husdoutputprocessors/stagingdir_processor.py create mode 100644 openpype/lib/usdlib.py diff --git a/openpype/hosts/houdini/api/__init__.py b/openpype/hosts/houdini/api/__init__.py index 21f4ae41c3..8eda4aff26 100644 --- a/openpype/hosts/houdini/api/__init__.py +++ b/openpype/hosts/houdini/api/__init__.py @@ -1,5 +1,7 @@ import os +import sys import logging +import contextlib import hou @@ -11,7 +13,12 @@ from avalon.houdini import pipeline as houdini import openpype.hosts.houdini from openpype.hosts.houdini.api import lib -from openpype.lib import any_outdated +from openpype.lib import ( + any_outdated, + update_task_from_path +) + +from .lib import get_asset_fps log = logging.getLogger("openpype.hosts.houdini") @@ -33,15 +40,25 @@ def install(): avalon.before("save", before_save) avalon.on("save", on_save) avalon.on("open", on_open) + avalon.on("new", on_new) pyblish.register_callback("instanceToggled", on_pyblish_instance_toggled) log.info("Setting default family states for loader..") - avalon.data["familiesStateToggled"] = ["imagesequence"] + avalon.data["familiesStateToggled"] = [ + "imagesequence", + "review" + ] + # Expose Houdini husdoutputprocessors + hou_setup_pythonpath = os.path.join(os.path.dirname(PACKAGE_DIR), + "setup", "houdini", "pythonpath") + print("Adding PYTHONPATH: %s" % hou_setup_pythonpath) + sys.path.append(hou_setup_pythonpath) -def on_init(*args): - houdini.on_houdini_initialize() + # Set asset FPS for the empty scene directly after launch of Houdini + # so it initializes into the correct scene FPS + _set_asset_fps() def before_save(*args): @@ -52,6 +69,8 @@ def on_save(*args): avalon.logger.info("Running callback on save..") + update_task_from_path(hou.hipFile.path()) + nodes = lib.get_id_required_nodes() for node, new_id in lib.generate_ids(nodes): lib.set_id(node, new_id, overwrite=False) @@ -59,8 +78,18 @@ def on_save(*args): def on_open(*args): + if not hou.isUIAvailable(): + log.debug("Batch mode detected, ignoring `on_open` callbacks..") + return + avalon.logger.info("Running callback on open..") + update_task_from_path(hou.hipFile.path()) + + # Validate FPS after update_task_from_path to + # ensure it is using correct FPS for the asset + lib.validate_fps() + if any_outdated(): from ..widgets import popup @@ -70,7 +99,7 @@ def on_open(*args): parent = hou.ui.mainQtWindow() if parent is None: log.info("Skipping outdated content pop-up " - "because Maya window can't be found.") + "because Houdini window can't be found.") else: # Show outdated pop-up @@ -79,15 +108,53 @@ def on_open(*args): tool.show(parent=parent) dialog = popup.Popup(parent=parent) - dialog.setWindowTitle("Maya scene has outdated content") + dialog.setWindowTitle("Houdini scene has outdated content") dialog.setMessage("There are outdated containers in " - "your Maya scene.") - dialog.on_show.connect(_on_show_inventory) + "your Houdini scene.") + dialog.on_clicked.connect(_on_show_inventory) dialog.show() +def on_new(_): + """Set project resolution and fps when create a new file""" + avalon.logger.info("Running callback on new..") + _set_asset_fps() + + +def _set_asset_fps(): + """Set Houdini scene FPS to the default required for current asset""" + + # Set new scene fps + fps = get_asset_fps() + print("Setting scene FPS to %i" % fps) + lib.set_scene_fps(fps) + + def on_pyblish_instance_toggled(instance, new_value, old_value): """Toggle saver tool passthrough states on instance toggles.""" + + @contextlib.contextmanager + def main_take(no_update=True): + """Enter root take during context""" + original_take = hou.takes.currentTake() + original_update_mode = hou.updateModeSetting() + root = hou.takes.rootTake() + has_changed = False + try: + if original_take != root: + has_changed = True + if no_update: + hou.setUpdateMode(hou.updateMode.Manual) + hou.takes.setCurrentTake(root) + yield + finally: + if has_changed: + if no_update: + hou.setUpdateMode(original_update_mode) + hou.takes.setCurrentTake(original_take) + + if not instance.data.get("_allowToggleBypass", True): + return nodes = instance[:] if not nodes: @@ -96,8 +163,20 @@ def on_pyblish_instance_toggled(instance, new_value, old_value): # Assume instance node is first node instance_node = nodes[0] + if not hasattr(instance_node, "isBypassed"): + # Likely not a node that can actually be bypassed + log.debug("Can't bypass node: %s", instance_node.path()) + return + if instance_node.isBypassed() != (not old_value): print("%s old bypass state didn't match old instance state, " "updating anyway.." % instance_node.path()) - instance_node.bypass(not new_value) + try: + # Go into the main take, because when in another take changing + # the bypass state of a note cannot be done due to it being locked + # by default. + with main_take(no_update=True): + instance_node.bypass(not new_value) + except hou.PermissionError as exc: + log.warning("%s - %s", instance_node.path(), exc) diff --git a/openpype/hosts/houdini/api/lib.py b/openpype/hosts/houdini/api/lib.py index 1f0f90811f..53f0e59ea9 100644 --- a/openpype/hosts/houdini/api/lib.py +++ b/openpype/hosts/houdini/api/lib.py @@ -1,14 +1,19 @@ import uuid - +import logging from contextlib import contextmanager -import hou - -from openpype import lib - +from openpype.api import get_asset from avalon import api, io from avalon.houdini import lib as houdini +import hou + +log = logging.getLogger(__name__) + + +def get_asset_fps(): + """Return current asset fps.""" + return get_asset()["data"].get("fps") def set_id(node, unique_id, overwrite=False): @@ -171,10 +176,10 @@ def get_output_parameter(node): node_type = node.type().name() if node_type == "geometry": return node.parm("sopoutput") - elif node_type == "alembic": return node.parm("filename") - + elif node_type == "comp": + return node.parm("copoutput") else: raise TypeError("Node type '%s' not supported" % node_type) @@ -205,7 +210,7 @@ def validate_fps(): """ - fps = lib.get_asset()["data"]["fps"] + fps = get_asset_fps() current_fps = hou.fps() # returns float if current_fps != fps: @@ -217,18 +222,123 @@ def validate_fps(): if parent is None: pass else: - dialog = popup.Popup2(parent=parent) + dialog = popup.Popup(parent=parent) dialog.setModal(True) - dialog.setWindowTitle("Houdini scene not in line with project") - dialog.setMessage("The FPS is out of sync, please fix it") + dialog.setWindowTitle("Houdini scene does not match project FPS") + dialog.setMessage("Scene %i FPS does not match project %i FPS" % + (current_fps, fps)) + dialog.setButtonText("Fix") - # Set new text for button (add optional argument for the popup?) - toggle = dialog.widgets["toggle"] - toggle.setEnabled(False) - dialog.on_show.connect(lambda: set_scene_fps(fps)) + # on_show is the Fix button clicked callback + dialog.on_clicked.connect(lambda: set_scene_fps(fps)) dialog.show() return False return True + + +def create_remote_publish_node(force=True): + """Function to create a remote publish node in /out + + This is a hacked "Shell" node that does *nothing* except for triggering + `colorbleed.lib.publish_remote()` as pre-render script. + + All default attributes of the Shell node are hidden to the Artist to + avoid confusion. + + Additionally some custom attributes are added that can be collected + by a Collector to set specific settings for the publish, e.g. whether + to separate the jobs per instance or process in one single job. + + """ + + cmd = "import colorbleed.lib; colorbleed.lib.publish_remote()" + + existing = hou.node("/out/REMOTE_PUBLISH") + if existing: + if force: + log.warning("Removing existing '/out/REMOTE_PUBLISH' node..") + existing.destroy() + else: + raise RuntimeError("Node already exists /out/REMOTE_PUBLISH. " + "Please remove manually or set `force` to " + "True.") + + # Create the shell node + out = hou.node("/out") + node = out.createNode("shell", node_name="REMOTE_PUBLISH") + node.moveToGoodPosition() + + # Set color make it stand out (avalon/pyblish color) + node.setColor(hou.Color(0.439, 0.709, 0.933)) + + # Set the pre-render script + node.setParms({ + "prerender": cmd, + "lprerender": "python" # command language + }) + + # Lock the attributes to ensure artists won't easily mess things up. + node.parm("prerender").lock(True) + node.parm("lprerender").lock(True) + + # Lock up the actual shell command + command_parm = node.parm("command") + command_parm.set("") + command_parm.lock(True) + shellexec_parm = node.parm("shellexec") + shellexec_parm.set(False) + shellexec_parm.lock(True) + + # Get the node's parm template group so we can customize it + template = node.parmTemplateGroup() + + # Hide default tabs + template.hideFolder("Shell", True) + template.hideFolder("Scripts", True) + + # Hide default settings + template.hide("execute", True) + template.hide("renderdialog", True) + template.hide("trange", True) + template.hide("f", True) + template.hide("take", True) + + # Add custom settings to this node. + parm_folder = hou.FolderParmTemplate("folder", "Submission Settings") + + # Separate Jobs per Instance + parm = hou.ToggleParmTemplate(name="separateJobPerInstance", + label="Separate Job per Instance", + default_value=False) + parm_folder.addParmTemplate(parm) + + # Add our custom Submission Settings folder + template.append(parm_folder) + + # Apply template back to the node + node.setParmTemplateGroup(template) + + +def render_rop(ropnode): + """Render ROP node utility for Publishing. + + This renders a ROP node with the settings we want during Publishing. + """ + # Print verbose when in batch mode without UI + verbose = not hou.isUIAvailable() + + # Render + try: + ropnode.render(verbose=verbose, + # Allow Deadline to capture completion percentage + output_progress=verbose) + except hou.Error as exc: + # The hou.Error is not inherited from a Python Exception class, + # so we explicitly capture the houdini error, otherwise pyblish + # will remain hanging. + import traceback + traceback.print_exc() + raise RuntimeError("Render failed: {0}".format(exc)) diff --git a/openpype/hosts/houdini/api/usd.py b/openpype/hosts/houdini/api/usd.py new file mode 100644 index 0000000000..545cd3f7a5 --- /dev/null +++ b/openpype/hosts/houdini/api/usd.py @@ -0,0 +1,255 @@ +"""Houdini-specific USD Library functions.""" + +import contextlib + +from avalon import io +import logging +from avalon.vendor.Qt import QtCore, QtGui +from avalon.tools.widgets import AssetWidget +from avalon import style + +from pxr import Sdf + + +log = logging.getLogger(__name__) + + +def pick_asset(node): + """Show a user interface to select an Asset in the project + + When double clicking an asset it will set the Asset value in the + 'asset' parameter. + + """ + + pos = QtGui.QCursor.pos() + + parm = node.parm("asset_name") + if not parm: + log.error("Node has no 'asset' parameter: %s", node) + return + + # Construct the AssetWidget as a frameless popup so it automatically + # closes when clicked outside of it. + global tool + tool = AssetWidget(silo_creatable=False) + tool.setContentsMargins(5, 5, 5, 5) + tool.setWindowTitle("Pick Asset") + tool.setStyleSheet(style.load_stylesheet()) + tool.setWindowFlags(QtCore.Qt.FramelessWindowHint | QtCore.Qt.Popup) + tool.refresh() + + # Select the current asset if there is any + name = parm.eval() + if name: + from avalon import io + db_asset = io.find_one({"name": name, "type": "asset"}) + if db_asset: + silo = db_asset.get("silo") + if silo: + tool.set_silo(silo) + tool.select_assets([name], expand=True) + + # Show cursor (top right of window) near cursor + tool.resize(250, 400) + tool.move(tool.mapFromGlobal(pos) - QtCore.QPoint(tool.width(), 0)) + + def set_parameter_callback(index): + name = index.data(tool.model.DocumentRole)["name"] + parm.set(name) + tool.close() + + tool.view.doubleClicked.connect(set_parameter_callback) + tool.show() + + +def add_usd_output_processor(ropnode, processor): + """Add USD Output Processor to USD Rop node. + + Args: + ropnode (hou.RopNode): The USD Rop node. + processor (str): The output processor name. This is the basename of + the python file that contains the Houdini USD Output Processor. + + """ + + import loputils + + loputils.handleOutputProcessorAdd({ + "node": ropnode, + "parm": ropnode.parm("outputprocessors"), + "script_value": processor + }) + + +def remove_usd_output_processor(ropnode, processor): + """Removes USD Output Processor from USD Rop node. + + Args: + ropnode (hou.RopNode): The USD Rop node. + processor (str): The output processor name. This is the basename of + the python file that contains the Houdini USD Output Processor. + + """ + import loputils + + parm = ropnode.parm(processor + "_remove") + if not parm: + raise RuntimeError("Output Processor %s does not " + "exist on %s" % (processor, ropnode.name())) + + loputils.handleOutputProcessorRemove({ + "node": ropnode, + "parm": parm + }) + + +@contextlib.contextmanager +def outputprocessors(ropnode, + processors=tuple(), + disable_all_others=True): + """Context manager to temporarily add Output Processors to USD ROP node. + + Args: + ropnode (hou.RopNode): The USD Rop node. + processors (tuple or list): The processors to add. + disable_all_others (bool, Optional): Whether to disable all + output processors currently on the ROP node that are not in the + `processors` list passed to this function. + + """ + # TODO: Add support for forcing the correct Order of the processors + + original = [] + prefix = "enableoutputprocessor_" + processor_parms = ropnode.globParms(prefix + "*") + for parm in processor_parms: + original.append((parm, parm.eval())) + + if disable_all_others: + for parm in processor_parms: + parm.set(False) + + added = [] + for processor in processors: + + parm = ropnode.parm(prefix + processor) + if parm: + # If processor already exists, just enable it + parm.set(True) + + else: + # Else add the new processor + add_usd_output_processor(ropnode, processor) + added.append(processor) + + try: + yield + finally: + + # Remove newly added processors + for processor in added: + remove_usd_output_processor(ropnode, processor) + + # Revert to original values + for parm, value in original: + if parm: + parm.set(value) + + +def get_usd_rop_loppath(node): + + # Get sop path + node_type = node.type().name() + if node_type == "usd": + return node.parm("loppath").evalAsNode() + + elif node_type in {"usd_rop", "usdrender_rop"}: + # Inside Solaris e.g. /stage (not in ROP context) + # When incoming connection is present it takes it directly + inputs = node.inputs() + if inputs: + return inputs[0] + else: + return node.parm("loppath").evalAsNode() + + +def get_layer_save_path(layer): + """Get custom HoudiniLayerInfo->HoudiniSavePath from SdfLayer. + + Args: + layer (pxr.Sdf.Layer): The Layer to retrieve the save pah data from. + + Returns: + str or None: Path to save to when data exists. + + """ + hou_layer_info = layer.rootPrims.get("HoudiniLayerInfo") + if not hou_layer_info: + return + + save_path = hou_layer_info.customData.get("HoudiniSavePath", None) + if save_path: + # Unfortunately this doesn't actually resolve the full absolute path + return layer.ComputeAbsolutePath(save_path) + + +def get_referenced_layers(layer): + """Return SdfLayers for all external references of the current layer + + Args: + layer (pxr.Sdf.Layer): The Layer to retrieve the save pah data from. + + Returns: + list: List of pxr.Sdf.Layer that are external references to this layer + + """ + + layers = [] + for layer_id in layer.GetExternalReferences(): + layer = Sdf.Layer.Find(layer_id) + if not layer: + # A file may not be in memory and is + # referenced from disk. As such it cannot + # be found. We will ignore those layers. + continue + + layers.append(layer) + + return layers + + +def iter_layer_recursive(layer): + """Recursively iterate all 'external' referenced layers""" + + layers = get_referenced_layers(layer) + traversed = set(layers) # Avoid recursion to itself (if even possible) + traverse = list(layers) + for layer in traverse: + + # Include children layers (recursion) + children_layers = get_referenced_layers(layer) + children_layers = [x for x in children_layers if x not in traversed] + traverse.extend(children_layers) + traversed.update(children_layers) + + yield layer + + +def get_configured_save_layers(usd_rop): + + lop_node = get_usd_rop_loppath(usd_rop) + stage = lop_node.stage(apply_viewport_overrides=False) + if not stage: + raise RuntimeError("No valid USD stage for ROP node: " + "%s" % usd_rop.path()) + + root_layer = stage.GetRootLayer() + + save_layers = [] + for layer in iter_layer_recursive(root_layer): + save_path = get_layer_save_path(layer) + if save_path is not None: + save_layers.append(layer) + + return save_layers diff --git a/openpype/hosts/houdini/plugins/create/create_composite.py b/openpype/hosts/houdini/plugins/create/create_composite.py new file mode 100644 index 0000000000..d8ec41e61a --- /dev/null +++ b/openpype/hosts/houdini/plugins/create/create_composite.py @@ -0,0 +1,35 @@ +from avalon import houdini + + +class CreateCompositeSequence(houdini.Creator): + """Composite ROP to Image Sequence""" + + label = "Composite (Image Sequence)" + family = "colorbleed.imagesequence" + icon = "gears" + + def __init__(self, *args, **kwargs): + super(CreateCompositeSequence, self).__init__(*args, **kwargs) + + # Remove the active, we are checking the bypass flag of the nodes + self.data.pop("active", None) + + # Type of ROP node to create + self.data.update({"node_type": "comp"}) + + def process(self): + instance = super(CreateCompositeSequence, self).process() + + parms = {"copoutput": "$HIP/pyblish/%s.$F4.exr" % self.name} + + if self.nodes: + node = self.nodes[0] + parms.update({"coppath": node.path()}) + + instance.setParms(parms) + + # Lock any parameters in this list + to_lock = ["prim_to_detail_pattern"] + for name in to_lock: + parm = instance.parm(name) + parm.lock(True) diff --git a/openpype/hosts/houdini/plugins/create/create_pointcache.py b/openpype/hosts/houdini/plugins/create/create_pointcache.py index 6be854ac28..7ab1046df3 100644 --- a/openpype/hosts/houdini/plugins/create/create_pointcache.py +++ b/openpype/hosts/houdini/plugins/create/create_pointcache.py @@ -25,6 +25,7 @@ class CreatePointCache(plugin.Creator): "path_attrib": "path", # Pass path attribute for output "prim_to_detail_pattern": "cbId", "format": 2, # Set format to Ogawa + "facesets": 0, # No face sets (by default exclude them) "filename": "$HIP/pyblish/%s.abc" % self.name} if self.nodes: diff --git a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py new file mode 100644 index 0000000000..b944d592f2 --- /dev/null +++ b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py @@ -0,0 +1,63 @@ +import hou + +from avalon import houdini + + +class CreateRedshiftROP(houdini.Creator): + """Redshift ROP""" + + label = "Redshift ROP" + family = "redshift_rop" + icon = "magic" + defaults = ["master"] + + def __init__(self, *args, **kwargs): + super(CreateRedshiftROP, self).__init__(*args, **kwargs) + + # Clear the family prefix from the subset + subset = self.data["subset"] + subset_no_prefix = subset[len(self.family):] + subset_no_prefix = subset_no_prefix[0].lower() + subset_no_prefix[1:] + self.data["subset"] = subset_no_prefix + + # Add chunk size attribute + self.data["chunkSize"] = 10 + + # Remove the active, we are checking the bypass flag of the nodes + self.data.pop("active", None) + + self.data.update({"node_type": "Redshift_ROP"}) + + def process(self): + instance = super(CreateRedshiftROP, self).process() + + basename = instance.name() + instance.setName(basename + "_ROP", unique_name=True) + + # Also create the linked Redshift IPR Rop + ipr_rop = self.parent.createNode("Redshift_IPR", + node_name=basename + "_IPR") + + # Move it to directly under the Redshift ROP + ipr_rop.setPosition(instance.position() + hou.Vector2(0, -1)) + + # Set the linked rop to the Redshift ROP + ipr_rop.parm("linked_rop").set(ipr_rop.relativePathTo(instance)) + + prefix = '${HIP}/render/${HIPNAME}/`chs("subset")`.${AOV}.$F4.exr' + parms = { + # Render frame range + "trange": 1, + + # Redshift ROP settings + "RS_outputFileNamePrefix": prefix, + "RS_outputMultilayerMode": 0, # no multi-layered exr + "RS_outputBeautyAOVSuffix": "beauty" + } + instance.setParms(parms) + + # Lock some Avalon attributes + to_lock = ["family", "id"] + for name in to_lock: + parm = instance.parm(name) + parm.lock(True) diff --git a/openpype/hosts/houdini/plugins/create/create_remote_publish.py b/openpype/hosts/houdini/plugins/create/create_remote_publish.py new file mode 100644 index 0000000000..bc6cf5d949 --- /dev/null +++ b/openpype/hosts/houdini/plugins/create/create_remote_publish.py @@ -0,0 +1,22 @@ +from avalon import houdini + +from colorbleed.houdini import lib + + +class CreateRemotePublish(houdini.Creator): + """Create Remote Publish Submission Settings node.""" + + label = "Remote Publish" + family = "remotePublish" + icon = "cloud-upload" + + def process(self): + """This is a stub creator process. + + This does not create a regular instance that the instance collector + picks up. Instead we force this one to solely create something we + explicitly want to create. The only reason this class is here is so + that Artists can also create the node through the Avalon creator. + + """ + lib.create_remote_publish_node(force=True) diff --git a/openpype/hosts/houdini/plugins/create/create_usd.py b/openpype/hosts/houdini/plugins/create/create_usd.py new file mode 100644 index 0000000000..d4cf3f761b --- /dev/null +++ b/openpype/hosts/houdini/plugins/create/create_usd.py @@ -0,0 +1,39 @@ +from avalon import houdini + + +class CreateUSD(houdini.Creator): + """Universal Scene Description""" + + label = "USD" + family = "colorbleed.usd" + icon = "gears" + + def __init__(self, *args, **kwargs): + super(CreateUSD, self).__init__(*args, **kwargs) + + # Remove the active, we are checking the bypass flag of the nodes + self.data.pop("active", None) + + self.data.update({"node_type": "usd"}) + + def process(self): + instance = super(CreateUSD, self).process() + + parms = { + "lopoutput": "$HIP/pyblish/%s.usd" % self.name, + "enableoutputprocessor_simplerelativepaths": False + } + + if self.nodes: + node = self.nodes[0] + parms.update({"loppath": node.path()}) + + instance.setParms(parms) + + # Lock any parameters in this list + to_lock = ["fileperframe", + # Lock some Avalon attributes + "family", "id"] + for name in to_lock: + parm = instance.parm(name) + parm.lock(True) diff --git a/openpype/hosts/houdini/plugins/create/create_usd_model.py b/openpype/hosts/houdini/plugins/create/create_usd_model.py new file mode 100644 index 0000000000..f4c377e0a8 --- /dev/null +++ b/openpype/hosts/houdini/plugins/create/create_usd_model.py @@ -0,0 +1,39 @@ +import re + +from avalon import api +from avalon.houdini import lib +import hou + + +class CreateUSDModel(api.Creator): + """Author USD Model""" + + label = "USD Model" + family = "usdModel" + icon = "gears" + + def process(self): + + node_type = "cb::author_model:1.0" + + subset = self.data["subset"] + name = "author_{}".format(subset) + variant = re.match("usdModel(.*)", subset).group(1) + + # Get stage root and create node + stage = hou.node("/stage") + instance = stage.createNode(node_type, node_name=name) + instance.moveToGoodPosition(move_unconnected=True) + + parms = { + "asset_name": self.data["asset"], + "variant_name": variant + } + + # Set the Geo Path to the first selected node (if any) + selection = hou.selectedNodes() + if selection: + node = selection[0] + parms["geo_path"] = node.path() + + instance.setParms(parms) diff --git a/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py b/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py new file mode 100644 index 0000000000..87c54c9fb7 --- /dev/null +++ b/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py @@ -0,0 +1,57 @@ +from avalon import api +from avalon.houdini import lib +import hou + + +class _USDWorkspace(api.Creator): + """Base class to create pre-built USD Workspaces""" + + node_name = None + node_type = None + step = None + icon = "gears" + + def process(self): + + if not all([self.node_type, self.node_name, self.step]): + self.log.error("Incomplete USD Workspace parameters") + return + + name = self.node_name + node_type = self.node_type + + # Force the subset to "{asset}.{step}.usd" + subset = "usd{step}".format(step=self.step) + self.data["subset"] = subset + + # Get stage root and create node + stage = hou.node("/stage") + instance = stage.createNode(node_type, node_name=name) + instance.moveToGoodPosition() + + # With the Workspace HDAs there is no need to imprint the instance data + # since this data is pre-built into it. However, we do set the right + # asset as that can be defined by the user. + parms = { + "asset": self.data["asset"] + } + instance.setParms(parms) + + return instance + + +class USDCreateShadingWorkspace(_USDWorkspace): + """USD Shading Workspace""" + + defaults = ["Shade"] + + label = "USD Shading Workspace" + family = "colorbleed.shade.usd" + + node_type = "cb::shadingWorkspace::1.0" + node_name = "shadingWorkspace" + step = "Shade" + + +# Don't allow the base class to be picked up by Avalon +del _USDWorkspace diff --git a/openpype/hosts/houdini/plugins/create/create_usdrender.py b/openpype/hosts/houdini/plugins/create/create_usdrender.py new file mode 100644 index 0000000000..4914e8e3ab --- /dev/null +++ b/openpype/hosts/houdini/plugins/create/create_usdrender.py @@ -0,0 +1,36 @@ +import hou + +from avalon import houdini + + +class CreateUSDRender(houdini.Creator): + """USD Render ROP in /stage""" + + label = "USD Render" + family = "colorbleed.usdrender" + icon = "magic" + + def __init__(self, *args, **kwargs): + super(CreateUSDRender, self).__init__(*args, **kwargs) + + self.parent = hou.node("/stage") + + # Remove the active, we are checking the bypass flag of the nodes + self.data.pop("active", None) + + self.data.update({"node_type": "usdrender_rop"}) + + def process(self): + instance = super(CreateUSDRender, self).process() + + parms = { + # Render frame range + "trange": 1 + } + instance.setParms(parms) + + # Lock some Avalon attributes + to_lock = ["family", "id"] + for name in to_lock: + parm = instance.parm(name) + parm.lock(True) diff --git a/openpype/hosts/houdini/plugins/load/actions.py b/openpype/hosts/houdini/plugins/load/actions.py new file mode 100644 index 0000000000..bb8cd7a1f6 --- /dev/null +++ b/openpype/hosts/houdini/plugins/load/actions.py @@ -0,0 +1,78 @@ +"""A module containing generic loader actions that will display in the Loader. + +""" + +from avalon import api + + +class SetFrameRangeLoader(api.Loader): + """Set Maya frame range""" + + families = ["colorbleed.animation", + "colorbleed.camera", + "colorbleed.pointcache", + "colorbleed.vdbcache", + "colorbleed.usd"] + representations = ["abc", "vdb", "usd"] + + label = "Set frame range" + order = 11 + icon = "clock-o" + color = "white" + + def load(self, context, name, namespace, data): + + import hou + + version = context['version'] + version_data = version.get("data", {}) + + start = version_data.get("startFrame", None) + end = version_data.get("endFrame", None) + + if start is None or end is None: + print("Skipping setting frame range because start or " + "end frame data is missing..") + return + + hou.playbar.setFrameRange(start, end) + hou.playbar.setPlaybackRange(start, end) + + +class SetFrameRangeWithHandlesLoader(api.Loader): + """Set Maya frame range including pre- and post-handles""" + + families = ["colorbleed.animation", + "colorbleed.camera", + "colorbleed.pointcache", + "colorbleed.vdbcache", + "colorbleed.usd"] + representations = ["abc", "vdb", "usd"] + + label = "Set frame range (with handles)" + order = 12 + icon = "clock-o" + color = "white" + + def load(self, context, name, namespace, data): + + import hou + + version = context['version'] + version_data = version.get("data", {}) + + start = version_data.get("startFrame", None) + end = version_data.get("endFrame", None) + + if start is None or end is None: + print("Skipping setting frame range because start or " + "end frame data is missing..") + return + + # Include handles + handles = version_data.get("handles", 0) + start -= handles + end += handles + + hou.playbar.setFrameRange(start, end) + hou.playbar.setPlaybackRange(start, end) diff --git a/openpype/hosts/houdini/plugins/load/load_alembic.py b/openpype/hosts/houdini/plugins/load/load_alembic.py index 8fc2b6a61a..076b4051f8 100644 --- a/openpype/hosts/houdini/plugins/load/load_alembic.py +++ b/openpype/hosts/houdini/plugins/load/load_alembic.py @@ -8,7 +8,8 @@ class AbcLoader(api.Loader): families = ["model", "animation", - "pointcache"] + "pointcache", + "gpuCache"] label = "Load Alembic" representations = ["abc"] order = -10 @@ -68,8 +69,9 @@ class AbcLoader(api.Loader): null = container.createNode("null", node_name="OUT".format(name)) null.setInput(0, normal_node) - # Set display on last node - null.setDisplayFlag(True) + # Ensure display flag is on the Alembic input node and not on the OUT + # node to optimize "debug" displaying in the viewport. + alembic.setDisplayFlag(True) # Set new position for unpack node else it gets cluttered nodes = [container, alembic, unpack, normal_node, null] @@ -82,7 +84,8 @@ class AbcLoader(api.Loader): namespace, nodes, context, - self.__class__.__name__) + self.__class__.__name__, + suffix="") def update(self, container, representation): diff --git a/openpype/hosts/houdini/plugins/load/load_camera.py b/openpype/hosts/houdini/plugins/load/load_camera.py index a3d67f6e5e..ac0e1f0436 100644 --- a/openpype/hosts/houdini/plugins/load/load_camera.py +++ b/openpype/hosts/houdini/plugins/load/load_camera.py @@ -1,8 +1,78 @@ from avalon import api - from avalon.houdini import pipeline, lib +ARCHIVE_EXPRESSION = '__import__("_alembic_hom_extensions").alembicGetCameraDict' + + +def transfer_non_default_values(src, dest, ignore=None): + """Copy parm from src to dest. + + Because the Alembic Archive rebuilds the entire node + hierarchy on triggering "Build Hierarchy" we want to + preserve any local tweaks made by the user on the camera + for ease of use. That could be a background image, a + resolution change or even Redshift camera parameters. + + We try to do so by finding all Parms that exist on both + source and destination node, include only those that both + are not at their default value, they must be visible, + we exclude those that have the special "alembic archive" + channel expression and ignore certain Parm types. + + """ + import hou + + src.updateParmStates() + + for parm in src.allParms(): + + if ignore and parm.name() in ignore: + continue + + # If destination parm does not exist, ignore.. + dest_parm = dest.parm(parm.name()) + if not dest_parm: + continue + + # Ignore values that are currently at default + if parm.isAtDefault() and dest_parm.isAtDefault(): + continue + + if not parm.isVisible(): + # Ignore hidden parameters, assume they + # are implementation details + continue + + expression = None + try: + expression = parm.expression() + except hou.OperationFailed: + # No expression present + pass + + if expression is not None and ARCHIVE_EXPRESSION in expression: + # Assume it's part of the automated connections that the Alembic Archive + # makes on loading of the camera and thus we do not want to transfer + # the expression + continue + + # Ignore folders, separators, etc. + ignore_types = { + hou.parmTemplateType.Toggle, + hou.parmTemplateType.Menu, + hou.parmTemplateType.Button, + hou.parmTemplateType.FolderSet, + hou.parmTemplateType.Separator, + hou.parmTemplateType.Label, + } + if parm.parmTemplate().type() in ignore_types: + continue + + print("Preserving attribute: %s" % parm.name()) + dest_parm.setFromParm(parm) + + class CameraLoader(api.Loader): """Specific loader of Alembic for the avalon.animation family""" @@ -30,7 +100,7 @@ class CameraLoader(api.Loader): counter = 1 asset_name = context["asset"]["name"] - namespace = namespace if namespace else asset_name + namespace = namespace or asset_name formatted = "{}_{}".format(namespace, name) if namespace else name node_name = "{0}_{1:03d}".format(formatted, counter) @@ -59,7 +129,8 @@ class CameraLoader(api.Loader): namespace, nodes, context, - self.__class__.__name__) + self.__class__.__name__, + suffix="") def update(self, container, representation): @@ -73,14 +144,40 @@ class CameraLoader(api.Loader): node.setParms({"fileName": file_path, "representation": str(representation["_id"])}) + # Store the cam temporarily next to the Alembic Archive + # so that we can preserve parm values the user set on it + # after build hierarchy was triggered. + old_camera = self._get_camera(node) + temp_camera = old_camera.copyTo(node.parent()) + # Rebuild node.parm("buildHierarchy").pressButton() + # Apply values to the new camera + new_camera = self._get_camera(node) + transfer_non_default_values(temp_camera, + new_camera, + # The hidden uniform scale attribute + # gets a default connection to "icon_scale" + # just skip that completely + ignore={"scale"}) + + temp_camera.destroy() + def remove(self, container): node = container["node"] node.destroy() + def _get_camera(self, node): + import hou + cameras = node.recursiveGlob("*", + filter=hou.nodeTypeFilter.ObjCamera, + include_subnets=False) + + assert len(cameras) == 1, "Camera instance must have only one camera" + return cameras[0] + def create_and_connect(self, node, node_type, name=None): """Create a node within a node which and connect it to the input @@ -93,27 +190,10 @@ class CameraLoader(api.Loader): hou.Node """ + if name: + new_node = node.createNode(node_type, node_name=name) + else: + new_node = node.createNode(node_type) - import hou - - try: - - if name: - new_node = node.createNode(node_type, node_name=name) - else: - new_node = node.createNode(node_type) - - new_node.moveToGoodPosition() - - try: - input_node = next(i for i in node.allItems() if - isinstance(i, hou.SubnetIndirectInput)) - except StopIteration: - return new_node - - new_node.setInput(0, input_node) - return new_node - - except Exception: - raise RuntimeError("Could not created node type `%s` in node `%s`" - % (node_type, node)) + new_node.moveToGoodPosition() + return new_node diff --git a/openpype/hosts/houdini/plugins/load/load_image.py b/openpype/hosts/houdini/plugins/load/load_image.py new file mode 100644 index 0000000000..026cb07f67 --- /dev/null +++ b/openpype/hosts/houdini/plugins/load/load_image.py @@ -0,0 +1,119 @@ +import os + +from avalon import api +from avalon.houdini import pipeline, lib + +import hou + +def get_image_avalon_container(): + """The COP2 files must be in a COP2 network. + + So we maintain a single entry point within AVALON_CONTAINERS, + just for ease of use. + + """ + + path = pipeline.AVALON_CONTAINERS + avalon_container = hou.node(path) + if not avalon_container: + # Let's create avalon container secretly + # but make sure the pipeline still is built the + # way we anticipate it was built, asserting it. + assert path == "/obj/AVALON_CONTAINERS" + + parent = hou.node("/obj") + avalon_container = parent.createNode("subnet", + node_name="AVALON_CONTAINERS") + + image_container = hou.node(path + "/IMAGES") + if not image_container: + image_container = avalon_container.createNode("cop2net", node_name="IMAGES") + image_container.moveToGoodPosition() + + return image_container + + +class ImageLoader(api.Loader): + """Specific loader of Alembic for the avalon.animation family""" + + families = ["colorbleed.imagesequence"] + label = "Load Image (COP2)" + representations = ["*"] + order = -10 + + icon = "code-fork" + color = "orange" + + def load(self, context, name=None, namespace=None, data=None): + + # Format file name, Houdini only wants forward slashes + file_path = os.path.normpath(self.fname) + file_path = file_path.replace("\\", "/") + file_path = self._get_file_sequence(file_path) + + # Get the root node + parent = get_image_avalon_container() + + # Define node name + namespace = namespace if namespace else context["asset"]["name"] + node_name = "{}_{}".format(namespace, name) if namespace else name + + node = parent.createNode("file", node_name=node_name) + node.moveToGoodPosition() + + node.setParms({"filename1": file_path}) + + # Imprint it manually + data = { + "schema": "avalon-core:container-2.0", + "id": pipeline.AVALON_CONTAINER_ID, + "name": node_name, + "namespace": namespace, + "loader": str(self.__class__.__name__), + "representation": str(context["representation"]["_id"]), + } + + # todo: add folder="Avalon" + lib.imprint(node, data) + + return node + + def update(self, container, representation): + + node = container["node"] + + # Update the file path + file_path = api.get_representation_path(representation) + file_path = file_path.replace("\\", "/") + file_path = self._get_file_sequence(file_path) + + # Update attributes + node.setParms({ + "filename1": file_path, + "representation": str(representation["_id"]) + }) + + def remove(self, container): + + node = container["node"] + + # Let's clean up the IMAGES COP2 network + # if it ends up being empty and we deleted + # the last file node. Store the parent + # before we delete the node. + parent = node.parent() + + node.destroy() + + if not parent.children(): + parent.destroy() + + + + def _get_file_sequence(self, root): + files = sorted(os.listdir(root)) + + first_fname = files[0] + prefix, padding, suffix = first_fname.rsplit(".", 2) + fname = ".".join([prefix, "$F{}".format(len(padding)), suffix]) + return os.path.join(root, fname).replace("\\", "/") \ No newline at end of file diff --git a/openpype/hosts/houdini/plugins/load/load_usd_layer.py b/openpype/hosts/houdini/plugins/load/load_usd_layer.py new file mode 100644 index 0000000000..79fe3e88fd --- /dev/null +++ b/openpype/hosts/houdini/plugins/load/load_usd_layer.py @@ -0,0 +1,74 @@ +from avalon import api +from avalon.houdini import pipeline, lib + + +class USDSublayerLoader(api.Loader): + """Sublayer USD file in Solaris""" + + families = ["colorbleed.usd", + "colorbleed.pointcache", + "colorbleed.animation", + "colorbleed.camera", + "usdCamera"] + label = "Sublayer USD" + representations = ["usd", "usda", "usdlc", "usdnc", "abc"] + order = 1 + + icon = "code-fork" + color = "orange" + + def load(self, context, name=None, namespace=None, data=None): + + import os + import hou + + # Format file name, Houdini only wants forward slashes + file_path = os.path.normpath(self.fname) + file_path = file_path.replace("\\", "/") + + # Get the root node + stage = hou.node("/stage") + + # Define node name + namespace = namespace if namespace else context["asset"]["name"] + node_name = "{}_{}".format(namespace, name) if namespace else name + + # Create USD reference + container = stage.createNode("sublayer", node_name=node_name) + container.setParms({"filepath1": file_path}) + container.moveToGoodPosition() + + # Imprint it manually + data = { + "schema": "avalon-core:container-2.0", + "id": pipeline.AVALON_CONTAINER_ID, + "name": node_name, + "namespace": namespace, + "loader": str(self.__class__.__name__), + "representation": str(context["representation"]["_id"]), + } + + # todo: add folder="Avalon" + lib.imprint(container, data) + + return container + + def update(self, container, representation): + + node = container["node"] + + # Update the file path + file_path = api.get_representation_path(representation) + file_path = file_path.replace("\\", "/") + + # Update attributes + node.setParms({"filepath1": file_path, + "representation": str(representation["_id"])}) + + # Reload files + node.parm("reload").pressButton() + + def remove(self, container): + + node = container["node"] + node.destroy() \ No newline at end of file diff --git a/openpype/hosts/houdini/plugins/load/load_usd_reference.py b/openpype/hosts/houdini/plugins/load/load_usd_reference.py new file mode 100644 index 0000000000..f996ccdc3c --- /dev/null +++ b/openpype/hosts/houdini/plugins/load/load_usd_reference.py @@ -0,0 +1,74 @@ +from avalon import api +from avalon.houdini import pipeline, lib + + +class USDReferenceLoader(api.Loader): + """Reference USD file in Solaris""" + + families = ["colorbleed.usd", + "colorbleed.pointcache", + "colorbleed.animation", + "colorbleed.camera", + "usdCamera"] + label = "Reference USD" + representations = ["usd", "usda", "usdlc", "usdnc", "abc"] + order = -8 + + icon = "code-fork" + color = "orange" + + def load(self, context, name=None, namespace=None, data=None): + + import os + import hou + + # Format file name, Houdini only wants forward slashes + file_path = os.path.normpath(self.fname) + file_path = file_path.replace("\\", "/") + + # Get the root node + stage = hou.node("/stage") + + # Define node name + namespace = namespace if namespace else context["asset"]["name"] + node_name = "{}_{}".format(namespace, name) if namespace else name + + # Create USD reference + container = stage.createNode("reference", node_name=node_name) + container.setParms({"filepath1": file_path}) + container.moveToGoodPosition() + + # Imprint it manually + data = { + "schema": "avalon-core:container-2.0", + "id": pipeline.AVALON_CONTAINER_ID, + "name": node_name, + "namespace": namespace, + "loader": str(self.__class__.__name__), + "representation": str(context["representation"]["_id"]), + } + + # todo: add folder="Avalon" + lib.imprint(container, data) + + return container + + def update(self, container, representation): + + node = container["node"] + + # Update the file path + file_path = api.get_representation_path(representation) + file_path = file_path.replace("\\", "/") + + # Update attributes + node.setParms({"filepath1": file_path, + "representation": str(representation["_id"])}) + + # Reload files + node.parm("reload").pressButton() + + def remove(self, container): + + node = container["node"] + node.destroy() diff --git a/openpype/hosts/houdini/plugins/load/load_vdb.py b/openpype/hosts/houdini/plugins/load/load_vdb.py new file mode 100644 index 0000000000..be2b2556f5 --- /dev/null +++ b/openpype/hosts/houdini/plugins/load/load_vdb.py @@ -0,0 +1,106 @@ +import os +import re +from avalon import api + +from avalon.houdini import pipeline, lib + + +class VdbLoader(api.Loader): + """Specific loader of Alembic for the avalon.animation family""" + + families = ["colorbleed.vdbcache"] + label = "Load VDB" + representations = ["vdb"] + order = -10 + icon = "code-fork" + color = "orange" + + def load(self, context, name=None, namespace=None, data=None): + + import hou + + # Get the root node + obj = hou.node("/obj") + + # Define node name + namespace = namespace if namespace else context["asset"]["name"] + node_name = "{}_{}".format(namespace, name) if namespace else name + + # Create a new geo node + container = obj.createNode("geo", node_name=node_name) + + # Remove the file node, it only loads static meshes + # Houdini 17 has removed the file node from the geo node + file_node = container.node("file1") + if file_node: + file_node.destroy() + + # Explicitly create a file node + file_node = container.createNode("file", node_name=node_name) + file_node.setParms({"file": self.format_path(self.fname)}) + + # Set display on last node + file_node.setDisplayFlag(True) + + nodes = [container, file_node] + self[:] = nodes + + return pipeline.containerise(node_name, + namespace, + nodes, + context, + self.__class__.__name__, + suffix="") + + def format_path(self, path): + """Format file path correctly for single vdb or vdb sequence""" + + if not os.path.exists(path): + raise RuntimeError("Path does not exist: %s" % path) + + # The path is either a single file or sequence in a folder. + is_single_file = os.path.isfile(path) + if is_single_file: + filename = path + else: + # The path points to the publish .vdb sequence folder so we + # find the first file in there that ends with .vdb + files = sorted(os.listdir(path)) + first = next((x for x in files if x.endswith(".vdb")), None) + if first is None: + raise RuntimeError("Couldn't find first .vdb file of " + "sequence in: %s" % path) + + # Set .vdb to $F.vdb + first = re.sub(r"\.(\d+)\.vdb$", ".$F.vdb", first) + + filename = os.path.join(path, first) + + filename = os.path.normpath(filename) + filename = filename.replace("\\", "/") + + return filename + + def update(self, container, representation): + + node = container["node"] + try: + file_node = next(n for n in node.children() if + n.type().name() == "file") + except StopIteration: + self.log.error("Could not find node of type `alembic`") + return + + # Update the file path + file_path = api.get_representation_path(representation) + file_path = self.format_path(file_path) + + file_node.setParms({"fileName": file_path}) + + # Update attribute + node.setParms({"representation": str(representation["_id"])}) + + def remove(self, container): + + node = container["node"] + node.destroy() diff --git a/openpype/hosts/houdini/plugins/load/show_usdview.py b/openpype/hosts/houdini/plugins/load/show_usdview.py new file mode 100644 index 0000000000..b9aa0e7ddc --- /dev/null +++ b/openpype/hosts/houdini/plugins/load/show_usdview.py @@ -0,0 +1,44 @@ +from avalon import api + + +class ShowInUsdview(api.Loader): + """Open USD file in usdview""" + + families = ["colorbleed.usd"] + label = "Show in usdview" + representations = ["usd", "usda", "usdlc", "usdnc"] + order = 10 + + icon = "code-fork" + color = "white" + + def load(self, context, name=None, namespace=None, data=None): + + import os + import subprocess + + import avalon.lib as lib + + usdview = lib.which("usdview") + + filepath = os.path.normpath(self.fname) + filepath = filepath.replace("\\", "/") + + if not os.path.exists(filepath): + self.log.error("File does not exist: %s" % filepath) + return + + self.log.info("Start houdini variant of usdview...") + + # For now avoid some pipeline environment variables that initialize + # Avalon in Houdini as it is redundant for usdview and slows boot time + env = os.environ.copy() + env.pop("PYTHONPATH", None) + env.pop("HOUDINI_SCRIPT_PATH", None) + env.pop("HOUDINI_MENU_PATH", None) + + # Force string to avoid unicode issues + env = {str(key): str(value) for key, value in env.items()} + + subprocess.Popen([usdview, filepath, "--renderer", "GL"], + env=env) diff --git a/openpype/hosts/houdini/plugins/publish/collect_active_state.py b/openpype/hosts/houdini/plugins/publish/collect_active_state.py new file mode 100644 index 0000000000..ee8640b04e --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/collect_active_state.py @@ -0,0 +1,36 @@ +import pyblish.api +import openpype.api + + +class CollectInstanceActiveState(pyblish.api.InstancePlugin): + """Collect default active state for instance from its node bypass state. + + This is done at the very end of the CollectorOrder so that any required + collecting of data iterating over instances (with InstancePlugin) will + actually collect the data for when the user enables the state in the UI. + Otherwise potentially required data might have skipped collecting. + + """ + + order = pyblish.api.CollectorOrder + 0.299 + families = ["*"] + hosts = ["houdini"] + label = "Instance Active State" + + def process(self, instance): + + # Must have node to check for bypass state + if len(instance) == 0: + return + + # Check bypass state and reverse + node = instance[0] + active = not node.isBypassed() + + # Set instance active state + instance.data.update({ + "active": active, + # temporarily translation of `active` to `publish` till issue has + # been resolved: https://github.com/pyblish/pyblish-base/issues/307 + "publish": active + }) diff --git a/openpype/hosts/houdini/plugins/publish/collect_frames.py b/openpype/hosts/houdini/plugins/publish/collect_frames.py index 1d664aeaeb..ed43f717c2 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_frames.py +++ b/openpype/hosts/houdini/plugins/publish/collect_frames.py @@ -6,11 +6,12 @@ from openpype.hosts.houdini.api import lib class CollectFrames(pyblish.api.InstancePlugin): - """Collect all frames which would be a resukl""" + """Collect all frames which would be saved from the ROP nodes""" order = pyblish.api.CollectorOrder label = "Collect Frames" - families = ["vdbcache"] + families = ["vdbcache", + "imagesequence"] def process(self, instance): @@ -19,10 +20,17 @@ class CollectFrames(pyblish.api.InstancePlugin): output_parm = lib.get_output_parameter(ropnode) output = output_parm.eval() + _, ext = os.path.splitext(output) file_name = os.path.basename(output) - match = re.match("(\w+)\.(\d+)\.vdb", file_name) result = file_name + # Get the filename pattern match from the output + # path so we can compute all frames that would + # come out from rendering the ROP node if there + # is a frame pattern in the name + pattern = r"\w+\.(\d+)" + re.escape(ext) + match = re.match(pattern, file_name) + start_frame = instance.data.get("frameStart", None) end_frame = instance.data.get("frameEnd", None) @@ -35,6 +43,8 @@ class CollectFrames(pyblish.api.InstancePlugin): int(start_frame), int(end_frame)) + # todo: `frames` currently conflicts with "explicit frames" for a + # for a custom frame list. So this should be refactored. instance.data.update({"frames": result}) def create_file_list(self, match, start_frame, end_frame): @@ -50,17 +60,24 @@ class CollectFrames(pyblish.api.InstancePlugin): """ + # Get the padding length + frame = match.group(1) + padding = len(frame) + + # Get the parts of the filename surrounding the frame number + # so we can put our own frame numbers in. + span = match.span(1) + prefix = match.string[:span[0]] + suffix = match.string[span[1]:] + + # Generate filenames for all frames result = [] + for i in range(start_frame, end_frame+1): - padding = len(match.group(2)) - name = match.group(1) - padding_format = "{number:0{width}d}" + # Format frame number by the padding amount + str_frame = "{number:0{width}d}".format(number=i, width=padding) - count = start_frame - while count <= end_frame: - str_count = padding_format.format(number=count, width=padding) - file_name = "{}.{}.vdb".format(name, str_count) + file_name = prefix + str_frame + suffix result.append(file_name) - count += 1 return result diff --git a/openpype/hosts/houdini/plugins/publish/collect_inputs.py b/openpype/hosts/houdini/plugins/publish/collect_inputs.py new file mode 100644 index 0000000000..1fafba483e --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/collect_inputs.py @@ -0,0 +1,120 @@ +import hou + +import avalon.io as io +import avalon.api as api +import pyblish.api + + +def collect_input_containers(nodes): + """Collect containers that contain any of the node in `nodes`. + + This will return any loaded Avalon container that contains at least one of + the nodes. As such, the Avalon container is an input for it. Or in short, + there are member nodes of that container. + + Returns: + list: Input avalon containers + + """ + + # Lookup by node ids + lookup = frozenset(nodes) + + containers = [] + host = api.registered_host() + for container in host.ls(): + + node = container["node"] + + # Usually the loaded containers don't have any complex references + # and the contained children should be all we need. So we disregard + # checking for .references() on the nodes. + members = set(node.allSubChildren()) + members.add(node) # include the node itself + + # If there's an intersection + if not lookup.isdisjoint(members): + containers.append(container) + + return containers + + +def iter_upstream(node): + """Yields all upstream inputs for the current node. + + This includes all `node.inputAncestors()` but also traverses through all + `node.references()` for the node itself and for any of the upstream nodes. + This method has no max-depth and will collect all upstream inputs. + + Yields: + hou.Node: The upstream nodes, including references. + + """ + + upstream = node.inputAncestors(include_ref_inputs=True, + follow_subnets=True) + + # Initialize process queue with the node's ancestors itself + queue = list(upstream) + collected = set(upstream) + + # Traverse upstream references for all nodes and yield them as we + # process the queue. + while queue: + upstream_node = queue.pop() + yield upstream_node + + # Find its references that are not collected yet. + references = upstream_node.references() + references = [n for n in references if n not in collected] + + queue.extend(references) + collected.update(references) + + # Include the references' ancestors that have not been collected yet. + for reference in references: + ancestors = reference.inputAncestors(include_ref_inputs=True, + follow_subnets=True) + ancestors = [n for n in ancestors if n not in collected] + + queue.extend(ancestors) + collected.update(ancestors) + + +class CollectUpstreamInputs(pyblish.api.InstancePlugin): + """Collect source input containers used for this publish. + + This will include `inputs` data of which loaded publishes were used in the + generation of this publish. This leaves an upstream trace to what was used + as input. + + """ + + label = "Collect Inputs" + order = pyblish.api.CollectorOrder + 0.4 + hosts = ["houdini"] + + def process(self, instance): + # We can't get the "inputAncestors" directly from the ROP + # node, so we find the related output node (set in SOP/COP path) + # and include that together with its ancestors + output = instance.data.get("output_node") + + if output is None: + # If no valid output node is set then ignore it as validation + # will be checking those cases. + self.log.debug("No output node found, skipping " + "collecting of inputs..") + return + + # Collect all upstream parents + nodes = list(iter_upstream(output)) + nodes.append(output) + + # Collect containers for the given set of nodes + containers = collect_input_containers(nodes) + + inputs = [c["representation"] for c in containers] + instance.data["inputs"] = inputs + + self.log.info("Collected inputs: %s" % inputs) diff --git a/openpype/hosts/houdini/plugins/publish/collect_instances.py b/openpype/hosts/houdini/plugins/publish/collect_instances.py index 2e294face2..6b00b7cb22 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_instances.py +++ b/openpype/hosts/houdini/plugins/publish/collect_instances.py @@ -31,6 +31,13 @@ class CollectInstances(pyblish.api.ContextPlugin): def process(self, context): nodes = hou.node("/out").children() + + # Include instances in USD stage only when it exists so it + # remains backwards compatible with version before houdini 18 + stage = hou.node("/stage") + if stage: + nodes += stage.recursiveGlob("*", filter=hou.nodeTypeFilter.Rop) + for node in nodes: if not node.parm("id"): @@ -55,6 +62,8 @@ class CollectInstances(pyblish.api.ContextPlugin): # Create nice name if the instance has a frame range. label = data.get("name", node.name()) + label += " (%s)" % data["asset"] # include asset in name + if "frameStart" in data and "frameEnd" in data: frames = "[{frameStart} - {frameEnd}]".format(**data) label = "{} {}".format(label, frames) diff --git a/openpype/hosts/houdini/plugins/publish/collect_instances_usd_layered.py b/openpype/hosts/houdini/plugins/publish/collect_instances_usd_layered.py new file mode 100644 index 0000000000..a3e9400970 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/collect_instances_usd_layered.py @@ -0,0 +1,155 @@ +import os + +import hou +import pyblish.api +from avalon import io +from avalon.houdini import lib +import openpype.hosts.houdini.api.usd as hou_usdlib +import openpype.lib.usdlib as usdlib + + +class CollectInstancesUsdLayered(pyblish.api.ContextPlugin): + """Collect Instances from a ROP Network and its configured layer paths. + + The output nodes of the ROP node will only be published when *any* of the + layers remain set to 'publish' by the user. + + This works differently from most of our Avalon instances in the pipeline. + As opposed to storing `pyblish.avalon.instance` as id on the node we store + `pyblish.avalon.usdlayered`. + + Additionally this instance has no need for storing family, asset, subset + or name on the nodes. Instead all information is retrieved solely from + the output filepath, which is an Avalon URI: + avalon://{asset}/{subset}.{representation} + + Each final ROP node is considered a dependency for any of the Configured + Save Path layers it sets along the way. As such, the instances shown in + the Pyblish UI are solely the configured layers. The encapsulating usd + files are generated whenever *any* of the dependencies is published. + + These dependency instances are stored in: + instance.data["publishDependencies"] + + """ + + order = pyblish.api.CollectorOrder - 0.01 + label = "Collect Instances (USD Configured Layers)" + hosts = ["houdini"] + + def process(self, context): + + stage = hou.node("/stage") + if not stage: + # Likely Houdini version <18 + return + + nodes = stage.recursiveGlob("*", filter=hou.nodeTypeFilter.Rop) + for node in nodes: + + if not node.parm("id"): + continue + + if node.evalParm("id") != "pyblish.avalon.usdlayered": + continue + + has_family = node.evalParm("family") + assert has_family, "'%s' is missing 'family'" % node.name() + + self.process_node(node, context) + + def sort_by_family(instance): + """Sort by family""" + return instance.data.get("families", instance.data.get("family")) + + # Sort/grouped by family (preserving local index) + context[:] = sorted(context, key=sort_by_family) + + return context + + def process_node(self, node, context): + + # Allow a single ROP node or a full ROP network of USD ROP nodes + # to be processed as a single entry that should "live together" on + # a publish. + if node.type().name() == "ropnet": + # All rop nodes inside ROP Network + ropnodes = node.recursiveGlob("*", filter=hou.nodeTypeFilter.Rop) + else: + # A single node + ropnodes = [node] + + data = lib.read(node) + + # Don't use the explicit "colorbleed.usd.layered" family for publishing + # instead use the "colorbleed.usd" family to integrate. + data["publishFamilies"] = ["colorbleed.usd"] + + # For now group ALL of them into USD Layer subset group + # Allow this subset to be grouped into a USD Layer on creation + data["subsetGroup"] = "USD Layer" + + instances = list() + dependencies = [] + for ropnode in ropnodes: + + # Create a dependency instance per ROP Node. + lopoutput = ropnode.evalParm("lopoutput") + dependency_save_data = self.get_save_data(lopoutput) + dependency = context.create_instance(dependency_save_data["name"]) + dependency.append(ropnode) + dependency.data.update(data) + dependency.data.update(dependency_save_data) + dependency.data["family"] = "colorbleed.usd.dependency" + dependency.data["optional"] = False + dependencies.append(dependency) + + # Hide the dependency instance from the context + context.pop() + + # Get all configured layers for this USD ROP node + # and create a Pyblish instance for each one + layers = hou_usdlib.get_configured_save_layers(ropnode) + for layer in layers: + save_path = hou_usdlib.get_layer_save_path(layer) + save_data = self.get_save_data(save_path) + if not save_data: + continue + self.log.info(save_path) + + instance = context.create_instance(save_data["name"]) + instance[:] = [node] + + # Set the instance data + instance.data.update(data) + instance.data.update(save_data) + instance.data["usdLayer"] = layer + + # Don't allow the Pyblish `instanceToggled` we have installed + # to set this node to bypass. + instance.data["_allowToggleBypass"] = False + + instances.append(instance) + + # Store the collected ROP node dependencies + self.log.debug("Collected dependencies: %s" % (dependencies,)) + for instance in instances: + instance.data["publishDependencies"] = dependencies + + def get_save_data(self, save_path): + + # Resolve Avalon URI + uri_data = usdlib.parse_avalon_uri(save_path) + if not uri_data: + self.log.warning("Non Avalon URI Layer Path: %s" % save_path) + return {} + + # Collect asset + subset from URI + name = "{subset} ({asset})".format(**uri_data) + fname = "{asset}_{subset}.{ext}".format(**uri_data) + + data = dict(uri_data) + data["usdSavePath"] = save_path + data["usdFilename"] = fname + data["name"] = name + return data diff --git a/openpype/hosts/houdini/plugins/publish/collect_output_node.py b/openpype/hosts/houdini/plugins/publish/collect_output_node.py index c0587d5336..e8aa701f26 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_output_node.py +++ b/openpype/hosts/houdini/plugins/publish/collect_output_node.py @@ -2,13 +2,18 @@ import pyblish.api class CollectOutputSOPPath(pyblish.api.InstancePlugin): - """Collect the out node's SOP Path value.""" + """Collect the out node's SOP/COP Path value.""" order = pyblish.api.CollectorOrder families = ["pointcache", - "vdbcache"] + "camera", + "vdbcache", + "imagesequence", + "usd", + "usdrender"] + hosts = ["houdini"] - label = "Collect Output SOP Path" + label = "Collect Output Node Path" def process(self, instance): @@ -17,12 +22,43 @@ class CollectOutputSOPPath(pyblish.api.InstancePlugin): node = instance[0] # Get sop path - if node.type().name() == "alembic": - sop_path_parm = "sop_path" + node_type = node.type().name() + if node_type == "geometry": + out_node = node.parm("soppath").evalAsNode() + + elif node_type == "alembic": + + # Alembic can switch between using SOP Path or object + if node.parm("use_sop_path").eval(): + out_node = node.parm("sop_path").evalAsNode() + else: + root = node.parm("root").eval() + objects = node.parm("objects").eval() + path = root + "/" + objects + out_node = hou.node(path) + + elif node_type == "comp": + out_node = node.parm("coppath").evalAsNode() + + elif node_type == "usd" or node_type == "usdrender": + out_node = node.parm("loppath").evalAsNode() + + elif node_type == "usd_rop" or node_type == "usdrender_rop": + # Inside Solaris e.g. /stage (not in ROP context) + # When incoming connection is present it takes it directly + inputs = node.inputs() + if inputs: + out_node = inputs[0] + else: + out_node = node.parm("loppath").evalAsNode() + else: - sop_path_parm = "soppath" + raise ValueError("ROP node type '%s' is" + " not supported." % node_type) - sop_path = node.parm(sop_path_parm).eval() - out_node = hou.node(sop_path) + if not out_node: + self.log.warning("No output node collected.") + return + self.log.debug("Output node: %s" % out_node.path()) instance.data["output_node"] = out_node diff --git a/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py b/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py new file mode 100644 index 0000000000..f19b1eec2c --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py @@ -0,0 +1,137 @@ +import re +import os + +import hou +import pyblish.api + + +def get_top_referenced_parm(parm): + + processed = set() # disallow infinite loop + while True: + if parm.path() in processed: + raise RuntimeError("Parameter references result in cycle.") + + processed.add(parm.path()) + + ref = parm.getReferencedParm() + if ref.path() == parm.path(): + # It returns itself when it doesn't reference + # another parameter + return ref + else: + parm = ref + + +def evalParmNoFrame(node, parm, pad_character="#"): + + parameter = node.parm(parm) + assert parameter, "Parameter does not exist: %s.%s" % (node, parm) + + # If the parameter has a parameter reference, then get that + # parameter instead as otherwise `unexpandedString()` fails. + parameter = get_top_referenced_parm(parameter) + + # Substitute out the frame numbering with padded characters + try: + raw = parameter.unexpandedString() + except hou.Error as exc: + print("Failed: %s" % parameter) + raise RuntimeError(exc) + + def replace(match): + padding = 1 + n = match.group(2) + if n and int(n): + padding = int(n) + return pad_character * padding + + expression = re.sub(r"(\$F([0-9]*))", replace, raw) + + with hou.ScriptEvalContext(parameter): + return hou.expandStringAtFrame(expression, 0) + + +class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): + """Collect USD Render Products + + Collects the instance.data["files"] for the render products. + + Provides: + instance -> files + + """ + + label = "Redshift ROP Render Products" + order = pyblish.api.CollectorOrder + 0.4 + hosts = ["houdini"] + families = ["redshift_rop"] + + def process(self, instance): + + rop = instance[0] + + # Collect chunkSize + chunk_size_parm = rop.parm("chunkSize") + if chunk_size_parm: + chunk_size = int(chunk_size_parm.eval()) + instance.data["chunkSize"] = chunk_size + self.log.debug("Chunk Size: %s" % chunk_size) + + default_prefix = evalParmNoFrame(rop, "RS_outputFileNamePrefix") + beauty_suffix = rop.evalParm("RS_outputBeautyAOVSuffix") + render_products = [] + + # Default beauty AOV + beauty_product = self.get_render_product_name(prefix=default_prefix, + suffix=beauty_suffix) + render_products.append(beauty_product) + + num_aovs = rop.evalParm("RS_aov") + for index in range(num_aovs): + i = index + 1 + + # Skip disabled AOVs + if not rop.evalParm("RS_aovEnable_%s" % i): + continue + + aov_suffix = rop.evalParm("RS_aovSuffix_%s" % i) + aov_prefix = evalParmNoFrame(rop, "RS_aovCustomPrefix_%s" % i) + if not aov_prefix: + aov_prefix = default_prefix + + aov_product = self.get_render_product_name(aov_prefix, aov_suffix) + render_products.append(aov_product) + + for product in render_products: + self.log.debug("Found render product: %s" % product) + + filenames = list(render_products) + instance.data["files"] = filenames + + def get_render_product_name(self, prefix, suffix): + """Return the output filename using the AOV prefix and suffix""" + + # When AOV is explicitly defined in prefix we just swap it out + # directly with the AOV suffix to embed it. + # Note: ${AOV} seems to be evaluated in the parameter as %AOV% + has_aov_in_prefix = "%AOV%" in prefix + if has_aov_in_prefix: + # It seems that when some special separator characters are present + # before the %AOV% token that Redshift will secretly remove it if + # there is no suffix for the current product, for example: + # foo_%AOV% -> foo.exr + pattern = "%AOV%" if suffix else "[._-]?%AOV%" + product_name = re.sub(pattern, + suffix, + prefix, + flags=re.IGNORECASE) + else: + if suffix: + # Add ".{suffix}" before the extension + prefix_base, ext = os.path.splitext(prefix) + product_name = prefix_base + "." + suffix + ext + else: + product_name = prefix + + return product_name diff --git a/openpype/hosts/houdini/plugins/publish/collect_remote_publish.py b/openpype/hosts/houdini/plugins/publish/collect_remote_publish.py new file mode 100644 index 0000000000..8f0210129f --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/collect_remote_publish.py @@ -0,0 +1,30 @@ +import pyblish.api +import openpype.api + +import hou +from avalon.houdini import lib + + +class CollectRemotePublishSettings(pyblish.api.ContextPlugin): + """Collect custom settings of the Remote Publish node.""" + + order = pyblish.api.CollectorOrder + families = ["*"] + hosts = ['houdini'] + targets = ["deadline"] + label = 'Remote Publish Submission Settings' + actions = [openpype.api.RepairAction] + + def process(self, context): + + node = hou.node("/out/REMOTE_PUBLISH") + if not node: + return + + attributes = lib.read(node) + + # Debug the settings we have collected + for key, value in sorted(attributes.items()): + self.log.debug("Collected %s: %s" % (key, value)) + + context.data.update(attributes) diff --git a/openpype/hosts/houdini/plugins/publish/collect_render_products.py b/openpype/hosts/houdini/plugins/publish/collect_render_products.py new file mode 100644 index 0000000000..084c00cd70 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/collect_render_products.py @@ -0,0 +1,130 @@ +import re +import os + +import hou +import pxr.UsdRender + +import avalon.io as io +import avalon.api as api +import pyblish.api + + +def get_var_changed(variable=None): + """Return changed variables and operators that use it. + + Note: `varchange` hscript states that it forces a recook of the nodes + that use Variables. That was tested in Houdini + 18.0.391. + + Args: + variable (str, Optional): A specific variable to query the operators + for. When None is provided it will return all variables that have + had recent changes and require a recook. Defaults to None. + + Returns: + dict: Variable that changed with the operators that use it. + + """ + cmd = "varchange -V" + if variable: + cmd += " {0}".format(variable) + output, errors = hou.hscript(cmd) + + changed = {} + for line in output.split("Variable: "): + if not line.strip(): + continue + + split = line.split() + var = split[0] + operators = split[1:] + changed[var] = operators + + return changed + + +class CollectRenderProducts(pyblish.api.InstancePlugin): + """Collect USD Render Products""" + + label = "Collect Render Products" + order = pyblish.api.CollectorOrder + 0.4 + hosts = ["houdini"] + families = ["colorbleed.usdrender"] + + def process(self, instance): + + node = instance.data.get("output_node") + if not node: + rop_path = instance[0].path() + raise RuntimeError("No output node found. Make sure to connect an " + "input to the USD ROP: %s" % rop_path) + + # Workaround Houdini 18.0.391 bug where $HIPNAME doesn't automatically + # update after scene save. + if hou.applicationVersion() == (18, 0, 391): + self.log.debug("Checking for recook to workaround " + "$HIPNAME refresh bug...") + changed = get_var_changed("HIPNAME").get("HIPNAME") + if changed: + self.log.debug("Recooking for $HIPNAME refresh bug...") + for operator in changed: + hou.node(operator).cook(force=True) + + # Make sure to recook any 'cache' nodes in the history chain + chain = [node] + chain.extend(node.inputAncestors()) + for input_node in chain: + if input_node.type().name() == "cache": + input_node.cook(force=True) + + stage = node.stage() + + filenames = [] + for prim in stage.Traverse(): + + if not prim.IsA(pxr.UsdRender.Product): + continue + + # Get Render Product Name + product = pxr.UsdRender.Product(prim) + + # We force taking it from any random time sample as opposed to + # "default" that the USD Api falls back to since that won't return + # time sampled values if they were set per time sample. + name = product.GetProductNameAttr().Get(time=0) + dirname = os.path.dirname(name) + basename = os.path.basename(name) + + dollarf_regex = r"(\$F([0-9]?))" + frame_regex = r"^(.+\.)([0-9]+)(\.[a-zA-Z]+)$" + if re.match(dollarf_regex, basename): + # TODO: Confirm this actually is allowed USD stages and HUSK + # Substitute $F + def replace(match): + """Replace $F4 with padded #""" + padding = int(match.group(2)) if match.group(2) else 1 + return "#" * padding + + filename_base = re.sub(dollarf_regex, replace, basename) + filename = os.path.join(dirname, filename_base) + else: + # Substitute basename.0001.ext + def replace(match): + prefix, frame, ext = match.groups() + padding = "#" * len(frame) + return prefix + padding + ext + + filename_base = re.sub(frame_regex, replace, basename) + filename = os.path.join(dirname, filename_base) + filename = filename.replace("\\", "/") + + assert "#" in filename, "Couldn't resolve render product name " \ + "with frame number: %s" % name + + filenames.append(filename) + + prim_path = str(prim.GetPath()) + self.log.info("Collected %s name: %s" % (prim_path, filename)) + + # Filenames for Deadline + instance.data["files"] = filenames diff --git a/openpype/hosts/houdini/plugins/publish/collect_usd_bootstrap.py b/openpype/hosts/houdini/plugins/publish/collect_usd_bootstrap.py new file mode 100644 index 0000000000..fbf1ef4cb1 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/collect_usd_bootstrap.py @@ -0,0 +1,117 @@ +import hou + +import pyblish.api + +from avalon import io +from avalon.houdini import lib +import openpype.lib.usdlib as usdlib + + +class CollectUsdBootstrap(pyblish.api.InstancePlugin): + """Collect special Asset/Shot bootstrap instances if those are needed. + + Some specific subsets are intended to be part of the default structure + of an "Asset" or "Shot" in our USD pipeline. For example, for an Asset + we layer a Model and Shade USD file over each other and expose that in + a Asset USD file, ready to use. + + On the first publish of any of the components of a Asset or Shot the + missing pieces are bootstrapped and generated in the pipeline too. This + means that on the very first publish of your model the Asset USD file + will exist too. + + """ + + order = pyblish.api.CollectorOrder + 0.35 + label = "Collect USD Bootstrap" + hosts = ["houdini"] + families = ["colorbleed.usd", + "colorbleed.usd.layered"] + + def process(self, instance): + + # Detect whether the current subset is a subset in a pipeline + def get_bootstrap(instance): + instance_subset = instance.data["subset"] + for name, layers in usdlib.PIPELINE.items(): + if instance_subset in set(layers): + return name # e.g. "asset" + break + else: + return + + bootstrap = get_bootstrap(instance) + if bootstrap: + self.add_bootstrap(instance, bootstrap) + + # Check if any of the dependencies requires a bootstrap + for dependency in instance.data.get("publishDependencies", list()): + bootstrap = get_bootstrap(dependency) + if bootstrap: + self.add_bootstrap(dependency, bootstrap) + + def add_bootstrap(self, instance, bootstrap): + + self.log.debug("Add bootstrap for: %s" % bootstrap) + + asset = io.find_one({"name": instance.data["asset"], + "type": "asset"}) + assert asset, "Asset must exist: %s" % asset + + # Check which are not about to be created and don't exist yet + required = { + "shot": ["usdShot"], + "asset": ["usdAsset"] + }.get(bootstrap) + + require_all_layers = instance.data.get("requireAllLayers", False) + if require_all_layers: + # USD files load fine in usdview and Houdini even when layered or + # referenced files do not exist. So by default we don't require + # the layers to exist. + layers = usdlib.PIPELINE.get(bootstrap) + if layers: + required += list(layers) + + self.log.debug("Checking required bootstrap: %s" % required) + for subset in required: + if self._subset_exists(instance, subset, asset): + continue + + self.log.debug("Creating {0} USD bootstrap: {1} {2}".format( + bootstrap, + asset["name"], + subset + )) + + new = instance.context.create_instance(subset) + new.data["subset"] = subset + new.data["label"] = "{0} ({1})".format(subset, asset["name"]) + new.data["family"] = "colorbleed.usd.bootstrap" + new.data["comment"] = "Automated bootstrap USD file." + new.data["publishFamilies"] = ["colorbleed.usd"] + + # Do not allow the user to toggle this instance + new.data["optional"] = False + + # Copy some data from the instance for which we bootstrap + for key in ["asset"]: + new.data[key] = instance.data[key] + + def _subset_exists(self, instance, subset, asset): + """Return whether subset exists in current context or in database.""" + + # Allow it to be created during this publish session + context = instance.context + for inst in context: + if ( + inst.data["subset"] == subset + and inst.data["asset"] == asset["name"] + ): + return True + + # Or, if they already exist in the database we can + # skip them too. + return bool(io.find_one({"name": subset, + "type": "subset", + "parent": asset["_id"]})) diff --git a/openpype/hosts/houdini/plugins/publish/collect_usd_layers.py b/openpype/hosts/houdini/plugins/publish/collect_usd_layers.py new file mode 100644 index 0000000000..2920b5366d --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/collect_usd_layers.py @@ -0,0 +1,67 @@ +import os + +import pyblish.api + +from avalon import io +from avalon.houdini import lib +import openpype.hosts.houdini.lib.usd as usdlib + +import hou +from pxr import Sdf + + +class CollectUsdLayers(pyblish.api.InstancePlugin): + """Collect the USD Layers that have configured save paths.""" + + order = pyblish.api.CollectorOrder + 0.35 + label = "Collect USD Layers" + hosts = ["houdini"] + families = ["usd"] + + def process(self, instance): + + output = instance.data.get("output_node") + if not output: + self.log.debug("No output node found..") + return + + rop_node = instance[0] + + save_layers = [] + for layer in usdlib.get_configured_save_layers(rop_node): + + info = layer.rootPrims.get("HoudiniLayerInfo") + save_path = info.customData.get("HoudiniSavePath") + creator = info.customData.get("HoudiniCreatorNode") + + self.log.debug("Found configured save path: " + "%s -> %s" % (layer, save_path)) + + # Log node that configured this save path + if creator: + self.log.debug("Created by: %s" % creator) + + save_layers.append((layer, save_path)) + + # Store on the instance + instance.data["usdConfiguredSavePaths"] = save_layers + + # Create configured layer instances so User can disable updating + # specific configured layers for publishing. + context = instance.context + for layer, save_path in save_layers: + name = os.path.basename(save_path) + label = "{0} -> {1}".format(instance.data["name"], name) + layer_inst = context.create_instance(name) + + family = "colorbleed.usdlayer" + layer_inst.data["family"] = family + layer_inst.data["families"] = [family] + layer_inst.data["subset"] = "__stub__" + layer_inst.data["label"] = label + layer_inst.data["asset"] = instance.data["asset"] + layer_inst.append(instance[0]) # include same USD ROP + layer_inst.append((layer, save_path)) # include layer data + + # Allow this subset to be grouped into a USD Layer on creation + layer_inst.data["subsetGroup"] = "USD Layer" diff --git a/openpype/hosts/houdini/plugins/publish/extract_alembic.py b/openpype/hosts/houdini/plugins/publish/extract_alembic.py index b251ebdc90..23f926254b 100644 --- a/openpype/hosts/houdini/plugins/publish/extract_alembic.py +++ b/openpype/hosts/houdini/plugins/publish/extract_alembic.py @@ -2,6 +2,7 @@ import os import pyblish.api import openpype.api +from openpype.hosts.houdini.api.lib import render_rop class ExtractAlembic(openpype.api.Extractor): @@ -9,6 +10,7 @@ class ExtractAlembic(openpype.api.Extractor): order = pyblish.api.ExtractorOrder label = "Extract Alembic" hosts = ["houdini"] + targets = ["local"] families = ["pointcache", "camera"] def process(self, instance): @@ -20,22 +22,15 @@ class ExtractAlembic(openpype.api.Extractor): # Get the filename from the filename parameter output = ropnode.evalParm("filename") staging_dir = os.path.dirname(output) - # instance.data["stagingDir"] = staging_dir + instance.data["stagingDir"] = staging_dir file_name = os.path.basename(output) # We run the render self.log.info("Writing alembic '%s' to '%s'" % (file_name, staging_dir)) - try: - ropnode.render() - except hou.Error as exc: - # The hou.Error is not inherited from a Python Exception class, - # so we explicitly capture the houdini error, otherwise pyblish - # will remain hanging. - import traceback - traceback.print_exc() - raise RuntimeError("Render failed: {0}".format(exc)) + + render_rop(ropnode) if "representations" not in instance.data: instance.data["representations"] = [] diff --git a/openpype/hosts/houdini/plugins/publish/extract_composite.py b/openpype/hosts/houdini/plugins/publish/extract_composite.py new file mode 100644 index 0000000000..63cee5d9c9 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/extract_composite.py @@ -0,0 +1,36 @@ +import os + +import pyblish.api +import openpype.api + +from openpype.hosts.houdini.api.lib import render_rop + + +class ExtractComposite(openpype.api.Extractor): + + order = pyblish.api.ExtractorOrder + label = "Extract Composite (Image Sequence)" + hosts = ["houdini"] + targets = ["local"] + families = ["imagesequence"] + + def process(self, instance): + + ropnode = instance[0] + + # Get the filename from the copoutput parameter + # `.evalParm(parameter)` will make sure all tokens are resolved + output = ropnode.evalParm("copoutput") + staging_dir = os.path.dirname(output) + instance.data["stagingDir"] = staging_dir + file_name = os.path.basename(output) + + self.log.info("Writing comp '%s' to '%s'" % (file_name, staging_dir)) + + render_rop(ropnode) + + if "files" not in instance.data: + instance.data["files"] = [] + + frames = instance.data["frames"] + instance.data["files"].append(frames) diff --git a/openpype/hosts/houdini/plugins/publish/extract_usd.py b/openpype/hosts/houdini/plugins/publish/extract_usd.py new file mode 100644 index 0000000000..0968ba87e9 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/extract_usd.py @@ -0,0 +1,37 @@ +import os + +import pyblish.api +import openpype.api +from openpype.hosts.houdini.api.lib import render_rop + + +class ExtractUSD(openpype.api.Extractor): + + order = pyblish.api.ExtractorOrder + label = "Extract USD" + hosts = ["houdini"] + targets = ["local"] + families = ["colorbleed.usd", + "usdModel", + "usdSetDress"] + + def process(self, instance): + + ropnode = instance[0] + + # Get the filename from the filename parameter + output = ropnode.evalParm("lopoutput") + staging_dir = os.path.dirname(output) + instance.data["stagingDir"] = staging_dir + file_name = os.path.basename(output) + + self.log.info("Writing USD '%s' to '%s'" % (file_name, staging_dir)) + + render_rop(ropnode) + + assert os.path.exists(output), "Output does not exist: %s" % output + + if "files" not in instance.data: + instance.data["files"] = [] + + instance.data["files"].append(file_name) diff --git a/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py b/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py new file mode 100644 index 0000000000..329d26bf3b --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py @@ -0,0 +1,303 @@ +import os +import contextlib +import hou +import sys +from collections import deque + +import pyblish.api +import openpype.api + +import openpype.hosts.houdini.api.usd as hou_usdlib +from openpype.hosts.houdini.api.lib import render_rop + + +class ExitStack(object): + """Context manager for dynamic management of a stack of exit callbacks + + For example: + + with ExitStack() as stack: + files = [stack.enter_context(open(fname)) for fname in filenames] + # All opened files will automatically be closed at the end of + # the with statement, even if attempts to open files later + # in the list raise an exception + + """ + def __init__(self): + self._exit_callbacks = deque() + + def pop_all(self): + """Preserve the context stack by transferring it to a new instance""" + new_stack = type(self)() + new_stack._exit_callbacks = self._exit_callbacks + self._exit_callbacks = deque() + return new_stack + + def _push_cm_exit(self, cm, cm_exit): + """Helper to correctly register callbacks to __exit__ methods""" + def _exit_wrapper(*exc_details): + return cm_exit(cm, *exc_details) + _exit_wrapper.__self__ = cm + self.push(_exit_wrapper) + + def push(self, exit): + """Registers a callback with the standard __exit__ method signature + + Can suppress exceptions the same way __exit__ methods can. + + Also accepts any object with an __exit__ method (registering a call + to the method instead of the object itself) + """ + # We use an unbound method rather than a bound method to follow + # the standard lookup behaviour for special methods + _cb_type = type(exit) + try: + exit_method = _cb_type.__exit__ + except AttributeError: + # Not a context manager, so assume its a callable + self._exit_callbacks.append(exit) + else: + self._push_cm_exit(exit, exit_method) + return exit # Allow use as a decorator + + def callback(self, callback, *args, **kwds): + """Registers an arbitrary callback and arguments. + + Cannot suppress exceptions. + """ + def _exit_wrapper(exc_type, exc, tb): + callback(*args, **kwds) + # We changed the signature, so using @wraps is not appropriate, but + # setting __wrapped__ may still help with introspection + _exit_wrapper.__wrapped__ = callback + self.push(_exit_wrapper) + return callback # Allow use as a decorator + + def enter_context(self, cm): + """Enters the supplied context manager + + If successful, also pushes its __exit__ method as a callback and + returns the result of the __enter__ method. + """ + # We look up the special methods on the type to match the with statement + _cm_type = type(cm) + _exit = _cm_type.__exit__ + result = _cm_type.__enter__(cm) + self._push_cm_exit(cm, _exit) + return result + + def close(self): + """Immediately unwind the context stack""" + self.__exit__(None, None, None) + + def __enter__(self): + return self + + def __exit__(self, *exc_details): + # We manipulate the exception state so it behaves as though + # we were actually nesting multiple with statements + frame_exc = sys.exc_info()[1] + def _fix_exception_context(new_exc, old_exc): + while 1: + exc_context = new_exc.__context__ + if exc_context in (None, frame_exc): + break + new_exc = exc_context + new_exc.__context__ = old_exc + + # Callbacks are invoked in LIFO order to match the behaviour of + # nested context managers + suppressed_exc = False + while self._exit_callbacks: + cb = self._exit_callbacks.pop() + try: + if cb(*exc_details): + suppressed_exc = True + exc_details = (None, None, None) + except: + new_exc_details = sys.exc_info() + # simulate the stack of exceptions by setting the context + _fix_exception_context(new_exc_details[1], exc_details[1]) + if not self._exit_callbacks: + raise + exc_details = new_exc_details + return suppressed_exc + + +@contextlib.contextmanager +def parm_values(overrides): + """Override Parameter values during the context.""" + + originals = [] + try: + for parm, value in overrides: + originals.append((parm, parm.eval())) + parm.set(value) + yield + finally: + for parm, value in originals: + # Parameter might not exist anymore so first + # check whether it's still valid + if hou.parm(parm.path()): + parm.set(value) + + +class ExtractUSDLayered(openpype.api.Extractor): + + order = pyblish.api.ExtractorOrder + label = "Extract Layered USD" + hosts = ["houdini"] + targets = ["local"] + families = ["colorbleed.usd.layered", + "usdShade"] + + # Force Output Processors so it will always save any file + # into our unique staging directory with processed Avalon paths + output_processors = [ + "avalon_uri_processor", + "stagingdir_processor" + ] + + def process(self, instance): + + self.log.info("Extracting: %s" % instance) + + staging_dir = self.staging_dir(instance) + fname = instance.data.get("usdFilename") + + # The individual rop nodes are collected as "publishDependencies" + dependencies = instance.data["publishDependencies"] + ropnodes = [dependency[0] for dependency in dependencies] + assert all(node.type().name() in {"usd", "usd_rop"} + for node in ropnodes) + + # Main ROP node, either a USD Rop or ROP network with multiple USD ROPs + node = instance[0] + + # Collect any output dependencies that have not been processed yet + # during extraction of other instances + outputs = [fname] + active_dependencies = [dep for dep in dependencies if + dep.data.get("publish", True) and + not dep.data.get("_isExtracted", False)] + for dependency in active_dependencies: + outputs.append(dependency.data["usdFilename"]) + + pattern = r"*[/\]{0} {0}" + save_pattern = " ".join(pattern.format(fname) for fname in outputs) + + # Run a stack of context managers before we start the render to + # temporarily adjust USD ROP settings for our publish output. + rop_overrides = { + # This sets staging directory on the processor to force our + # output files to end up in the Staging Directory. + "stagingdiroutputprocessor_stagingDir": staging_dir, + + # Force the Avalon URI Output Processor to refactor paths for + # references, payloads and layers to published paths. + "avalonurioutputprocessor_use_publish_paths": True, + + # Only write out specific USD files based on our outputs + "savepattern": save_pattern + } + overrides = list() + with ExitStack() as stack: + + for ropnode in ropnodes: + manager = hou_usdlib.outputprocessors( + ropnode, + processors=self.output_processors, + disable_all_others=True + ) + stack.enter_context(manager) + + # Some of these must be added after we enter the output + # processor context manager because those parameters only + # exist when the Output Processor is added to the ROP node. + for name, value in rop_overrides.items(): + parm = ropnode.parm(name) + assert parm, "Parm not found: %s.%s" % (ropnode.path(), + name) + overrides.append((parm, value)) + + stack.enter_context(parm_values(overrides)) + + # Render the single ROP node or the full ROP network + render_rop(node) + + # Assert all output files in the Staging Directory + for output_fname in outputs: + path = os.path.join(staging_dir, output_fname) + assert os.path.exists(path), "Output file must exist: %s" % path + + # Set up the dependency for publish if they have new content + # compared to previous publishes + for dependency in active_dependencies: + dependency_fname = dependency.data["usdFilename"] + + filepath = os.path.join(staging_dir, dependency_fname) + similar = self._compare_with_latest_publish(dependency, + filepath) + if similar: + # Deactivate this dependency + self.log.debug("Dependency matches previous publish version," + " deactivating %s for publish" % dependency) + dependency.data["publish"] = False + else: + self.log.debug("Extracted dependency: %s" % dependency) + # This dependency should be published + dependency.data["files"] = [dependency_fname] + dependency.data["stagingDir"] = staging_dir + dependency.data["_isExtracted"] = True + + # Store the created files on the instance + if "files" not in instance.data: + instance.data["files"] = [] + instance.data["files"].append(fname) + + def _compare_with_latest_publish(self, dependency, new_file): + + from avalon import api, io + import filecmp + + _, ext = os.path.splitext(new_file) + + # Compare this dependency with the latest published version + # to detect whether we should make this into a new publish + # version. If not, skip it. + asset = io.find_one({ + "name": dependency.data["asset"], + "type": "asset" + }) + subset = io.find_one({ + "name": dependency.data["subset"], + "type": "subset", + "parent": asset["_id"] + }) + if not subset: + # Subset doesn't exist yet. Definitely new file + self.log.debug("No existing subset..") + return False + + version = io.find_one({ + "type": "version", + "parent": subset["_id"], + }, sort=[("name", -1)]) + if not version: + self.log.debug("No existing version..") + return False + + representation = io.find_one({ + "name": ext.lstrip("."), + "type": "representation", + "parent": version["_id"] + }) + if not representation: + self.log.debug("No existing representation..") + return False + + old_file = api.get_representation_path(representation) + if not os.path.exists(old_file): + return False + + return filecmp.cmp(old_file, new_file) diff --git a/openpype/hosts/houdini/plugins/publish/extract_vdb_cache.py b/openpype/hosts/houdini/plugins/publish/extract_vdb_cache.py index f480fe6236..d077635dfd 100644 --- a/openpype/hosts/houdini/plugins/publish/extract_vdb_cache.py +++ b/openpype/hosts/houdini/plugins/publish/extract_vdb_cache.py @@ -2,6 +2,7 @@ import os import pyblish.api import openpype.api +from openpype.hosts.api.houdini.lib import render_rop class ExtractVDBCache(openpype.api.Extractor): @@ -9,6 +10,7 @@ class ExtractVDBCache(openpype.api.Extractor): order = pyblish.api.ExtractorOrder + 0.1 label = "Extract VDB Cache" families = ["vdbcache"] + targets = ["local"] hosts = ["houdini"] def process(self, instance): @@ -25,15 +27,8 @@ class ExtractVDBCache(openpype.api.Extractor): file_name = os.path.basename(sop_output) self.log.info("Writing VDB '%s' to '%s'" % (file_name, staging_dir)) - try: - ropnode.render() - except hou.Error as exc: - # The hou.Error is not inherited from a Python Exception class, - # so we explicitly capture the houdini error, otherwise pyblish - # will remain hanging. - import traceback - traceback.print_exc() - raise RuntimeError("Render failed: {0}".format(exc)) + + render_rop(ropnode) output = instance.data["frames"] diff --git a/openpype/hosts/houdini/plugins/publish/increment_current_file.py b/openpype/hosts/houdini/plugins/publish/increment_current_file.py new file mode 100644 index 0000000000..205599eaa3 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/increment_current_file.py @@ -0,0 +1,48 @@ +import pyblish.api +import avalon.api + +from openpype.api import version_up +from openpype.action import get_errored_plugins_from_data + + +class IncrementCurrentFile(pyblish.api.InstancePlugin): + """Increment the current file. + + Saves the current scene with an increased version number. + + """ + + label = "Increment current file" + order = pyblish.api.IntegratorOrder + 9.0 + hosts = ["houdini"] + families = ["colorbleed.usdrender", + "redshift_rop"] + targets = ["local"] + + def process(self, instance): + + # This should be a ContextPlugin, but this is a workaround + # for a bug in pyblish to run once for a family: issue #250 + context = instance.context + key = "__hasRun{}".format(self.__class__.__name__) + if context.data.get(key, False): + return + else: + context.data[key] = True + + context = instance.context + errored_plugins = get_errored_plugins_from_data(context) + if any(plugin.__name__ == "HoudiniSubmitPublishDeadline" + for plugin in errored_plugins): + raise RuntimeError("Skipping incrementing current file because " + "submission to deadline failed.") + + # Filename must not have changed since collecting + host = avalon.api.registered_host() + current_file = host.current_file() + assert context.data['currentFile'] == current_file, ( + "Collected filename from current scene name." + ) + + new_filepath = version_up(current_file) + host.save(new_filepath) diff --git a/openpype/hosts/houdini/plugins/publish/increment_current_file_deadline.py b/openpype/hosts/houdini/plugins/publish/increment_current_file_deadline.py new file mode 100644 index 0000000000..06ec711b9e --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/increment_current_file_deadline.py @@ -0,0 +1,34 @@ +import pyblish.api + +import os +import hou +from openpype.api import version_up +from openpype.action import get_errored_plugins_from_data + + +class IncrementCurrentFileDeadline(pyblish.api.ContextPlugin): + """Increment the current file. + + Saves the current scene with an increased version number. + + """ + + label = "Increment current file" + order = pyblish.api.IntegratorOrder + 9.0 + hosts = ["houdini"] + targets = ["deadline"] + + def process(self, context): + + errored_plugins = get_errored_plugins_from_data(context) + if any(plugin.__name__ == "HoudiniSubmitPublishDeadline" + for plugin in errored_plugins): + raise RuntimeError("Skipping incrementing current file because " + "submission to deadline failed.") + + current_filepath = context.data["currentFile"] + new_filepath = version_up(current_filepath) + + hou.hipFile.save(file_name=new_filepath, + save_to_recent_files=True) + diff --git a/openpype/hosts/houdini/plugins/publish/save_scene.py b/openpype/hosts/houdini/plugins/publish/save_scene.py new file mode 100644 index 0000000000..ec97944bee --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/save_scene.py @@ -0,0 +1,37 @@ +import pyblish.api +import avalon.api + + +class SaveCurrentScene(pyblish.api.InstancePlugin): + """Save current scene""" + + label = "Save current file" + order = pyblish.api.IntegratorOrder - 0.49 + hosts = ["houdini"] + families = ["colorbleed.usdrender", + "redshift_rop"] + targets = ["local"] + + def process(self, instance): + + # This should be a ContextPlugin, but this is a workaround + # for a bug in pyblish to run once for a family: issue #250 + context = instance.context + key = "__hasRun{}".format(self.__class__.__name__) + if context.data.get(key, False): + return + else: + context.data[key] = True + + # Filename must not have changed since collecting + host = avalon.api.registered_host() + current_file = host.current_file() + assert context.data['currentFile'] == current_file, ( + "Collected filename from current scene name." + ) + + if host.has_unsaved_changes(): + self.log.info("Saving current file..") + host.save_file(current_file) + else: + self.log.debug("No unsaved changes, skipping file save..") diff --git a/openpype/hosts/houdini/plugins/publish/save_scene_deadline.py b/openpype/hosts/houdini/plugins/publish/save_scene_deadline.py new file mode 100644 index 0000000000..8a787025c4 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/save_scene_deadline.py @@ -0,0 +1,23 @@ +import pyblish.api + + +class SaveCurrentSceneDeadline(pyblish.api.ContextPlugin): + """Save current scene""" + + label = "Save current file" + order = pyblish.api.IntegratorOrder - 0.49 + hosts = ["houdini"] + targets = ["deadline"] + + def process(self, context): + import hou + + assert context.data['currentFile'] == hou.hipFile.path(), ( + "Collected filename from current scene name." + ) + + if hou.hipFile.hasUnsavedChanges(): + self.log.info("Saving current file..") + hou.hipFile.save(save_to_recent_files=True) + else: + self.log.debug("No unsaved changes, skipping file save..") diff --git a/openpype/hosts/houdini/plugins/publish/submit_houdini_render_deadline.py b/openpype/hosts/houdini/plugins/publish/submit_houdini_render_deadline.py new file mode 100644 index 0000000000..34566f6c63 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/submit_houdini_render_deadline.py @@ -0,0 +1,158 @@ +import os +import json +import getpass + +from avalon import api +from avalon.vendor import requests + +import pyblish.api + +import hou + + +class HoudiniSubmitRenderDeadline(pyblish.api.InstancePlugin): + """Submit Solaris USD Render ROPs to Deadline + + Renders are submitted to a Deadline Web Service as + supplied via the environment variable AVALON_DEADLINE. + + Target "local": + Even though this does *not* render locally this is seen as + a 'local' submission as it is the regular way of submitting + a Houdini render locally. + + """ + + label = "Submit Render to Deadline" + order = pyblish.api.IntegratorOrder + hosts = ["houdini"] + families = ["colorbleed.usdrender", + "redshift_rop"] + targets = ["local"] + + def process(self, instance): + + context = instance.context + code = context.data["code"] + filepath = context.data["currentFile"] + filename = os.path.basename(filepath) + comment = context.data.get("comment", "") + deadline_user = context.data.get("deadlineUser", getpass.getuser()) + jobname = "%s - %s" % (filename, instance.name) + + # Support code prefix label for batch name + batch_name = filename + if code: + batch_name = "{0} - {1}".format(code, batch_name) + + # Output driver to render + driver = instance[0] + + # StartFrame to EndFrame by byFrameStep + frames = "{start}-{end}x{step}".format( + start=int(instance.data["startFrame"]), + end=int(instance.data["endFrame"]), + step=int(instance.data["byFrameStep"]), + ) + + # Documentation for keys available at: + # https://docs.thinkboxsoftware.com + # /products/deadline/8.0/1_User%20Manual/manual + # /manual-submission.html#job-info-file-options + payload = { + "JobInfo": { + # Top-level group name + "BatchName": batch_name, + + # Job name, as seen in Monitor + "Name": jobname, + + # Arbitrary username, for visualisation in Monitor + "UserName": deadline_user, + + "Plugin": "Houdini", + "Pool": "houdini_redshift", # todo: remove hardcoded pool + "Frames": frames, + + "ChunkSize": instance.data.get("chunkSize", 10), + + "Comment": comment + }, + "PluginInfo": { + # Input + "SceneFile": filepath, + "OutputDriver": driver.path(), + + # Mandatory for Deadline + # Houdini version without patch number + "Version": hou.applicationVersionString().rsplit(".", 1)[0], + + "IgnoreInputs": True + }, + + # Mandatory for Deadline, may be empty + "AuxFiles": [] + } + + # Include critical environment variables with submission + api.Session + keys = [ + # Submit along the current Avalon tool setup that we launched + # this application with so the Render Slave can build its own + # similar environment using it, e.g. "maya2018;vray4.x;yeti3.1.9" + "AVALON_TOOLS", + ] + environment = dict({key: os.environ[key] for key in keys + if key in os.environ}, **api.Session) + + payload["JobInfo"].update({ + "EnvironmentKeyValue%d" % index: "{key}={value}".format( + key=key, + value=environment[key] + ) for index, key in enumerate(environment) + }) + + # Include OutputFilename entries + # The first entry also enables double-click to preview rendered + # frames from Deadline Monitor + output_data = {} + for i, filepath in enumerate(instance.data["files"]): + dirname = os.path.dirname(filepath) + fname = os.path.basename(filepath) + output_data["OutputDirectory%d" % i] = dirname.replace("\\", "/") + output_data["OutputFilename%d" % i] = fname + + # For now ensure destination folder exists otherwise HUSK + # will fail to render the output image. This is supposedly fixed + # in new production builds of Houdini + # TODO Remove this workaround with Houdini 18.0.391+ + if not os.path.exists(dirname): + self.log.info("Ensuring output directory exists: %s" % + dirname) + os.makedirs(dirname) + + payload["JobInfo"].update(output_data) + + self.submit(instance, payload) + + def submit(self, instance, payload): + + AVALON_DEADLINE = api.Session.get("AVALON_DEADLINE", + "http://localhost:8082") + assert AVALON_DEADLINE, "Requires AVALON_DEADLINE" + + plugin = payload["JobInfo"]["Plugin"] + self.log.info("Using Render Plugin : {}".format(plugin)) + + self.log.info("Submitting..") + self.log.debug(json.dumps(payload, indent=4, sort_keys=True)) + + # E.g. http://192.168.0.1:8082/api/jobs + url = "{}/api/jobs".format(AVALON_DEADLINE) + response = requests.post(url, json=payload) + if not response.ok: + raise Exception(response.text) + + # Store output dir for unified publisher (filesequence) + output_dir = os.path.dirname(instance.data["files"][0]) + instance.data["outputDir"] = output_dir + instance.data["deadlineSubmissionJob"] = response.json() diff --git a/openpype/hosts/houdini/plugins/publish/submit_remote_publish.py b/openpype/hosts/houdini/plugins/publish/submit_remote_publish.py new file mode 100644 index 0000000000..b9278c1a90 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/submit_remote_publish.py @@ -0,0 +1,152 @@ +import os +import json +import getpass + +import hou + +from avalon import api, io +from avalon.vendor import requests + +import pyblish.api + + +class HoudiniSubmitPublishDeadline(pyblish.api.ContextPlugin): + """Submit Houdini scene to perform a local publish in Deadline. + + Publishing in Deadline can be helpful for scenes that publish very slow. + This way it can process in the background on another machine without the + Artist having to wait for the publish to finish on their local machine. + + Submission is done through the Deadline Web Service as + supplied via the environment variable AVALON_DEADLINE. + + """ + + label = "Submit Scene to Deadline" + order = pyblish.api.IntegratorOrder + hosts = ["houdini"] + families = ["*"] + targets = ["deadline"] + + def process(self, context): + + # Ensure no errors so far + assert all(result["success"] for result in context.data["results"]), ( + "Errors found, aborting integration..") + + # Deadline connection + AVALON_DEADLINE = api.Session.get("AVALON_DEADLINE", + "http://localhost:8082") + assert AVALON_DEADLINE, "Requires AVALON_DEADLINE" + + # Note that `publish` data member might change in the future. + # See: https://github.com/pyblish/pyblish-base/issues/307 + actives = [i for i in context if i.data["publish"]] + instance_names = sorted(instance.name for instance in actives) + + if not instance_names: + self.log.warning("No active instances found. " + "Skipping submission..") + return + + scene = context.data["currentFile"] + scenename = os.path.basename(scene) + + # Get project code + project = io.find_one({"type": "project"}) + code = project["data"].get("code", project["name"]) + + job_name = "{scene} [PUBLISH]".format(scene=scenename) + batch_name = "{code} - {scene}".format(code=code, scene=scenename) + deadline_user = "roy" # todo: get deadline user dynamically + + # Get only major.minor version of Houdini, ignore patch version + version = hou.applicationVersionString() + version = ".".join(version.split(".")[:2]) + + # Generate the payload for Deadline submission + payload = { + "JobInfo": { + "Plugin": "Houdini", + "Pool": "houdini", # todo: remove hardcoded pool + "BatchName": batch_name, + "Comment": context.data.get("comment", ""), + "Priority": 50, + "Frames": "1-1", # Always trigger a single frame + "IsFrameDependent": False, + "Name": job_name, + "UserName": deadline_user, + # "Comment": instance.context.data.get("comment", ""), + # "InitialStatus": state + + }, + "PluginInfo": { + + "Build": None, # Don't force build + "IgnoreInputs": True, + + # Inputs + "SceneFile": scene, + "OutputDriver": "/out/REMOTE_PUBLISH", + + # Mandatory for Deadline + "Version": version, + + }, + + # Mandatory for Deadline, may be empty + "AuxFiles": [] + } + + # Process submission per individual instance if the submission + # is set to publish each instance as a separate job. Else submit + # a single job to process all instances. + per_instance = context.data.get("separateJobPerInstance", False) + if per_instance: + # Submit a job per instance + job_name = payload["JobInfo"]["Name"] + for instance in instance_names: + # Clarify job name per submission (include instance name) + payload["JobInfo"]["Name"] = job_name + " - %s" % instance + self.submit_job(payload, + instances=[instance], + deadline=AVALON_DEADLINE) + else: + # Submit a single job + self.submit_job(payload, + instances=instance_names, + deadline=AVALON_DEADLINE) + + def submit_job(self, payload, instances, deadline): + + # Ensure we operate on a copy, a shallow copy is fine. + payload = payload.copy() + + # Include critical environment variables with submission + api.Session + keys = [ + # Submit along the current Avalon tool setup that we launched + # this application with so the Render Slave can build its own + # similar environment using it, e.g. "houdini17.5;pluginx2.3" + "AVALON_TOOLS", + ] + + environment = dict({key: os.environ[key] for key in keys + if key in os.environ}, **api.Session) + environment["PYBLISH_ACTIVE_INSTANCES"] = ",".join(instances) + + payload["JobInfo"].update({ + "EnvironmentKeyValue%d" % index: "{key}={value}".format( + key=key, + value=environment[key] + ) for index, key in enumerate(environment) + }) + + # Submit + self.log.info("Submitting..") + self.log.debug(json.dumps(payload, indent=4, sort_keys=True)) + + # E.g. http://192.168.0.1:8082/api/jobs + url = "{}/api/jobs".format(deadline) + response = requests.post(url, json=payload) + if not response.ok: + raise Exception(response.text) diff --git a/openpype/hosts/houdini/plugins/publish/validate_abc_primitive_to_detail.py b/openpype/hosts/houdini/plugins/publish/validate_abc_primitive_to_detail.py new file mode 100644 index 0000000000..31eb3d1fb1 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_abc_primitive_to_detail.py @@ -0,0 +1,116 @@ +import pyblish.api +import openpype.api + +from collections import defaultdict + + +class ValidateAbcPrimitiveToDetail(pyblish.api.InstancePlugin): + """Validate Alembic ROP Primitive to Detail attribute is consistent. + + The Alembic ROP crashes Houdini whenever an attribute in the "Primitive to + Detail" parameter exists on only a part of the primitives that belong to + the same hierarchy path. Whenever it encounters inconsistent values, + specifically where some are empty as opposed to others then Houdini + crashes. (Tested in Houdini 17.5.229) + + """ + + order = openpype.api.ValidateContentsOrder + 0.1 + families = ["colorbleed.pointcache"] + hosts = ["houdini"] + label = "Validate Primitive to Detail (Abc)" + + def process(self, instance): + invalid = self.get_invalid(instance) + if invalid: + raise RuntimeError("Primitives found with inconsistent primitive " + "to detail attributes. See log.") + + @classmethod + def get_invalid(cls, instance): + + output = instance.data["output_node"] + + rop = instance[0] + pattern = rop.parm("prim_to_detail_pattern").eval().strip() + if not pattern: + cls.log.debug("Alembic ROP has no 'Primitive to Detail' pattern. " + "Validation is ignored..") + return + + build_from_path = rop.parm("build_from_path").eval() + if not build_from_path: + cls.log.debug("Alembic ROP has 'Build from Path' disabled. " + "Validation is ignored..") + return + + path_attr = rop.parm("path_attrib").eval() + if not path_attr: + cls.log.error("The Alembic ROP node has no Path Attribute" + "value set, but 'Build Hierarchy from Attribute'" + "is enabled.") + return [rop.path()] + + # Let's assume each attribute is explicitly named for now and has no + # wildcards for Primitive to Detail. This simplifies the check. + cls.log.debug("Checking Primitive to Detail pattern: %s" % pattern) + cls.log.debug("Checking with path attribute: %s" % path_attr) + + # Check if the primitive attribute exists + frame = instance.data.get("startFrame", 0) + geo = output.geometryAtFrame(frame) + + # If there are no primitives on the start frame then it might be + # something that is emitted over time. As such we can't actually + # validate whether the attributes exist, because they won't exist + # yet. In that case, just warn the user and allow it. + if len(geo.iterPrims()) == 0: + cls.log.warning("No primitives found on current frame. Validation" + " for Primitive to Detail will be skipped.") + return + + attrib = geo.findPrimAttrib(path_attr) + if not attrib: + cls.log.info("Geometry Primitives are missing " + "path attribute: `%s`" % path_attr) + return [output.path()] + + # Ensure at least a single string value is present + if not attrib.strings(): + cls.log.info("Primitive path attribute has no " + "string values: %s" % path_attr) + return [output.path()] + + paths = None + for attr in pattern.split(" "): + if not attr.strip(): + # Ignore empty values + continue + + # Check if the primitive attribute exists + attrib = geo.findPrimAttrib(attr) + if not attrib: + # It is allowed to not have the attribute at all + continue + + # The issue can only happen if at least one string attribute is + # present. So we ignore cases with no values whatsoever. + if not attrib.strings(): + continue + + check = defaultdict(set) + values = geo.primStringAttribValues(attr) + if paths is None: + paths = geo.primStringAttribValues(path_attr) + + for path, value in zip(paths, values): + check[path].add(value) + + for path, values in check.items(): + # Whenever a single path has multiple values for the + # Primitive to Detail attribute then we consider it + # inconsistent and invalidate the ROP node's content. + if len(values) > 1: + cls.log.warning("Path has multiple values: %s (path: %s)" + % (list(values), path)) + return [output.path()] diff --git a/openpype/hosts/houdini/plugins/publish/validate_alembic_face_sets.py b/openpype/hosts/houdini/plugins/publish/validate_alembic_face_sets.py new file mode 100644 index 0000000000..da79569edd --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_alembic_face_sets.py @@ -0,0 +1,35 @@ +import pyblish.api +import openpype.api + + +class ValidateAlembicROPFaceSets(pyblish.api.InstancePlugin): + """Validate Face Sets are disabled for extraction to pointcache. + + When groups are saved as Face Sets with the Alembic these show up + as shadingEngine connections in Maya - however, with animated groups + these connections in Maya won't work as expected, it won't update per + frame. Additionally, it can break shader assignments in some cases + where it requires to first break this connection to allow a shader to + be assigned. + + It is allowed to include Face Sets, so only an issue is logged to + identify that it could introduce issues down the pipeline. + + """ + + order = openpype.api.ValidateContentsOrder + 0.1 + families = ["colorbleed.pointcache"] + hosts = ["houdini"] + label = "Validate Alembic ROP Face Sets" + + def process(self, instance): + + rop = instance[0] + facesets = rop.parm("facesets").eval() + + # 0 = No Face Sets + # 1 = Save Non-Empty Groups as Face Sets + # 2 = Save All Groups As Face Sets + if facesets != 0: + self.log.warning("Alembic ROP saves 'Face Sets' for Geometry. " + "Are you sure you want this?") diff --git a/openpype/hosts/houdini/plugins/publish/validate_alembic_input_node.py b/openpype/hosts/houdini/plugins/publish/validate_alembic_input_node.py index e8596b739d..3595918765 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_alembic_input_node.py +++ b/openpype/hosts/houdini/plugins/publish/validate_alembic_input_node.py @@ -1,5 +1,5 @@ import pyblish.api -import openpype.api +import colorbleed.api class ValidateAlembicInputNode(pyblish.api.InstancePlugin): @@ -11,27 +11,40 @@ class ValidateAlembicInputNode(pyblish.api.InstancePlugin): """ - order = openpype.api.ValidateContentsOrder + 0.1 - families = ["pointcache"] + order = colorbleed.api.ValidateContentsOrder + 0.1 + families = ["colorbleed.pointcache"] hosts = ["houdini"] label = "Validate Input Node (Abc)" def process(self, instance): invalid = self.get_invalid(instance) if invalid: - raise RuntimeError("Node connected to the output node incorrect") + raise RuntimeError("Primitive types found that are not supported" + "for Alembic output.") @classmethod def get_invalid(cls, instance): - invalid_nodes = ["VDB", "Volume"] + invalid_prim_types = ["VDB", "Volume"] node = instance.data["output_node"] - - prims = node.geometry().prims() - - for prim in prims: - prim_type = prim.type().name() - if prim_type in invalid_nodes: + + if not hasattr(node, "geometry"): + # In the case someone has explicitly set an Object + # node instead of a SOP node in Geometry context + # then for now we ignore - this allows us to also + # export object transforms. + cls.log.warning("No geometry output node found, skipping check..") + return + + frame = instance.data.get("startFrame", 0) + geo = node.geometryAtFrame(frame) + + invalid = False + for prim_type in invalid_prim_types: + if geo.countPrimType(prim_type) > 0: cls.log.error("Found a primitive which is of type '%s' !" % prim_type) - return [instance] + invalid = True + + if invalid: + return [instance] diff --git a/openpype/hosts/houdini/plugins/publish/validate_bypass.py b/openpype/hosts/houdini/plugins/publish/validate_bypass.py index 9118ae0e8c..c04734c684 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_bypass.py +++ b/openpype/hosts/houdini/plugins/publish/validate_bypass.py @@ -1,5 +1,5 @@ import pyblish.api -import openpype.api +import colorbleed.api class ValidateBypassed(pyblish.api.InstancePlugin): @@ -11,13 +11,18 @@ class ValidateBypassed(pyblish.api.InstancePlugin): """ - order = openpype.api.ValidateContentsOrder - 0.1 + order = colorbleed.api.ValidateContentsOrder - 0.1 families = ["*"] hosts = ["houdini"] label = "Validate ROP Bypass" def process(self, instance): + if len(instance) == 0: + # Ignore instances without any nodes + # e.g. in memory bootstrap instances + return + invalid = self.get_invalid(instance) if invalid: rop = invalid[0] diff --git a/openpype/hosts/houdini/plugins/publish/validate_camera_rop.py b/openpype/hosts/houdini/plugins/publish/validate_camera_rop.py index ca75579267..f509c51bc6 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_camera_rop.py +++ b/openpype/hosts/houdini/plugins/publish/validate_camera_rop.py @@ -6,7 +6,7 @@ class ValidateCameraROP(pyblish.api.InstancePlugin): """Validate Camera ROP settings.""" order = openpype.api.ValidateContentsOrder - families = ['camera'] + families = ['colorbleed.camera'] hosts = ['houdini'] label = 'Camera ROP' @@ -34,7 +34,7 @@ class ValidateCameraROP(pyblish.api.InstancePlugin): if not camera: raise ValueError("Camera path does not exist: %s" % path) - if not camera.type().name() == "cam": + if camera.type().name() != "cam": raise ValueError("Object set in Alembic ROP is not a camera: " "%s (type: %s)" % (camera, camera.type().name())) diff --git a/openpype/hosts/houdini/plugins/publish/validate_cop_output_node.py b/openpype/hosts/houdini/plugins/publish/validate_cop_output_node.py new file mode 100644 index 0000000000..51c5d07b0f --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_cop_output_node.py @@ -0,0 +1,58 @@ +import pyblish.api + + +class ValidateCopOutputNode(pyblish.api.InstancePlugin): + """Validate the instance COP Output Node. + + This will ensure: + - The COP Path is set. + - The COP Path refers to an existing object. + - The COP Path node is a COP node. + + """ + + order = pyblish.api.ValidatorOrder + families = ["colorbleed.imagesequence"] + hosts = ["houdini"] + label = "Validate COP Output Node" + + def process(self, instance): + + invalid = self.get_invalid(instance) + if invalid: + raise RuntimeError("Output node(s) `%s` are incorrect. " + "See plug-in log for details." % invalid) + + @classmethod + def get_invalid(cls, instance): + + import hou + + output_node = instance.data["output_node"] + + if output_node is None: + node = instance[0] + cls.log.error("COP Output node in '%s' does not exist. " + "Ensure a valid COP output path is set." + % node.path()) + + return [node.path()] + + # Output node must be a Sop node. + if not isinstance(output_node, hou.CopNode): + cls.log.error("Output node %s is not a COP node. " + "COP Path must point to a COP node, " + "instead found category type: %s" % ( + output_node.path(), + output_node.type().category().name() + ) + ) + return [output_node.path()] + + # For the sake of completeness also assert the category type + # is Cop2 to avoid potential edge case scenarios even though + # the isinstance check above should be stricter than this category + assert output_node.type().category().name() == "Cop2", ( + "Output node %s is not of category Cop2. This is a bug.." % + output_node.path() + ) diff --git a/openpype/hosts/houdini/plugins/publish/validate_file_extension.py b/openpype/hosts/houdini/plugins/publish/validate_file_extension.py new file mode 100644 index 0000000000..5823c3eddc --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_file_extension.py @@ -0,0 +1,60 @@ +import os +import pyblish.api + +from openpype.hosts.houdini.api import lib + + +class ValidateFileExtension(pyblish.api.InstancePlugin): + """Validate the output file extension fits the output family. + + File extensions: + - Pointcache must be .abc + - Camera must be .abc + - VDB must be .vdb + + """ + + order = pyblish.api.ValidatorOrder + families = ["pointcache", + "camera", + "vdbcache"] + hosts = ["houdini"] + label = "Output File Extension" + + family_extensions = { + "pointcache": ".abc", + "camera": ".abc", + "vdbcache": ".vdb" + } + + def process(self, instance): + + invalid = self.get_invalid(instance) + if invalid: + raise RuntimeError("ROP node has incorrect " + "file extension: %s" % invalid) + + @classmethod + def get_invalid(cls, instance): + + # Get ROP node from instance + node = instance[0] + + # Create lookup for current family in instance + families = instance.data.get("families", list()) + family = instance.data.get("family", None) + if family: + families.append(family) + families = set(families) + + # Perform extension check + output = lib.get_output_parameter(node).eval() + _, output_extension = os.path.splitext(output) + + for family in families: + extension = cls.family_extensions.get(family, None) + if extension is None: + raise RuntimeError("Unsupported family: %s" % family) + + if output_extension != extension: + return [node.path()] diff --git a/openpype/hosts/houdini/plugins/publish/validate_frame_token.py b/openpype/hosts/houdini/plugins/publish/validate_frame_token.py new file mode 100644 index 0000000000..f55f05032d --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_frame_token.py @@ -0,0 +1,50 @@ +import pyblish.api + +from openpype.hosts.houdini.api import lib + + +class ValidateFrameToken(pyblish.api.InstancePlugin): + """Validate if the unexpanded string contains the frame ('$F') token + + This validator will *only* check the output parameter of the node if + the Valid Frame Range is not set to 'Render Current Frame' + + Rules: + If you render out a frame range it is mandatory to have the + frame token - '$F4' or similar - to ensure that each frame gets + written. If this is not the case you will override the same file + every time a frame is written out. + + Examples: + Good: 'my_vbd_cache.$F4.vdb' + Bad: 'my_vbd_cache.vdb' + + """ + + order = pyblish.api.ValidatorOrder + label = "Validate Frame Token" + families = ["vdbcache"] + + def process(self, instance): + + invalid = self.get_invalid(instance) + if invalid: + raise RuntimeError("Output settings do no match for '%s'" % + instance) + + @classmethod + def get_invalid(cls, instance): + + node = instance[0] + + # Check trange parm, 0 means Render Current Frame + frame_range = node.evalParm("trange") + if frame_range == 0: + return [] + + output_parm = lib.get_output_parameter(node) + unexpanded_str = output_parm.unexpandedString() + + if "$F" not in unexpanded_str: + cls.log.error("No frame token found in '%s'" % node.path()) + return [instance] diff --git a/openpype/hosts/houdini/plugins/publish/validate_houdini_license_category.py b/openpype/hosts/houdini/plugins/publish/validate_houdini_license_category.py new file mode 100644 index 0000000000..e18404b7ad --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_houdini_license_category.py @@ -0,0 +1,28 @@ +import pyblish.api + + +class ValidateHoudiniCommercialLicense(pyblish.api.InstancePlugin): + """Validate the Houdini instance runs a Commercial license. + + When extracting USD files from a non-commercial Houdini license, even with + Houdini Indie license, the resulting files will get "scrambled" with + a license protection and get a special .usdnc or .usdlc suffix. + + This currently breaks the Subset/representation pipeline so we disallow + any publish with those licenses. Only the commercial license is valid. + + """ + + order = pyblish.api.ValidatorOrder + families = ["usd"] + hosts = ["houdini"] + label = "Houdini Commercial License" + + def process(self, instance): + + import hou + + license = hou.licenseCategory() + if license != hou.licenseCategoryType.Commercial: + raise RuntimeError("USD Publishing requires a full Commercial " + "license. You are on: %s" % license) diff --git a/openpype/hosts/houdini/plugins/publish/validate_mkpaths_toggled.py b/openpype/hosts/houdini/plugins/publish/validate_mkpaths_toggled.py index a735f4b64b..826dedf933 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_mkpaths_toggled.py +++ b/openpype/hosts/houdini/plugins/publish/validate_mkpaths_toggled.py @@ -1,14 +1,14 @@ import pyblish.api -import openpype.api +import colorbleed.api class ValidateIntermediateDirectoriesChecked(pyblish.api.InstancePlugin): """Validate Create Intermediate Directories is enabled on ROP node.""" - order = openpype.api.ValidateContentsOrder - families = ['pointcache', - 'camera', - 'vdbcache'] + order = colorbleed.api.ValidateContentsOrder + families = ['colorbleed.pointcache', + 'colorbleed.camera', + 'colorbleed.vdbcache'] hosts = ['houdini'] label = 'Create Intermediate Directories Checked' @@ -30,3 +30,5 @@ class ValidateIntermediateDirectoriesChecked(pyblish.api.InstancePlugin): result.append(node.path()) return result + + diff --git a/openpype/hosts/houdini/plugins/publish/validate_no_errors.py b/openpype/hosts/houdini/plugins/publish/validate_no_errors.py new file mode 100644 index 0000000000..1a7cf9d599 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_no_errors.py @@ -0,0 +1,64 @@ +import pyblish.api +import openpype.api +import hou + + +def cook_in_range(node, start, end): + current = hou.intFrame() + if start >= current >= end: + # Allow cooking current frame since we're in frame range + node.cook(force=False) + else: + node.cook(force=False, frame_range=(start, start)) + + +def get_errors(node): + """Get cooking errors. + + If node already has errors check whether it needs to recook + If so, then recook first to see if that solves it. + + """ + if node.errors() and node.needsToCook(): + node.cook() + + return node.errors() + + +class ValidateNoErrors(pyblish.api.InstancePlugin): + """Validate the Instance has no current cooking errors.""" + + order = openpype.api.ValidateContentsOrder + hosts = ['houdini'] + label = 'Validate no errors' + + def process(self, instance): + + validate_nodes = [] + + if len(instance) > 0: + validate_nodes.append(instance[0]) + output_node = instance.data.get("output_node") + if output_node: + validate_nodes.append(output_node) + + for node in validate_nodes: + self.log.debug("Validating for errors: %s" % node.path()) + errors = get_errors(node) + + if errors: + # If there are current errors, then try an unforced cook + # to see whether the error will disappear. + self.log.debug("Recooking to revalidate error " + "is up to date for: %s" % node.path()) + current_frame = hou.intFrame() + start = instance.data.get("startFrame", current_frame) + end = instance.data.get("endFrame", current_frame) + cook_in_range(node, start=start, end=end) + + # Check for errors again after the forced recook + errors = get_errors(node) + if errors: + self.log.error(errors) + raise RuntimeError("Node has errors: %s" % node.path()) + diff --git a/openpype/hosts/houdini/plugins/publish/validate_primitive_hierarchy_paths.py b/openpype/hosts/houdini/plugins/publish/validate_primitive_hierarchy_paths.py index 608e236198..785dd1db78 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_primitive_hierarchy_paths.py +++ b/openpype/hosts/houdini/plugins/publish/validate_primitive_hierarchy_paths.py @@ -28,7 +28,6 @@ class ValidatePrimitiveHierarchyPaths(pyblish.api.InstancePlugin): import hou output = instance.data["output_node"] - prims = output.geometry().prims() rop = instance[0] build_from_path = rop.parm("build_from_path").eval() @@ -46,30 +45,41 @@ class ValidatePrimitiveHierarchyPaths(pyblish.api.InstancePlugin): cls.log.debug("Checking for attribute: %s" % path_attr) - missing_attr = [] - invalid_attr = [] - for prim in prims: + # Check if the primitive attribute exists + frame = instance.data.get("startFrame", 0) + geo = output.geometryAtFrame(frame) - try: - path = prim.stringAttribValue(path_attr) - except hou.OperationFailed: - # Attribute does not exist. - missing_attr.append(prim) - continue + # If there are no primitives on the current frame then we can't + # check whether the path names are correct. So we'll just issue a + # warning that the check can't be done consistently and skip + # validation. + if len(geo.iterPrims()) == 0: + cls.log.warning("No primitives found on current frame. Validation" + " for primitive hierarchy paths will be skipped," + " thus can't be validated.") + return - if not path: - # Empty path value is invalid. - invalid_attr.append(prim) - continue + # Check if there are any values for the primitives + attrib = geo.findPrimAttrib(path_attr) + if not attrib: + cls.log.info("Geometry Primitives are missing " + "path attribute: `%s`" % path_attr) + return [output.path()] - if missing_attr: - cls.log.info("Prims are missing attribute `%s`" % path_attr) + # Ensure at least a single string value is present + if not attrib.strings(): + cls.log.info("Primitive path attribute has no " + "string values: %s" % path_attr) + return [output.path()] - if invalid_attr: + paths = geo.primStringAttribValues(path_attr) + # Ensure all primitives are set to a valid path + # Collect all invalid primitive numbers + invalid_prims = [i for i, path in enumerate(paths) if not path] + if invalid_prims: + num_prims = len(geo.iterPrims()) # faster than len(geo.prims()) cls.log.info("Prims have no value for attribute `%s` " "(%s of %s prims)" % (path_attr, - len(invalid_attr), - len(prims))) - - if missing_attr or invalid_attr: + len(invalid_prims), + num_prims)) return [output.path()] diff --git a/openpype/hosts/houdini/plugins/publish/validate_remote_publish.py b/openpype/hosts/houdini/plugins/publish/validate_remote_publish.py new file mode 100644 index 0000000000..931acdcc2f --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_remote_publish.py @@ -0,0 +1,43 @@ +import pyblish.api +import openpype.api + +from openpype.hosts.houdini.api import lib + +import hou + + +class ValidateRemotePublishOutNode(pyblish.api.ContextPlugin): + """Validate the remote publish out node exists for Deadline to trigger.""" + + order = pyblish.api.ValidatorOrder - 0.4 + families = ["*"] + hosts = ['houdini'] + targets = ["deadline"] + label = 'Remote Publish ROP node' + actions = [openpype.api.RepairContextAction] + + def process(self, context): + + cmd = "import colorbleed.lib; colorbleed.lib.publish_remote()" + + node = hou.node("/out/REMOTE_PUBLISH") + if not node: + raise RuntimeError("Missing REMOTE_PUBLISH node.") + + # We ensure it's a shell node and that it has the pre-render script + # set correctly. Plus the shell script it will trigger should be + # completely empty (doing nothing) + assert node.type().name() == "shell", "Must be shell ROP node" + assert node.parm("command").eval() == "", "Must have no command" + assert not node.parm("shellexec").eval(), "Must not execute in shell" + assert node.parm("prerender").eval() == cmd, ( + "REMOTE_PUBLISH node does not have correct prerender script." + ) + assert node.parm("lprerender").eval() == "python", ( + "REMOTE_PUBLISH node prerender script type not set to 'python'" + ) + + @classmethod + def repair(cls, context): + """(Re)create the node if it fails to pass validation""" + lib.create_remote_publish_node(force=True) diff --git a/openpype/hosts/houdini/plugins/publish/validate_remote_publish_enabled.py b/openpype/hosts/houdini/plugins/publish/validate_remote_publish_enabled.py new file mode 100644 index 0000000000..9f486842ae --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_remote_publish_enabled.py @@ -0,0 +1,35 @@ +import pyblish.api +import openpype.api + +import hou + + +class ValidateRemotePublishEnabled(pyblish.api.ContextPlugin): + """Validate the remote publish node is *not* bypassed.""" + + order = pyblish.api.ValidatorOrder - 0.39 + families = ["*"] + hosts = ['houdini'] + targets = ["deadline"] + label = 'Remote Publish ROP enabled' + actions = [openpype.api.RepairContextAction] + + def process(self, context): + + node = hou.node("/out/REMOTE_PUBLISH") + if not node: + raise RuntimeError("Missing REMOTE_PUBLISH node.") + + if node.isBypassed(): + raise RuntimeError("REMOTE_PUBLISH must not be bypassed.") + + @classmethod + def repair(cls, context): + """(Re)create the node if it fails to pass validation""" + + node = hou.node("/out/REMOTE_PUBLISH") + if not node: + raise RuntimeError("Missing REMOTE_PUBLISH node.") + + cls.log.info("Disabling bypass on /out/REMOTE_PUBLISH") + node.bypass(False) diff --git a/openpype/hosts/houdini/plugins/publish/validate_sop_output_node.py b/openpype/hosts/houdini/plugins/publish/validate_sop_output_node.py new file mode 100644 index 0000000000..7ba9ddd534 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_sop_output_node.py @@ -0,0 +1,78 @@ +import pyblish.api + + +class ValidateSopOutputNode(pyblish.api.InstancePlugin): + """Validate the instance SOP Output Node. + + This will ensure: + - The SOP Path is set. + - The SOP Path refers to an existing object. + - The SOP Path node is a SOP node. + - The SOP Path node has at least one input connection (has an input) + - The SOP Path has geometry data. + + """ + + order = pyblish.api.ValidatorOrder + families = ["pointcache", + "vdbcache"] + hosts = ["houdini"] + label = "Validate Output Node" + + def process(self, instance): + + invalid = self.get_invalid(instance) + if invalid: + raise RuntimeError("Output node(s) `%s` are incorrect. " + "See plug-in log for details." % invalid) + + @classmethod + def get_invalid(cls, instance): + + import hou + + output_node = instance.data["output_node"] + + if output_node is None: + node = instance[0] + cls.log.error("SOP Output node in '%s' does not exist. " + "Ensure a valid SOP output path is set." + % node.path()) + + return [node.path()] + + # Output node must be a Sop node. + if not isinstance(output_node, hou.SopNode): + cls.log.error("Output node %s is not a SOP node. " + "SOP Path must point to a SOP node, " + "instead found category type: %s" % ( + output_node.path(), + output_node.type().category().name() + ) + ) + return [output_node.path()] + + # For the sake of completeness also assert the category type + # is Sop to avoid potential edge case scenarios even though + # the isinstance check above should be stricter than this category + assert output_node.type().category().name() == "Sop", ( + "Output node %s is not of category Sop. This is a bug.." % + output_node.path() + ) + + # Ensure the node is cooked and succeeds to cook so we can correctly + # check for its geometry data. + if output_node.needsToCook(): + cls.log.debug("Cooking node: %s" % output_node.path()) + try: + output_node.cook() + except hou.Error as exc: + cls.log.error("Cook failed: %s" % exc) + cls.log.error(output_node.errors()[0]) + return [output_node.path()] + + # Ensure the output node has at least Geometry data + if not output_node.geometry(): + cls.log.error("Output node `%s` has no geometry data." + % output_node.path()) + return [output_node.path()] diff --git a/openpype/hosts/houdini/plugins/publish/validate_usd_layer_path_backslashes.py b/openpype/hosts/houdini/plugins/publish/validate_usd_layer_path_backslashes.py new file mode 100644 index 0000000000..a21e5c267f --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_usd_layer_path_backslashes.py @@ -0,0 +1,51 @@ +import pyblish.api + +import openpype.hosts.houdini.api.usd as hou_usdlib + + +class ValidateUSDLayerPathBackslashes(pyblish.api.InstancePlugin): + """Validate USD loaded paths have no backslashes. + + This is a crucial validation for HUSK USD rendering as Houdini's + USD Render ROP will fail to write out a .usd file for rendering that + correctly preserves the backslashes, e.g. it will incorrectly convert a + '\t' to a TAB character disallowing HUSK to find those specific files. + + This validation is redundant for usdModel since that flattens the model + before write. As such it will never have any used layers with a path. + + """ + + order = pyblish.api.ValidatorOrder + families = ["usdSetDress", + "usdShade", + "usd", + "usdrender"] + hosts = ["houdini"] + label = "USD Layer path backslashes" + optional = True + + def process(self, instance): + + rop = instance[0] + lop_path = hou_usdlib.get_usd_rop_loppath(rop) + stage = lop_path.stage(apply_viewport_overrides=False) + + invalid = [] + for layer in stage.GetUsedLayers(): + references = layer.externalReferences + + for ref in references: + + # Ignore anonymous layers + if ref.startswith("anon:"): + continue + + # If any backslashes in the path consider it invalid + if "\\" in ref: + self.log.error("Found invalid path: %s" % ref) + invalid.append(layer) + + if invalid: + raise RuntimeError("Loaded layers have backslashes. " + "This is invalid for HUSK USD rendering.") diff --git a/openpype/hosts/houdini/plugins/publish/validate_usd_model_and_shade.py b/openpype/hosts/houdini/plugins/publish/validate_usd_model_and_shade.py new file mode 100644 index 0000000000..4fe4322bb3 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_usd_model_and_shade.py @@ -0,0 +1,75 @@ +import pyblish.api + +import openpype.hosts.houdini.api.usd as hou_usdlib + + +from pxr import UsdShade, UsdRender, UsdLux + + +def fullname(o): + """Get fully qualified class name""" + module = o.__module__ + if module is None or module == str.__module__: + return o.__name__ + return module + '.' + o.__name__ + + +class ValidateUsdModel(pyblish.api.InstancePlugin): + """Validate USD Model. + + Disallow Shaders, Render settings, products and vars and Lux lights. + + """ + + order = pyblish.api.ValidatorOrder + families = ["usdModel"] + hosts = ["houdini"] + label = "Validate USD Model" + optional = True + + disallowed = [ + UsdShade.Shader, + UsdRender.Settings, + UsdRender.Product, + UsdRender.Var, + UsdLux.Light + ] + + def process(self, instance): + + rop = instance[0] + lop_path = hou_usdlib.get_usd_rop_loppath(rop) + stage = lop_path.stage(apply_viewport_overrides=False) + + invalid = [] + for prim in stage.Traverse(): + + for klass in self.disallowed: + if klass(prim): + # Get full class name without pxr. prefix + name = fullname(klass).split("pxr.", 1)[-1] + path = str(prim.GetPath()) + self.log.warning("Disallowed %s: %s" % (name, path)) + + invalid.append(prim) + + if invalid: + prim_paths = sorted([str(prim.GetPath()) for prim in invalid]) + raise RuntimeError("Found invalid primitives: %s" % prim_paths) + + +class ValidateUsdShade(ValidateUsdModel): + """Validate usdShade. + + Disallow Render settings, products, vars and Lux lights. + + """ + families = ["usdShade"] + label = "Validate USD Shade" + + disallowed = [ + UsdRender.Settings, + UsdRender.Product, + UsdRender.Var, + UsdLux.Light + ] diff --git a/openpype/hosts/houdini/plugins/publish/validate_usd_output_node.py b/openpype/hosts/houdini/plugins/publish/validate_usd_output_node.py new file mode 100644 index 0000000000..0960129819 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_usd_output_node.py @@ -0,0 +1,50 @@ +import pyblish.api + + +class ValidateUSDOutputNode(pyblish.api.InstancePlugin): + """Validate the instance USD LOPs Output Node. + + This will ensure: + - The LOP Path is set. + - The LOP Path refers to an existing object. + - The LOP Path node is a LOP node. + + """ + + order = pyblish.api.ValidatorOrder + families = ["colorbleed.usd"] + hosts = ["houdini"] + label = "Validate Output Node (USD)" + + def process(self, instance): + + invalid = self.get_invalid(instance) + if invalid: + raise RuntimeError("Output node(s) `%s` are incorrect. " + "See plug-in log for details." % invalid) + + @classmethod + def get_invalid(cls, instance): + + import hou + + output_node = instance.data["output_node"] + + if output_node is None: + node = instance[0] + cls.log.error("USD node '%s' LOP path does not exist. " + "Ensure a valid LOP path is set." + % node.path()) + + return [node.path()] + + # Output node must be a Sop node. + if not isinstance(output_node, hou.LopNode): + cls.log.error("Output node %s is not a LOP node. " + "LOP Path must point to a LOP node, " + "instead found category type: %s" % ( + output_node.path(), + output_node.type().category().name() + ) + ) + return [output_node.path()] diff --git a/openpype/hosts/houdini/plugins/publish/validate_usd_render_product_names.py b/openpype/hosts/houdini/plugins/publish/validate_usd_render_product_names.py new file mode 100644 index 0000000000..18231a9605 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_usd_render_product_names.py @@ -0,0 +1,30 @@ +import pyblish.api + +import os + + +class ValidateUSDRenderProductNames(pyblish.api.InstancePlugin): + """Validate USD Render Product names are correctly set absolute paths.""" + + order = pyblish.api.ValidatorOrder + families = ["colorbleed.usdrender"] + hosts = ["houdini"] + label = "Validate USD Render Product Names" + optional = True + + def process(self, instance): + + invalid = [] + for filepath in instance.data["files"]: + + if not filepath: + invalid.append("Detected empty output filepath.") + + if not os.path.isabs(filepath): + invalid.append("Output file path is not " + "absolute path: %s" % filepath) + + if invalid: + for message in invalid: + self.log.error(message) + raise RuntimeError("USD Render Paths are invalid.") diff --git a/openpype/hosts/houdini/plugins/publish/validate_usd_setdress.py b/openpype/hosts/houdini/plugins/publish/validate_usd_setdress.py new file mode 100644 index 0000000000..8af53fa617 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_usd_setdress.py @@ -0,0 +1,51 @@ +import pyblish.api + +import openpype.hosts.houdini.api.usd as hou_usdlib + + +class ValidateUsdSetDress(pyblish.api.InstancePlugin): + """Validate USD Set Dress. + + Must only have references or payloads. May not generate new mesh or + flattened meshes. + + """ + + order = pyblish.api.ValidatorOrder + families = ["usdSetDress"] + hosts = ["houdini"] + label = "Validate USD Set Dress" + optional = True + + def process(self, instance): + + from pxr import UsdGeom + + rop = instance[0] + lop_path = hou_usdlib.get_usd_rop_loppath(rop) + stage = lop_path.stage(apply_viewport_overrides=False) + + invalid = [] + for node in stage.Traverse(): + + if UsdGeom.Mesh(node): + # This solely checks whether there is any USD involved + # in this Prim's Stack and doesn't accurately tell us + # whether it was generated locally or not. + # TODO: More accurately track whether the Prim was created + # in the local scene + stack = node.GetPrimStack() + for sdf in stack: + path = sdf.layer.realPath + if path: + break + else: + prim_path = node.GetPath() + self.log.error("%s is not referenced geometry." % + prim_path) + invalid.append(node) + + if invalid: + raise RuntimeError("SetDress contains local geometry. " + "This is not allowed, it must be an assembly " + "of referenced assets.") diff --git a/openpype/hosts/houdini/plugins/publish/validate_usd_shade_model_exists.py b/openpype/hosts/houdini/plugins/publish/validate_usd_shade_model_exists.py new file mode 100644 index 0000000000..3de18fd9b4 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_usd_shade_model_exists.py @@ -0,0 +1,36 @@ +import re + +import pyblish.api +import openpype.api + +from avalon import io + + +class ValidateUSDShadeModelExists(pyblish.api.InstancePlugin): + """Validate the Instance has no current cooking errors.""" + + order = openpype.api.ValidateContentsOrder + hosts = ['houdini'] + families = ["usdShade"] + label = 'USD Shade model exists' + + def process(self, instance): + + asset = instance.data["asset"] + subset = instance.data["subset"] + + # Assume shading variation starts after a dot separator + shade_subset = subset.split(".", 1)[0] + model_subset = re.sub("^usdShade", "usdModel", shade_subset) + + asset_doc = io.find_one({"name": asset, + "type": "asset"}) + if not asset_doc: + raise RuntimeError("Asset does not exist: %s" % asset) + + subset_doc = io.find_one({"name": model_subset, + "type": "subset", + "parent": asset_doc["_id"]}) + if not subset_doc: + raise RuntimeError("USD Model subset not found: " + "%s (%s)" % (model_subset, asset)) diff --git a/openpype/hosts/houdini/plugins/publish/validate_usd_shade_workspace.py b/openpype/hosts/houdini/plugins/publish/validate_usd_shade_workspace.py new file mode 100644 index 0000000000..3220159508 --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_usd_shade_workspace.py @@ -0,0 +1,60 @@ +import re + +import pyblish.api +import openpype.api + +from avalon import io +import hou + + +class ValidateUsdShadeWorkspace(pyblish.api.InstancePlugin): + """Validate USD Shading Workspace is correct version. + + There have been some issues with outdated/erroneous Shading Workspaces + so this is to confirm everything is set as it should. + + """ + + order = openpype.api.ValidateContentsOrder + hosts = ["houdini"] + families = ["usdShade"] + label = "USD Shade Workspace" + + def process(self, instance): + + rop = instance[0] + workspace = rop.parent() + + definition = workspace.type().definition() + name = definition.nodeType().name() + library = definition.libraryFilePath() + + all_definitions = hou.hda.definitionsInFile(library) + node_type, version = name.rsplit(":", 1) + version = float(version) + + highest = version + for other_definition in all_definitions: + other_name = other_definition.nodeType().name() + other_node_type, other_version = other_name.rsplit(":", 1) + other_version = float(other_version) + + if node_type != other_node_type: + continue + + # Get highest version + highest = max(highest, other_version) + + if version != highest: + raise RuntimeError("Shading Workspace is not the latest version." + " Found %s. Latest is %s." % (version, highest)) + + # There were some issues with the editable node not having the right + # configured path. So for now let's assure that is correct to.from + value = ('avalon://`chs("../asset_name")`/' + 'usdShade`chs("../model_variantname1")`.usd') + rop_value = rop.parm("lopoutput").rawValue() + if rop_value != value: + raise RuntimeError("Shading Workspace has invalid 'lopoutput'" + " parameter value. The Shading Workspace" + " needs to be reset to its default values.") diff --git a/openpype/hosts/houdini/plugins/publish/validate_vdb_output_node.py b/openpype/hosts/houdini/plugins/publish/validate_vdb_output_node.py new file mode 100644 index 0000000000..d3894ee41d --- /dev/null +++ b/openpype/hosts/houdini/plugins/publish/validate_vdb_output_node.py @@ -0,0 +1,68 @@ +import pyblish.api +import openpype.api +import hou + + +class ValidateVDBOutputNode(pyblish.api.InstancePlugin): + """Validate that the node connected to the output node is of type VDB + + Regardless of the amount of VDBs create the output will need to have an + equal amount of VDBs, points, primitives and vertices + + A VDB is an inherited type of Prim, holds the following data: + - Primitives: 1 + - Points: 1 + - Vertices: 1 + - VDBs: 1 + + """ + + order = openpype.api.ValidateContentsOrder + 0.1 + families = ["colorbleed.vdbcache"] + hosts = ["houdini"] + label = "Validate Output Node (VDB)" + + def process(self, instance): + invalid = self.get_invalid(instance) + if invalid: + raise RuntimeError("Node connected to the output node is not" + " of type VDB!") + + @classmethod + def get_invalid(cls, instance): + + node = instance.data["output_node"] + if node is None: + cls.log.error("SOP path is not correctly set on " + "ROP node '%s'." % instance[0].path()) + return [instance] + + frame = instance.data.get("startFrame", 0) + geometry = node.geometryAtFrame(frame) + if geometry is None: + # No geometry data on this node, maybe the node hasn't cooked? + cls.log.error("SOP node has no geometry data. " + "Is it cooked? %s" % node.path()) + return [node] + + prims = geometry.prims() + nr_of_prims = len(prims) + + # All primitives must be hou.VDB + invalid_prim = False + for prim in prims: + if not isinstance(prim, hou.VDB): + cls.log.error("Found non-VDB primitive: %s" % prim) + invalid_prim = True + if invalid_prim: + return [instance] + + nr_of_points = len(geometry.points()) + if nr_of_points != nr_of_prims: + cls.log.error("The number of primitives and points do not match") + return [instance] + + for prim in prims: + if prim.numVertices() != 1: + cls.log.error("Found primitive with more than 1 vertex!") + return [instance] diff --git a/openpype/hosts/houdini/vendor/husdoutputprocessors/__init__.py b/openpype/hosts/houdini/vendor/husdoutputprocessors/__init__.py new file mode 100644 index 0000000000..69e3be50da --- /dev/null +++ b/openpype/hosts/houdini/vendor/husdoutputprocessors/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) diff --git a/openpype/hosts/houdini/vendor/husdoutputprocessors/avalon_uri_processor.py b/openpype/hosts/houdini/vendor/husdoutputprocessors/avalon_uri_processor.py new file mode 100644 index 0000000000..4071eb3e0c --- /dev/null +++ b/openpype/hosts/houdini/vendor/husdoutputprocessors/avalon_uri_processor.py @@ -0,0 +1,168 @@ +import hou +import husdoutputprocessors.base as base +import os +import re +import logging + +import colorbleed.usdlib as usdlib + + +def _get_project_publish_template(): + """Return publish template from database for current project""" + from avalon import io + project = io.find_one({"type": "project"}, + projection={"config.template.publish": True}) + return project["config"]["template"]["publish"] + + +class AvalonURIOutputProcessor(base.OutputProcessorBase): + """Process Avalon URIs into their full path equivalents. + + """ + + _parameters = None + _param_prefix = 'avalonurioutputprocessor_' + _parms = { + "use_publish_paths": _param_prefix + "use_publish_paths" + } + + def __init__(self): + """ There is only one object of each output processor class that is + ever created in a Houdini session. Therefore be very careful + about what data gets put in this object. + """ + self._template = None + self._use_publish_paths = False + self._cache = dict() + + def displayName(self): + return 'Avalon URI Output Processor' + + def parameters(self): + + if not self._parameters: + parameters = hou.ParmTemplateGroup() + use_publish_path = hou.ToggleParmTemplate( + name=self._parms["use_publish_paths"], + label='Resolve Reference paths to publish paths', + default_value=False, + help=("When enabled any paths for Layers, References or " + "Payloads are resolved to published master versions.\n" + "This is usually only used by the publishing pipeline, " + "but can be used for testing too.")) + parameters.append(use_publish_path) + self._parameters = parameters.asDialogScript() + + return self._parameters + + def beginSave(self, config_node, t): + self._template = _get_project_publish_template() + + parm = self._parms["use_publish_paths"] + self._use_publish_paths = config_node.parm(parm).evalAtTime(t) + self._cache.clear() + + def endSave(self): + self._template = None + self._use_publish_paths = None + self._cache.clear() + + def processAsset(self, + asset_path, + asset_path_for_save, + referencing_layer_path, + asset_is_layer, + for_save): + """ + Args: + asset_path (str): The incoming file path you want to alter or not. + asset_path_for_save (bool): Whether the current path is a + referenced path in the USD file. When True, return the path + you want inside USD file. + referencing_layer_path (str): ??? + asset_is_layer (bool): Whether this asset is a USD layer file. + If this is False, the asset is something else (for example, + a texture or volume file). + for_save (bool): Whether the asset path is for a file to be saved + out. If so, then return actual written filepath. + + Returns: + The refactored asset path. + + """ + + # Retrieve from cache if this query occurred before (optimization) + cache_key = (asset_path, asset_path_for_save, asset_is_layer, for_save) + if cache_key in self._cache: + return self._cache[cache_key] + + relative_template = "{asset}_{subset}.{ext}" + uri_data = usdlib.parse_avalon_uri(asset_path) + if uri_data: + + if for_save: + # Set save output path to a relative path so other + # processors can potentially manage it easily? + path = relative_template.format(**uri_data) + + print("Avalon URI Resolver: %s -> %s" % (asset_path, path)) + self._cache[cache_key] = path + return path + + if self._use_publish_paths: + # Resolve to an Avalon published asset for embedded paths + path = self._get_usd_master_path(**uri_data) + else: + path = relative_template.format(**uri_data) + + print("Avalon URI Resolver: %s -> %s" % (asset_path, path)) + self._cache[cache_key] = path + return path + + self._cache[cache_key] = asset_path + return asset_path + + def _get_usd_master_path(self, + asset, + subset, + ext): + """Get the filepath for a .usd file of a subset. + + This will return the path to an unversioned master file generated by + `usd_master_file.py`. + + """ + + from avalon import api, io + + PROJECT = api.Session["AVALON_PROJECT"] + asset_doc = io.find_one({"name": asset, + "type": "asset"}) + if not asset_doc: + raise RuntimeError("Invalid asset name: '%s'" % asset) + + root = api.registered_root() + path = self._template.format(**{ + "root": root, + "project": PROJECT, + "silo": asset_doc["silo"], + "asset": asset_doc["name"], + "subset": subset, + "representation": ext, + "version": 0 # stub version zero + }) + + # Remove the version folder + subset_folder = os.path.dirname(os.path.dirname(path)) + master_folder = os.path.join(subset_folder, "master") + fname = "{0}.{1}".format(subset, ext) + + return os.path.join(master_folder, fname).replace("\\", "/") + + +output_processor = AvalonURIOutputProcessor() + + +def usdOutputProcessor(): + return output_processor + diff --git a/openpype/hosts/houdini/vendor/husdoutputprocessors/stagingdir_processor.py b/openpype/hosts/houdini/vendor/husdoutputprocessors/stagingdir_processor.py new file mode 100644 index 0000000000..d8e36d5aa8 --- /dev/null +++ b/openpype/hosts/houdini/vendor/husdoutputprocessors/stagingdir_processor.py @@ -0,0 +1,90 @@ +import hou +import husdoutputprocessors.base as base +import os + + +class StagingDirOutputProcessor(base.OutputProcessorBase): + """Output all USD Rop file nodes into the Staging Directory + + Ignore any folders and paths set in the Configured Layers + and USD Rop node, just take the filename and save into a + single directory. + + """ + theParameters = None + parameter_prefix = "stagingdiroutputprocessor_" + stagingdir_parm_name = parameter_prefix + "stagingDir" + + def __init__(self): + self.staging_dir = None + + def displayName(self): + return 'StagingDir Output Processor' + + def parameters(self): + if not self.theParameters: + parameters = hou.ParmTemplateGroup() + rootdirparm = hou.StringParmTemplate( + self.stagingdir_parm_name, + 'Staging Directory', 1, + string_type=hou.stringParmType.FileReference, + file_type=hou.fileType.Directory + ) + parameters.append(rootdirparm) + self.theParameters = parameters.asDialogScript() + return self.theParameters + + def beginSave(self, config_node, t): + + # Use the Root Directory parameter if it is set. + root_dir_parm = config_node.parm(self.stagingdir_parm_name) + if root_dir_parm: + self.staging_dir = root_dir_parm.evalAtTime(t) + + if not self.staging_dir: + out_file_parm = config_node.parm('lopoutput') + if out_file_parm: + self.staging_dir = out_file_parm.evalAtTime(t) + if self.staging_dir: + (self.staging_dir, filename) = os.path.split(self.staging_dir) + + def endSave(self): + self.staging_dir = None + + def processAsset(self, asset_path, + asset_path_for_save, + referencing_layer_path, + asset_is_layer, + for_save): + """ + Args: + asset_path (str): The incoming file path you want to alter or not. + asset_path_for_save (bool): Whether the current path is a + referenced path in the USD file. When True, return the path + you want inside USD file. + referencing_layer_path (str): ??? + asset_is_layer (bool): Whether this asset is a USD layer file. + If this is False, the asset is something else (for example, + a texture or volume file). + for_save (bool): Whether the asset path is for a file to be saved + out. If so, then return actual written filepath. + + Returns: + The refactored asset path. + + """ + + # Treat save paths as being relative to the output path. + if for_save and self.staging_dir: + # Whenever we're processing a Save Path make sure to + # resolve it to the Staging Directory + filename = os.path.basename(asset_path) + return os.path.join(self.staging_dir, filename) + + return asset_path + + +output_processor = StagingDirOutputProcessor() +def usdOutputProcessor(): + return output_processor + diff --git a/openpype/lib/usdlib.py b/openpype/lib/usdlib.py new file mode 100644 index 0000000000..cc036a9491 --- /dev/null +++ b/openpype/lib/usdlib.py @@ -0,0 +1,347 @@ +import os +import re +import logging + +try: + from pxr import Usd, UsdGeom, Sdf, Kind +except ImportError: + # Allow to fall back on Multiverse 6.3.0+ pxr usd library + from mvpxr import Usd, UsdGeom, Sdf, Kind + +from avalon import io, api + +log = logging.getLogger(__name__) + + +# The predefined steps order used for bootstrapping USD Shots and Assets. +# These are ordered in order from strongest to weakest opinions, like in USD. +PIPELINE = { + "shot": ["usdLighting", + "usdFx", + "usdSimulation", + "usdAnimation", + "usdLayout"], + "asset": ["usdShade", + "usdModel"] +} + + +def create_asset(filepath, + asset_name, + reference_layers, + kind=Kind.Tokens.component): + """ + Creates an asset file that consists of a top level layer and sublayers for + shading and geometry. + + Args: + filepath (str): Filepath where the asset.usd file will be saved. + reference_layers (list): USD Files to reference in the asset. + Note that the bottom layer (first file, like a model) would + be last in the list. The strongest layer will be the first + index. + asset_name (str): The name for the Asset identifier and default prim. + kind (pxr.Kind): A USD Kind for the root asset. + + """ + # Also see create_asset.py in PixarAnimationStudios/USD endToEnd example + + log.info("Creating asset at %s", filepath) + + # Make the layer ascii - good for readability, plus the file is small + root_layer = Sdf.Layer.CreateNew(filepath, args={'format': 'usda'}) + stage = Usd.Stage.Open(root_layer) + + # Define a prim for the asset and make it the default for the stage. + asset_prim = UsdGeom.Xform.Define(stage, '/%s' % asset_name).GetPrim() + stage.SetDefaultPrim(asset_prim) + + # Let viewing applications know how to orient a free camera properly + UsdGeom.SetStageUpAxis(stage, UsdGeom.Tokens.y) + + # Usually we will "loft up" the kind authored into the exported geometry + # layer rather than re-stamping here; we'll leave that for a later + # tutorial, and just be explicit here. + model = Usd.ModelAPI(asset_prim) + if kind: + model.SetKind(kind) + + model.SetAssetName(asset_name) + model.SetAssetIdentifier('%s/%s.usd' % (asset_name, asset_name)) + + # Add references to the asset prim + references = asset_prim.GetReferences() + for reference_filepath in reference_layers: + references.AddReference(reference_filepath) + + stage.GetRootLayer().Save() + + +def create_shot(filepath, layers, create_layers=False): + """Create a shot with separate layers for departments. + + Args: + filepath (str): Filepath where the asset.usd file will be saved. + layers (str): When provided this will be added verbatim in the + subLayerPaths layers. When the provided layer paths do not exist + they are generated using Sdf.Layer.CreateNew + create_layers (bool): Whether to create the stub layers on disk if + they do not exist yet. + + Returns: + str: The saved shot file path + + """ + # Also see create_shot.py in PixarAnimationStudios/USD endToEnd example + + stage = Usd.Stage.CreateNew(filepath) + log.info("Creating shot at %s" % filepath) + + for layer_path in layers: + if create_layers and not os.path.exists(layer_path): + # We use the Sdf API here to quickly create layers. Also, we're + # using it as a way to author the subLayerPaths as there is no + # way to do that directly in the Usd API. + layer_folder = os.path.dirname(layer_path) + if not os.path.exists(layer_folder): + os.makedirs(layer_folder) + + Sdf.Layer.CreateNew(layer_path) + + stage.GetRootLayer().subLayerPaths.append(layer_path) + + # Lets viewing applications know how to orient a free camera properly + UsdGeom.SetStageUpAxis(stage, UsdGeom.Tokens.y) + stage.GetRootLayer().Save() + + return filepath + + +def create_model(filename, asset, variant_subsets): + """Create a USD Model file. + + For each of the variation paths it will payload the path and set its + relevant variation name. + + """ + + asset_doc = io.find_one({"name": asset, "type": "asset"}) + assert asset_doc, "Asset not found: %s" % asset + + variants = [] + for subset in variant_subsets: + prefix = "usdModel" + if subset.startswith(prefix): + # Strip off `usdModel_` + variant = subset[len(prefix):] + else: + raise ValueError("Model subsets must start " + "with usdModel: %s" % subset) + + path = get_usd_master_path(asset=asset_doc, + subset=subset, + representation="usd") + variants.append((variant, path)) + + stage = _create_variants_file(filename, + variants=variants, + variantset="model", + variant_prim="/root", + reference_prim="/root/geo", + as_payload=True) + + UsdGeom.SetStageMetersPerUnit(stage, 1) + UsdGeom.SetStageUpAxis(stage, UsdGeom.Tokens.y) + + # modelAPI = Usd.ModelAPI(root_prim) + # modelAPI.SetKind(Kind.Tokens.component) + + # See http://openusd.org/docs/api/class_usd_model_a_p_i.html#details + # for more on assetInfo + # modelAPI.SetAssetName(asset) + # modelAPI.SetAssetIdentifier(asset) + + stage.GetRootLayer().Save() + + +def create_shade(filename, asset, variant_subsets): + """Create a master USD shade file for an asset. + + For each available model variation this should generate a reference + to a `usdShade_{modelVariant}` subset. + + """ + + asset_doc = io.find_one({"name": asset, "type": "asset"}) + assert asset_doc, "Asset not found: %s" % asset + + variants = [] + + for subset in variant_subsets: + prefix = "usdModel" + if subset.startswith(prefix): + # Strip off `usdModel_` + variant = subset[len(prefix):] + else: + raise ValueError("Model subsets must start " + "with usdModel: %s" % subset) + + shade_subset = re.sub("^usdModel", "usdShade", subset) + path = get_usd_master_path(asset=asset_doc, + subset=shade_subset, + representation="usd") + variants.append((variant, path)) + + stage = _create_variants_file(filename, + variants=variants, + variantset="model", + variant_prim="/root") + + stage.GetRootLayer().Save() + + +def create_shade_variation(filename, + asset, + model_variant, + shade_variants): + """Create the master Shade file for a specific model variant. + + This should reference all shade variants for the specific model variant. + + """ + + asset_doc = io.find_one({"name": asset, "type": "asset"}) + assert asset_doc, "Asset not found: %s" % asset + + variants = [] + for variant in shade_variants: + subset = "usdShade_{model}_{shade}".format(model=model_variant, + shade=variant) + path = get_usd_master_path(asset=asset_doc, + subset=subset, + representation="usd") + variants.append((variant, path)) + + stage = _create_variants_file(filename, + variants=variants, + variantset="shade", + variant_prim="/root") + + stage.GetRootLayer().Save() + + +def _create_variants_file(filename, + variants, + variantset, + default_variant=None, + variant_prim="/root", + reference_prim=None, + set_default_variant=True, + as_payload=False, + skip_variant_on_single_file=True): + + root_layer = Sdf.Layer.CreateNew(filename, args={'format': 'usda'}) + stage = Usd.Stage.Open(root_layer) + + root_prim = stage.DefinePrim(variant_prim) + stage.SetDefaultPrim(root_prim) + + def _reference(path): + """Reference/Payload path depending on function arguments""" + + if reference_prim: + prim = stage.DefinePrim(reference_prim) + else: + prim = root_prim + + if as_payload: + # Payload + prim.GetPayloads().AddPayload(Sdf.Payload(path)) + else: + # Reference + prim.GetReferences().AddReference(Sdf.Reference(path)) + + assert variants, "Must have variants, got: %s" % variants + + log.info(filename) + + if skip_variant_on_single_file and len(variants) == 1: + # Reference directly, no variants + variant_path = variants[0][1] + _reference(variant_path) + + log.info("Non-variants..") + log.info("Path: %s" % variant_path) + + else: + # Variants + append = Usd.ListPositionBackOfAppendList + variant_set = root_prim.GetVariantSets().AddVariantSet(variantset, + append) + + for variant, variant_path in variants: + + if default_variant is None: + default_variant = variant + + variant_set.AddVariant(variant, append) + variant_set.SetVariantSelection(variant) + with variant_set.GetVariantEditContext(): + _reference(variant_path) + + log.info("Variants..") + log.info("Variant: %s" % variant) + log.info("Path: %s" % variant_path) + + if set_default_variant: + variant_set.SetVariantSelection(default_variant) + + return stage + + +def get_usd_master_path(asset, + subset, + representation): + """Get the filepath for a .usd file of a subset. + + This will return the path to an unversioned master file generated by + `usd_master_file.py`. + + """ + + project = io.find_one({"type": "project"}, + projection={"config.template.publish": True}) + template = project["config"]["template"]["publish"] + + if isinstance(asset, dict) and "silo" in asset and "name" in asset: + # Allow explicitly passing asset document + asset_doc = asset + else: + asset_doc = io.find_one({"name": asset, + "type": "asset"}) + + path = template.format(**{ + "root": api.registered_root(), + "project": api.Session["AVALON_PROJECT"], + "silo": asset_doc["silo"], + "asset": asset_doc["name"], + "subset": subset, + "representation": representation, + "version": 0 # stub version zero + }) + + # Remove the version folder + subset_folder = os.path.dirname(os.path.dirname(path)) + master_folder = os.path.join(subset_folder, "master") + fname = "{0}.{1}".format(subset, representation) + + return os.path.join(master_folder, fname).replace("\\", "/") + + +def parse_avalon_uri(uri): + # URI Pattern: avalon://{asset}/{subset}.{ext} + pattern = r"avalon://(?P[^/.]*)/(?P[^/]*)\.(?P.*)" + if uri.startswith("avalon://"): + match = re.match(pattern, uri) + if match: + return match.groupdict() From c85bd30e1b01aa543f8a14a5b03de2a01f8fbcd7 Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Fri, 16 Jul 2021 12:58:16 +0200 Subject: [PATCH 19/38] =?UTF-8?q?hound=20cleanup=20=F0=9F=90=B6?= =?UTF-8?q?=F0=9F=A7=BD=F0=9F=A7=BA=20I.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openpype/hosts/houdini/api/__init__.py | 23 +++++-------- openpype/hosts/houdini/api/usd.py | 3 +- .../plugins/create/create_redshift_rop.py | 2 +- .../plugins/create/create_usd_model.py | 1 - .../plugins/create/create_usd_workspaces.py | 1 - .../hosts/houdini/plugins/load/load_camera.py | 34 +++++++++---------- 6 files changed, 27 insertions(+), 37 deletions(-) diff --git a/openpype/hosts/houdini/api/__init__.py b/openpype/hosts/houdini/api/__init__.py index 8eda4aff26..bb43654fef 100644 --- a/openpype/hosts/houdini/api/__init__.py +++ b/openpype/hosts/houdini/api/__init__.py @@ -6,16 +6,13 @@ import contextlib import hou from pyblish import api as pyblish - from avalon import api as avalon -from avalon.houdini import pipeline as houdini import openpype.hosts.houdini from openpype.hosts.houdini.api import lib from openpype.lib import ( - any_outdated, - update_task_from_path + any_outdated ) from .lib import get_asset_fps @@ -29,6 +26,7 @@ LOAD_PATH = os.path.join(PLUGINS_DIR, "load") CREATE_PATH = os.path.join(PLUGINS_DIR, "create") INVENTORY_PATH = os.path.join(PLUGINS_DIR, "inventory") + def install(): pyblish.register_plugin_path(PUBLISH_PATH) @@ -36,7 +34,7 @@ def install(): avalon.register_plugin_path(avalon.Creator, CREATE_PATH) log.info("Installing callbacks ... ") - avalon.on("init", on_init) + # avalon.on("init", on_init) avalon.before("save", before_save) avalon.on("save", on_save) avalon.on("open", on_open) @@ -50,11 +48,10 @@ def install(): "review" ] - # Expose Houdini husdoutputprocessors - hou_setup_pythonpath = os.path.join(os.path.dirname(PACKAGE_DIR), - "setup", "houdini", "pythonpath") - print("Adding PYTHONPATH: %s" % hou_setup_pythonpath) - sys.path.append(hou_setup_pythonpath) + # add houdini vendor packages + hou_pythonpath = os.path.join(os.path.dirname(HOST_DIR), "vendor") + + sys.path.append(hou_pythonpath) # Set asset FPS for the empty scene directly after launch of Houdini # so it initializes into the correct scene FPS @@ -69,8 +66,6 @@ def on_save(*args): avalon.logger.info("Running callback on save..") - update_task_from_path(hou.hipFile.path()) - nodes = lib.get_id_required_nodes() for node, new_id in lib.generate_ids(nodes): lib.set_id(node, new_id, overwrite=False) @@ -84,14 +79,12 @@ def on_open(*args): avalon.logger.info("Running callback on open..") - update_task_from_path(hou.hipFile.path()) - # Validate FPS after update_task_from_path to # ensure it is using correct FPS for the asset lib.validate_fps() if any_outdated(): - from ..widgets import popup + from openpype.widgets import popup log.warning("Scene has outdated content.") diff --git a/openpype/hosts/houdini/api/usd.py b/openpype/hosts/houdini/api/usd.py index 545cd3f7a5..48b97bb250 100644 --- a/openpype/hosts/houdini/api/usd.py +++ b/openpype/hosts/houdini/api/usd.py @@ -2,9 +2,8 @@ import contextlib -from avalon import io import logging -from avalon.vendor.Qt import QtCore, QtGui +from Qt import QtCore, QtGui from avalon.tools.widgets import AssetWidget from avalon import style diff --git a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py index b944d592f2..f6e482954d 100644 --- a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py @@ -19,7 +19,7 @@ class CreateRedshiftROP(houdini.Creator): subset_no_prefix = subset[len(self.family):] subset_no_prefix = subset_no_prefix[0].lower() + subset_no_prefix[1:] self.data["subset"] = subset_no_prefix - + # Add chunk size attribute self.data["chunkSize"] = 10 diff --git a/openpype/hosts/houdini/plugins/create/create_usd_model.py b/openpype/hosts/houdini/plugins/create/create_usd_model.py index f4c377e0a8..e412a88c71 100644 --- a/openpype/hosts/houdini/plugins/create/create_usd_model.py +++ b/openpype/hosts/houdini/plugins/create/create_usd_model.py @@ -1,7 +1,6 @@ import re from avalon import api -from avalon.houdini import lib import hou diff --git a/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py b/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py index 87c54c9fb7..906a217c0f 100644 --- a/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py +++ b/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py @@ -1,5 +1,4 @@ from avalon import api -from avalon.houdini import lib import hou diff --git a/openpype/hosts/houdini/plugins/load/load_camera.py b/openpype/hosts/houdini/plugins/load/load_camera.py index ac0e1f0436..0cb17dc7d6 100644 --- a/openpype/hosts/houdini/plugins/load/load_camera.py +++ b/openpype/hosts/houdini/plugins/load/load_camera.py @@ -23,40 +23,40 @@ def transfer_non_default_values(src, dest, ignore=None): """ import hou - src.updateParmStates() + src.updateParmStates() for parm in src.allParms(): - + if ignore and parm.name() in ignore: continue - + # If destination parm does not exist, ignore.. dest_parm = dest.parm(parm.name()) if not dest_parm: continue - + # Ignore values that are currently at default if parm.isAtDefault() and dest_parm.isAtDefault(): continue - + if not parm.isVisible(): # Ignore hidden parameters, assume they # are implementation details continue - + expression = None try: expression = parm.expression() except hou.OperationFailed: # No expression present pass - + if expression is not None and ARCHIVE_EXPRESSION in expression: - # Assume it's part of the automated connections that the Alembic Archive - # makes on loading of the camera and thus we do not want to transfer - # the expression + # Assume it's part of the automated connections that the + # Alembic Archive makes on loading of the camera and thus we do + # not want to transfer the expression continue - + # Ignore folders, separators, etc. ignore_types = { hou.parmTemplateType.Toggle, @@ -68,7 +68,7 @@ def transfer_non_default_values(src, dest, ignore=None): } if parm.parmTemplate().type() in ignore_types: continue - + print("Preserving attribute: %s" % parm.name()) dest_parm.setFromParm(parm) @@ -155,13 +155,13 @@ class CameraLoader(api.Loader): # Apply values to the new camera new_camera = self._get_camera(node) - transfer_non_default_values(temp_camera, + transfer_non_default_values(temp_camera, new_camera, - # The hidden uniform scale attribute - # gets a default connection to "icon_scale" - # just skip that completely + # The hidden uniform scale attribute + # gets a default connection to + # "icon_scale" just skip that completely ignore={"scale"}) - + temp_camera.destroy() def remove(self, container): From 7b2932c9a78aa0e829a6bd06b148eb29a6f31e7d Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Fri, 16 Jul 2021 15:25:14 +0200 Subject: [PATCH 20/38] =?UTF-8?q?hound=20cleanup=20=F0=9F=90=B6?= =?UTF-8?q?=F0=9F=A7=BD=F0=9F=A7=BA=20II.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/create/create_alembic_camera.py | 7 +- .../plugins/create/create_composite.py | 2 +- .../plugins/create/create_pointcache.py | 16 ++-- .../plugins/create/create_redshift_rop.py | 10 +- .../houdini/plugins/create/create_usd.py | 13 ++- .../plugins/create/create_usd_model.py | 7 +- .../plugins/create/create_usd_workspaces.py | 6 +- .../plugins/create/create_usdrender.py | 2 +- .../plugins/create/create_vbd_cache.py | 6 +- .../hosts/houdini/plugins/load/actions.py | 42 +++++---- .../houdini/plugins/load/load_alembic.py | 24 ++--- .../hosts/houdini/plugins/load/load_camera.py | 9 +- .../hosts/houdini/plugins/load/load_image.py | 54 ++++++----- .../houdini/plugins/load/load_usd_layer.py | 22 +++-- .../plugins/load/load_usd_reference.py | 20 ++-- .../hosts/houdini/plugins/load/load_vdb.py | 25 +++-- .../houdini/plugins/load/show_usdview.py | 3 +- .../plugins/publish/collect_active_state.py | 15 +-- .../plugins/publish/collect_current_file.py | 12 ++- .../houdini/plugins/publish/collect_frames.py | 13 ++- .../houdini/plugins/publish/collect_inputs.py | 20 ++-- .../plugins/publish/collect_instances.py | 2 +- .../publish/collect_instances_usd_layered.py | 3 - .../plugins/publish/collect_output_node.py | 19 ++-- .../plugins/publish/collect_redshift_rop.py | 26 +++--- .../plugins/publish/collect_remote_publish.py | 4 +- .../publish/collect_render_products.py | 23 +++-- .../plugins/publish/collect_usd_bootstrap.py | 36 ++++--- .../plugins/publish/collect_usd_layers.py | 1 - .../plugins/publish/collect_workscene_fps.py | 2 +- .../houdini/plugins/publish/extract_usd.py | 2 +- .../plugins/publish/extract_usd_layered.py | 93 ++++++++++--------- .../plugins/publish/extract_vdb_cache.py | 6 +- .../plugins/publish/increment_current_file.py | 21 +++-- .../increment_current_file_deadline.py | 17 ++-- .../houdini/plugins/publish/save_scene.py | 2 +- .../plugins/publish/save_scene_deadline.py | 6 +- .../publish/submit_houdini_render_deadline.py | 10 +- .../plugins/publish/submit_remote_publish.py | 58 ++++++------ .../plugins/publish/valiate_vdb_input_node.py | 7 +- .../validate_abc_primitive_to_detail.py | 56 +++++++---- .../publish/validate_alembic_face_sets.py | 18 ++-- .../publish/validate_alembic_input_node.py | 21 +++-- .../publish/validate_animation_settings.py | 5 +- .../plugins/publish/validate_bypass.py | 8 +- .../plugins/publish/validate_camera_rop.py | 20 ++-- .../publish/validate_cop_output_node.py | 34 +++---- .../publish/validate_file_extension.py | 11 +-- .../plugins/publish/validate_frame_token.py | 7 +- .../validate_houdini_license_category.py | 6 +- .../publish/validate_mkpaths_toggled.py | 20 ++-- .../plugins/publish/validate_no_errors.py | 21 +++-- .../publish/validate_outnode_exists.py | 4 +- .../plugins/publish/validate_output_node.py | 44 +++++---- .../validate_primitive_hierarchy_paths.py | 47 ++++++---- .../publish/validate_remote_publish.py | 18 ++-- .../validate_remote_publish_enabled.py | 6 +- .../publish/validate_sop_output_node.py | 38 ++++---- .../validate_usd_layer_path_backslashes.py | 11 +-- .../publish/validate_usd_model_and_shade.py | 7 +- .../publish/validate_usd_output_node.py | 28 +++--- .../validate_usd_render_product_names.py | 7 +- .../plugins/publish/validate_usd_setdress.py | 13 ++- .../validate_usd_shade_model_exists.py | 23 +++-- .../publish/validate_usd_shade_workspace.py | 21 +++-- .../publish/validate_vdb_input_node.py | 7 +- .../publish/validate_vdb_output_node.py | 27 +++--- 67 files changed, 652 insertions(+), 542 deletions(-) diff --git a/openpype/hosts/houdini/plugins/create/create_alembic_camera.py b/openpype/hosts/houdini/plugins/create/create_alembic_camera.py index adcfb48539..99a587b035 100644 --- a/openpype/hosts/houdini/plugins/create/create_alembic_camera.py +++ b/openpype/hosts/houdini/plugins/create/create_alembic_camera.py @@ -23,7 +23,7 @@ class CreateAlembicCamera(plugin.Creator): parms = { "filename": "$HIP/pyblish/%s.abc" % self.name, - "use_sop_path": False + "use_sop_path": False, } if self.nodes: @@ -33,10 +33,7 @@ class CreateAlembicCamera(plugin.Creator): # Split the node path into the first root and the remainder # So we can set the root and objects parameters correctly _, root, remainder = path.split("/", 2) - parms.update({ - "root": "/" + root, - "objects": remainder - }) + parms.update({"root": "/" + root, "objects": remainder}) instance.setParms(parms) diff --git a/openpype/hosts/houdini/plugins/create/create_composite.py b/openpype/hosts/houdini/plugins/create/create_composite.py index d8ec41e61a..4f91fa2258 100644 --- a/openpype/hosts/houdini/plugins/create/create_composite.py +++ b/openpype/hosts/houdini/plugins/create/create_composite.py @@ -5,7 +5,7 @@ class CreateCompositeSequence(houdini.Creator): """Composite ROP to Image Sequence""" label = "Composite (Image Sequence)" - family = "colorbleed.imagesequence" + family = "imagesequence" icon = "gears" def __init__(self, *args, **kwargs): diff --git a/openpype/hosts/houdini/plugins/create/create_pointcache.py b/openpype/hosts/houdini/plugins/create/create_pointcache.py index 7ab1046df3..cc452ed806 100644 --- a/openpype/hosts/houdini/plugins/create/create_pointcache.py +++ b/openpype/hosts/houdini/plugins/create/create_pointcache.py @@ -20,13 +20,15 @@ class CreatePointCache(plugin.Creator): def process(self): instance = super(CreatePointCache, self).process() - parms = {"use_sop_path": True, # Export single node from SOP Path - "build_from_path": True, # Direct path of primitive in output - "path_attrib": "path", # Pass path attribute for output - "prim_to_detail_pattern": "cbId", - "format": 2, # Set format to Ogawa - "facesets": 0, # No face sets (by default exclude them) - "filename": "$HIP/pyblish/%s.abc" % self.name} + parms = { + "use_sop_path": True, # Export single node from SOP Path + "build_from_path": True, # Direct path of primitive in output + "path_attrib": "path", # Pass path attribute for output + "prim_to_detail_pattern": "cbId", + "format": 2, # Set format to Ogawa + "facesets": 0, # No face sets (by default exclude them) + "filename": "$HIP/pyblish/%s.abc" % self.name, + } if self.nodes: node = self.nodes[0] diff --git a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py index f6e482954d..0babc17c6b 100644 --- a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py @@ -35,8 +35,9 @@ class CreateRedshiftROP(houdini.Creator): instance.setName(basename + "_ROP", unique_name=True) # Also create the linked Redshift IPR Rop - ipr_rop = self.parent.createNode("Redshift_IPR", - node_name=basename + "_IPR") + ipr_rop = self.parent.createNode( + "Redshift_IPR", node_name=basename + "_IPR" + ) # Move it to directly under the Redshift ROP ipr_rop.setPosition(instance.position() + hou.Vector2(0, -1)) @@ -48,11 +49,10 @@ class CreateRedshiftROP(houdini.Creator): parms = { # Render frame range "trange": 1, - # Redshift ROP settings "RS_outputFileNamePrefix": prefix, - "RS_outputMultilayerMode": 0, # no multi-layered exr - "RS_outputBeautyAOVSuffix": "beauty" + "RS_outputMultilayerMode": 0, # no multi-layered exr + "RS_outputBeautyAOVSuffix": "beauty", } instance.setParms(parms) diff --git a/openpype/hosts/houdini/plugins/create/create_usd.py b/openpype/hosts/houdini/plugins/create/create_usd.py index d4cf3f761b..5ca8875dc0 100644 --- a/openpype/hosts/houdini/plugins/create/create_usd.py +++ b/openpype/hosts/houdini/plugins/create/create_usd.py @@ -5,7 +5,7 @@ class CreateUSD(houdini.Creator): """Universal Scene Description""" label = "USD" - family = "colorbleed.usd" + family = "usd" icon = "gears" def __init__(self, *args, **kwargs): @@ -21,7 +21,7 @@ class CreateUSD(houdini.Creator): parms = { "lopoutput": "$HIP/pyblish/%s.usd" % self.name, - "enableoutputprocessor_simplerelativepaths": False + "enableoutputprocessor_simplerelativepaths": False, } if self.nodes: @@ -31,9 +31,12 @@ class CreateUSD(houdini.Creator): instance.setParms(parms) # Lock any parameters in this list - to_lock = ["fileperframe", - # Lock some Avalon attributes - "family", "id"] + to_lock = [ + "fileperframe", + # Lock some Avalon attributes + "family", + "id", + ] for name in to_lock: parm = instance.parm(name) parm.lock(True) diff --git a/openpype/hosts/houdini/plugins/create/create_usd_model.py b/openpype/hosts/houdini/plugins/create/create_usd_model.py index e412a88c71..96563f2f91 100644 --- a/openpype/hosts/houdini/plugins/create/create_usd_model.py +++ b/openpype/hosts/houdini/plugins/create/create_usd_model.py @@ -13,7 +13,7 @@ class CreateUSDModel(api.Creator): def process(self): - node_type = "cb::author_model:1.0" + node_type = "op::author_model:1.0" subset = self.data["subset"] name = "author_{}".format(subset) @@ -24,10 +24,7 @@ class CreateUSDModel(api.Creator): instance = stage.createNode(node_type, node_name=name) instance.moveToGoodPosition(move_unconnected=True) - parms = { - "asset_name": self.data["asset"], - "variant_name": variant - } + parms = {"asset_name": self.data["asset"], "variant_name": variant} # Set the Geo Path to the first selected node (if any) selection = hou.selectedNodes() diff --git a/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py b/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py index 906a217c0f..a2309122e4 100644 --- a/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py +++ b/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py @@ -31,9 +31,7 @@ class _USDWorkspace(api.Creator): # With the Workspace HDAs there is no need to imprint the instance data # since this data is pre-built into it. However, we do set the right # asset as that can be defined by the user. - parms = { - "asset": self.data["asset"] - } + parms = {"asset": self.data["asset"]} instance.setParms(parms) return instance @@ -47,7 +45,7 @@ class USDCreateShadingWorkspace(_USDWorkspace): label = "USD Shading Workspace" family = "colorbleed.shade.usd" - node_type = "cb::shadingWorkspace::1.0" + node_type = "op::shadingWorkspace::1.0" node_name = "shadingWorkspace" step = "Shade" diff --git a/openpype/hosts/houdini/plugins/create/create_usdrender.py b/openpype/hosts/houdini/plugins/create/create_usdrender.py index 4914e8e3ab..1c488f381b 100644 --- a/openpype/hosts/houdini/plugins/create/create_usdrender.py +++ b/openpype/hosts/houdini/plugins/create/create_usdrender.py @@ -7,7 +7,7 @@ class CreateUSDRender(houdini.Creator): """USD Render ROP in /stage""" label = "USD Render" - family = "colorbleed.usdrender" + family = "usdrender" icon = "magic" def __init__(self, *args, **kwargs): diff --git a/openpype/hosts/houdini/plugins/create/create_vbd_cache.py b/openpype/hosts/houdini/plugins/create/create_vbd_cache.py index f8f3bbf9c3..677c3d5a9a 100644 --- a/openpype/hosts/houdini/plugins/create/create_vbd_cache.py +++ b/openpype/hosts/houdini/plugins/create/create_vbd_cache.py @@ -21,8 +21,10 @@ class CreateVDBCache(plugin.Creator): def process(self): instance = super(CreateVDBCache, self).process() - parms = {"sopoutput": "$HIP/pyblish/%s.$F4.vdb" % self.name, - "initsim": True} + parms = { + "sopoutput": "$HIP/pyblish/%s.$F4.vdb" % self.name, + "initsim": True, + } if self.nodes: node = self.nodes[0] diff --git a/openpype/hosts/houdini/plugins/load/actions.py b/openpype/hosts/houdini/plugins/load/actions.py index bb8cd7a1f6..6e9410ff58 100644 --- a/openpype/hosts/houdini/plugins/load/actions.py +++ b/openpype/hosts/houdini/plugins/load/actions.py @@ -6,13 +6,15 @@ from avalon import api class SetFrameRangeLoader(api.Loader): - """Set Maya frame range""" + """Set Houdini frame range""" - families = ["colorbleed.animation", - "colorbleed.camera", - "colorbleed.pointcache", - "colorbleed.vdbcache", - "colorbleed.usd"] + families = [ + "animation", + "camera", + "pointcache", + "vdbcache", + "usd", + ] representations = ["abc", "vdb", "usd"] label = "Set frame range" @@ -24,15 +26,17 @@ class SetFrameRangeLoader(api.Loader): import hou - version = context['version'] + version = context["version"] version_data = version.get("data", {}) start = version_data.get("startFrame", None) end = version_data.get("endFrame", None) if start is None or end is None: - print("Skipping setting frame range because start or " - "end frame data is missing..") + print( + "Skipping setting frame range because start or " + "end frame data is missing.." + ) return hou.playbar.setFrameRange(start, end) @@ -42,11 +46,13 @@ class SetFrameRangeLoader(api.Loader): class SetFrameRangeWithHandlesLoader(api.Loader): """Set Maya frame range including pre- and post-handles""" - families = ["colorbleed.animation", - "colorbleed.camera", - "colorbleed.pointcache", - "colorbleed.vdbcache", - "colorbleed.usd"] + families = [ + "animation", + "camera", + "pointcache", + "vdbcache", + "usd", + ] representations = ["abc", "vdb", "usd"] label = "Set frame range (with handles)" @@ -58,15 +64,17 @@ class SetFrameRangeWithHandlesLoader(api.Loader): import hou - version = context['version'] + version = context["version"] version_data = version.get("data", {}) start = version_data.get("startFrame", None) end = version_data.get("endFrame", None) if start is None or end is None: - print("Skipping setting frame range because start or " - "end frame data is missing..") + print( + "Skipping setting frame range because start or " + "end frame data is missing.." + ) return # Include handles diff --git a/openpype/hosts/houdini/plugins/load/load_alembic.py b/openpype/hosts/houdini/plugins/load/load_alembic.py index 076b4051f8..cd0f0f0d2d 100644 --- a/openpype/hosts/houdini/plugins/load/load_alembic.py +++ b/openpype/hosts/houdini/plugins/load/load_alembic.py @@ -6,10 +6,7 @@ from avalon.houdini import pipeline, lib class AbcLoader(api.Loader): """Specific loader of Alembic for the avalon.animation family""" - families = ["model", - "animation", - "pointcache", - "gpuCache"] + families = ["model", "animation", "pointcache", "gpuCache"] label = "Load Alembic" representations = ["abc"] order = -10 @@ -80,19 +77,22 @@ class AbcLoader(api.Loader): self[:] = nodes - return pipeline.containerise(node_name, - namespace, - nodes, - context, - self.__class__.__name__, - suffix="") + return pipeline.containerise( + node_name, + namespace, + nodes, + context, + self.__class__.__name__, + suffix="", + ) def update(self, container, representation): node = container["node"] try: - alembic_node = next(n for n in node.children() if - n.type().name() == "alembic") + alembic_node = next( + n for n in node.children() if n.type().name() == "alembic" + ) except StopIteration: self.log.error("Could not find node of type `alembic`") return diff --git a/openpype/hosts/houdini/plugins/load/load_camera.py b/openpype/hosts/houdini/plugins/load/load_camera.py index 0cb17dc7d6..65697eef63 100644 --- a/openpype/hosts/houdini/plugins/load/load_camera.py +++ b/openpype/hosts/houdini/plugins/load/load_camera.py @@ -2,24 +2,25 @@ from avalon import api from avalon.houdini import pipeline, lib -ARCHIVE_EXPRESSION = '__import__("_alembic_hom_extensions").alembicGetCameraDict' +ARCHIVE_EXPRESSION = ('__import__("_alembic_hom_extensions")' + '.alembicGetCameraDict') def transfer_non_default_values(src, dest, ignore=None): """Copy parm from src to dest. - + Because the Alembic Archive rebuilds the entire node hierarchy on triggering "Build Hierarchy" we want to preserve any local tweaks made by the user on the camera for ease of use. That could be a background image, a resolution change or even Redshift camera parameters. - + We try to do so by finding all Parms that exist on both source and destination node, include only those that both are not at their default value, they must be visible, we exclude those that have the special "alembic archive" channel expression and ignore certain Parm types. - + """ import hou diff --git a/openpype/hosts/houdini/plugins/load/load_image.py b/openpype/hosts/houdini/plugins/load/load_image.py index 026cb07f67..4ff2777d77 100644 --- a/openpype/hosts/houdini/plugins/load/load_image.py +++ b/openpype/hosts/houdini/plugins/load/load_image.py @@ -5,14 +5,15 @@ from avalon.houdini import pipeline, lib import hou + def get_image_avalon_container(): - """The COP2 files must be in a COP2 network. - + """The COP2 files must be in a COP2 network. + So we maintain a single entry point within AVALON_CONTAINERS, just for ease of use. - + """ - + path = pipeline.AVALON_CONTAINERS avalon_container = hou.node(path) if not avalon_container: @@ -20,18 +21,21 @@ def get_image_avalon_container(): # but make sure the pipeline still is built the # way we anticipate it was built, asserting it. assert path == "/obj/AVALON_CONTAINERS" - + parent = hou.node("/obj") - avalon_container = parent.createNode("subnet", - node_name="AVALON_CONTAINERS") - + avalon_container = parent.createNode( + "subnet", node_name="AVALON_CONTAINERS" + ) + image_container = hou.node(path + "/IMAGES") if not image_container: - image_container = avalon_container.createNode("cop2net", node_name="IMAGES") + image_container = avalon_container.createNode( + "cop2net", node_name="IMAGES" + ) image_container.moveToGoodPosition() - + return image_container - + class ImageLoader(api.Loader): """Specific loader of Alembic for the avalon.animation family""" @@ -57,12 +61,12 @@ class ImageLoader(api.Loader): # Define node name namespace = namespace if namespace else context["asset"]["name"] node_name = "{}_{}".format(namespace, name) if namespace else name - + node = parent.createNode("file", node_name=node_name) node.moveToGoodPosition() node.setParms({"filename1": file_path}) - + # Imprint it manually data = { "schema": "avalon-core:container-2.0", @@ -75,7 +79,7 @@ class ImageLoader(api.Loader): # todo: add folder="Avalon" lib.imprint(node, data) - + return node def update(self, container, representation): @@ -88,32 +92,32 @@ class ImageLoader(api.Loader): file_path = self._get_file_sequence(file_path) # Update attributes - node.setParms({ - "filename1": file_path, - "representation": str(representation["_id"]) - }) + node.setParms( + { + "filename1": file_path, + "representation": str(representation["_id"]), + } + ) def remove(self, container): node = container["node"] - + # Let's clean up the IMAGES COP2 network # if it ends up being empty and we deleted # the last file node. Store the parent # before we delete the node. parent = node.parent() - + node.destroy() - + if not parent.children(): parent.destroy() - - def _get_file_sequence(self, root): files = sorted(os.listdir(root)) - + first_fname = files[0] prefix, padding, suffix = first_fname.rsplit(".", 2) fname = ".".join([prefix, "$F{}".format(len(padding)), suffix]) - return os.path.join(root, fname).replace("\\", "/") \ No newline at end of file + return os.path.join(root, fname).replace("\\", "/") diff --git a/openpype/hosts/houdini/plugins/load/load_usd_layer.py b/openpype/hosts/houdini/plugins/load/load_usd_layer.py index 79fe3e88fd..7483101409 100644 --- a/openpype/hosts/houdini/plugins/load/load_usd_layer.py +++ b/openpype/hosts/houdini/plugins/load/load_usd_layer.py @@ -5,11 +5,13 @@ from avalon.houdini import pipeline, lib class USDSublayerLoader(api.Loader): """Sublayer USD file in Solaris""" - families = ["colorbleed.usd", - "colorbleed.pointcache", - "colorbleed.animation", - "colorbleed.camera", - "usdCamera"] + families = [ + "colorbleed.usd", + "colorbleed.pointcache", + "colorbleed.animation", + "colorbleed.camera", + "usdCamera", + ] label = "Sublayer USD" representations = ["usd", "usda", "usdlc", "usdnc", "abc"] order = 1 @@ -62,8 +64,12 @@ class USDSublayerLoader(api.Loader): file_path = file_path.replace("\\", "/") # Update attributes - node.setParms({"filepath1": file_path, - "representation": str(representation["_id"])}) + node.setParms( + { + "filepath1": file_path, + "representation": str(representation["_id"]), + } + ) # Reload files node.parm("reload").pressButton() @@ -71,4 +77,4 @@ class USDSublayerLoader(api.Loader): def remove(self, container): node = container["node"] - node.destroy() \ No newline at end of file + node.destroy() diff --git a/openpype/hosts/houdini/plugins/load/load_usd_reference.py b/openpype/hosts/houdini/plugins/load/load_usd_reference.py index f996ccdc3c..cab3cb5269 100644 --- a/openpype/hosts/houdini/plugins/load/load_usd_reference.py +++ b/openpype/hosts/houdini/plugins/load/load_usd_reference.py @@ -5,11 +5,13 @@ from avalon.houdini import pipeline, lib class USDReferenceLoader(api.Loader): """Reference USD file in Solaris""" - families = ["colorbleed.usd", - "colorbleed.pointcache", - "colorbleed.animation", - "colorbleed.camera", - "usdCamera"] + families = [ + "colorbleed.usd", + "colorbleed.pointcache", + "colorbleed.animation", + "colorbleed.camera", + "usdCamera", + ] label = "Reference USD" representations = ["usd", "usda", "usdlc", "usdnc", "abc"] order = -8 @@ -62,8 +64,12 @@ class USDReferenceLoader(api.Loader): file_path = file_path.replace("\\", "/") # Update attributes - node.setParms({"filepath1": file_path, - "representation": str(representation["_id"])}) + node.setParms( + { + "filepath1": file_path, + "representation": str(representation["_id"]), + } + ) # Reload files node.parm("reload").pressButton() diff --git a/openpype/hosts/houdini/plugins/load/load_vdb.py b/openpype/hosts/houdini/plugins/load/load_vdb.py index be2b2556f5..576b459d7d 100644 --- a/openpype/hosts/houdini/plugins/load/load_vdb.py +++ b/openpype/hosts/houdini/plugins/load/load_vdb.py @@ -45,12 +45,14 @@ class VdbLoader(api.Loader): nodes = [container, file_node] self[:] = nodes - return pipeline.containerise(node_name, - namespace, - nodes, - context, - self.__class__.__name__, - suffix="") + return pipeline.containerise( + node_name, + namespace, + nodes, + context, + self.__class__.__name__, + suffix="", + ) def format_path(self, path): """Format file path correctly for single vdb or vdb sequence""" @@ -68,8 +70,10 @@ class VdbLoader(api.Loader): files = sorted(os.listdir(path)) first = next((x for x in files if x.endswith(".vdb")), None) if first is None: - raise RuntimeError("Couldn't find first .vdb file of " - "sequence in: %s" % path) + raise RuntimeError( + "Couldn't find first .vdb file of " + "sequence in: %s" % path + ) # Set .vdb to $F.vdb first = re.sub(r"\.(\d+)\.vdb$", ".$F.vdb", first) @@ -85,8 +89,9 @@ class VdbLoader(api.Loader): node = container["node"] try: - file_node = next(n for n in node.children() if - n.type().name() == "file") + file_node = next( + n for n in node.children() if n.type().name() == "file" + ) except StopIteration: self.log.error("Could not find node of type `alembic`") return diff --git a/openpype/hosts/houdini/plugins/load/show_usdview.py b/openpype/hosts/houdini/plugins/load/show_usdview.py index b9aa0e7ddc..f23974094e 100644 --- a/openpype/hosts/houdini/plugins/load/show_usdview.py +++ b/openpype/hosts/houdini/plugins/load/show_usdview.py @@ -40,5 +40,4 @@ class ShowInUsdview(api.Loader): # Force string to avoid unicode issues env = {str(key): str(value) for key, value in env.items()} - subprocess.Popen([usdview, filepath, "--renderer", "GL"], - env=env) + subprocess.Popen([usdview, filepath, "--renderer", "GL"], env=env) diff --git a/openpype/hosts/houdini/plugins/publish/collect_active_state.py b/openpype/hosts/houdini/plugins/publish/collect_active_state.py index ee8640b04e..7b3637df88 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_active_state.py +++ b/openpype/hosts/houdini/plugins/publish/collect_active_state.py @@ -1,5 +1,4 @@ import pyblish.api -import openpype.api class CollectInstanceActiveState(pyblish.api.InstancePlugin): @@ -28,9 +27,11 @@ class CollectInstanceActiveState(pyblish.api.InstancePlugin): active = not node.isBypassed() # Set instance active state - instance.data.update({ - "active": active, - # temporarily translation of `active` to `publish` till issue has - # been resolved: https://github.com/pyblish/pyblish-base/issues/307 - "publish": active - }) + instance.data.update( + { + "active": active, + # temporarily translation of `active` to `publish` till issue has + # been resolved: https://github.com/pyblish/pyblish-base/issues/307 + "publish": active, + } + ) diff --git a/openpype/hosts/houdini/plugins/publish/collect_current_file.py b/openpype/hosts/houdini/plugins/publish/collect_current_file.py index b35a943833..c0b987ebbc 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_current_file.py +++ b/openpype/hosts/houdini/plugins/publish/collect_current_file.py @@ -9,7 +9,7 @@ class CollectHoudiniCurrentFile(pyblish.api.ContextPlugin): order = pyblish.api.CollectorOrder - 0.5 label = "Houdini Current File" - hosts = ['houdini'] + hosts = ["houdini"] def process(self, context): """Inject the current working file""" @@ -27,8 +27,10 @@ class CollectHoudiniCurrentFile(pyblish.api.ContextPlugin): # could have existed already. We will allow it if the file exists, # but show a warning for this edge case to clarify the potential # false positive. - self.log.warning("Current file is 'untitled.hip' and we are " - "unable to detect whether the current scene is " - "saved correctly.") + self.log.warning( + "Current file is 'untitled.hip' and we are " + "unable to detect whether the current scene is " + "saved correctly." + ) - context.data['currentFile'] = filepath + context.data["currentFile"] = filepath diff --git a/openpype/hosts/houdini/plugins/publish/collect_frames.py b/openpype/hosts/houdini/plugins/publish/collect_frames.py index ed43f717c2..ef77c3230b 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_frames.py +++ b/openpype/hosts/houdini/plugins/publish/collect_frames.py @@ -10,8 +10,7 @@ class CollectFrames(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder label = "Collect Frames" - families = ["vdbcache", - "imagesequence"] + families = ["vdbcache", "imagesequence"] def process(self, instance): @@ -39,9 +38,9 @@ class CollectFrames(pyblish.api.InstancePlugin): # Check if frames are bigger than 1 (file collection) # override the result if end_frame - start_frame > 1: - result = self.create_file_list(match, - int(start_frame), - int(end_frame)) + result = self.create_file_list( + match, int(start_frame), int(end_frame) + ) # todo: `frames` currently conflicts with "explicit frames" for a # for a custom frame list. So this should be refactored. @@ -67,12 +66,12 @@ class CollectFrames(pyblish.api.InstancePlugin): # Get the parts of the filename surrounding the frame number # so we can put our own frame numbers in. span = match.span(1) - prefix = match.string[:span[0]] + prefix = match.string[: span[0]] suffix = match.string[span[1]:] # Generate filenames for all frames result = [] - for i in range(start_frame, end_frame+1): + for i in range(start_frame, end_frame + 1): # Format frame number by the padding amount str_frame = "{number:0{width}d}".format(number=i, width=padding) diff --git a/openpype/hosts/houdini/plugins/publish/collect_inputs.py b/openpype/hosts/houdini/plugins/publish/collect_inputs.py index 1fafba483e..39e2737e8c 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_inputs.py +++ b/openpype/hosts/houdini/plugins/publish/collect_inputs.py @@ -1,6 +1,3 @@ -import hou - -import avalon.io as io import avalon.api as api import pyblish.api @@ -30,7 +27,7 @@ def collect_input_containers(nodes): # and the contained children should be all we need. So we disregard # checking for .references() on the nodes. members = set(node.allSubChildren()) - members.add(node) # include the node itself + members.add(node) # include the node itself # If there's an intersection if not lookup.isdisjoint(members): @@ -51,8 +48,9 @@ def iter_upstream(node): """ - upstream = node.inputAncestors(include_ref_inputs=True, - follow_subnets=True) + upstream = node.inputAncestors( + include_ref_inputs=True, follow_subnets=True + ) # Initialize process queue with the node's ancestors itself queue = list(upstream) @@ -73,8 +71,9 @@ def iter_upstream(node): # Include the references' ancestors that have not been collected yet. for reference in references: - ancestors = reference.inputAncestors(include_ref_inputs=True, - follow_subnets=True) + ancestors = reference.inputAncestors( + include_ref_inputs=True, follow_subnets=True + ) ancestors = [n for n in ancestors if n not in collected] queue.extend(ancestors) @@ -103,8 +102,9 @@ class CollectUpstreamInputs(pyblish.api.InstancePlugin): if output is None: # If no valid output node is set then ignore it as validation # will be checking those cases. - self.log.debug("No output node found, skipping " - "collecting of inputs..") + self.log.debug( + "No output node found, skipping " "collecting of inputs.." + ) return # Collect all upstream parents diff --git a/openpype/hosts/houdini/plugins/publish/collect_instances.py b/openpype/hosts/houdini/plugins/publish/collect_instances.py index 6b00b7cb22..1b36526783 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_instances.py +++ b/openpype/hosts/houdini/plugins/publish/collect_instances.py @@ -62,7 +62,7 @@ class CollectInstances(pyblish.api.ContextPlugin): # Create nice name if the instance has a frame range. label = data.get("name", node.name()) - label += " (%s)" % data["asset"] # include asset in name + label += " (%s)" % data["asset"] # include asset in name if "frameStart" in data and "frameEnd" in data: frames = "[{frameStart} - {frameEnd}]".format(**data) diff --git a/openpype/hosts/houdini/plugins/publish/collect_instances_usd_layered.py b/openpype/hosts/houdini/plugins/publish/collect_instances_usd_layered.py index a3e9400970..7df5e8b6f2 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_instances_usd_layered.py +++ b/openpype/hosts/houdini/plugins/publish/collect_instances_usd_layered.py @@ -1,8 +1,5 @@ -import os - import hou import pyblish.api -from avalon import io from avalon.houdini import lib import openpype.hosts.houdini.api.usd as hou_usdlib import openpype.lib.usdlib as usdlib diff --git a/openpype/hosts/houdini/plugins/publish/collect_output_node.py b/openpype/hosts/houdini/plugins/publish/collect_output_node.py index e8aa701f26..938ee81cc3 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_output_node.py +++ b/openpype/hosts/houdini/plugins/publish/collect_output_node.py @@ -5,12 +5,14 @@ class CollectOutputSOPPath(pyblish.api.InstancePlugin): """Collect the out node's SOP/COP Path value.""" order = pyblish.api.CollectorOrder - families = ["pointcache", - "camera", - "vdbcache", - "imagesequence", - "usd", - "usdrender"] + families = [ + "pointcache", + "camera", + "vdbcache", + "imagesequence", + "usd", + "usdrender", + ] hosts = ["houdini"] label = "Collect Output Node Path" @@ -53,8 +55,9 @@ class CollectOutputSOPPath(pyblish.api.InstancePlugin): out_node = node.parm("loppath").evalAsNode() else: - raise ValueError("ROP node type '%s' is" - " not supported." % node_type) + raise ValueError( + "ROP node type '%s' is" " not supported." % node_type + ) if not out_node: self.log.warning("No output node collected.") diff --git a/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py b/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py index f19b1eec2c..72b554b567 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py +++ b/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py @@ -7,11 +7,11 @@ import pyblish.api def get_top_referenced_parm(parm): - processed = set() # disallow infinite loop + processed = set() # disallow infinite loop while True: if parm.path() in processed: raise RuntimeError("Parameter references result in cycle.") - + processed.add(parm.path()) ref = parm.getReferencedParm() @@ -27,7 +27,7 @@ def evalParmNoFrame(node, parm, pad_character="#"): parameter = node.parm(parm) assert parameter, "Parameter does not exist: %s.%s" % (node, parm) - + # If the parameter has a parameter reference, then get that # parameter instead as otherwise `unexpandedString()` fails. parameter = get_top_referenced_parm(parameter) @@ -38,7 +38,7 @@ def evalParmNoFrame(node, parm, pad_character="#"): except hou.Error as exc: print("Failed: %s" % parameter) raise RuntimeError(exc) - + def replace(match): padding = 1 n = match.group(2) @@ -70,31 +70,32 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): def process(self, instance): rop = instance[0] - + # Collect chunkSize chunk_size_parm = rop.parm("chunkSize") if chunk_size_parm: chunk_size = int(chunk_size_parm.eval()) instance.data["chunkSize"] = chunk_size self.log.debug("Chunk Size: %s" % chunk_size) - + default_prefix = evalParmNoFrame(rop, "RS_outputFileNamePrefix") beauty_suffix = rop.evalParm("RS_outputBeautyAOVSuffix") render_products = [] # Default beauty AOV - beauty_product = self.get_render_product_name(prefix=default_prefix, - suffix=beauty_suffix) + beauty_product = self.get_render_product_name( + prefix=default_prefix, suffix=beauty_suffix + ) render_products.append(beauty_product) num_aovs = rop.evalParm("RS_aov") for index in range(num_aovs): i = index + 1 - + # Skip disabled AOVs if not rop.evalParm("RS_aovEnable_%s" % i): continue - + aov_suffix = rop.evalParm("RS_aovSuffix_%s" % i) aov_prefix = evalParmNoFrame(rop, "RS_aovCustomPrefix_%s" % i) if not aov_prefix: @@ -122,10 +123,7 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): # there is no suffix for the current product, for example: # foo_%AOV% -> foo.exr pattern = "%AOV%" if suffix else "[._-]?%AOV%" - product_name = re.sub(pattern, - suffix, - prefix, - flags=re.IGNORECASE) + product_name = re.sub(pattern, suffix, prefix, flags=re.IGNORECASE) else: if suffix: # Add ".{suffix}" before the extension diff --git a/openpype/hosts/houdini/plugins/publish/collect_remote_publish.py b/openpype/hosts/houdini/plugins/publish/collect_remote_publish.py index 8f0210129f..3ae16efe56 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_remote_publish.py +++ b/openpype/hosts/houdini/plugins/publish/collect_remote_publish.py @@ -10,9 +10,9 @@ class CollectRemotePublishSettings(pyblish.api.ContextPlugin): order = pyblish.api.CollectorOrder families = ["*"] - hosts = ['houdini'] + hosts = ["houdini"] targets = ["deadline"] - label = 'Remote Publish Submission Settings' + label = "Remote Publish Submission Settings" actions = [openpype.api.RepairAction] def process(self, context): diff --git a/openpype/hosts/houdini/plugins/publish/collect_render_products.py b/openpype/hosts/houdini/plugins/publish/collect_render_products.py index 084c00cd70..e8a4a3dc3d 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_render_products.py +++ b/openpype/hosts/houdini/plugins/publish/collect_render_products.py @@ -28,7 +28,7 @@ def get_var_changed(variable=None): cmd = "varchange -V" if variable: cmd += " {0}".format(variable) - output, errors = hou.hscript(cmd) + output, _ = hou.hscript(cmd) changed = {} for line in output.split("Variable: "): @@ -44,7 +44,7 @@ def get_var_changed(variable=None): class CollectRenderProducts(pyblish.api.InstancePlugin): - """Collect USD Render Products""" + """Collect USD Render Products.""" label = "Collect Render Products" order = pyblish.api.CollectorOrder + 0.4 @@ -56,14 +56,17 @@ class CollectRenderProducts(pyblish.api.InstancePlugin): node = instance.data.get("output_node") if not node: rop_path = instance[0].path() - raise RuntimeError("No output node found. Make sure to connect an " - "input to the USD ROP: %s" % rop_path) + raise RuntimeError( + "No output node found. Make sure to connect an " + "input to the USD ROP: %s" % rop_path + ) # Workaround Houdini 18.0.391 bug where $HIPNAME doesn't automatically # update after scene save. if hou.applicationVersion() == (18, 0, 391): - self.log.debug("Checking for recook to workaround " - "$HIPNAME refresh bug...") + self.log.debug( + "Checking for recook to workaround " "$HIPNAME refresh bug..." + ) changed = get_var_changed("HIPNAME").get("HIPNAME") if changed: self.log.debug("Recooking for $HIPNAME refresh bug...") @@ -101,7 +104,7 @@ class CollectRenderProducts(pyblish.api.InstancePlugin): # TODO: Confirm this actually is allowed USD stages and HUSK # Substitute $F def replace(match): - """Replace $F4 with padded #""" + """Replace $F4 with padded #.""" padding = int(match.group(2)) if match.group(2) else 1 return "#" * padding @@ -118,8 +121,10 @@ class CollectRenderProducts(pyblish.api.InstancePlugin): filename = os.path.join(dirname, filename_base) filename = filename.replace("\\", "/") - assert "#" in filename, "Couldn't resolve render product name " \ - "with frame number: %s" % name + assert "#" in filename, ( + "Couldn't resolve render product name " + "with frame number: %s" % name + ) filenames.append(filename) diff --git a/openpype/hosts/houdini/plugins/publish/collect_usd_bootstrap.py b/openpype/hosts/houdini/plugins/publish/collect_usd_bootstrap.py index fbf1ef4cb1..991354fc5a 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_usd_bootstrap.py +++ b/openpype/hosts/houdini/plugins/publish/collect_usd_bootstrap.py @@ -25,8 +25,7 @@ class CollectUsdBootstrap(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.35 label = "Collect USD Bootstrap" hosts = ["houdini"] - families = ["colorbleed.usd", - "colorbleed.usd.layered"] + families = ["usd", "usd.layered"] def process(self, instance): @@ -35,7 +34,7 @@ class CollectUsdBootstrap(pyblish.api.InstancePlugin): instance_subset = instance.data["subset"] for name, layers in usdlib.PIPELINE.items(): if instance_subset in set(layers): - return name # e.g. "asset" + return name # e.g. "asset" break else: return @@ -54,15 +53,11 @@ class CollectUsdBootstrap(pyblish.api.InstancePlugin): self.log.debug("Add bootstrap for: %s" % bootstrap) - asset = io.find_one({"name": instance.data["asset"], - "type": "asset"}) + asset = io.find_one({"name": instance.data["asset"], "type": "asset"}) assert asset, "Asset must exist: %s" % asset # Check which are not about to be created and don't exist yet - required = { - "shot": ["usdShot"], - "asset": ["usdAsset"] - }.get(bootstrap) + required = {"shot": ["usdShot"], "asset": ["usdAsset"]}.get(bootstrap) require_all_layers = instance.data.get("requireAllLayers", False) if require_all_layers: @@ -78,18 +73,18 @@ class CollectUsdBootstrap(pyblish.api.InstancePlugin): if self._subset_exists(instance, subset, asset): continue - self.log.debug("Creating {0} USD bootstrap: {1} {2}".format( - bootstrap, - asset["name"], - subset - )) + self.log.debug( + "Creating {0} USD bootstrap: {1} {2}".format( + bootstrap, asset["name"], subset + ) + ) new = instance.context.create_instance(subset) new.data["subset"] = subset new.data["label"] = "{0} ({1})".format(subset, asset["name"]) - new.data["family"] = "colorbleed.usd.bootstrap" + new.data["family"] = "usd.bootstrap" new.data["comment"] = "Automated bootstrap USD file." - new.data["publishFamilies"] = ["colorbleed.usd"] + new.data["publishFamilies"] = ["usd"] # Do not allow the user to toggle this instance new.data["optional"] = False @@ -100,7 +95,6 @@ class CollectUsdBootstrap(pyblish.api.InstancePlugin): def _subset_exists(self, instance, subset, asset): """Return whether subset exists in current context or in database.""" - # Allow it to be created during this publish session context = instance.context for inst in context: @@ -112,6 +106,8 @@ class CollectUsdBootstrap(pyblish.api.InstancePlugin): # Or, if they already exist in the database we can # skip them too. - return bool(io.find_one({"name": subset, - "type": "subset", - "parent": asset["_id"]})) + return bool( + io.find_one( + {"name": subset, "type": "subset", "parent": asset["_id"]} + ) + ) diff --git a/openpype/hosts/houdini/plugins/publish/collect_usd_layers.py b/openpype/hosts/houdini/plugins/publish/collect_usd_layers.py index 2920b5366d..581f029ac2 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_usd_layers.py +++ b/openpype/hosts/houdini/plugins/publish/collect_usd_layers.py @@ -7,7 +7,6 @@ from avalon.houdini import lib import openpype.hosts.houdini.lib.usd as usdlib import hou -from pxr import Sdf class CollectUsdLayers(pyblish.api.InstancePlugin): diff --git a/openpype/hosts/houdini/plugins/publish/collect_workscene_fps.py b/openpype/hosts/houdini/plugins/publish/collect_workscene_fps.py index c145eea519..6f6cc978cd 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_workscene_fps.py +++ b/openpype/hosts/houdini/plugins/publish/collect_workscene_fps.py @@ -3,7 +3,7 @@ import hou class CollectWorksceneFPS(pyblish.api.ContextPlugin): - """Get the FPS of the work scene""" + """Get the FPS of the work scene.""" label = "Workscene FPS" order = pyblish.api.CollectorOrder diff --git a/openpype/hosts/houdini/plugins/publish/extract_usd.py b/openpype/hosts/houdini/plugins/publish/extract_usd.py index 0968ba87e9..ae1dfb3f8f 100644 --- a/openpype/hosts/houdini/plugins/publish/extract_usd.py +++ b/openpype/hosts/houdini/plugins/publish/extract_usd.py @@ -11,7 +11,7 @@ class ExtractUSD(openpype.api.Extractor): label = "Extract USD" hosts = ["houdini"] targets = ["local"] - families = ["colorbleed.usd", + families = ["usd", "usdModel", "usdSetDress"] diff --git a/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py b/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py index 329d26bf3b..06b48f3b43 100644 --- a/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py +++ b/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py @@ -12,7 +12,7 @@ from openpype.hosts.houdini.api.lib import render_rop class ExitStack(object): - """Context manager for dynamic management of a stack of exit callbacks + """Context manager for dynamic management of a stack of exit callbacks. For example: @@ -23,6 +23,7 @@ class ExitStack(object): # in the list raise an exception """ + def __init__(self): self._exit_callbacks = deque() @@ -35,8 +36,10 @@ class ExitStack(object): def _push_cm_exit(self, cm, cm_exit): """Helper to correctly register callbacks to __exit__ methods""" + def _exit_wrapper(*exc_details): return cm_exit(cm, *exc_details) + _exit_wrapper.__self__ = cm self.push(_exit_wrapper) @@ -58,20 +61,22 @@ class ExitStack(object): self._exit_callbacks.append(exit) else: self._push_cm_exit(exit, exit_method) - return exit # Allow use as a decorator + return exit # Allow use as a decorator def callback(self, callback, *args, **kwds): """Registers an arbitrary callback and arguments. Cannot suppress exceptions. """ + def _exit_wrapper(exc_type, exc, tb): callback(*args, **kwds) + # We changed the signature, so using @wraps is not appropriate, but # setting __wrapped__ may still help with introspection _exit_wrapper.__wrapped__ = callback self.push(_exit_wrapper) - return callback # Allow use as a decorator + return callback # Allow use as a decorator def enter_context(self, cm): """Enters the supplied context manager @@ -97,6 +102,7 @@ class ExitStack(object): # We manipulate the exception state so it behaves as though # we were actually nesting multiple with statements frame_exc = sys.exc_info()[1] + def _fix_exception_context(new_exc, old_exc): while 1: exc_context = new_exc.__context__ @@ -148,15 +154,11 @@ class ExtractUSDLayered(openpype.api.Extractor): label = "Extract Layered USD" hosts = ["houdini"] targets = ["local"] - families = ["colorbleed.usd.layered", - "usdShade"] + families = ["colorbleed.usd.layered", "usdShade"] # Force Output Processors so it will always save any file # into our unique staging directory with processed Avalon paths - output_processors = [ - "avalon_uri_processor", - "stagingdir_processor" - ] + output_processors = ["avalon_uri_processor", "stagingdir_processor"] def process(self, instance): @@ -168,8 +170,9 @@ class ExtractUSDLayered(openpype.api.Extractor): # The individual rop nodes are collected as "publishDependencies" dependencies = instance.data["publishDependencies"] ropnodes = [dependency[0] for dependency in dependencies] - assert all(node.type().name() in {"usd", "usd_rop"} - for node in ropnodes) + assert all( + node.type().name() in {"usd", "usd_rop"} for node in ropnodes + ) # Main ROP node, either a USD Rop or ROP network with multiple USD ROPs node = instance[0] @@ -177,9 +180,12 @@ class ExtractUSDLayered(openpype.api.Extractor): # Collect any output dependencies that have not been processed yet # during extraction of other instances outputs = [fname] - active_dependencies = [dep for dep in dependencies if - dep.data.get("publish", True) and - not dep.data.get("_isExtracted", False)] + active_dependencies = [ + dep + for dep in dependencies + if dep.data.get("publish", True) + and not dep.data.get("_isExtracted", False) + ] for dependency in active_dependencies: outputs.append(dependency.data["usdFilename"]) @@ -192,13 +198,11 @@ class ExtractUSDLayered(openpype.api.Extractor): # This sets staging directory on the processor to force our # output files to end up in the Staging Directory. "stagingdiroutputprocessor_stagingDir": staging_dir, - # Force the Avalon URI Output Processor to refactor paths for # references, payloads and layers to published paths. "avalonurioutputprocessor_use_publish_paths": True, - # Only write out specific USD files based on our outputs - "savepattern": save_pattern + "savepattern": save_pattern, } overrides = list() with ExitStack() as stack: @@ -207,7 +211,7 @@ class ExtractUSDLayered(openpype.api.Extractor): manager = hou_usdlib.outputprocessors( ropnode, processors=self.output_processors, - disable_all_others=True + disable_all_others=True, ) stack.enter_context(manager) @@ -216,8 +220,10 @@ class ExtractUSDLayered(openpype.api.Extractor): # exist when the Output Processor is added to the ROP node. for name, value in rop_overrides.items(): parm = ropnode.parm(name) - assert parm, "Parm not found: %s.%s" % (ropnode.path(), - name) + assert parm, "Parm not found: %s.%s" % ( + ropnode.path(), + name, + ) overrides.append((parm, value)) stack.enter_context(parm_values(overrides)) @@ -236,12 +242,13 @@ class ExtractUSDLayered(openpype.api.Extractor): dependency_fname = dependency.data["usdFilename"] filepath = os.path.join(staging_dir, dependency_fname) - similar = self._compare_with_latest_publish(dependency, - filepath) + similar = self._compare_with_latest_publish(dependency, filepath) if similar: # Deactivate this dependency - self.log.debug("Dependency matches previous publish version," - " deactivating %s for publish" % dependency) + self.log.debug( + "Dependency matches previous publish version," + " deactivating %s for publish" % dependency + ) dependency.data["publish"] = False else: self.log.debug("Extracted dependency: %s" % dependency) @@ -265,33 +272,35 @@ class ExtractUSDLayered(openpype.api.Extractor): # Compare this dependency with the latest published version # to detect whether we should make this into a new publish # version. If not, skip it. - asset = io.find_one({ - "name": dependency.data["asset"], - "type": "asset" - }) - subset = io.find_one({ - "name": dependency.data["subset"], - "type": "subset", - "parent": asset["_id"] - }) + asset = io.find_one( + {"name": dependency.data["asset"], "type": "asset"} + ) + subset = io.find_one( + { + "name": dependency.data["subset"], + "type": "subset", + "parent": asset["_id"], + } + ) if not subset: # Subset doesn't exist yet. Definitely new file self.log.debug("No existing subset..") return False - version = io.find_one({ - "type": "version", - "parent": subset["_id"], - }, sort=[("name", -1)]) + version = io.find_one( + {"type": "version", "parent": subset["_id"], }, sort=[("name", -1)] + ) if not version: self.log.debug("No existing version..") return False - representation = io.find_one({ - "name": ext.lstrip("."), - "type": "representation", - "parent": version["_id"] - }) + representation = io.find_one( + { + "name": ext.lstrip("."), + "type": "representation", + "parent": version["_id"], + } + ) if not representation: self.log.debug("No existing representation..") return False diff --git a/openpype/hosts/houdini/plugins/publish/extract_vdb_cache.py b/openpype/hosts/houdini/plugins/publish/extract_vdb_cache.py index d077635dfd..432faf68c3 100644 --- a/openpype/hosts/houdini/plugins/publish/extract_vdb_cache.py +++ b/openpype/hosts/houdini/plugins/publish/extract_vdb_cache.py @@ -36,9 +36,9 @@ class ExtractVDBCache(openpype.api.Extractor): instance.data["representations"] = [] representation = { - 'name': 'mov', - 'ext': 'mov', - 'files': output, + "name": "mov", + "ext": "mov", + "files": output, "stagingDir": staging_dir, } instance.data["representations"].append(representation) diff --git a/openpype/hosts/houdini/plugins/publish/increment_current_file.py b/openpype/hosts/houdini/plugins/publish/increment_current_file.py index 205599eaa3..31c2954ee7 100644 --- a/openpype/hosts/houdini/plugins/publish/increment_current_file.py +++ b/openpype/hosts/houdini/plugins/publish/increment_current_file.py @@ -15,8 +15,7 @@ class IncrementCurrentFile(pyblish.api.InstancePlugin): label = "Increment current file" order = pyblish.api.IntegratorOrder + 9.0 hosts = ["houdini"] - families = ["colorbleed.usdrender", - "redshift_rop"] + families = ["colorbleed.usdrender", "redshift_rop"] targets = ["local"] def process(self, instance): @@ -32,17 +31,21 @@ class IncrementCurrentFile(pyblish.api.InstancePlugin): context = instance.context errored_plugins = get_errored_plugins_from_data(context) - if any(plugin.__name__ == "HoudiniSubmitPublishDeadline" - for plugin in errored_plugins): - raise RuntimeError("Skipping incrementing current file because " - "submission to deadline failed.") + if any( + plugin.__name__ == "HoudiniSubmitPublishDeadline" + for plugin in errored_plugins + ): + raise RuntimeError( + "Skipping incrementing current file because " + "submission to deadline failed." + ) # Filename must not have changed since collecting host = avalon.api.registered_host() current_file = host.current_file() - assert context.data['currentFile'] == current_file, ( - "Collected filename from current scene name." - ) + assert ( + context.data["currentFile"] == current_file + ), "Collected filename from current scene name." new_filepath = version_up(current_file) host.save(new_filepath) diff --git a/openpype/hosts/houdini/plugins/publish/increment_current_file_deadline.py b/openpype/hosts/houdini/plugins/publish/increment_current_file_deadline.py index 06ec711b9e..faa015f739 100644 --- a/openpype/hosts/houdini/plugins/publish/increment_current_file_deadline.py +++ b/openpype/hosts/houdini/plugins/publish/increment_current_file_deadline.py @@ -1,6 +1,5 @@ import pyblish.api -import os import hou from openpype.api import version_up from openpype.action import get_errored_plugins_from_data @@ -21,14 +20,16 @@ class IncrementCurrentFileDeadline(pyblish.api.ContextPlugin): def process(self, context): errored_plugins = get_errored_plugins_from_data(context) - if any(plugin.__name__ == "HoudiniSubmitPublishDeadline" - for plugin in errored_plugins): - raise RuntimeError("Skipping incrementing current file because " - "submission to deadline failed.") + if any( + plugin.__name__ == "HoudiniSubmitPublishDeadline" + for plugin in errored_plugins + ): + raise RuntimeError( + "Skipping incrementing current file because " + "submission to deadline failed." + ) current_filepath = context.data["currentFile"] new_filepath = version_up(current_filepath) - hou.hipFile.save(file_name=new_filepath, - save_to_recent_files=True) - + hou.hipFile.save(file_name=new_filepath, save_to_recent_files=True) diff --git a/openpype/hosts/houdini/plugins/publish/save_scene.py b/openpype/hosts/houdini/plugins/publish/save_scene.py index ec97944bee..1b12efa603 100644 --- a/openpype/hosts/houdini/plugins/publish/save_scene.py +++ b/openpype/hosts/houdini/plugins/publish/save_scene.py @@ -8,7 +8,7 @@ class SaveCurrentScene(pyblish.api.InstancePlugin): label = "Save current file" order = pyblish.api.IntegratorOrder - 0.49 hosts = ["houdini"] - families = ["colorbleed.usdrender", + families = ["usdrender", "redshift_rop"] targets = ["local"] diff --git a/openpype/hosts/houdini/plugins/publish/save_scene_deadline.py b/openpype/hosts/houdini/plugins/publish/save_scene_deadline.py index 8a787025c4..a0efd0610c 100644 --- a/openpype/hosts/houdini/plugins/publish/save_scene_deadline.py +++ b/openpype/hosts/houdini/plugins/publish/save_scene_deadline.py @@ -12,9 +12,9 @@ class SaveCurrentSceneDeadline(pyblish.api.ContextPlugin): def process(self, context): import hou - assert context.data['currentFile'] == hou.hipFile.path(), ( - "Collected filename from current scene name." - ) + assert ( + context.data["currentFile"] == hou.hipFile.path() + ), "Collected filename from current scene name." if hou.hipFile.hasUnsavedChanges(): self.log.info("Saving current file..") diff --git a/openpype/hosts/houdini/plugins/publish/submit_houdini_render_deadline.py b/openpype/hosts/houdini/plugins/publish/submit_houdini_render_deadline.py index 34566f6c63..f471d788b6 100644 --- a/openpype/hosts/houdini/plugins/publish/submit_houdini_render_deadline.py +++ b/openpype/hosts/houdini/plugins/publish/submit_houdini_render_deadline.py @@ -11,7 +11,7 @@ import hou class HoudiniSubmitRenderDeadline(pyblish.api.InstancePlugin): - """Submit Solaris USD Render ROPs to Deadline + """Submit Solaris USD Render ROPs to Deadline. Renders are submitted to a Deadline Web Service as supplied via the environment variable AVALON_DEADLINE. @@ -26,7 +26,7 @@ class HoudiniSubmitRenderDeadline(pyblish.api.InstancePlugin): label = "Submit Render to Deadline" order = pyblish.api.IntegratorOrder hosts = ["houdini"] - families = ["colorbleed.usdrender", + families = ["usdrender", "redshift_rop"] targets = ["local"] @@ -50,9 +50,9 @@ class HoudiniSubmitRenderDeadline(pyblish.api.InstancePlugin): # StartFrame to EndFrame by byFrameStep frames = "{start}-{end}x{step}".format( - start=int(instance.data["startFrame"]), - end=int(instance.data["endFrame"]), - step=int(instance.data["byFrameStep"]), + start=int(instance.data["startFrame"]), + end=int(instance.data["endFrame"]), + step=int(instance.data["byFrameStep"]), ) # Documentation for keys available at: diff --git a/openpype/hosts/houdini/plugins/publish/submit_remote_publish.py b/openpype/hosts/houdini/plugins/publish/submit_remote_publish.py index b9278c1a90..77666921c8 100644 --- a/openpype/hosts/houdini/plugins/publish/submit_remote_publish.py +++ b/openpype/hosts/houdini/plugins/publish/submit_remote_publish.py @@ -31,12 +31,14 @@ class HoudiniSubmitPublishDeadline(pyblish.api.ContextPlugin): def process(self, context): # Ensure no errors so far - assert all(result["success"] for result in context.data["results"]), ( - "Errors found, aborting integration..") + assert all( + result["success"] for result in context.data["results"] + ), "Errors found, aborting integration.." # Deadline connection - AVALON_DEADLINE = api.Session.get("AVALON_DEADLINE", - "http://localhost:8082") + AVALON_DEADLINE = api.Session.get( + "AVALON_DEADLINE", "http://localhost:8082" + ) assert AVALON_DEADLINE, "Requires AVALON_DEADLINE" # Note that `publish` data member might change in the future. @@ -45,8 +47,9 @@ class HoudiniSubmitPublishDeadline(pyblish.api.ContextPlugin): instance_names = sorted(instance.name for instance in actives) if not instance_names: - self.log.warning("No active instances found. " - "Skipping submission..") + self.log.warning( + "No active instances found. " "Skipping submission.." + ) return scene = context.data["currentFile"] @@ -72,30 +75,24 @@ class HoudiniSubmitPublishDeadline(pyblish.api.ContextPlugin): "BatchName": batch_name, "Comment": context.data.get("comment", ""), "Priority": 50, - "Frames": "1-1", # Always trigger a single frame + "Frames": "1-1", # Always trigger a single frame "IsFrameDependent": False, "Name": job_name, "UserName": deadline_user, # "Comment": instance.context.data.get("comment", ""), # "InitialStatus": state - }, "PluginInfo": { - "Build": None, # Don't force build "IgnoreInputs": True, - # Inputs "SceneFile": scene, "OutputDriver": "/out/REMOTE_PUBLISH", - # Mandatory for Deadline "Version": version, - }, - # Mandatory for Deadline, may be empty - "AuxFiles": [] + "AuxFiles": [], } # Process submission per individual instance if the submission @@ -108,14 +105,14 @@ class HoudiniSubmitPublishDeadline(pyblish.api.ContextPlugin): for instance in instance_names: # Clarify job name per submission (include instance name) payload["JobInfo"]["Name"] = job_name + " - %s" % instance - self.submit_job(payload, - instances=[instance], - deadline=AVALON_DEADLINE) + self.submit_job( + payload, instances=[instance], deadline=AVALON_DEADLINE + ) else: # Submit a single job - self.submit_job(payload, - instances=instance_names, - deadline=AVALON_DEADLINE) + self.submit_job( + payload, instances=instance_names, deadline=AVALON_DEADLINE + ) def submit_job(self, payload, instances, deadline): @@ -130,16 +127,21 @@ class HoudiniSubmitPublishDeadline(pyblish.api.ContextPlugin): "AVALON_TOOLS", ] - environment = dict({key: os.environ[key] for key in keys - if key in os.environ}, **api.Session) + environment = dict( + {key: os.environ[key] for key in keys if key in os.environ}, + **api.Session + ) environment["PYBLISH_ACTIVE_INSTANCES"] = ",".join(instances) - payload["JobInfo"].update({ - "EnvironmentKeyValue%d" % index: "{key}={value}".format( - key=key, - value=environment[key] - ) for index, key in enumerate(environment) - }) + payload["JobInfo"].update( + { + "EnvironmentKeyValue%d" + % index: "{key}={value}".format( + key=key, value=environment[key] + ) + for index, key in enumerate(environment) + } + ) # Submit self.log.info("Submitting..") diff --git a/openpype/hosts/houdini/plugins/publish/valiate_vdb_input_node.py b/openpype/hosts/houdini/plugins/publish/valiate_vdb_input_node.py index 7b23d73ac7..0ae1bc94eb 100644 --- a/openpype/hosts/houdini/plugins/publish/valiate_vdb_input_node.py +++ b/openpype/hosts/houdini/plugins/publish/valiate_vdb_input_node.py @@ -3,7 +3,7 @@ import openpype.api class ValidateVDBInputNode(pyblish.api.InstancePlugin): - """Validate that the node connected to the output node is of type VDB + """Validate that the node connected to the output node is of type VDB. Regardless of the amount of VDBs create the output will need to have an equal amount of VDBs, points, primitives and vertices @@ -24,8 +24,9 @@ class ValidateVDBInputNode(pyblish.api.InstancePlugin): def process(self, instance): invalid = self.get_invalid(instance) if invalid: - raise RuntimeError("Node connected to the output node is not" - "of type VDB!") + raise RuntimeError( + "Node connected to the output node is not" "of type VDB!" + ) @classmethod def get_invalid(cls, instance): diff --git a/openpype/hosts/houdini/plugins/publish/validate_abc_primitive_to_detail.py b/openpype/hosts/houdini/plugins/publish/validate_abc_primitive_to_detail.py index 31eb3d1fb1..8fe1b44b7a 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_abc_primitive_to_detail.py +++ b/openpype/hosts/houdini/plugins/publish/validate_abc_primitive_to_detail.py @@ -16,15 +16,17 @@ class ValidateAbcPrimitiveToDetail(pyblish.api.InstancePlugin): """ order = openpype.api.ValidateContentsOrder + 0.1 - families = ["colorbleed.pointcache"] + families = ["pointcache"] hosts = ["houdini"] label = "Validate Primitive to Detail (Abc)" def process(self, instance): invalid = self.get_invalid(instance) if invalid: - raise RuntimeError("Primitives found with inconsistent primitive " - "to detail attributes. See log.") + raise RuntimeError( + "Primitives found with inconsistent primitive " + "to detail attributes. See log." + ) @classmethod def get_invalid(cls, instance): @@ -34,21 +36,27 @@ class ValidateAbcPrimitiveToDetail(pyblish.api.InstancePlugin): rop = instance[0] pattern = rop.parm("prim_to_detail_pattern").eval().strip() if not pattern: - cls.log.debug("Alembic ROP has no 'Primitive to Detail' pattern. " - "Validation is ignored..") + cls.log.debug( + "Alembic ROP has no 'Primitive to Detail' pattern. " + "Validation is ignored.." + ) return build_from_path = rop.parm("build_from_path").eval() if not build_from_path: - cls.log.debug("Alembic ROP has 'Build from Path' disabled. " - "Validation is ignored..") + cls.log.debug( + "Alembic ROP has 'Build from Path' disabled. " + "Validation is ignored.." + ) return path_attr = rop.parm("path_attrib").eval() if not path_attr: - cls.log.error("The Alembic ROP node has no Path Attribute" - "value set, but 'Build Hierarchy from Attribute'" - "is enabled.") + cls.log.error( + "The Alembic ROP node has no Path Attribute" + "value set, but 'Build Hierarchy from Attribute'" + "is enabled." + ) return [rop.path()] # Let's assume each attribute is explicitly named for now and has no @@ -59,26 +67,32 @@ class ValidateAbcPrimitiveToDetail(pyblish.api.InstancePlugin): # Check if the primitive attribute exists frame = instance.data.get("startFrame", 0) geo = output.geometryAtFrame(frame) - + # If there are no primitives on the start frame then it might be # something that is emitted over time. As such we can't actually # validate whether the attributes exist, because they won't exist # yet. In that case, just warn the user and allow it. if len(geo.iterPrims()) == 0: - cls.log.warning("No primitives found on current frame. Validation" - " for Primitive to Detail will be skipped.") + cls.log.warning( + "No primitives found on current frame. Validation" + " for Primitive to Detail will be skipped." + ) return - + attrib = geo.findPrimAttrib(path_attr) if not attrib: - cls.log.info("Geometry Primitives are missing " - "path attribute: `%s`" % path_attr) + cls.log.info( + "Geometry Primitives are missing " + "path attribute: `%s`" % path_attr + ) return [output.path()] # Ensure at least a single string value is present if not attrib.strings(): - cls.log.info("Primitive path attribute has no " - "string values: %s" % path_attr) + cls.log.info( + "Primitive path attribute has no " + "string values: %s" % path_attr + ) return [output.path()] paths = None @@ -111,6 +125,8 @@ class ValidateAbcPrimitiveToDetail(pyblish.api.InstancePlugin): # Primitive to Detail attribute then we consider it # inconsistent and invalidate the ROP node's content. if len(values) > 1: - cls.log.warning("Path has multiple values: %s (path: %s)" - % (list(values), path)) + cls.log.warning( + "Path has multiple values: %s (path: %s)" + % (list(values), path) + ) return [output.path()] diff --git a/openpype/hosts/houdini/plugins/publish/validate_alembic_face_sets.py b/openpype/hosts/houdini/plugins/publish/validate_alembic_face_sets.py index da79569edd..e9126ffef0 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_alembic_face_sets.py +++ b/openpype/hosts/houdini/plugins/publish/validate_alembic_face_sets.py @@ -4,21 +4,21 @@ import openpype.api class ValidateAlembicROPFaceSets(pyblish.api.InstancePlugin): """Validate Face Sets are disabled for extraction to pointcache. - + When groups are saved as Face Sets with the Alembic these show up as shadingEngine connections in Maya - however, with animated groups these connections in Maya won't work as expected, it won't update per - frame. Additionally, it can break shader assignments in some cases + frame. Additionally, it can break shader assignments in some cases where it requires to first break this connection to allow a shader to be assigned. - + It is allowed to include Face Sets, so only an issue is logged to identify that it could introduce issues down the pipeline. """ order = openpype.api.ValidateContentsOrder + 0.1 - families = ["colorbleed.pointcache"] + families = ["pointcache"] hosts = ["houdini"] label = "Validate Alembic ROP Face Sets" @@ -26,10 +26,12 @@ class ValidateAlembicROPFaceSets(pyblish.api.InstancePlugin): rop = instance[0] facesets = rop.parm("facesets").eval() - + # 0 = No Face Sets # 1 = Save Non-Empty Groups as Face Sets # 2 = Save All Groups As Face Sets - if facesets != 0: - self.log.warning("Alembic ROP saves 'Face Sets' for Geometry. " - "Are you sure you want this?") + if facesets != 0: + self.log.warning( + "Alembic ROP saves 'Face Sets' for Geometry. " + "Are you sure you want this?" + ) diff --git a/openpype/hosts/houdini/plugins/publish/validate_alembic_input_node.py b/openpype/hosts/houdini/plugins/publish/validate_alembic_input_node.py index 3595918765..17c9da837a 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_alembic_input_node.py +++ b/openpype/hosts/houdini/plugins/publish/validate_alembic_input_node.py @@ -3,7 +3,7 @@ import colorbleed.api class ValidateAlembicInputNode(pyblish.api.InstancePlugin): - """Validate that the node connected to the output is correct + """Validate that the node connected to the output is correct. The connected node cannot be of the following types for Alembic: - VDB @@ -12,22 +12,24 @@ class ValidateAlembicInputNode(pyblish.api.InstancePlugin): """ order = colorbleed.api.ValidateContentsOrder + 0.1 - families = ["colorbleed.pointcache"] + families = ["pointcache"] hosts = ["houdini"] label = "Validate Input Node (Abc)" def process(self, instance): invalid = self.get_invalid(instance) if invalid: - raise RuntimeError("Primitive types found that are not supported" - "for Alembic output.") + raise RuntimeError( + "Primitive types found that are not supported" + "for Alembic output." + ) @classmethod def get_invalid(cls, instance): invalid_prim_types = ["VDB", "Volume"] node = instance.data["output_node"] - + if not hasattr(node, "geometry"): # In the case someone has explicitly set an Object # node instead of a SOP node in Geometry context @@ -35,15 +37,16 @@ class ValidateAlembicInputNode(pyblish.api.InstancePlugin): # export object transforms. cls.log.warning("No geometry output node found, skipping check..") return - + frame = instance.data.get("startFrame", 0) geo = node.geometryAtFrame(frame) - + invalid = False for prim_type in invalid_prim_types: if geo.countPrimType(prim_type) > 0: - cls.log.error("Found a primitive which is of type '%s' !" - % prim_type) + cls.log.error( + "Found a primitive which is of type '%s' !" % prim_type + ) invalid = True if invalid: diff --git a/openpype/hosts/houdini/plugins/publish/validate_animation_settings.py b/openpype/hosts/houdini/plugins/publish/validate_animation_settings.py index a42c3696da..5eb8f93d03 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_animation_settings.py +++ b/openpype/hosts/houdini/plugins/publish/validate_animation_settings.py @@ -29,8 +29,9 @@ class ValidateAnimationSettings(pyblish.api.InstancePlugin): invalid = self.get_invalid(instance) if invalid: - raise RuntimeError("Output settings do no match for '%s'" % - instance) + raise RuntimeError( + "Output settings do no match for '%s'" % instance + ) @classmethod def get_invalid(cls, instance): diff --git a/openpype/hosts/houdini/plugins/publish/validate_bypass.py b/openpype/hosts/houdini/plugins/publish/validate_bypass.py index c04734c684..79c67c3008 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_bypass.py +++ b/openpype/hosts/houdini/plugins/publish/validate_bypass.py @@ -1,5 +1,5 @@ import pyblish.api -import colorbleed.api +import openpype.api class ValidateBypassed(pyblish.api.InstancePlugin): @@ -11,7 +11,7 @@ class ValidateBypassed(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder - 0.1 + order = openpype.api.ValidateContentsOrder - 0.1 families = ["*"] hosts = ["houdini"] label = "Validate ROP Bypass" @@ -27,8 +27,8 @@ class ValidateBypassed(pyblish.api.InstancePlugin): if invalid: rop = invalid[0] raise RuntimeError( - "ROP node %s is set to bypass, publishing cannot continue.." % - rop.path() + "ROP node %s is set to bypass, publishing cannot continue.." + % rop.path() ) @classmethod diff --git a/openpype/hosts/houdini/plugins/publish/validate_camera_rop.py b/openpype/hosts/houdini/plugins/publish/validate_camera_rop.py index f509c51bc6..a0919e1323 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_camera_rop.py +++ b/openpype/hosts/houdini/plugins/publish/validate_camera_rop.py @@ -6,9 +6,9 @@ class ValidateCameraROP(pyblish.api.InstancePlugin): """Validate Camera ROP settings.""" order = openpype.api.ValidateContentsOrder - families = ['colorbleed.camera'] - hosts = ['houdini'] - label = 'Camera ROP' + families = ["camera"] + hosts = ["houdini"] + label = "Camera ROP" def process(self, instance): @@ -16,8 +16,10 @@ class ValidateCameraROP(pyblish.api.InstancePlugin): node = instance[0] if node.parm("use_sop_path").eval(): - raise RuntimeError("Alembic ROP for Camera export should not be " - "set to 'Use Sop Path'. Please disable.") + raise RuntimeError( + "Alembic ROP for Camera export should not be " + "set to 'Use Sop Path'. Please disable." + ) # Get the root and objects parameter of the Alembic ROP node root = node.parm("root").eval() @@ -35,7 +37,7 @@ class ValidateCameraROP(pyblish.api.InstancePlugin): raise ValueError("Camera path does not exist: %s" % path) if camera.type().name() != "cam": - raise ValueError("Object set in Alembic ROP is not a camera: " - "%s (type: %s)" % (camera, camera.type().name())) - - + raise ValueError( + "Object set in Alembic ROP is not a camera: " + "%s (type: %s)" % (camera, camera.type().name()) + ) diff --git a/openpype/hosts/houdini/plugins/publish/validate_cop_output_node.py b/openpype/hosts/houdini/plugins/publish/validate_cop_output_node.py index 51c5d07b0f..543539ffe3 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_cop_output_node.py +++ b/openpype/hosts/houdini/plugins/publish/validate_cop_output_node.py @@ -12,7 +12,7 @@ class ValidateCopOutputNode(pyblish.api.InstancePlugin): """ order = pyblish.api.ValidatorOrder - families = ["colorbleed.imagesequence"] + families = ["imagesequence"] hosts = ["houdini"] label = "Validate COP Output Node" @@ -20,8 +20,10 @@ class ValidateCopOutputNode(pyblish.api.InstancePlugin): invalid = self.get_invalid(instance) if invalid: - raise RuntimeError("Output node(s) `%s` are incorrect. " - "See plug-in log for details." % invalid) + raise RuntimeError( + "Output node(s) `%s` are incorrect. " + "See plug-in log for details." % invalid + ) @classmethod def get_invalid(cls, instance): @@ -32,27 +34,27 @@ class ValidateCopOutputNode(pyblish.api.InstancePlugin): if output_node is None: node = instance[0] - cls.log.error("COP Output node in '%s' does not exist. " - "Ensure a valid COP output path is set." - % node.path()) + cls.log.error( + "COP Output node in '%s' does not exist. " + "Ensure a valid COP output path is set." % node.path() + ) return [node.path()] # Output node must be a Sop node. if not isinstance(output_node, hou.CopNode): - cls.log.error("Output node %s is not a COP node. " - "COP Path must point to a COP node, " - "instead found category type: %s" % ( - output_node.path(), - output_node.type().category().name() - ) - ) + cls.log.error( + "Output node %s is not a COP node. " + "COP Path must point to a COP node, " + "instead found category type: %s" + % (output_node.path(), output_node.type().category().name()) + ) return [output_node.path()] - + # For the sake of completeness also assert the category type # is Cop2 to avoid potential edge case scenarios even though # the isinstance check above should be stricter than this category assert output_node.type().category().name() == "Cop2", ( - "Output node %s is not of category Cop2. This is a bug.." % - output_node.path() + "Output node %s is not of category Cop2. This is a bug.." + % output_node.path() ) diff --git a/openpype/hosts/houdini/plugins/publish/validate_file_extension.py b/openpype/hosts/houdini/plugins/publish/validate_file_extension.py index 5823c3eddc..c299a47e74 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_file_extension.py +++ b/openpype/hosts/houdini/plugins/publish/validate_file_extension.py @@ -15,24 +15,23 @@ class ValidateFileExtension(pyblish.api.InstancePlugin): """ order = pyblish.api.ValidatorOrder - families = ["pointcache", - "camera", - "vdbcache"] + families = ["pointcache", "camera", "vdbcache"] hosts = ["houdini"] label = "Output File Extension" family_extensions = { "pointcache": ".abc", "camera": ".abc", - "vdbcache": ".vdb" + "vdbcache": ".vdb", } def process(self, instance): invalid = self.get_invalid(instance) if invalid: - raise RuntimeError("ROP node has incorrect " - "file extension: %s" % invalid) + raise RuntimeError( + "ROP node has incorrect " "file extension: %s" % invalid + ) @classmethod def get_invalid(cls, instance): diff --git a/openpype/hosts/houdini/plugins/publish/validate_frame_token.py b/openpype/hosts/houdini/plugins/publish/validate_frame_token.py index f55f05032d..76b5910576 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_frame_token.py +++ b/openpype/hosts/houdini/plugins/publish/validate_frame_token.py @@ -4,7 +4,7 @@ from openpype.hosts.houdini.api import lib class ValidateFrameToken(pyblish.api.InstancePlugin): - """Validate if the unexpanded string contains the frame ('$F') token + """Validate if the unexpanded string contains the frame ('$F') token. This validator will *only* check the output parameter of the node if the Valid Frame Range is not set to 'Render Current Frame' @@ -29,8 +29,9 @@ class ValidateFrameToken(pyblish.api.InstancePlugin): invalid = self.get_invalid(instance) if invalid: - raise RuntimeError("Output settings do no match for '%s'" % - instance) + raise RuntimeError( + "Output settings do no match for '%s'" % instance + ) @classmethod def get_invalid(cls, instance): diff --git a/openpype/hosts/houdini/plugins/publish/validate_houdini_license_category.py b/openpype/hosts/houdini/plugins/publish/validate_houdini_license_category.py index e18404b7ad..f5f03aa844 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_houdini_license_category.py +++ b/openpype/hosts/houdini/plugins/publish/validate_houdini_license_category.py @@ -24,5 +24,7 @@ class ValidateHoudiniCommercialLicense(pyblish.api.InstancePlugin): license = hou.licenseCategory() if license != hou.licenseCategoryType.Commercial: - raise RuntimeError("USD Publishing requires a full Commercial " - "license. You are on: %s" % license) + raise RuntimeError( + "USD Publishing requires a full Commercial " + "license. You are on: %s" % license + ) diff --git a/openpype/hosts/houdini/plugins/publish/validate_mkpaths_toggled.py b/openpype/hosts/houdini/plugins/publish/validate_mkpaths_toggled.py index 826dedf933..cd72877949 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_mkpaths_toggled.py +++ b/openpype/hosts/houdini/plugins/publish/validate_mkpaths_toggled.py @@ -1,23 +1,23 @@ import pyblish.api -import colorbleed.api +import openpype.api class ValidateIntermediateDirectoriesChecked(pyblish.api.InstancePlugin): """Validate Create Intermediate Directories is enabled on ROP node.""" - order = colorbleed.api.ValidateContentsOrder - families = ['colorbleed.pointcache', - 'colorbleed.camera', - 'colorbleed.vdbcache'] - hosts = ['houdini'] - label = 'Create Intermediate Directories Checked' + order = openpype.api.ValidateContentsOrder + families = ["pointcache", "camera", "vdbcache"] + hosts = ["houdini"] + label = "Create Intermediate Directories Checked" def process(self, instance): invalid = self.get_invalid(instance) if invalid: - raise RuntimeError("Found ROP node with Create Intermediate " - "Directories turned off: %s" % invalid) + raise RuntimeError( + "Found ROP node with Create Intermediate " + "Directories turned off: %s" % invalid + ) @classmethod def get_invalid(cls, instance): @@ -30,5 +30,3 @@ class ValidateIntermediateDirectoriesChecked(pyblish.api.InstancePlugin): result.append(node.path()) return result - - diff --git a/openpype/hosts/houdini/plugins/publish/validate_no_errors.py b/openpype/hosts/houdini/plugins/publish/validate_no_errors.py index 1a7cf9d599..f58e5f8d7d 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_no_errors.py +++ b/openpype/hosts/houdini/plugins/publish/validate_no_errors.py @@ -10,7 +10,7 @@ def cook_in_range(node, start, end): node.cook(force=False) else: node.cook(force=False, frame_range=(start, start)) - + def get_errors(node): """Get cooking errors. @@ -29,8 +29,8 @@ class ValidateNoErrors(pyblish.api.InstancePlugin): """Validate the Instance has no current cooking errors.""" order = openpype.api.ValidateContentsOrder - hosts = ['houdini'] - label = 'Validate no errors' + hosts = ["houdini"] + label = "Validate no errors" def process(self, instance): @@ -45,20 +45,21 @@ class ValidateNoErrors(pyblish.api.InstancePlugin): for node in validate_nodes: self.log.debug("Validating for errors: %s" % node.path()) errors = get_errors(node) - + if errors: # If there are current errors, then try an unforced cook # to see whether the error will disappear. - self.log.debug("Recooking to revalidate error " - "is up to date for: %s" % node.path()) + self.log.debug( + "Recooking to revalidate error " + "is up to date for: %s" % node.path() + ) current_frame = hou.intFrame() - start = instance.data.get("startFrame", current_frame) - end = instance.data.get("endFrame", current_frame) + start = instance.data.get("frameStart", current_frame) + end = instance.data.get("frameEnd", current_frame) cook_in_range(node, start=start, end=end) - + # Check for errors again after the forced recook errors = get_errors(node) if errors: self.log.error(errors) raise RuntimeError("Node has errors: %s" % node.path()) - diff --git a/openpype/hosts/houdini/plugins/publish/validate_outnode_exists.py b/openpype/hosts/houdini/plugins/publish/validate_outnode_exists.py index bfa2d38f1a..aedc68d5df 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_outnode_exists.py +++ b/openpype/hosts/houdini/plugins/publish/validate_outnode_exists.py @@ -3,7 +3,7 @@ import openpype.api class ValidatOutputNodeExists(pyblish.api.InstancePlugin): - """Validate if node attribute Create intermediate Directories is turned on + """Validate if node attribute Create intermediate Directories is turned on. Rules: * The node must have Create intermediate Directories turned on to @@ -13,7 +13,7 @@ class ValidatOutputNodeExists(pyblish.api.InstancePlugin): order = openpype.api.ValidateContentsOrder families = ["*"] - hosts = ['houdini'] + hosts = ["houdini"] label = "Output Node Exists" def process(self, instance): diff --git a/openpype/hosts/houdini/plugins/publish/validate_output_node.py b/openpype/hosts/houdini/plugins/publish/validate_output_node.py index 5e20ee40d6..0b60ab5c48 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_output_node.py +++ b/openpype/hosts/houdini/plugins/publish/validate_output_node.py @@ -14,8 +14,7 @@ class ValidateOutputNode(pyblish.api.InstancePlugin): """ order = pyblish.api.ValidatorOrder - families = ["pointcache", - "vdbcache"] + families = ["pointcache", "vdbcache"] hosts = ["houdini"] label = "Validate Output Node" @@ -23,8 +22,10 @@ class ValidateOutputNode(pyblish.api.InstancePlugin): invalid = self.get_invalid(instance) if invalid: - raise RuntimeError("Output node(s) `%s` are incorrect. " - "See plug-in log for details." % invalid) + raise RuntimeError( + "Output node(s) `%s` are incorrect. " + "See plug-in log for details." % invalid + ) @classmethod def get_invalid(cls, instance): @@ -35,39 +36,42 @@ class ValidateOutputNode(pyblish.api.InstancePlugin): if output_node is None: node = instance[0] - cls.log.error("SOP Output node in '%s' does not exist. " - "Ensure a valid SOP output path is set." - % node.path()) + cls.log.error( + "SOP Output node in '%s' does not exist. " + "Ensure a valid SOP output path is set." % node.path() + ) return [node.path()] # Output node must be a Sop node. if not isinstance(output_node, hou.SopNode): - cls.log.error("Output node %s is not a SOP node. " - "SOP Path must point to a SOP node, " - "instead found category type: %s" % ( - output_node.path(), - output_node.type().category().name() - ) - ) + cls.log.error( + "Output node %s is not a SOP node. " + "SOP Path must point to a SOP node, " + "instead found category type: %s" + % (output_node.path(), output_node.type().category().name()) + ) return [output_node.path()] # For the sake of completeness also assert the category type # is Sop to avoid potential edge case scenarios even though # the isinstance check above should be stricter than this category assert output_node.type().category().name() == "Sop", ( - "Output node %s is not of category Sop. This is a bug.." % - output_node.path() + "Output node %s is not of category Sop. This is a bug.." + % output_node.path() ) # Check if output node has incoming connections if not output_node.inputConnections(): - cls.log.error("Output node `%s` has no incoming connections" - % output_node.path()) + cls.log.error( + "Output node `%s` has no incoming connections" + % output_node.path() + ) return [output_node.path()] # Ensure the output node has at least Geometry data if not output_node.geometry(): - cls.log.error("Output node `%s` has no geometry data." - % output_node.path()) + cls.log.error( + "Output node `%s` has no geometry data." % output_node.path() + ) return [output_node.path()] diff --git a/openpype/hosts/houdini/plugins/publish/validate_primitive_hierarchy_paths.py b/openpype/hosts/houdini/plugins/publish/validate_primitive_hierarchy_paths.py index 785dd1db78..3c15532be8 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_primitive_hierarchy_paths.py +++ b/openpype/hosts/houdini/plugins/publish/validate_primitive_hierarchy_paths.py @@ -19,8 +19,9 @@ class ValidatePrimitiveHierarchyPaths(pyblish.api.InstancePlugin): def process(self, instance): invalid = self.get_invalid(instance) if invalid: - raise RuntimeError("See log for details. " - "Invalid nodes: {0}".format(invalid)) + raise RuntimeError( + "See log for details. " "Invalid nodes: {0}".format(invalid) + ) @classmethod def get_invalid(cls, instance): @@ -32,15 +33,19 @@ class ValidatePrimitiveHierarchyPaths(pyblish.api.InstancePlugin): rop = instance[0] build_from_path = rop.parm("build_from_path").eval() if not build_from_path: - cls.log.debug("Alembic ROP has 'Build from Path' disabled. " - "Validation is ignored..") + cls.log.debug( + "Alembic ROP has 'Build from Path' disabled. " + "Validation is ignored.." + ) return path_attr = rop.parm("path_attrib").eval() if not path_attr: - cls.log.error("The Alembic ROP node has no Path Attribute" - "value set, but 'Build Hierarchy from Attribute'" - "is enabled.") + cls.log.error( + "The Alembic ROP node has no Path Attribute" + "value set, but 'Build Hierarchy from Attribute'" + "is enabled." + ) return [rop.path()] cls.log.debug("Checking for attribute: %s" % path_attr) @@ -54,22 +59,28 @@ class ValidatePrimitiveHierarchyPaths(pyblish.api.InstancePlugin): # warning that the check can't be done consistently and skip # validation. if len(geo.iterPrims()) == 0: - cls.log.warning("No primitives found on current frame. Validation" - " for primitive hierarchy paths will be skipped," - " thus can't be validated.") + cls.log.warning( + "No primitives found on current frame. Validation" + " for primitive hierarchy paths will be skipped," + " thus can't be validated." + ) return # Check if there are any values for the primitives attrib = geo.findPrimAttrib(path_attr) if not attrib: - cls.log.info("Geometry Primitives are missing " - "path attribute: `%s`" % path_attr) + cls.log.info( + "Geometry Primitives are missing " + "path attribute: `%s`" % path_attr + ) return [output.path()] # Ensure at least a single string value is present if not attrib.strings(): - cls.log.info("Primitive path attribute has no " - "string values: %s" % path_attr) + cls.log.info( + "Primitive path attribute has no " + "string values: %s" % path_attr + ) return [output.path()] paths = geo.primStringAttribValues(path_attr) @@ -78,8 +89,8 @@ class ValidatePrimitiveHierarchyPaths(pyblish.api.InstancePlugin): invalid_prims = [i for i, path in enumerate(paths) if not path] if invalid_prims: num_prims = len(geo.iterPrims()) # faster than len(geo.prims()) - cls.log.info("Prims have no value for attribute `%s` " - "(%s of %s prims)" % (path_attr, - len(invalid_prims), - num_prims)) + cls.log.info( + "Prims have no value for attribute `%s` " + "(%s of %s prims)" % (path_attr, len(invalid_prims), num_prims) + ) return [output.path()] diff --git a/openpype/hosts/houdini/plugins/publish/validate_remote_publish.py b/openpype/hosts/houdini/plugins/publish/validate_remote_publish.py index 931acdcc2f..95c66edff0 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_remote_publish.py +++ b/openpype/hosts/houdini/plugins/publish/validate_remote_publish.py @@ -11,9 +11,9 @@ class ValidateRemotePublishOutNode(pyblish.api.ContextPlugin): order = pyblish.api.ValidatorOrder - 0.4 families = ["*"] - hosts = ['houdini'] + hosts = ["houdini"] targets = ["deadline"] - label = 'Remote Publish ROP node' + label = "Remote Publish ROP node" actions = [openpype.api.RepairContextAction] def process(self, context): @@ -30,14 +30,14 @@ class ValidateRemotePublishOutNode(pyblish.api.ContextPlugin): assert node.type().name() == "shell", "Must be shell ROP node" assert node.parm("command").eval() == "", "Must have no command" assert not node.parm("shellexec").eval(), "Must not execute in shell" - assert node.parm("prerender").eval() == cmd, ( - "REMOTE_PUBLISH node does not have correct prerender script." - ) - assert node.parm("lprerender").eval() == "python", ( - "REMOTE_PUBLISH node prerender script type not set to 'python'" - ) + assert ( + node.parm("prerender").eval() == cmd + ), "REMOTE_PUBLISH node does not have correct prerender script." + assert ( + node.parm("lprerender").eval() == "python" + ), "REMOTE_PUBLISH node prerender script type not set to 'python'" @classmethod def repair(cls, context): - """(Re)create the node if it fails to pass validation""" + """(Re)create the node if it fails to pass validation.""" lib.create_remote_publish_node(force=True) diff --git a/openpype/hosts/houdini/plugins/publish/validate_remote_publish_enabled.py b/openpype/hosts/houdini/plugins/publish/validate_remote_publish_enabled.py index 9f486842ae..b681fd0ee1 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_remote_publish_enabled.py +++ b/openpype/hosts/houdini/plugins/publish/validate_remote_publish_enabled.py @@ -9,9 +9,9 @@ class ValidateRemotePublishEnabled(pyblish.api.ContextPlugin): order = pyblish.api.ValidatorOrder - 0.39 families = ["*"] - hosts = ['houdini'] + hosts = ["houdini"] targets = ["deadline"] - label = 'Remote Publish ROP enabled' + label = "Remote Publish ROP enabled" actions = [openpype.api.RepairContextAction] def process(self, context): @@ -25,7 +25,7 @@ class ValidateRemotePublishEnabled(pyblish.api.ContextPlugin): @classmethod def repair(cls, context): - """(Re)create the node if it fails to pass validation""" + """(Re)create the node if it fails to pass validation.""" node = hou.node("/out/REMOTE_PUBLISH") if not node: diff --git a/openpype/hosts/houdini/plugins/publish/validate_sop_output_node.py b/openpype/hosts/houdini/plugins/publish/validate_sop_output_node.py index 7ba9ddd534..a5a07b1b1a 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_sop_output_node.py +++ b/openpype/hosts/houdini/plugins/publish/validate_sop_output_node.py @@ -14,8 +14,7 @@ class ValidateSopOutputNode(pyblish.api.InstancePlugin): """ order = pyblish.api.ValidatorOrder - families = ["pointcache", - "vdbcache"] + families = ["pointcache", "vdbcache"] hosts = ["houdini"] label = "Validate Output Node" @@ -23,8 +22,10 @@ class ValidateSopOutputNode(pyblish.api.InstancePlugin): invalid = self.get_invalid(instance) if invalid: - raise RuntimeError("Output node(s) `%s` are incorrect. " - "See plug-in log for details." % invalid) + raise RuntimeError( + "Output node(s) `%s` are incorrect. " + "See plug-in log for details." % invalid + ) @classmethod def get_invalid(cls, instance): @@ -35,29 +36,29 @@ class ValidateSopOutputNode(pyblish.api.InstancePlugin): if output_node is None: node = instance[0] - cls.log.error("SOP Output node in '%s' does not exist. " - "Ensure a valid SOP output path is set." - % node.path()) + cls.log.error( + "SOP Output node in '%s' does not exist. " + "Ensure a valid SOP output path is set." % node.path() + ) return [node.path()] # Output node must be a Sop node. if not isinstance(output_node, hou.SopNode): - cls.log.error("Output node %s is not a SOP node. " - "SOP Path must point to a SOP node, " - "instead found category type: %s" % ( - output_node.path(), - output_node.type().category().name() - ) - ) + cls.log.error( + "Output node %s is not a SOP node. " + "SOP Path must point to a SOP node, " + "instead found category type: %s" + % (output_node.path(), output_node.type().category().name()) + ) return [output_node.path()] # For the sake of completeness also assert the category type # is Sop to avoid potential edge case scenarios even though # the isinstance check above should be stricter than this category assert output_node.type().category().name() == "Sop", ( - "Output node %s is not of category Sop. This is a bug.." % - output_node.path() + "Output node %s is not of category Sop. This is a bug.." + % output_node.path() ) # Ensure the node is cooked and succeeds to cook so we can correctly @@ -73,6 +74,7 @@ class ValidateSopOutputNode(pyblish.api.InstancePlugin): # Ensure the output node has at least Geometry data if not output_node.geometry(): - cls.log.error("Output node `%s` has no geometry data." - % output_node.path()) + cls.log.error( + "Output node `%s` has no geometry data." % output_node.path() + ) return [output_node.path()] diff --git a/openpype/hosts/houdini/plugins/publish/validate_usd_layer_path_backslashes.py b/openpype/hosts/houdini/plugins/publish/validate_usd_layer_path_backslashes.py index a21e5c267f..ac0181aed2 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_usd_layer_path_backslashes.py +++ b/openpype/hosts/houdini/plugins/publish/validate_usd_layer_path_backslashes.py @@ -17,10 +17,7 @@ class ValidateUSDLayerPathBackslashes(pyblish.api.InstancePlugin): """ order = pyblish.api.ValidatorOrder - families = ["usdSetDress", - "usdShade", - "usd", - "usdrender"] + families = ["usdSetDress", "usdShade", "usd", "usdrender"] hosts = ["houdini"] label = "USD Layer path backslashes" optional = True @@ -47,5 +44,7 @@ class ValidateUSDLayerPathBackslashes(pyblish.api.InstancePlugin): invalid.append(layer) if invalid: - raise RuntimeError("Loaded layers have backslashes. " - "This is invalid for HUSK USD rendering.") + raise RuntimeError( + "Loaded layers have backslashes. " + "This is invalid for HUSK USD rendering." + ) diff --git a/openpype/hosts/houdini/plugins/publish/validate_usd_model_and_shade.py b/openpype/hosts/houdini/plugins/publish/validate_usd_model_and_shade.py index 4fe4322bb3..2fd2f5eb9f 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_usd_model_and_shade.py +++ b/openpype/hosts/houdini/plugins/publish/validate_usd_model_and_shade.py @@ -11,7 +11,7 @@ def fullname(o): module = o.__module__ if module is None or module == str.__module__: return o.__name__ - return module + '.' + o.__name__ + return module + "." + o.__name__ class ValidateUsdModel(pyblish.api.InstancePlugin): @@ -32,7 +32,7 @@ class ValidateUsdModel(pyblish.api.InstancePlugin): UsdRender.Settings, UsdRender.Product, UsdRender.Var, - UsdLux.Light + UsdLux.Light, ] def process(self, instance): @@ -64,6 +64,7 @@ class ValidateUsdShade(ValidateUsdModel): Disallow Render settings, products, vars and Lux lights. """ + families = ["usdShade"] label = "Validate USD Shade" @@ -71,5 +72,5 @@ class ValidateUsdShade(ValidateUsdModel): UsdRender.Settings, UsdRender.Product, UsdRender.Var, - UsdLux.Light + UsdLux.Light, ] diff --git a/openpype/hosts/houdini/plugins/publish/validate_usd_output_node.py b/openpype/hosts/houdini/plugins/publish/validate_usd_output_node.py index 0960129819..1f10fafdf4 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_usd_output_node.py +++ b/openpype/hosts/houdini/plugins/publish/validate_usd_output_node.py @@ -12,7 +12,7 @@ class ValidateUSDOutputNode(pyblish.api.InstancePlugin): """ order = pyblish.api.ValidatorOrder - families = ["colorbleed.usd"] + families = ["usd"] hosts = ["houdini"] label = "Validate Output Node (USD)" @@ -20,8 +20,10 @@ class ValidateUSDOutputNode(pyblish.api.InstancePlugin): invalid = self.get_invalid(instance) if invalid: - raise RuntimeError("Output node(s) `%s` are incorrect. " - "See plug-in log for details." % invalid) + raise RuntimeError( + "Output node(s) `%s` are incorrect. " + "See plug-in log for details." % invalid + ) @classmethod def get_invalid(cls, instance): @@ -32,19 +34,19 @@ class ValidateUSDOutputNode(pyblish.api.InstancePlugin): if output_node is None: node = instance[0] - cls.log.error("USD node '%s' LOP path does not exist. " - "Ensure a valid LOP path is set." - % node.path()) + cls.log.error( + "USD node '%s' LOP path does not exist. " + "Ensure a valid LOP path is set." % node.path() + ) return [node.path()] # Output node must be a Sop node. if not isinstance(output_node, hou.LopNode): - cls.log.error("Output node %s is not a LOP node. " - "LOP Path must point to a LOP node, " - "instead found category type: %s" % ( - output_node.path(), - output_node.type().category().name() - ) - ) + cls.log.error( + "Output node %s is not a LOP node. " + "LOP Path must point to a LOP node, " + "instead found category type: %s" + % (output_node.path(), output_node.type().category().name()) + ) return [output_node.path()] diff --git a/openpype/hosts/houdini/plugins/publish/validate_usd_render_product_names.py b/openpype/hosts/houdini/plugins/publish/validate_usd_render_product_names.py index 18231a9605..36336a03ae 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_usd_render_product_names.py +++ b/openpype/hosts/houdini/plugins/publish/validate_usd_render_product_names.py @@ -7,7 +7,7 @@ class ValidateUSDRenderProductNames(pyblish.api.InstancePlugin): """Validate USD Render Product names are correctly set absolute paths.""" order = pyblish.api.ValidatorOrder - families = ["colorbleed.usdrender"] + families = ["usdrender"] hosts = ["houdini"] label = "Validate USD Render Product Names" optional = True @@ -21,8 +21,9 @@ class ValidateUSDRenderProductNames(pyblish.api.InstancePlugin): invalid.append("Detected empty output filepath.") if not os.path.isabs(filepath): - invalid.append("Output file path is not " - "absolute path: %s" % filepath) + invalid.append( + "Output file path is not " "absolute path: %s" % filepath + ) if invalid: for message in invalid: diff --git a/openpype/hosts/houdini/plugins/publish/validate_usd_setdress.py b/openpype/hosts/houdini/plugins/publish/validate_usd_setdress.py index 8af53fa617..fb1094e6b5 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_usd_setdress.py +++ b/openpype/hosts/houdini/plugins/publish/validate_usd_setdress.py @@ -41,11 +41,14 @@ class ValidateUsdSetDress(pyblish.api.InstancePlugin): break else: prim_path = node.GetPath() - self.log.error("%s is not referenced geometry." % - prim_path) + self.log.error( + "%s is not referenced geometry." % prim_path + ) invalid.append(node) if invalid: - raise RuntimeError("SetDress contains local geometry. " - "This is not allowed, it must be an assembly " - "of referenced assets.") + raise RuntimeError( + "SetDress contains local geometry. " + "This is not allowed, it must be an assembly " + "of referenced assets." + ) diff --git a/openpype/hosts/houdini/plugins/publish/validate_usd_shade_model_exists.py b/openpype/hosts/houdini/plugins/publish/validate_usd_shade_model_exists.py index 3de18fd9b4..fcfbf6b22d 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_usd_shade_model_exists.py +++ b/openpype/hosts/houdini/plugins/publish/validate_usd_shade_model_exists.py @@ -10,9 +10,9 @@ class ValidateUSDShadeModelExists(pyblish.api.InstancePlugin): """Validate the Instance has no current cooking errors.""" order = openpype.api.ValidateContentsOrder - hosts = ['houdini'] + hosts = ["houdini"] families = ["usdShade"] - label = 'USD Shade model exists' + label = "USD Shade model exists" def process(self, instance): @@ -23,14 +23,19 @@ class ValidateUSDShadeModelExists(pyblish.api.InstancePlugin): shade_subset = subset.split(".", 1)[0] model_subset = re.sub("^usdShade", "usdModel", shade_subset) - asset_doc = io.find_one({"name": asset, - "type": "asset"}) + asset_doc = io.find_one({"name": asset, "type": "asset"}) if not asset_doc: raise RuntimeError("Asset does not exist: %s" % asset) - subset_doc = io.find_one({"name": model_subset, - "type": "subset", - "parent": asset_doc["_id"]}) + subset_doc = io.find_one( + { + "name": model_subset, + "type": "subset", + "parent": asset_doc["_id"], + } + ) if not subset_doc: - raise RuntimeError("USD Model subset not found: " - "%s (%s)" % (model_subset, asset)) + raise RuntimeError( + "USD Model subset not found: " + "%s (%s)" % (model_subset, asset) + ) diff --git a/openpype/hosts/houdini/plugins/publish/validate_usd_shade_workspace.py b/openpype/hosts/houdini/plugins/publish/validate_usd_shade_workspace.py index 3220159508..0fd1cf1fad 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_usd_shade_workspace.py +++ b/openpype/hosts/houdini/plugins/publish/validate_usd_shade_workspace.py @@ -3,7 +3,6 @@ import re import pyblish.api import openpype.api -from avalon import io import hou @@ -46,15 +45,21 @@ class ValidateUsdShadeWorkspace(pyblish.api.InstancePlugin): highest = max(highest, other_version) if version != highest: - raise RuntimeError("Shading Workspace is not the latest version." - " Found %s. Latest is %s." % (version, highest)) + raise RuntimeError( + "Shading Workspace is not the latest version." + " Found %s. Latest is %s." % (version, highest) + ) # There were some issues with the editable node not having the right # configured path. So for now let's assure that is correct to.from - value = ('avalon://`chs("../asset_name")`/' - 'usdShade`chs("../model_variantname1")`.usd') + value = ( + 'avalon://`chs("../asset_name")`/' + 'usdShade`chs("../model_variantname1")`.usd' + ) rop_value = rop.parm("lopoutput").rawValue() if rop_value != value: - raise RuntimeError("Shading Workspace has invalid 'lopoutput'" - " parameter value. The Shading Workspace" - " needs to be reset to its default values.") + raise RuntimeError( + "Shading Workspace has invalid 'lopoutput'" + " parameter value. The Shading Workspace" + " needs to be reset to its default values." + ) diff --git a/openpype/hosts/houdini/plugins/publish/validate_vdb_input_node.py b/openpype/hosts/houdini/plugins/publish/validate_vdb_input_node.py index 7b23d73ac7..0ae1bc94eb 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_vdb_input_node.py +++ b/openpype/hosts/houdini/plugins/publish/validate_vdb_input_node.py @@ -3,7 +3,7 @@ import openpype.api class ValidateVDBInputNode(pyblish.api.InstancePlugin): - """Validate that the node connected to the output node is of type VDB + """Validate that the node connected to the output node is of type VDB. Regardless of the amount of VDBs create the output will need to have an equal amount of VDBs, points, primitives and vertices @@ -24,8 +24,9 @@ class ValidateVDBInputNode(pyblish.api.InstancePlugin): def process(self, instance): invalid = self.get_invalid(instance) if invalid: - raise RuntimeError("Node connected to the output node is not" - "of type VDB!") + raise RuntimeError( + "Node connected to the output node is not" "of type VDB!" + ) @classmethod def get_invalid(cls, instance): diff --git a/openpype/hosts/houdini/plugins/publish/validate_vdb_output_node.py b/openpype/hosts/houdini/plugins/publish/validate_vdb_output_node.py index d3894ee41d..1ba840b71d 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_vdb_output_node.py +++ b/openpype/hosts/houdini/plugins/publish/validate_vdb_output_node.py @@ -4,7 +4,7 @@ import hou class ValidateVDBOutputNode(pyblish.api.InstancePlugin): - """Validate that the node connected to the output node is of type VDB + """Validate that the node connected to the output node is of type VDB. Regardless of the amount of VDBs create the output will need to have an equal amount of VDBs, points, primitives and vertices @@ -18,36 +18,41 @@ class ValidateVDBOutputNode(pyblish.api.InstancePlugin): """ order = openpype.api.ValidateContentsOrder + 0.1 - families = ["colorbleed.vdbcache"] + families = ["vdbcache"] hosts = ["houdini"] label = "Validate Output Node (VDB)" def process(self, instance): invalid = self.get_invalid(instance) if invalid: - raise RuntimeError("Node connected to the output node is not" - " of type VDB!") + raise RuntimeError( + "Node connected to the output node is not" " of type VDB!" + ) @classmethod def get_invalid(cls, instance): node = instance.data["output_node"] if node is None: - cls.log.error("SOP path is not correctly set on " - "ROP node '%s'." % instance[0].path()) + cls.log.error( + "SOP path is not correctly set on " + "ROP node '%s'." % instance[0].path() + ) return [instance] - - frame = instance.data.get("startFrame", 0) + + frame = instance.data.get("frameStart", 0) geometry = node.geometryAtFrame(frame) if geometry is None: # No geometry data on this node, maybe the node hasn't cooked? - cls.log.error("SOP node has no geometry data. " - "Is it cooked? %s" % node.path()) + cls.log.error( + "SOP node has no geometry data. " + "Is it cooked? %s" % node.path() + ) return [node] prims = geometry.prims() nr_of_prims = len(prims) - + # All primitives must be hou.VDB invalid_prim = False for prim in prims: From 6d2563fa5c688bba62649e7da8da09cd5db16a3b Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Fri, 16 Jul 2021 15:48:00 +0200 Subject: [PATCH 21/38] =?UTF-8?q?hound=20cleanup=20=F0=9F=90=B6?= =?UTF-8?q?=F0=9F=A7=BD=F0=9F=A7=BA=20III.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openpype/hosts/houdini/api/__init__.py | 1 - openpype/hosts/houdini/plugins/load/load_camera.py | 2 +- openpype/hosts/houdini/plugins/load/load_vdb.py | 7 +++---- .../houdini/plugins/publish/collect_active_state.py | 5 +++-- .../plugins/publish/collect_render_products.py | 4 +--- .../houdini/plugins/publish/collect_usd_bootstrap.py | 3 --- .../houdini/plugins/publish/collect_usd_layers.py | 7 +------ .../houdini/plugins/publish/extract_usd_layered.py | 12 ++++++++---- .../publish/submit_houdini_remote_publish.py} | 1 - .../publish/submit_houdini_render_deadline.py | 0 10 files changed, 17 insertions(+), 25 deletions(-) rename openpype/{hosts/houdini/plugins/publish/submit_remote_publish.py => modules/deadline/plugins/publish/submit_houdini_remote_publish.py} (99%) rename openpype/{hosts/houdini => modules/deadline}/plugins/publish/submit_houdini_render_deadline.py (100%) diff --git a/openpype/hosts/houdini/api/__init__.py b/openpype/hosts/houdini/api/__init__.py index bb43654fef..7328236b97 100644 --- a/openpype/hosts/houdini/api/__init__.py +++ b/openpype/hosts/houdini/api/__init__.py @@ -125,7 +125,6 @@ def _set_asset_fps(): def on_pyblish_instance_toggled(instance, new_value, old_value): """Toggle saver tool passthrough states on instance toggles.""" - @contextlib.contextmanager def main_take(no_update=True): """Enter root take during context""" diff --git a/openpype/hosts/houdini/plugins/load/load_camera.py b/openpype/hosts/houdini/plugins/load/load_camera.py index 65697eef63..83246b7d97 100644 --- a/openpype/hosts/houdini/plugins/load/load_camera.py +++ b/openpype/hosts/houdini/plugins/load/load_camera.py @@ -146,7 +146,7 @@ class CameraLoader(api.Loader): "representation": str(representation["_id"])}) # Store the cam temporarily next to the Alembic Archive - # so that we can preserve parm values the user set on it + # so that we can preserve parm values the user set on it # after build hierarchy was triggered. old_camera = self._get_camera(node) temp_camera = old_camera.copyTo(node.parent()) diff --git a/openpype/hosts/houdini/plugins/load/load_vdb.py b/openpype/hosts/houdini/plugins/load/load_vdb.py index 576b459d7d..5f7e400b39 100644 --- a/openpype/hosts/houdini/plugins/load/load_vdb.py +++ b/openpype/hosts/houdini/plugins/load/load_vdb.py @@ -2,13 +2,13 @@ import os import re from avalon import api -from avalon.houdini import pipeline, lib +from avalon.houdini import pipeline class VdbLoader(api.Loader): """Specific loader of Alembic for the avalon.animation family""" - families = ["colorbleed.vdbcache"] + families = ["vdbcache"] label = "Load VDB" representations = ["vdb"] order = -10 @@ -55,8 +55,7 @@ class VdbLoader(api.Loader): ) def format_path(self, path): - """Format file path correctly for single vdb or vdb sequence""" - + """Format file path correctly for single vdb or vdb sequence.""" if not os.path.exists(path): raise RuntimeError("Path does not exist: %s" % path) diff --git a/openpype/hosts/houdini/plugins/publish/collect_active_state.py b/openpype/hosts/houdini/plugins/publish/collect_active_state.py index 7b3637df88..1193f0cd19 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_active_state.py +++ b/openpype/hosts/houdini/plugins/publish/collect_active_state.py @@ -30,8 +30,9 @@ class CollectInstanceActiveState(pyblish.api.InstancePlugin): instance.data.update( { "active": active, - # temporarily translation of `active` to `publish` till issue has - # been resolved: https://github.com/pyblish/pyblish-base/issues/307 + # temporarily translation of `active` to `publish` till + # issue has been resolved: + # https://github.com/pyblish/pyblish-base/issues/307 "publish": active, } ) diff --git a/openpype/hosts/houdini/plugins/publish/collect_render_products.py b/openpype/hosts/houdini/plugins/publish/collect_render_products.py index e8a4a3dc3d..d7163b43c0 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_render_products.py +++ b/openpype/hosts/houdini/plugins/publish/collect_render_products.py @@ -4,8 +4,6 @@ import os import hou import pxr.UsdRender -import avalon.io as io -import avalon.api as api import pyblish.api @@ -49,7 +47,7 @@ class CollectRenderProducts(pyblish.api.InstancePlugin): label = "Collect Render Products" order = pyblish.api.CollectorOrder + 0.4 hosts = ["houdini"] - families = ["colorbleed.usdrender"] + families = ["usdrender"] def process(self, instance): diff --git a/openpype/hosts/houdini/plugins/publish/collect_usd_bootstrap.py b/openpype/hosts/houdini/plugins/publish/collect_usd_bootstrap.py index 991354fc5a..66dfba64df 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_usd_bootstrap.py +++ b/openpype/hosts/houdini/plugins/publish/collect_usd_bootstrap.py @@ -1,9 +1,6 @@ -import hou - import pyblish.api from avalon import io -from avalon.houdini import lib import openpype.lib.usdlib as usdlib diff --git a/openpype/hosts/houdini/plugins/publish/collect_usd_layers.py b/openpype/hosts/houdini/plugins/publish/collect_usd_layers.py index 581f029ac2..8be6ead1b1 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_usd_layers.py +++ b/openpype/hosts/houdini/plugins/publish/collect_usd_layers.py @@ -1,12 +1,7 @@ import os import pyblish.api - -from avalon import io -from avalon.houdini import lib -import openpype.hosts.houdini.lib.usd as usdlib - -import hou +import openpype.hosts.houdini.api.usd as usdlib class CollectUsdLayers(pyblish.api.InstancePlugin): diff --git a/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py b/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py index 06b48f3b43..890d420a73 100644 --- a/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py +++ b/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py @@ -44,12 +44,13 @@ class ExitStack(object): self.push(_exit_wrapper) def push(self, exit): - """Registers a callback with the standard __exit__ method signature + """Registers a callback with the standard __exit__ method signature. Can suppress exceptions the same way __exit__ methods can. Also accepts any object with an __exit__ method (registering a call to the method instead of the object itself) + """ # We use an unbound method rather than a bound method to follow # the standard lookup behaviour for special methods @@ -84,7 +85,8 @@ class ExitStack(object): If successful, also pushes its __exit__ method as a callback and returns the result of the __enter__ method. """ - # We look up the special methods on the type to match the with statement + # We look up the special methods on the type to match the with + # statement _cm_type = type(cm) _exit = _cm_type.__exit__ result = _cm_type.__enter__(cm) @@ -174,7 +176,8 @@ class ExtractUSDLayered(openpype.api.Extractor): node.type().name() in {"usd", "usd_rop"} for node in ropnodes ) - # Main ROP node, either a USD Rop or ROP network with multiple USD ROPs + # Main ROP node, either a USD Rop or ROP network with + # multiple USD ROPs node = instance[0] # Collect any output dependencies that have not been processed yet @@ -288,7 +291,8 @@ class ExtractUSDLayered(openpype.api.Extractor): return False version = io.find_one( - {"type": "version", "parent": subset["_id"], }, sort=[("name", -1)] + {"type": "version", "parent": subset["_id"], }, + sort=[("name", -1)] ) if not version: self.log.debug("No existing version..") diff --git a/openpype/hosts/houdini/plugins/publish/submit_remote_publish.py b/openpype/modules/deadline/plugins/publish/submit_houdini_remote_publish.py similarity index 99% rename from openpype/hosts/houdini/plugins/publish/submit_remote_publish.py rename to openpype/modules/deadline/plugins/publish/submit_houdini_remote_publish.py index 77666921c8..9ada437716 100644 --- a/openpype/hosts/houdini/plugins/publish/submit_remote_publish.py +++ b/openpype/modules/deadline/plugins/publish/submit_houdini_remote_publish.py @@ -1,6 +1,5 @@ import os import json -import getpass import hou diff --git a/openpype/hosts/houdini/plugins/publish/submit_houdini_render_deadline.py b/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py similarity index 100% rename from openpype/hosts/houdini/plugins/publish/submit_houdini_render_deadline.py rename to openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py From 64f9f43f5ed8ea96383d0ad866c92f9738108807 Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Fri, 16 Jul 2021 16:02:31 +0200 Subject: [PATCH 22/38] =?UTF-8?q?hound=20cleanup=20=F0=9F=90=B6?= =?UTF-8?q?=F0=9F=A7=BD=F0=9F=A7=BA=20IV.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openpype/hosts/houdini/api/usd.py | 33 ++++++++++--------- .../plugins/publish/extract_usd_layered.py | 2 +- .../publish/validate_usd_shade_workspace.py | 2 -- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/openpype/hosts/houdini/api/usd.py b/openpype/hosts/houdini/api/usd.py index 48b97bb250..850ffb60e5 100644 --- a/openpype/hosts/houdini/api/usd.py +++ b/openpype/hosts/houdini/api/usd.py @@ -42,6 +42,7 @@ def pick_asset(node): name = parm.eval() if name: from avalon import io + db_asset = io.find_one({"name": name, "type": "asset"}) if db_asset: silo = db_asset.get("silo") @@ -74,11 +75,13 @@ def add_usd_output_processor(ropnode, processor): import loputils - loputils.handleOutputProcessorAdd({ - "node": ropnode, - "parm": ropnode.parm("outputprocessors"), - "script_value": processor - }) + loputils.handleOutputProcessorAdd( + { + "node": ropnode, + "parm": ropnode.parm("outputprocessors"), + "script_value": processor, + } + ) def remove_usd_output_processor(ropnode, processor): @@ -94,19 +97,16 @@ def remove_usd_output_processor(ropnode, processor): parm = ropnode.parm(processor + "_remove") if not parm: - raise RuntimeError("Output Processor %s does not " - "exist on %s" % (processor, ropnode.name())) + raise RuntimeError( + "Output Processor %s does not " + "exist on %s" % (processor, ropnode.name()) + ) - loputils.handleOutputProcessorRemove({ - "node": ropnode, - "parm": parm - }) + loputils.handleOutputProcessorRemove({"node": ropnode, "parm": parm}) @contextlib.contextmanager -def outputprocessors(ropnode, - processors=tuple(), - disable_all_others=True): +def outputprocessors(ropnode, processors=tuple(), disable_all_others=True): """Context manager to temporarily add Output Processors to USD ROP node. Args: @@ -240,8 +240,9 @@ def get_configured_save_layers(usd_rop): lop_node = get_usd_rop_loppath(usd_rop) stage = lop_node.stage(apply_viewport_overrides=False) if not stage: - raise RuntimeError("No valid USD stage for ROP node: " - "%s" % usd_rop.path()) + raise RuntimeError( + "No valid USD stage for ROP node: " "%s" % usd_rop.path() + ) root_layer = stage.GetRootLayer() diff --git a/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py b/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py index 890d420a73..b9741c50ca 100644 --- a/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py +++ b/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py @@ -122,7 +122,7 @@ class ExitStack(object): if cb(*exc_details): suppressed_exc = True exc_details = (None, None, None) - except: + except Exception: new_exc_details = sys.exc_info() # simulate the stack of exceptions by setting the context _fix_exception_context(new_exc_details[1], exc_details[1]) diff --git a/openpype/hosts/houdini/plugins/publish/validate_usd_shade_workspace.py b/openpype/hosts/houdini/plugins/publish/validate_usd_shade_workspace.py index 0fd1cf1fad..a77ca2f3cb 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_usd_shade_workspace.py +++ b/openpype/hosts/houdini/plugins/publish/validate_usd_shade_workspace.py @@ -1,5 +1,3 @@ -import re - import pyblish.api import openpype.api From 5992c5f950187424a4ff3079b56e460b5d668ffd Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Fri, 16 Jul 2021 16:25:21 +0200 Subject: [PATCH 23/38] openpype conformation --- openpype/hosts/houdini/plugins/create/create_composite.py | 4 ++-- .../hosts/houdini/plugins/create/create_redshift_rop.py | 5 ++--- .../hosts/houdini/plugins/create/create_remote_publish.py | 7 +++---- openpype/hosts/houdini/plugins/create/create_usd.py | 4 ++-- openpype/hosts/houdini/plugins/create/create_usd_model.py | 5 ++--- .../hosts/houdini/plugins/create/create_usd_workspaces.py | 4 ++-- openpype/hosts/houdini/plugins/create/create_usdrender.py | 5 ++--- 7 files changed, 15 insertions(+), 19 deletions(-) diff --git a/openpype/hosts/houdini/plugins/create/create_composite.py b/openpype/hosts/houdini/plugins/create/create_composite.py index 4f91fa2258..7293669bef 100644 --- a/openpype/hosts/houdini/plugins/create/create_composite.py +++ b/openpype/hosts/houdini/plugins/create/create_composite.py @@ -1,7 +1,7 @@ -from avalon import houdini +from openpype.hosts.houdini.api import plugin -class CreateCompositeSequence(houdini.Creator): +class CreateCompositeSequence(plugin.Creator): """Composite ROP to Image Sequence""" label = "Composite (Image Sequence)" diff --git a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py index 0babc17c6b..40d2ac58c7 100644 --- a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py @@ -1,9 +1,8 @@ import hou - -from avalon import houdini +from openpype.hosts.houdini.api import plugin -class CreateRedshiftROP(houdini.Creator): +class CreateRedshiftROP(plugin.Creator): """Redshift ROP""" label = "Redshift ROP" diff --git a/openpype/hosts/houdini/plugins/create/create_remote_publish.py b/openpype/hosts/houdini/plugins/create/create_remote_publish.py index bc6cf5d949..b9782209cd 100644 --- a/openpype/hosts/houdini/plugins/create/create_remote_publish.py +++ b/openpype/hosts/houdini/plugins/create/create_remote_publish.py @@ -1,9 +1,8 @@ -from avalon import houdini - -from colorbleed.houdini import lib +from openpype.hosts.houdini.api import plugin +from openpype.hosts.houdini.api import lib -class CreateRemotePublish(houdini.Creator): +class CreateRemotePublish(plugin.Creator): """Create Remote Publish Submission Settings node.""" label = "Remote Publish" diff --git a/openpype/hosts/houdini/plugins/create/create_usd.py b/openpype/hosts/houdini/plugins/create/create_usd.py index 5ca8875dc0..642612f465 100644 --- a/openpype/hosts/houdini/plugins/create/create_usd.py +++ b/openpype/hosts/houdini/plugins/create/create_usd.py @@ -1,7 +1,7 @@ -from avalon import houdini +from openpype.hosts.houdini.api import plugin -class CreateUSD(houdini.Creator): +class CreateUSD(plugin.Creator): """Universal Scene Description""" label = "USD" diff --git a/openpype/hosts/houdini/plugins/create/create_usd_model.py b/openpype/hosts/houdini/plugins/create/create_usd_model.py index 96563f2f91..5276211f2c 100644 --- a/openpype/hosts/houdini/plugins/create/create_usd_model.py +++ b/openpype/hosts/houdini/plugins/create/create_usd_model.py @@ -1,10 +1,9 @@ import re - -from avalon import api +from openpype.hosts.houdini.api import plugin import hou -class CreateUSDModel(api.Creator): +class CreateUSDModel(plugin.Creator): """Author USD Model""" label = "USD Model" diff --git a/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py b/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py index a2309122e4..fc8ef5c810 100644 --- a/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py +++ b/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py @@ -1,8 +1,8 @@ -from avalon import api +from openpype.hosts.houdini.api import plugin import hou -class _USDWorkspace(api.Creator): +class _USDWorkspace(plugin.Creator): """Base class to create pre-built USD Workspaces""" node_name = None diff --git a/openpype/hosts/houdini/plugins/create/create_usdrender.py b/openpype/hosts/houdini/plugins/create/create_usdrender.py index 1c488f381b..34e1a9cc54 100644 --- a/openpype/hosts/houdini/plugins/create/create_usdrender.py +++ b/openpype/hosts/houdini/plugins/create/create_usdrender.py @@ -1,9 +1,8 @@ import hou - -from avalon import houdini +from openpype.hosts.houdini.api import plugin -class CreateUSDRender(houdini.Creator): +class CreateUSDRender(plugin.Creator): """USD Render ROP in /stage""" label = "USD Render" From 493b9cb756e0faa70cc8829488e2646d0e684aed Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Fri, 16 Jul 2021 16:31:18 +0200 Subject: [PATCH 24/38] =?UTF-8?q?yet=20another=20hound=20=F0=9F=A6=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openpype/lib/usdlib.py | 153 +++++++++++++++++++++-------------------- 1 file changed, 78 insertions(+), 75 deletions(-) diff --git a/openpype/lib/usdlib.py b/openpype/lib/usdlib.py index cc036a9491..3ae7430c7b 100644 --- a/openpype/lib/usdlib.py +++ b/openpype/lib/usdlib.py @@ -16,20 +16,20 @@ log = logging.getLogger(__name__) # The predefined steps order used for bootstrapping USD Shots and Assets. # These are ordered in order from strongest to weakest opinions, like in USD. PIPELINE = { - "shot": ["usdLighting", - "usdFx", - "usdSimulation", - "usdAnimation", - "usdLayout"], - "asset": ["usdShade", - "usdModel"] + "shot": [ + "usdLighting", + "usdFx", + "usdSimulation", + "usdAnimation", + "usdLayout", + ], + "asset": ["usdShade", "usdModel"], } -def create_asset(filepath, - asset_name, - reference_layers, - kind=Kind.Tokens.component): +def create_asset( + filepath, asset_name, reference_layers, kind=Kind.Tokens.component +): """ Creates an asset file that consists of a top level layer and sublayers for shading and geometry. @@ -49,11 +49,11 @@ def create_asset(filepath, log.info("Creating asset at %s", filepath) # Make the layer ascii - good for readability, plus the file is small - root_layer = Sdf.Layer.CreateNew(filepath, args={'format': 'usda'}) + root_layer = Sdf.Layer.CreateNew(filepath, args={"format": "usda"}) stage = Usd.Stage.Open(root_layer) # Define a prim for the asset and make it the default for the stage. - asset_prim = UsdGeom.Xform.Define(stage, '/%s' % asset_name).GetPrim() + asset_prim = UsdGeom.Xform.Define(stage, "/%s" % asset_name).GetPrim() stage.SetDefaultPrim(asset_prim) # Let viewing applications know how to orient a free camera properly @@ -67,7 +67,7 @@ def create_asset(filepath, model.SetKind(kind) model.SetAssetName(asset_name) - model.SetAssetIdentifier('%s/%s.usd' % (asset_name, asset_name)) + model.SetAssetIdentifier("%s/%s.usd" % (asset_name, asset_name)) # Add references to the asset prim references = asset_prim.GetReferences() @@ -135,20 +135,23 @@ def create_model(filename, asset, variant_subsets): # Strip off `usdModel_` variant = subset[len(prefix):] else: - raise ValueError("Model subsets must start " - "with usdModel: %s" % subset) + raise ValueError( + "Model subsets must start " "with usdModel: %s" % subset + ) - path = get_usd_master_path(asset=asset_doc, - subset=subset, - representation="usd") + path = get_usd_master_path( + asset=asset_doc, subset=subset, representation="usd" + ) variants.append((variant, path)) - stage = _create_variants_file(filename, - variants=variants, - variantset="model", - variant_prim="/root", - reference_prim="/root/geo", - as_payload=True) + stage = _create_variants_file( + filename, + variants=variants, + variantset="model", + variant_prim="/root", + reference_prim="/root/geo", + as_payload=True, + ) UsdGeom.SetStageMetersPerUnit(stage, 1) UsdGeom.SetStageUpAxis(stage, UsdGeom.Tokens.y) @@ -183,27 +186,24 @@ def create_shade(filename, asset, variant_subsets): # Strip off `usdModel_` variant = subset[len(prefix):] else: - raise ValueError("Model subsets must start " - "with usdModel: %s" % subset) + raise ValueError( + "Model subsets must start " "with usdModel: %s" % subset + ) shade_subset = re.sub("^usdModel", "usdShade", subset) - path = get_usd_master_path(asset=asset_doc, - subset=shade_subset, - representation="usd") + path = get_usd_master_path( + asset=asset_doc, subset=shade_subset, representation="usd" + ) variants.append((variant, path)) - stage = _create_variants_file(filename, - variants=variants, - variantset="model", - variant_prim="/root") + stage = _create_variants_file( + filename, variants=variants, variantset="model", variant_prim="/root" + ) stage.GetRootLayer().Save() -def create_shade_variation(filename, - asset, - model_variant, - shade_variants): +def create_shade_variation(filename, asset, model_variant, shade_variants): """Create the master Shade file for a specific model variant. This should reference all shade variants for the specific model variant. @@ -215,32 +215,34 @@ def create_shade_variation(filename, variants = [] for variant in shade_variants: - subset = "usdShade_{model}_{shade}".format(model=model_variant, - shade=variant) - path = get_usd_master_path(asset=asset_doc, - subset=subset, - representation="usd") + subset = "usdShade_{model}_{shade}".format( + model=model_variant, shade=variant + ) + path = get_usd_master_path( + asset=asset_doc, subset=subset, representation="usd" + ) variants.append((variant, path)) - stage = _create_variants_file(filename, - variants=variants, - variantset="shade", - variant_prim="/root") + stage = _create_variants_file( + filename, variants=variants, variantset="shade", variant_prim="/root" + ) stage.GetRootLayer().Save() -def _create_variants_file(filename, - variants, - variantset, - default_variant=None, - variant_prim="/root", - reference_prim=None, - set_default_variant=True, - as_payload=False, - skip_variant_on_single_file=True): +def _create_variants_file( + filename, + variants, + variantset, + default_variant=None, + variant_prim="/root", + reference_prim=None, + set_default_variant=True, + as_payload=False, + skip_variant_on_single_file=True, +): - root_layer = Sdf.Layer.CreateNew(filename, args={'format': 'usda'}) + root_layer = Sdf.Layer.CreateNew(filename, args={"format": "usda"}) stage = Usd.Stage.Open(root_layer) root_prim = stage.DefinePrim(variant_prim) @@ -276,8 +278,9 @@ def _create_variants_file(filename, else: # Variants append = Usd.ListPositionBackOfAppendList - variant_set = root_prim.GetVariantSets().AddVariantSet(variantset, - append) + variant_set = root_prim.GetVariantSets().AddVariantSet( + variantset, append + ) for variant, variant_path in variants: @@ -299,9 +302,7 @@ def _create_variants_file(filename, return stage -def get_usd_master_path(asset, - subset, - representation): +def get_usd_master_path(asset, subset, representation): """Get the filepath for a .usd file of a subset. This will return the path to an unversioned master file generated by @@ -309,26 +310,28 @@ def get_usd_master_path(asset, """ - project = io.find_one({"type": "project"}, - projection={"config.template.publish": True}) + project = io.find_one( + {"type": "project"}, projection={"config.template.publish": True} + ) template = project["config"]["template"]["publish"] if isinstance(asset, dict) and "silo" in asset and "name" in asset: # Allow explicitly passing asset document asset_doc = asset else: - asset_doc = io.find_one({"name": asset, - "type": "asset"}) + asset_doc = io.find_one({"name": asset, "type": "asset"}) - path = template.format(**{ - "root": api.registered_root(), - "project": api.Session["AVALON_PROJECT"], - "silo": asset_doc["silo"], - "asset": asset_doc["name"], - "subset": subset, - "representation": representation, - "version": 0 # stub version zero - }) + path = template.format( + **{ + "root": api.registered_root(), + "project": api.Session["AVALON_PROJECT"], + "silo": asset_doc["silo"], + "asset": asset_doc["name"], + "subset": subset, + "representation": representation, + "version": 0, # stub version zero + } + ) # Remove the version folder subset_folder = os.path.dirname(os.path.dirname(path)) From 07fd5ba12cdbbe3d4d04ccd83cfda3ec277f9094 Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Tue, 10 Aug 2021 11:51:59 +0100 Subject: [PATCH 25/38] Improved animation workflow --- .../plugins/create/create_animation.py | 42 +++- .../blender/plugins/load/load_animation.py | 226 ++---------------- .../blender/plugins/load/load_layout_json.py | 25 +- .../hosts/blender/plugins/load/load_model.py | 2 - .../hosts/blender/plugins/load/load_rig.py | 27 ++- .../plugins/publish/collect_instances.py | 42 ++++ .../blender/plugins/publish/extract_blend.py | 2 +- .../publish/extract_blend_animation.py | 53 ++++ .../plugins/publish/extract_fbx_animation.py | 76 +++--- .../unreal/plugins/publish/extract_layout.py | 2 +- 10 files changed, 235 insertions(+), 262 deletions(-) create mode 100644 openpype/hosts/blender/plugins/publish/extract_blend_animation.py diff --git a/openpype/hosts/blender/plugins/create/create_animation.py b/openpype/hosts/blender/plugins/create/create_animation.py index 9aebf7e9b7..f7887b7e80 100644 --- a/openpype/hosts/blender/plugins/create/create_animation.py +++ b/openpype/hosts/blender/plugins/create/create_animation.py @@ -2,11 +2,13 @@ import bpy -from avalon import api, blender -import openpype.hosts.blender.api.plugin +from avalon import api +from avalon.blender import lib, ops +from avalon.blender.pipeline import AVALON_INSTANCES +from openpype.hosts.blender.api import plugin -class CreateAnimation(openpype.hosts.blender.api.plugin.Creator): +class CreateAnimation(plugin.Creator): """Animation output for character rigs""" name = "animationMain" @@ -15,16 +17,36 @@ class CreateAnimation(openpype.hosts.blender.api.plugin.Creator): icon = "male" def process(self): + """ Run the creator on Blender main thread""" + mti = ops.MainThreadItem(self._process) + ops.execute_in_main_thread(mti) + + def _process(self): + # Get Instance Containter or create it if it does not exist + instances = bpy.data.collections.get(AVALON_INSTANCES) + if not instances: + instances = bpy.data.collections.new(name=AVALON_INSTANCES) + bpy.context.scene.collection.children.link(instances) + + # Create instance object + # name = self.name + # if not name: asset = self.data["asset"] subset = self.data["subset"] - name = openpype.hosts.blender.api.plugin.asset_name(asset, subset) - collection = bpy.data.collections.new(name=name) - bpy.context.scene.collection.children.link(collection) + name = plugin.asset_name(asset, subset) + # asset_group = bpy.data.objects.new(name=name, object_data=None) + # asset_group.empty_display_type = 'SINGLE_ARROW' + asset_group = bpy.data.collections.new(name=name) + instances.children.link(asset_group) self.data['task'] = api.Session.get('AVALON_TASK') - blender.lib.imprint(collection, self.data) + lib.imprint(asset_group, self.data) if (self.options or {}).get("useSelection"): - for obj in blender.lib.get_selection(): - collection.objects.link(obj) + selected = lib.get_selection() + for obj in selected: + asset_group.objects.link(obj) + elif (self.options or {}).get("asset_group"): + obj = (self.options or {}).get("asset_group") + asset_group.objects.link(obj) - return collection + return asset_group diff --git a/openpype/hosts/blender/plugins/load/load_animation.py b/openpype/hosts/blender/plugins/load/load_animation.py index 4025fdfa74..4f589011dd 100644 --- a/openpype/hosts/blender/plugins/load/load_animation.py +++ b/openpype/hosts/blender/plugins/load/load_animation.py @@ -1,20 +1,19 @@ """Load an animation in Blender.""" import logging -from pathlib import Path -from pprint import pformat from typing import Dict, List, Optional -from avalon import api, blender import bpy -import openpype.hosts.blender.api.plugin + +from avalon.blender.pipeline import AVALON_PROPERTY +from openpype.hosts.blender.api import plugin logger = logging.getLogger("openpype").getChild( "blender").getChild("load_animation") -class BlendAnimationLoader(openpype.hosts.blender.api.plugin.AssetLoader): +class BlendAnimationLoader(plugin.AssetLoader): """Load animations from a .blend file. Warning: @@ -29,67 +28,6 @@ class BlendAnimationLoader(openpype.hosts.blender.api.plugin.AssetLoader): icon = "code-fork" color = "orange" - def _remove(self, objects, lib_container): - for obj in list(objects): - if obj.type == 'ARMATURE': - bpy.data.armatures.remove(obj.data) - elif obj.type == 'MESH': - bpy.data.meshes.remove(obj.data) - - bpy.data.collections.remove(bpy.data.collections[lib_container]) - - def _process(self, libpath, lib_container, container_name): - - relative = bpy.context.preferences.filepaths.use_relative_paths - with bpy.data.libraries.load( - libpath, link=True, relative=relative - ) as (_, data_to): - data_to.collections = [lib_container] - - scene = bpy.context.scene - - scene.collection.children.link(bpy.data.collections[lib_container]) - - anim_container = scene.collection.children[lib_container].make_local() - - meshes = [obj for obj in anim_container.objects if obj.type == 'MESH'] - armatures = [ - obj for obj in anim_container.objects if obj.type == 'ARMATURE'] - - # Should check if there is only an armature? - - objects_list = [] - - # Link meshes first, then armatures. - # The armature is unparented for all the non-local meshes, - # when it is made local. - for obj in meshes + armatures: - - obj = obj.make_local() - - obj.data.make_local() - - anim_data = obj.animation_data - - if anim_data is not None and anim_data.action is not None: - - anim_data.action.make_local() - - if not obj.get(blender.pipeline.AVALON_PROPERTY): - - obj[blender.pipeline.AVALON_PROPERTY] = dict() - - avalon_info = obj[blender.pipeline.AVALON_PROPERTY] - avalon_info.update({"container_name": container_name}) - - objects_list.append(obj) - - anim_container.pop(blender.pipeline.AVALON_PROPERTY) - - bpy.ops.object.select_all(action='DESELECT') - - return objects_list - def process_asset( self, context: dict, name: str, namespace: Optional[str] = None, options: Optional[Dict] = None @@ -101,148 +39,32 @@ class BlendAnimationLoader(openpype.hosts.blender.api.plugin.AssetLoader): context: Full parenthood of representation to load options: Additional settings dictionary """ - libpath = self.fname - asset = context["asset"]["name"] - subset = context["subset"]["name"] - lib_container = openpype.hosts.blender.api.plugin.asset_name(asset, subset) - container_name = openpype.hosts.blender.api.plugin.asset_name( - asset, subset, namespace - ) - container = bpy.data.collections.new(lib_container) - container.name = container_name - blender.pipeline.containerise_existing( - container, - name, - namespace, - context, - self.__class__.__name__, - ) + with bpy.data.libraries.load( + libpath, link=True, relative=False + ) as (data_from, data_to): + data_to.objects = data_from.objects + data_to.actions = data_from.actions - container_metadata = container.get( - blender.pipeline.AVALON_PROPERTY) + container = data_to.objects[0] - container_metadata["libpath"] = libpath - container_metadata["lib_container"] = lib_container + assert container, "No asset group found" - objects_list = self._process( - libpath, lib_container, container_name) + target_namespace = container.get(AVALON_PROPERTY).get('namespace') - # Save the list of objects in the metadata container - container_metadata["objects"] = objects_list + action = data_to.actions[0].make_local().copy() - nodes = list(container.objects) - nodes.append(container) - self[:] = nodes - return nodes + for obj in bpy.data.objects: + if obj.get(AVALON_PROPERTY) and obj.get(AVALON_PROPERTY).get( + 'namespace') == target_namespace: + if obj.children[0]: + if not obj.children[0].animation_data: + obj.children[0].animation_data_create() + obj.children[0].animation_data.action = action + break - def update(self, container: Dict, representation: Dict): - """Update the loaded asset. + bpy.data.objects.remove(container) - This will remove all objects of the current collection, load the new - ones and add them to the collection. - If the objects of the collection are used in another collection they - will not be removed, only unlinked. Normally this should not be the - case though. - - Warning: - No nested collections are supported at the moment! - """ - - collection = bpy.data.collections.get( - container["objectName"] - ) - - libpath = Path(api.get_representation_path(representation)) - extension = libpath.suffix.lower() - - logger.info( - "Container: %s\nRepresentation: %s", - pformat(container, indent=2), - pformat(representation, indent=2), - ) - - assert collection, ( - f"The asset is not loaded: {container['objectName']}" - ) - assert not (collection.children), ( - "Nested collections are not supported." - ) - assert libpath, ( - "No existing library file found for {container['objectName']}" - ) - assert libpath.is_file(), ( - f"The file doesn't exist: {libpath}" - ) - assert extension in openpype.hosts.blender.api.plugin.VALID_EXTENSIONS, ( - f"Unsupported file: {libpath}" - ) - - collection_metadata = collection.get( - blender.pipeline.AVALON_PROPERTY) - - collection_libpath = collection_metadata["libpath"] - normalized_collection_libpath = ( - str(Path(bpy.path.abspath(collection_libpath)).resolve()) - ) - normalized_libpath = ( - str(Path(bpy.path.abspath(str(libpath))).resolve()) - ) - logger.debug( - "normalized_collection_libpath:\n %s\nnormalized_libpath:\n %s", - normalized_collection_libpath, - normalized_libpath, - ) - if normalized_collection_libpath == normalized_libpath: - logger.info("Library already loaded, not updating...") - return - - objects = collection_metadata["objects"] - lib_container = collection_metadata["lib_container"] - - self._remove(objects, lib_container) - - objects_list = self._process( - str(libpath), lib_container, collection.name) - - # Save the list of objects in the metadata container - collection_metadata["objects"] = objects_list - collection_metadata["libpath"] = str(libpath) - collection_metadata["representation"] = str(representation["_id"]) - - bpy.ops.object.select_all(action='DESELECT') - - def remove(self, container: Dict) -> bool: - """Remove an existing container from a Blender scene. - - Arguments: - container (openpype:container-1.0): Container to remove, - from `host.ls()`. - - Returns: - bool: Whether the container was deleted. - - Warning: - No nested collections are supported at the moment! - """ - - collection = bpy.data.collections.get( - container["objectName"] - ) - if not collection: - return False - assert not (collection.children), ( - "Nested collections are not supported." - ) - - collection_metadata = collection.get( - blender.pipeline.AVALON_PROPERTY) - objects = collection_metadata["objects"] - lib_container = collection_metadata["lib_container"] - - self._remove(objects, lib_container) - - bpy.data.collections.remove(collection) - - return True + library = bpy.data.libraries.get(bpy.path.basename(libpath)) + bpy.data.libraries.remove(library) diff --git a/openpype/hosts/blender/plugins/load/load_layout_json.py b/openpype/hosts/blender/plugins/load/load_layout_json.py index 8564b52816..dfa4501730 100644 --- a/openpype/hosts/blender/plugins/load/load_layout_json.py +++ b/openpype/hosts/blender/plugins/load/load_layout_json.py @@ -11,6 +11,7 @@ from avalon import api from avalon.blender.pipeline import AVALON_CONTAINERS from avalon.blender.pipeline import AVALON_CONTAINER_ID from avalon.blender.pipeline import AVALON_PROPERTY +from avalon.blender.pipeline import AVALON_INSTANCES from openpype.hosts.blender.api import plugin @@ -32,6 +33,14 @@ class JsonLayoutLoader(plugin.AssetLoader): for obj in objects: api.remove(obj.get(AVALON_PROPERTY)) + def _remove_animation_instances(self, asset_group): + instances = bpy.data.collections.get(AVALON_INSTANCES) + if instances: + for obj in list(asset_group.children): + anim_collection = instances.children.get(obj.name+"_animation") + if anim_collection: + bpy.data.collections.remove(anim_collection) + def _get_loader(self, loaders, family): name = "" if family == 'rig': @@ -48,7 +57,7 @@ class JsonLayoutLoader(plugin.AssetLoader): return None - def _process(self, libpath, asset_group, actions): + def _process(self, libpath, asset, asset_group, actions): bpy.ops.object.select_all(action='DESELECT') with open(libpath, "r") as fp: @@ -76,7 +85,9 @@ class JsonLayoutLoader(plugin.AssetLoader): options = { 'parent': asset_group, 'transform': element.get('transform'), - 'action': action + 'action': action, + 'create_animation': True if family == 'rig' else False, + 'animation_asset': asset } # This should return the loaded asset, but the load call will be @@ -121,7 +132,7 @@ class JsonLayoutLoader(plugin.AssetLoader): asset_group.empty_display_type = 'SINGLE_ARROW' avalon_container.objects.link(asset_group) - self._process(libpath, asset_group, None) + self._process(libpath, asset, asset_group, None) bpy.context.scene.collection.objects.link(asset_group) @@ -206,11 +217,13 @@ class JsonLayoutLoader(plugin.AssetLoader): if not rig: raise Exception("No armature in the rig asset group.") if rig.animation_data and rig.animation_data.action: - instance_name = obj_meta.get('instance_name') - actions[instance_name] = rig.animation_data.action + namespace = obj_meta.get('namespace') + actions[namespace] = rig.animation_data.action mat = asset_group.matrix_basis.copy() + self._remove_animation_instances(asset_group) + self._remove(asset_group) self._process(str(libpath), asset_group, actions) @@ -236,6 +249,8 @@ class JsonLayoutLoader(plugin.AssetLoader): if not asset_group: return False + self._remove_animation_instances(asset_group) + self._remove(asset_group) bpy.data.objects.remove(asset_group) diff --git a/openpype/hosts/blender/plugins/load/load_model.py b/openpype/hosts/blender/plugins/load/load_model.py index dd48be3db7..af5591c299 100644 --- a/openpype/hosts/blender/plugins/load/load_model.py +++ b/openpype/hosts/blender/plugins/load/load_model.py @@ -137,8 +137,6 @@ class BlendModelLoader(plugin.AssetLoader): rotation = transform.get('rotation') scale = transform.get('scale') - # Y position is inverted in sign because Unreal and Blender have the - # Y axis mirrored asset_group.location = ( location.get('x'), location.get('y'), diff --git a/openpype/hosts/blender/plugins/load/load_rig.py b/openpype/hosts/blender/plugins/load/load_rig.py index d12c398794..f3e2991a04 100644 --- a/openpype/hosts/blender/plugins/load/load_rig.py +++ b/openpype/hosts/blender/plugins/load/load_rig.py @@ -10,6 +10,7 @@ from avalon import api from avalon.blender.pipeline import AVALON_CONTAINERS from avalon.blender.pipeline import AVALON_CONTAINER_ID from avalon.blender.pipeline import AVALON_PROPERTY +from openpype import lib from openpype.hosts.blender.api import plugin @@ -164,18 +165,19 @@ class BlendRigLoader(plugin.AssetLoader): bpy.ops.object.select_all(action='DESELECT') + create_animation = False + if options is not None: parent = options.get('parent') transform = options.get('transform') action = options.get('action') + create_animation = options.get('create_animation') if parent and transform: location = transform.get('translation') rotation = transform.get('rotation') scale = transform.get('scale') - # Y position is inverted in sign because Unreal and Blender have the - # Y axis mirrored asset_group.location = ( location.get('x'), location.get('y'), @@ -201,6 +203,27 @@ class BlendRigLoader(plugin.AssetLoader): objects = self._process(libpath, asset_group, group_name, action) + if create_animation: + creator_plugin = lib.get_creator_by_name("CreateAnimation") + if not creator_plugin: + raise ValueError("Creator plugin \"CreateAnimation\" was " + "not found.") + + asset_group.select_set(True) + + animation_asset = options.get('animation_asset') + + api.create( + creator_plugin, + name=namespace+"_animation", + # name=f"{unique_number}_{subset}_animation", + asset=animation_asset, + options={"useSelection": False, "asset_group": asset_group}, + data={"dependencies": str(context["representation"]["_id"])} + ) + + bpy.ops.object.select_all(action='DESELECT') + bpy.context.scene.collection.objects.link(asset_group) asset_group[AVALON_PROPERTY] = { diff --git a/openpype/hosts/blender/plugins/publish/collect_instances.py b/openpype/hosts/blender/plugins/publish/collect_instances.py index 09a60d9725..0d683dace4 100644 --- a/openpype/hosts/blender/plugins/publish/collect_instances.py +++ b/openpype/hosts/blender/plugins/publish/collect_instances.py @@ -29,9 +29,23 @@ class CollectInstances(pyblish.api.ContextPlugin): if avalon_prop.get('id') == 'pyblish.avalon.instance': yield obj + @staticmethod + def get_collections() -> Generator: + """Return all 'model' collections. + + Check if the family is 'model' and if it doesn't have the + representation set. If the representation is set, it is a loaded model + and we don't want to publish it. + """ + for collection in bpy.data.collections: + avalon_prop = collection.get(AVALON_PROPERTY) or dict() + if avalon_prop.get('id') == 'pyblish.avalon.instance': + yield collection + def process(self, context): """Collect the models from the current Blender scene.""" asset_groups = self.get_asset_groups() + collections = self.get_collections() for group in asset_groups: avalon_prop = group[AVALON_PROPERTY] @@ -58,3 +72,31 @@ class CollectInstances(pyblish.api.ContextPlugin): self.log.debug(json.dumps(instance.data, indent=4)) for obj in instance: self.log.debug(obj) + + for collection in collections: + avalon_prop = collection[AVALON_PROPERTY] + asset = avalon_prop['asset'] + family = avalon_prop['family'] + subset = avalon_prop['subset'] + task = avalon_prop['task'] + name = f"{asset}_{subset}" + instance = context.create_instance( + name=name, + family=family, + families=[family], + subset=subset, + asset=asset, + task=task, + ) + members = list(collection.objects) + if family == "animation": + for obj in collection.objects: + if obj.type == 'EMPTY' and obj.get(AVALON_PROPERTY): + for child in obj.children: + if child.type == 'ARMATURE': + members.append(child) + members.append(collection) + instance[:] = members + self.log.debug(json.dumps(instance.data, indent=4)) + for obj in instance: + self.log.debug(obj) diff --git a/openpype/hosts/blender/plugins/publish/extract_blend.py b/openpype/hosts/blender/plugins/publish/extract_blend.py index 60ef20e31c..6687c9fe76 100644 --- a/openpype/hosts/blender/plugins/publish/extract_blend.py +++ b/openpype/hosts/blender/plugins/publish/extract_blend.py @@ -11,7 +11,7 @@ class ExtractBlend(openpype.api.Extractor): label = "Extract Blend" hosts = ["blender"] - families = ["model", "camera", "rig", "action", "layout", "animation"] + families = ["model", "camera", "rig", "action", "layout"] optional = True def process(self, instance): diff --git a/openpype/hosts/blender/plugins/publish/extract_blend_animation.py b/openpype/hosts/blender/plugins/publish/extract_blend_animation.py new file mode 100644 index 0000000000..239ca53f98 --- /dev/null +++ b/openpype/hosts/blender/plugins/publish/extract_blend_animation.py @@ -0,0 +1,53 @@ +import os + +import bpy + +import openpype.api + + +class ExtractBlendAnimation(openpype.api.Extractor): + """Extract a blend file.""" + + label = "Extract Blend" + hosts = ["blender"] + families = ["animation"] + optional = True + + def process(self, instance): + # Define extract output file path + + stagingdir = self.staging_dir(instance) + filename = f"{instance.name}.blend" + filepath = os.path.join(stagingdir, filename) + + # Perform extraction + self.log.info("Performing extraction..") + + data_blocks = set() + + for obj in instance: + if isinstance(obj, bpy.types.Object) and obj.type == 'EMPTY': + child = obj.children[0] + if child and child.type == 'ARMATURE': + if not obj.animation_data: + obj.animation_data_create() + obj.animation_data.action = child.animation_data.action + obj.animation_data_clear() + data_blocks.add(child.animation_data.action) + data_blocks.add(obj) + + bpy.data.libraries.write(filepath, data_blocks) + + if "representations" not in instance.data: + instance.data["representations"] = [] + + representation = { + 'name': 'blend', + 'ext': 'blend', + 'files': filename, + "stagingDir": stagingdir, + } + instance.data["representations"].append(representation) + + self.log.info("Extracted instance '%s' to: %s", + instance.name, representation) diff --git a/openpype/hosts/blender/plugins/publish/extract_fbx_animation.py b/openpype/hosts/blender/plugins/publish/extract_fbx_animation.py index 8312114c7b..16443b760c 100644 --- a/openpype/hosts/blender/plugins/publish/extract_fbx_animation.py +++ b/openpype/hosts/blender/plugins/publish/extract_fbx_animation.py @@ -1,14 +1,16 @@ import os import json -import openpype.api - import bpy import bpy_extras import bpy_extras.anim_utils +from openpype import api +from openpype.hosts.blender.api import plugin +from avalon.blender.pipeline import AVALON_PROPERTY -class ExtractAnimationFBX(openpype.api.Extractor): + +class ExtractAnimationFBX(api.Extractor): """Extract as animation.""" label = "Extract FBX" @@ -20,33 +22,26 @@ class ExtractAnimationFBX(openpype.api.Extractor): # Define extract output file path stagingdir = self.staging_dir(instance) - context = bpy.context - scene = context.scene - # Perform extraction self.log.info("Performing extraction..") - collections = [ - obj for obj in instance if type(obj) is bpy.types.Collection] + # The first collection object in the instance is taken, as there + # should be only one that contains the asset group. + collection = [ + obj for obj in instance if type(obj) is bpy.types.Collection][0] - assert len(collections) == 1, "There should be one and only one " \ - "collection collected for this asset" + # Again, the first object in the collection is taken , as there + # should be only the asset group in the collection. + asset_group = collection.objects[0] - old_scale = scene.unit_settings.scale_length + armature = [ + obj for obj in asset_group.children if obj.type == 'ARMATURE'][0] - # We set the scale of the scene for the export - scene.unit_settings.scale_length = 0.01 - - armatures = [ - obj for obj in collections[0].objects if obj.type == 'ARMATURE'] - - assert len(collections) == 1, "There should be one and only one " \ - "armature collected for this asset" - - armature = armatures[0] + asset_group_name = asset_group.name + asset_group.name = asset_group.get(AVALON_PROPERTY).get("asset_name") armature_name = armature.name - original_name = armature_name.split(':')[0] + original_name = armature_name.split(':')[1] armature.name = original_name object_action_pairs = [] @@ -89,27 +84,29 @@ class ExtractAnimationFBX(openpype.api.Extractor): for obj in bpy.data.objects: obj.select_set(False) + asset_group.select_set(True) armature.select_set(True) fbx_filename = f"{instance.name}_{armature.name}.fbx" filepath = os.path.join(stagingdir, fbx_filename) - override = bpy.context.copy() - override['selected_objects'] = [armature] + override = plugin.create_blender_context( + active=asset_group, selected=[asset_group, armature]) bpy.ops.export_scene.fbx( override, filepath=filepath, + use_active_collection=False, use_selection=True, bake_anim_use_nla_strips=False, bake_anim_use_all_actions=False, add_leaf_bones=False, armature_nodetype='ROOT', - object_types={'ARMATURE'} + object_types={'EMPTY', 'ARMATURE'} ) armature.name = armature_name + asset_group.name = asset_group_name + asset_group.select_set(False) armature.select_set(False) - scene.unit_settings.scale_length = old_scale - # We delete the baked action and set the original one back for i in range(0, len(object_action_pairs)): pair = object_action_pairs[i] @@ -125,18 +122,20 @@ class ExtractAnimationFBX(openpype.api.Extractor): json_filename = f"{instance.name}.json" json_path = os.path.join(stagingdir, json_filename) - json_dict = {} + json_dict = { + "instance_name": asset_group.get(AVALON_PROPERTY).get("namespace") + } - collection = instance.data.get("name") - container = None - for obj in bpy.data.collections[collection].objects: - if obj.type == "ARMATURE": - container_name = obj.get("avalon").get("container_name") - container = bpy.data.collections[container_name] - if container: - json_dict = { - "instance_name": container.get("avalon").get("instance_name") - } + # collection = instance.data.get("name") + # container = None + # for obj in bpy.data.collections[collection].objects: + # if obj.type == "ARMATURE": + # container_name = obj.get("avalon").get("container_name") + # container = bpy.data.collections[container_name] + # if container: + # json_dict = { + # "instance_name": container.get("avalon").get("instance_name") + # } with open(json_path, "w+") as file: json.dump(json_dict, fp=file, indent=2) @@ -159,6 +158,5 @@ class ExtractAnimationFBX(openpype.api.Extractor): instance.data["representations"].append(fbx_representation) instance.data["representations"].append(json_representation) - self.log.info("Extracted instance '{}' to: {}".format( instance.name, fbx_representation)) diff --git a/openpype/hosts/unreal/plugins/publish/extract_layout.py b/openpype/hosts/unreal/plugins/publish/extract_layout.py index 2d9f6eb3d1..a47187cf47 100644 --- a/openpype/hosts/unreal/plugins/publish/extract_layout.py +++ b/openpype/hosts/unreal/plugins/publish/extract_layout.py @@ -83,7 +83,7 @@ class ExtractLayout(openpype.api.Extractor): "z": transform.translation.z }, "rotation": { - "x": math.radians(transform.rotation.euler().x + 90.0), + "x": math.radians(transform.rotation.euler().x), "y": math.radians(transform.rotation.euler().y), "z": math.radians(180.0 - transform.rotation.euler().z) }, From 7789fb8299375f3f471fbd63d6d231659e3cfa7a Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Tue, 10 Aug 2021 12:06:52 +0100 Subject: [PATCH 26/38] Hound fixes --- openpype/hosts/blender/api/plugin.py | 3 ++- openpype/hosts/blender/plugins/load/load_animation.py | 2 +- openpype/hosts/blender/plugins/load/load_layout_json.py | 3 ++- openpype/hosts/blender/plugins/load/load_rig.py | 4 ++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/openpype/hosts/blender/api/plugin.py b/openpype/hosts/blender/api/plugin.py index a126f5702f..50b73ade2b 100644 --- a/openpype/hosts/blender/api/plugin.py +++ b/openpype/hosts/blender/api/plugin.py @@ -174,7 +174,8 @@ class AssetLoader(api.Loader): context: dict, name: Optional[str] = None, namespace: Optional[str] = None, - options: Optional[Dict] = None) -> Optional[bpy.types.Collection]: + options: Optional[Dict] = None + ) -> Optional[bpy.types.Collection]: """Load asset via database Arguments: diff --git a/openpype/hosts/blender/plugins/load/load_animation.py b/openpype/hosts/blender/plugins/load/load_animation.py index 4f589011dd..47c48248b2 100644 --- a/openpype/hosts/blender/plugins/load/load_animation.py +++ b/openpype/hosts/blender/plugins/load/load_animation.py @@ -57,7 +57,7 @@ class BlendAnimationLoader(plugin.AssetLoader): for obj in bpy.data.objects: if obj.get(AVALON_PROPERTY) and obj.get(AVALON_PROPERTY).get( - 'namespace') == target_namespace: + 'namespace') == target_namespace: if obj.children[0]: if not obj.children[0].animation_data: obj.children[0].animation_data_create() diff --git a/openpype/hosts/blender/plugins/load/load_layout_json.py b/openpype/hosts/blender/plugins/load/load_layout_json.py index dfa4501730..1a4dbbb5cb 100644 --- a/openpype/hosts/blender/plugins/load/load_layout_json.py +++ b/openpype/hosts/blender/plugins/load/load_layout_json.py @@ -37,7 +37,8 @@ class JsonLayoutLoader(plugin.AssetLoader): instances = bpy.data.collections.get(AVALON_INSTANCES) if instances: for obj in list(asset_group.children): - anim_collection = instances.children.get(obj.name+"_animation") + anim_collection = instances.children.get( + obj.name + "_animation") if anim_collection: bpy.data.collections.remove(anim_collection) diff --git a/openpype/hosts/blender/plugins/load/load_rig.py b/openpype/hosts/blender/plugins/load/load_rig.py index f3e2991a04..5573c081e1 100644 --- a/openpype/hosts/blender/plugins/load/load_rig.py +++ b/openpype/hosts/blender/plugins/load/load_rig.py @@ -207,7 +207,7 @@ class BlendRigLoader(plugin.AssetLoader): creator_plugin = lib.get_creator_by_name("CreateAnimation") if not creator_plugin: raise ValueError("Creator plugin \"CreateAnimation\" was " - "not found.") + "not found.") asset_group.select_set(True) @@ -215,7 +215,7 @@ class BlendRigLoader(plugin.AssetLoader): api.create( creator_plugin, - name=namespace+"_animation", + name=namespace + "_animation", # name=f"{unique_number}_{subset}_animation", asset=animation_asset, options={"useSelection": False, "asset_group": asset_group}, From e3116b0bd0d4b0f46676c1bef5243abbcdbd306f Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Wed, 11 Aug 2021 22:06:44 +0200 Subject: [PATCH 27/38] better loader error handling --- openpype/hosts/houdini/api/plugin.py | 15 ++++++++++++++- .../plugins/create/create_alembic_camera.py | 2 +- .../houdini/plugins/create/create_composite.py | 2 +- .../houdini/plugins/create/create_pointcache.py | 2 +- .../houdini/plugins/create/create_redshift_rop.py | 2 +- .../plugins/create/create_remote_publish.py | 2 +- .../hosts/houdini/plugins/create/create_usd.py | 2 +- .../houdini/plugins/create/create_usd_model.py | 2 +- .../plugins/create/create_usd_workspaces.py | 2 +- .../houdini/plugins/create/create_usdrender.py | 2 +- .../houdini/plugins/create/create_vbd_cache.py | 2 +- 11 files changed, 24 insertions(+), 11 deletions(-) diff --git a/openpype/hosts/houdini/api/plugin.py b/openpype/hosts/houdini/api/plugin.py index 9820ed49c3..40c4870a06 100644 --- a/openpype/hosts/houdini/api/plugin.py +++ b/openpype/hosts/houdini/api/plugin.py @@ -1,6 +1,19 @@ +# -*- coding: utf-8 -*- +"""Houdini specific Avalon/Pyblish plugin definitions.""" + +import sys + from avalon import houdini +import hou +import six from openpype.api import PypeCreatorMixin class Creator(PypeCreatorMixin, houdini.Creator): - pass + def process(self): + # reraise as standard Python exception so + # Avalon can catch it + try: + self._process() + except hou.Error as er: + six.reraise(Exception, er, sys.exc_info()[2]) diff --git a/openpype/hosts/houdini/plugins/create/create_alembic_camera.py b/openpype/hosts/houdini/plugins/create/create_alembic_camera.py index 99a587b035..a36b6642fa 100644 --- a/openpype/hosts/houdini/plugins/create/create_alembic_camera.py +++ b/openpype/hosts/houdini/plugins/create/create_alembic_camera.py @@ -18,7 +18,7 @@ class CreateAlembicCamera(plugin.Creator): # Set node type to create for output self.data.update({"node_type": "alembic"}) - def process(self): + def _process(self): instance = super(CreateAlembicCamera, self).process() parms = { diff --git a/openpype/hosts/houdini/plugins/create/create_composite.py b/openpype/hosts/houdini/plugins/create/create_composite.py index 7293669bef..06d10f3ad0 100644 --- a/openpype/hosts/houdini/plugins/create/create_composite.py +++ b/openpype/hosts/houdini/plugins/create/create_composite.py @@ -17,7 +17,7 @@ class CreateCompositeSequence(plugin.Creator): # Type of ROP node to create self.data.update({"node_type": "comp"}) - def process(self): + def _process(self): instance = super(CreateCompositeSequence, self).process() parms = {"copoutput": "$HIP/pyblish/%s.$F4.exr" % self.name} diff --git a/openpype/hosts/houdini/plugins/create/create_pointcache.py b/openpype/hosts/houdini/plugins/create/create_pointcache.py index cc452ed806..8aef274340 100644 --- a/openpype/hosts/houdini/plugins/create/create_pointcache.py +++ b/openpype/hosts/houdini/plugins/create/create_pointcache.py @@ -17,7 +17,7 @@ class CreatePointCache(plugin.Creator): self.data.update({"node_type": "alembic"}) - def process(self): + def _process(self): instance = super(CreatePointCache, self).process() parms = { diff --git a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py index 40d2ac58c7..3798bd8240 100644 --- a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py @@ -27,7 +27,7 @@ class CreateRedshiftROP(plugin.Creator): self.data.update({"node_type": "Redshift_ROP"}) - def process(self): + def _process(self): instance = super(CreateRedshiftROP, self).process() basename = instance.name() diff --git a/openpype/hosts/houdini/plugins/create/create_remote_publish.py b/openpype/hosts/houdini/plugins/create/create_remote_publish.py index b9782209cd..66ed35c618 100644 --- a/openpype/hosts/houdini/plugins/create/create_remote_publish.py +++ b/openpype/hosts/houdini/plugins/create/create_remote_publish.py @@ -9,7 +9,7 @@ class CreateRemotePublish(plugin.Creator): family = "remotePublish" icon = "cloud-upload" - def process(self): + def _process(self): """This is a stub creator process. This does not create a regular instance that the instance collector diff --git a/openpype/hosts/houdini/plugins/create/create_usd.py b/openpype/hosts/houdini/plugins/create/create_usd.py index 642612f465..96c56c2918 100644 --- a/openpype/hosts/houdini/plugins/create/create_usd.py +++ b/openpype/hosts/houdini/plugins/create/create_usd.py @@ -16,7 +16,7 @@ class CreateUSD(plugin.Creator): self.data.update({"node_type": "usd"}) - def process(self): + def _process(self): instance = super(CreateUSD, self).process() parms = { diff --git a/openpype/hosts/houdini/plugins/create/create_usd_model.py b/openpype/hosts/houdini/plugins/create/create_usd_model.py index 5276211f2c..3e4e7d9d69 100644 --- a/openpype/hosts/houdini/plugins/create/create_usd_model.py +++ b/openpype/hosts/houdini/plugins/create/create_usd_model.py @@ -10,7 +10,7 @@ class CreateUSDModel(plugin.Creator): family = "usdModel" icon = "gears" - def process(self): + def _process(self): node_type = "op::author_model:1.0" diff --git a/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py b/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py index fc8ef5c810..2b4577ba41 100644 --- a/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py +++ b/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py @@ -10,7 +10,7 @@ class _USDWorkspace(plugin.Creator): step = None icon = "gears" - def process(self): + def _process(self): if not all([self.node_type, self.node_name, self.step]): self.log.error("Incomplete USD Workspace parameters") diff --git a/openpype/hosts/houdini/plugins/create/create_usdrender.py b/openpype/hosts/houdini/plugins/create/create_usdrender.py index 34e1a9cc54..9070457864 100644 --- a/openpype/hosts/houdini/plugins/create/create_usdrender.py +++ b/openpype/hosts/houdini/plugins/create/create_usdrender.py @@ -19,7 +19,7 @@ class CreateUSDRender(plugin.Creator): self.data.update({"node_type": "usdrender_rop"}) - def process(self): + def _process(self): instance = super(CreateUSDRender, self).process() parms = { diff --git a/openpype/hosts/houdini/plugins/create/create_vbd_cache.py b/openpype/hosts/houdini/plugins/create/create_vbd_cache.py index 677c3d5a9a..b069be3f83 100644 --- a/openpype/hosts/houdini/plugins/create/create_vbd_cache.py +++ b/openpype/hosts/houdini/plugins/create/create_vbd_cache.py @@ -18,7 +18,7 @@ class CreateVDBCache(plugin.Creator): # Set node type to create for output self.data["node_type"] = "geometry" - def process(self): + def _process(self): instance = super(CreateVDBCache, self).process() parms = { From 86a3821657bc0aa9f7e8e35cc3f55115527131ff Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Thu, 12 Aug 2021 12:08:34 +0200 Subject: [PATCH 28/38] fix infinite recursion --- openpype/hosts/houdini/api/plugin.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/openpype/hosts/houdini/api/plugin.py b/openpype/hosts/houdini/api/plugin.py index 40c4870a06..610f260426 100644 --- a/openpype/hosts/houdini/api/plugin.py +++ b/openpype/hosts/houdini/api/plugin.py @@ -1,11 +1,7 @@ # -*- coding: utf-8 -*- """Houdini specific Avalon/Pyblish plugin definitions.""" - -import sys - from avalon import houdini import hou -import six from openpype.api import PypeCreatorMixin @@ -16,4 +12,6 @@ class Creator(PypeCreatorMixin, houdini.Creator): try: self._process() except hou.Error as er: - six.reraise(Exception, er, sys.exc_info()[2]) + # cannot do re-raise with six as it will cause + # infinite recursion. + raise Exception(er) From 9bb8fe23f786c10629c02a78fdd33cecdfb566f8 Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Thu, 12 Aug 2021 17:57:35 +0200 Subject: [PATCH 29/38] add creators to Settings --- openpype/hosts/houdini/api/plugin.py | 16 ++++-- .../plugins/create/create_alembic_camera.py | 8 ++- .../plugins/create/create_composite.py | 8 ++- .../plugins/create/create_pointcache.py | 8 ++- .../plugins/create/create_redshift_rop.py | 8 ++- .../plugins/create/create_remote_publish.py | 2 +- .../houdini/plugins/create/create_usd.py | 9 +++- .../plugins/create/create_usd_model.py | 8 ++- .../plugins/create/create_usd_workspaces.py | 7 ++- .../plugins/create/create_usdrender.py | 8 ++- .../plugins/create/create_vbd_cache.py | 8 ++- .../defaults/project_settings/houdini.json | 42 +++++++++++++++ .../schema_project_houdini.json | 4 ++ .../schemas/schema_houdini_create.json | 54 +++++++++++++++++++ 14 files changed, 168 insertions(+), 22 deletions(-) create mode 100644 openpype/settings/entities/schemas/projects_schema/schemas/schema_houdini_create.json diff --git a/openpype/hosts/houdini/api/plugin.py b/openpype/hosts/houdini/api/plugin.py index 610f260426..d84427bfee 100644 --- a/openpype/hosts/houdini/api/plugin.py +++ b/openpype/hosts/houdini/api/plugin.py @@ -1,17 +1,23 @@ # -*- coding: utf-8 -*- """Houdini specific Avalon/Pyblish plugin definitions.""" +import sys from avalon import houdini +import six + import hou from openpype.api import PypeCreatorMixin +class OpenPypeCreatorError(Exception): + pass + + class Creator(PypeCreatorMixin, houdini.Creator): def process(self): - # reraise as standard Python exception so + instance = super(houdini.Creator, self).process() + # re-raise as standard Python exception so # Avalon can catch it try: - self._process() + self._process(instance) except hou.Error as er: - # cannot do re-raise with six as it will cause - # infinite recursion. - raise Exception(er) + six.reraise(OpenPypeCreatorError, OpenPypeCreatorError("Creator error"), sys.exc_info()[2]) diff --git a/openpype/hosts/houdini/plugins/create/create_alembic_camera.py b/openpype/hosts/houdini/plugins/create/create_alembic_camera.py index a36b6642fa..d65e2a5e98 100644 --- a/openpype/hosts/houdini/plugins/create/create_alembic_camera.py +++ b/openpype/hosts/houdini/plugins/create/create_alembic_camera.py @@ -18,9 +18,13 @@ class CreateAlembicCamera(plugin.Creator): # Set node type to create for output self.data.update({"node_type": "alembic"}) - def _process(self): - instance = super(CreateAlembicCamera, self).process() + def _process(self, instance): + """Creator main entry point. + Args: + instance (hou.Node): Created Houdini instance. + + """ parms = { "filename": "$HIP/pyblish/%s.abc" % self.name, "use_sop_path": False, diff --git a/openpype/hosts/houdini/plugins/create/create_composite.py b/openpype/hosts/houdini/plugins/create/create_composite.py index 06d10f3ad0..d19c97de86 100644 --- a/openpype/hosts/houdini/plugins/create/create_composite.py +++ b/openpype/hosts/houdini/plugins/create/create_composite.py @@ -17,9 +17,13 @@ class CreateCompositeSequence(plugin.Creator): # Type of ROP node to create self.data.update({"node_type": "comp"}) - def _process(self): - instance = super(CreateCompositeSequence, self).process() + def _process(self, instance): + """Creator main entry point. + Args: + instance (hou.Node): Created Houdini instance. + + """ parms = {"copoutput": "$HIP/pyblish/%s.$F4.exr" % self.name} if self.nodes: diff --git a/openpype/hosts/houdini/plugins/create/create_pointcache.py b/openpype/hosts/houdini/plugins/create/create_pointcache.py index 8aef274340..28468bf073 100644 --- a/openpype/hosts/houdini/plugins/create/create_pointcache.py +++ b/openpype/hosts/houdini/plugins/create/create_pointcache.py @@ -17,9 +17,13 @@ class CreatePointCache(plugin.Creator): self.data.update({"node_type": "alembic"}) - def _process(self): - instance = super(CreatePointCache, self).process() + def _process(self, instance): + """Creator main entry point. + Args: + instance (hou.Node): Created Houdini instance. + + """ parms = { "use_sop_path": True, # Export single node from SOP Path "build_from_path": True, # Direct path of primitive in output diff --git a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py index 3798bd8240..06b70a01c2 100644 --- a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py @@ -27,9 +27,13 @@ class CreateRedshiftROP(plugin.Creator): self.data.update({"node_type": "Redshift_ROP"}) - def _process(self): - instance = super(CreateRedshiftROP, self).process() + def _process(self, instance): + """Creator main entry point. + Args: + instance (hou.Node): Created Houdini instance. + + """ basename = instance.name() instance.setName(basename + "_ROP", unique_name=True) diff --git a/openpype/hosts/houdini/plugins/create/create_remote_publish.py b/openpype/hosts/houdini/plugins/create/create_remote_publish.py index 66ed35c618..18074fa560 100644 --- a/openpype/hosts/houdini/plugins/create/create_remote_publish.py +++ b/openpype/hosts/houdini/plugins/create/create_remote_publish.py @@ -9,7 +9,7 @@ class CreateRemotePublish(plugin.Creator): family = "remotePublish" icon = "cloud-upload" - def _process(self): + def _process(self, instance): """This is a stub creator process. This does not create a regular instance that the instance collector diff --git a/openpype/hosts/houdini/plugins/create/create_usd.py b/openpype/hosts/houdini/plugins/create/create_usd.py index 96c56c2918..076197bace 100644 --- a/openpype/hosts/houdini/plugins/create/create_usd.py +++ b/openpype/hosts/houdini/plugins/create/create_usd.py @@ -7,6 +7,7 @@ class CreateUSD(plugin.Creator): label = "USD" family = "usd" icon = "gears" + enabled = False def __init__(self, *args, **kwargs): super(CreateUSD, self).__init__(*args, **kwargs) @@ -16,9 +17,13 @@ class CreateUSD(plugin.Creator): self.data.update({"node_type": "usd"}) - def _process(self): - instance = super(CreateUSD, self).process() + def _process(self, instance): + """Creator main entry point. + Args: + instance (hou.Node): Created Houdini instance. + + """ parms = { "lopoutput": "$HIP/pyblish/%s.usd" % self.name, "enableoutputprocessor_simplerelativepaths": False, diff --git a/openpype/hosts/houdini/plugins/create/create_usd_model.py b/openpype/hosts/houdini/plugins/create/create_usd_model.py index 3e4e7d9d69..5e6bd9e3b0 100644 --- a/openpype/hosts/houdini/plugins/create/create_usd_model.py +++ b/openpype/hosts/houdini/plugins/create/create_usd_model.py @@ -10,8 +10,13 @@ class CreateUSDModel(plugin.Creator): family = "usdModel" icon = "gears" - def _process(self): + def _process(self, instance): + """Creator main entry point. + Args: + instance (hou.Node): Created Houdini instance. + + """ node_type = "op::author_model:1.0" subset = self.data["subset"] @@ -20,6 +25,7 @@ class CreateUSDModel(plugin.Creator): # Get stage root and create node stage = hou.node("/stage") + print("creating node {}/{}".format(node_type, name)) instance = stage.createNode(node_type, node_name=name) instance.moveToGoodPosition(move_unconnected=True) diff --git a/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py b/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py index 2b4577ba41..0e24ca086b 100644 --- a/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py +++ b/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py @@ -10,8 +10,13 @@ class _USDWorkspace(plugin.Creator): step = None icon = "gears" - def _process(self): + def _process(self, instance): + """Creator main entry point. + Args: + instance (hou.Node): Created Houdini instance. + + """ if not all([self.node_type, self.node_name, self.step]): self.log.error("Incomplete USD Workspace parameters") return diff --git a/openpype/hosts/houdini/plugins/create/create_usdrender.py b/openpype/hosts/houdini/plugins/create/create_usdrender.py index 9070457864..5cf03a211f 100644 --- a/openpype/hosts/houdini/plugins/create/create_usdrender.py +++ b/openpype/hosts/houdini/plugins/create/create_usdrender.py @@ -19,9 +19,13 @@ class CreateUSDRender(plugin.Creator): self.data.update({"node_type": "usdrender_rop"}) - def _process(self): - instance = super(CreateUSDRender, self).process() + def _process(self, instance): + """Creator main entry point. + Args: + instance (hou.Node): Created Houdini instance. + + """ parms = { # Render frame range "trange": 1 diff --git a/openpype/hosts/houdini/plugins/create/create_vbd_cache.py b/openpype/hosts/houdini/plugins/create/create_vbd_cache.py index b069be3f83..2047ae2e76 100644 --- a/openpype/hosts/houdini/plugins/create/create_vbd_cache.py +++ b/openpype/hosts/houdini/plugins/create/create_vbd_cache.py @@ -18,9 +18,13 @@ class CreateVDBCache(plugin.Creator): # Set node type to create for output self.data["node_type"] = "geometry" - def _process(self): - instance = super(CreateVDBCache, self).process() + def _process(self, instance): + """Creator main entry point. + Args: + instance (hou.Node): Created Houdini instance. + + """ parms = { "sopoutput": "$HIP/pyblish/%s.$F4.vdb" % self.name, "initsim": True, diff --git a/openpype/settings/defaults/project_settings/houdini.json b/openpype/settings/defaults/project_settings/houdini.json index 811a446e59..809c732d6f 100644 --- a/openpype/settings/defaults/project_settings/houdini.json +++ b/openpype/settings/defaults/project_settings/houdini.json @@ -1,4 +1,46 @@ { + "create": { + "CreateAlembicCamera": { + "enabled": true, + "defaults": [] + }, + "CreateCompositeSequence": { + "enabled": true, + "defaults": [] + }, + "CreatePointCache": { + "enabled": true, + "defaults": [] + }, + "CreateRedshiftROP": { + "enabled": true, + "defaults": [] + }, + "CreateRemotePublish": { + "enabled": true, + "defaults": [] + }, + "CreateVDBCache": { + "enabled": true, + "defaults": [] + }, + "CreateUSD": { + "enabled": false, + "defaults": [] + }, + "CreateUSDModel": { + "enabled": false, + "defaults": [] + }, + "USDCreateShadingWorkspace": { + "enabled": false, + "defaults": [] + }, + "CreateUSDRender": { + "enabled": false, + "defaults": [] + } + }, "publish": { "ValidateContainers": { "enabled": true, diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_houdini.json b/openpype/settings/entities/schemas/projects_schema/schema_project_houdini.json index c6de257a61..cad99dde22 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_houdini.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_houdini.json @@ -5,6 +5,10 @@ "label": "Houdini", "is_file": true, "children": [ + { + "type": "schema", + "name": "schema_houdini_create" + }, { "type": "dict", "collapsible": true, diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_houdini_create.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_houdini_create.json new file mode 100644 index 0000000000..72b8032d4b --- /dev/null +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_houdini_create.json @@ -0,0 +1,54 @@ +{ + "type": "dict", + "collapsible": true, + "key": "create", + "label": "Creator plugins", + "children": [ + { + "type": "schema_template", + "name": "template_create_plugin", + "template_data": [ + { + "key": "CreateAlembicCamera", + "label": "Create Alembic Camera" + }, + { + "key": "CreateCompositeSequence", + "label": "Create Composite (Image Sequence)" + }, + { + "key": "CreatePointCache", + "label": "Create Point Cache" + }, + { + "key": "CreateRedshiftROP", + "label": "Create Redshift ROP" + }, + { + "key": "CreateRemotePublish", + "label": "Create Remote Publish" + }, + { + "key": "CreateVDBCache", + "label": "Create VDB Cache" + }, + { + "key": "CreateUSD", + "label": "Create USD" + }, + { + "key": "CreateUSDModel", + "label": "Create USD Model" + }, + { + "key": "USDCreateShadingWorkspace", + "label": "Create USD Shading Workspace" + }, + { + "key": "CreateUSDRender", + "label": "Create USD Render" + } + ] + } + ] +} \ No newline at end of file From 44a3515ec99d7dc9915f519dd8a4771841f44566 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Aug 2021 00:59:04 +0000 Subject: [PATCH 30/38] Bump path-parse from 1.0.6 to 1.0.7 in /website Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] --- website/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/yarn.lock b/website/yarn.lock index a63bf37731..88f3db082e 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -6168,9 +6168,9 @@ path-key@^3.0.0, path-key@^3.1.0: integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" From e19e4f58ec9f07c57018da9746da8b14ed996290 Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Wed, 18 Aug 2021 19:02:39 +0200 Subject: [PATCH 31/38] add pre-launch hook, minor fixes --- openpype/hosts/houdini/api/plugin.py | 6 +- openpype/hosts/houdini/hooks/set_paths.py | 18 ++++++ .../plugins/create/create_alembic_camera.py | 1 - .../plugins/create/create_composite.py | 9 ++- .../plugins/create/create_redshift_rop.py | 10 +++- .../plugins/create/create_remote_publish.py | 21 ------- .../plugins/create/create_usd_model.py | 40 ------------- .../plugins/create/create_usd_workspaces.py | 59 ------------------- .../plugins/publish/extract_alembic.py | 3 - .../plugins/publish/extract_composite.py | 1 - .../houdini/plugins/publish/extract_usd.py | 13 ++-- .../plugins/publish/extract_usd_layered.py | 3 +- .../plugins/publish/extract_vdb_cache.py | 9 +-- .../publish/validate_outnode_exists.py | 50 ---------------- openpype/hosts/houdini/startup/scripts/123.py | 1 - 15 files changed, 48 insertions(+), 196 deletions(-) create mode 100644 openpype/hosts/houdini/hooks/set_paths.py delete mode 100644 openpype/hosts/houdini/plugins/create/create_remote_publish.py delete mode 100644 openpype/hosts/houdini/plugins/create/create_usd_model.py delete mode 100644 openpype/hosts/houdini/plugins/create/create_usd_workspaces.py delete mode 100644 openpype/hosts/houdini/plugins/publish/validate_outnode_exists.py diff --git a/openpype/hosts/houdini/api/plugin.py b/openpype/hosts/houdini/api/plugin.py index d84427bfee..989bae12e3 100644 --- a/openpype/hosts/houdini/api/plugin.py +++ b/openpype/hosts/houdini/api/plugin.py @@ -14,10 +14,10 @@ class OpenPypeCreatorError(Exception): class Creator(PypeCreatorMixin, houdini.Creator): def process(self): - instance = super(houdini.Creator, self).process() - # re-raise as standard Python exception so - # Avalon can catch it try: + # re-raise as standard Python exception so + # Avalon can catch it + instance = super(Creator, self).process() self._process(instance) except hou.Error as er: six.reraise(OpenPypeCreatorError, OpenPypeCreatorError("Creator error"), sys.exc_info()[2]) diff --git a/openpype/hosts/houdini/hooks/set_paths.py b/openpype/hosts/houdini/hooks/set_paths.py new file mode 100644 index 0000000000..cd2f98fb76 --- /dev/null +++ b/openpype/hosts/houdini/hooks/set_paths.py @@ -0,0 +1,18 @@ +from openpype.lib import PreLaunchHook +import os + + +class SetPath(PreLaunchHook): + """Set current dir to workdir. + + Hook `GlobalHostDataHook` must be executed before this hook. + """ + app_groups = ["houdini"] + + def execute(self): + workdir = self.launch_context.env.get("AVALON_WORKDIR", "") + if not workdir: + self.log.warning("BUG: Workdir is not filled.") + return + + os.chdir(workdir) diff --git a/openpype/hosts/houdini/plugins/create/create_alembic_camera.py b/openpype/hosts/houdini/plugins/create/create_alembic_camera.py index d65e2a5e98..043cd0945f 100644 --- a/openpype/hosts/houdini/plugins/create/create_alembic_camera.py +++ b/openpype/hosts/houdini/plugins/create/create_alembic_camera.py @@ -33,7 +33,6 @@ class CreateAlembicCamera(plugin.Creator): if self.nodes: node = self.nodes[0] path = node.path() - # Split the node path into the first root and the remainder # So we can set the root and objects parameters correctly _, root, remainder = path.split("/", 2) diff --git a/openpype/hosts/houdini/plugins/create/create_composite.py b/openpype/hosts/houdini/plugins/create/create_composite.py index d19c97de86..e278708076 100644 --- a/openpype/hosts/houdini/plugins/create/create_composite.py +++ b/openpype/hosts/houdini/plugins/create/create_composite.py @@ -35,5 +35,10 @@ class CreateCompositeSequence(plugin.Creator): # Lock any parameters in this list to_lock = ["prim_to_detail_pattern"] for name in to_lock: - parm = instance.parm(name) - parm.lock(True) + try: + parm = instance.parm(name) + parm.lock(True) + except AttributeError: + # missing lock pattern + self.log.debug( + "missing lock pattern {}".format(name)) diff --git a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py index 06b70a01c2..6949ca169b 100644 --- a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py @@ -38,9 +38,13 @@ class CreateRedshiftROP(plugin.Creator): instance.setName(basename + "_ROP", unique_name=True) # Also create the linked Redshift IPR Rop - ipr_rop = self.parent.createNode( - "Redshift_IPR", node_name=basename + "_IPR" - ) + try: + ipr_rop = self.parent.createNode( + "Redshift_IPR", node_name=basename + "_IPR" + ) + except hou.OperationFailed: + raise Exception(("Cannot create Redshift node. Is Redshift " + "installed and enabled?")) # Move it to directly under the Redshift ROP ipr_rop.setPosition(instance.position() + hou.Vector2(0, -1)) diff --git a/openpype/hosts/houdini/plugins/create/create_remote_publish.py b/openpype/hosts/houdini/plugins/create/create_remote_publish.py deleted file mode 100644 index 18074fa560..0000000000 --- a/openpype/hosts/houdini/plugins/create/create_remote_publish.py +++ /dev/null @@ -1,21 +0,0 @@ -from openpype.hosts.houdini.api import plugin -from openpype.hosts.houdini.api import lib - - -class CreateRemotePublish(plugin.Creator): - """Create Remote Publish Submission Settings node.""" - - label = "Remote Publish" - family = "remotePublish" - icon = "cloud-upload" - - def _process(self, instance): - """This is a stub creator process. - - This does not create a regular instance that the instance collector - picks up. Instead we force this one to solely create something we - explicitly want to create. The only reason this class is here is so - that Artists can also create the node through the Avalon creator. - - """ - lib.create_remote_publish_node(force=True) diff --git a/openpype/hosts/houdini/plugins/create/create_usd_model.py b/openpype/hosts/houdini/plugins/create/create_usd_model.py deleted file mode 100644 index 5e6bd9e3b0..0000000000 --- a/openpype/hosts/houdini/plugins/create/create_usd_model.py +++ /dev/null @@ -1,40 +0,0 @@ -import re -from openpype.hosts.houdini.api import plugin -import hou - - -class CreateUSDModel(plugin.Creator): - """Author USD Model""" - - label = "USD Model" - family = "usdModel" - icon = "gears" - - def _process(self, instance): - """Creator main entry point. - - Args: - instance (hou.Node): Created Houdini instance. - - """ - node_type = "op::author_model:1.0" - - subset = self.data["subset"] - name = "author_{}".format(subset) - variant = re.match("usdModel(.*)", subset).group(1) - - # Get stage root and create node - stage = hou.node("/stage") - print("creating node {}/{}".format(node_type, name)) - instance = stage.createNode(node_type, node_name=name) - instance.moveToGoodPosition(move_unconnected=True) - - parms = {"asset_name": self.data["asset"], "variant_name": variant} - - # Set the Geo Path to the first selected node (if any) - selection = hou.selectedNodes() - if selection: - node = selection[0] - parms["geo_path"] = node.path() - - instance.setParms(parms) diff --git a/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py b/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py deleted file mode 100644 index 0e24ca086b..0000000000 --- a/openpype/hosts/houdini/plugins/create/create_usd_workspaces.py +++ /dev/null @@ -1,59 +0,0 @@ -from openpype.hosts.houdini.api import plugin -import hou - - -class _USDWorkspace(plugin.Creator): - """Base class to create pre-built USD Workspaces""" - - node_name = None - node_type = None - step = None - icon = "gears" - - def _process(self, instance): - """Creator main entry point. - - Args: - instance (hou.Node): Created Houdini instance. - - """ - if not all([self.node_type, self.node_name, self.step]): - self.log.error("Incomplete USD Workspace parameters") - return - - name = self.node_name - node_type = self.node_type - - # Force the subset to "{asset}.{step}.usd" - subset = "usd{step}".format(step=self.step) - self.data["subset"] = subset - - # Get stage root and create node - stage = hou.node("/stage") - instance = stage.createNode(node_type, node_name=name) - instance.moveToGoodPosition() - - # With the Workspace HDAs there is no need to imprint the instance data - # since this data is pre-built into it. However, we do set the right - # asset as that can be defined by the user. - parms = {"asset": self.data["asset"]} - instance.setParms(parms) - - return instance - - -class USDCreateShadingWorkspace(_USDWorkspace): - """USD Shading Workspace""" - - defaults = ["Shade"] - - label = "USD Shading Workspace" - family = "colorbleed.shade.usd" - - node_type = "op::shadingWorkspace::1.0" - node_name = "shadingWorkspace" - step = "Shade" - - -# Don't allow the base class to be picked up by Avalon -del _USDWorkspace diff --git a/openpype/hosts/houdini/plugins/publish/extract_alembic.py b/openpype/hosts/houdini/plugins/publish/extract_alembic.py index 23f926254b..83b790407f 100644 --- a/openpype/hosts/houdini/plugins/publish/extract_alembic.py +++ b/openpype/hosts/houdini/plugins/publish/extract_alembic.py @@ -10,13 +10,10 @@ class ExtractAlembic(openpype.api.Extractor): order = pyblish.api.ExtractorOrder label = "Extract Alembic" hosts = ["houdini"] - targets = ["local"] families = ["pointcache", "camera"] def process(self, instance): - import hou - ropnode = instance[0] # Get the filename from the filename parameter diff --git a/openpype/hosts/houdini/plugins/publish/extract_composite.py b/openpype/hosts/houdini/plugins/publish/extract_composite.py index 63cee5d9c9..f300b6d28d 100644 --- a/openpype/hosts/houdini/plugins/publish/extract_composite.py +++ b/openpype/hosts/houdini/plugins/publish/extract_composite.py @@ -11,7 +11,6 @@ class ExtractComposite(openpype.api.Extractor): order = pyblish.api.ExtractorOrder label = "Extract Composite (Image Sequence)" hosts = ["houdini"] - targets = ["local"] families = ["imagesequence"] def process(self, instance): diff --git a/openpype/hosts/houdini/plugins/publish/extract_usd.py b/openpype/hosts/houdini/plugins/publish/extract_usd.py index ae1dfb3f8f..0fc26900fb 100644 --- a/openpype/hosts/houdini/plugins/publish/extract_usd.py +++ b/openpype/hosts/houdini/plugins/publish/extract_usd.py @@ -10,7 +10,6 @@ class ExtractUSD(openpype.api.Extractor): order = pyblish.api.ExtractorOrder label = "Extract USD" hosts = ["houdini"] - targets = ["local"] families = ["usd", "usdModel", "usdSetDress"] @@ -31,7 +30,13 @@ class ExtractUSD(openpype.api.Extractor): assert os.path.exists(output), "Output does not exist: %s" % output - if "files" not in instance.data: - instance.data["files"] = [] + if "representations" not in instance.data: + instance.data["representations"] = [] - instance.data["files"].append(file_name) + representation = { + 'name': 'usd', + 'ext': 'usd', + 'files': file_name, + "stagingDir": staging_dir, + } + instance.data["representations"].append(representation) diff --git a/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py b/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py index b9741c50ca..645bd05d4b 100644 --- a/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py +++ b/openpype/hosts/houdini/plugins/publish/extract_usd_layered.py @@ -155,8 +155,7 @@ class ExtractUSDLayered(openpype.api.Extractor): order = pyblish.api.ExtractorOrder label = "Extract Layered USD" hosts = ["houdini"] - targets = ["local"] - families = ["colorbleed.usd.layered", "usdShade"] + families = ["usdLayered", "usdShade"] # Force Output Processors so it will always save any file # into our unique staging directory with processed Avalon paths diff --git a/openpype/hosts/houdini/plugins/publish/extract_vdb_cache.py b/openpype/hosts/houdini/plugins/publish/extract_vdb_cache.py index 432faf68c3..78794acc97 100644 --- a/openpype/hosts/houdini/plugins/publish/extract_vdb_cache.py +++ b/openpype/hosts/houdini/plugins/publish/extract_vdb_cache.py @@ -2,7 +2,7 @@ import os import pyblish.api import openpype.api -from openpype.hosts.api.houdini.lib import render_rop +from openpype.hosts.houdini.api.lib import render_rop class ExtractVDBCache(openpype.api.Extractor): @@ -10,13 +10,10 @@ class ExtractVDBCache(openpype.api.Extractor): order = pyblish.api.ExtractorOrder + 0.1 label = "Extract VDB Cache" families = ["vdbcache"] - targets = ["local"] hosts = ["houdini"] def process(self, instance): - import hou - ropnode = instance[0] # Get the filename from the filename parameter @@ -36,8 +33,8 @@ class ExtractVDBCache(openpype.api.Extractor): instance.data["representations"] = [] representation = { - "name": "mov", - "ext": "mov", + "name": "vdb", + "ext": "vdb", "files": output, "stagingDir": staging_dir, } diff --git a/openpype/hosts/houdini/plugins/publish/validate_outnode_exists.py b/openpype/hosts/houdini/plugins/publish/validate_outnode_exists.py deleted file mode 100644 index aedc68d5df..0000000000 --- a/openpype/hosts/houdini/plugins/publish/validate_outnode_exists.py +++ /dev/null @@ -1,50 +0,0 @@ -import pyblish.api -import openpype.api - - -class ValidatOutputNodeExists(pyblish.api.InstancePlugin): - """Validate if node attribute Create intermediate Directories is turned on. - - Rules: - * The node must have Create intermediate Directories turned on to - ensure the output file will be created - - """ - - order = openpype.api.ValidateContentsOrder - families = ["*"] - hosts = ["houdini"] - label = "Output Node Exists" - - def process(self, instance): - invalid = self.get_invalid(instance) - if invalid: - raise RuntimeError("Could not find output node(s)!") - - @classmethod - def get_invalid(cls, instance): - - import hou - - result = set() - - node = instance[0] - if node.type().name() == "alembic": - soppath_parm = "sop_path" - else: - # Fall back to geometry node - soppath_parm = "soppath" - - sop_path = node.parm(soppath_parm).eval() - output_node = hou.node(sop_path) - - if output_node is None: - cls.log.error("Node at '%s' does not exist" % sop_path) - result.add(node.path()) - - # Added cam as this is a legit output type (cameras can't - if output_node.type().name() not in ["output", "cam"]: - cls.log.error("SOP Path does not end path at output node") - result.add(node.path()) - - return result diff --git a/openpype/hosts/houdini/startup/scripts/123.py b/openpype/hosts/houdini/startup/scripts/123.py index 6d90b8352e..4233d68c15 100644 --- a/openpype/hosts/houdini/startup/scripts/123.py +++ b/openpype/hosts/houdini/startup/scripts/123.py @@ -1,5 +1,4 @@ from avalon import api, houdini -import hou def main(): From c6a52d6abba316035cf55844b8857f484904d639 Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Thu, 19 Aug 2021 10:30:03 +0200 Subject: [PATCH 32/38] =?UTF-8?q?set=20frame=20range=20for=20camera=20alem?= =?UTF-8?q?bic,=20first=20hit=20on=20documentation=20=F0=9F=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/create/create_alembic_camera.py | 1 + website/docs/artist_hosts_houdini.md | 26 +++++++++++++++++++ website/sidebars.js | 1 + 3 files changed, 28 insertions(+) create mode 100644 website/docs/artist_hosts_houdini.md diff --git a/openpype/hosts/houdini/plugins/create/create_alembic_camera.py b/openpype/hosts/houdini/plugins/create/create_alembic_camera.py index 043cd0945f..eef86005f5 100644 --- a/openpype/hosts/houdini/plugins/create/create_alembic_camera.py +++ b/openpype/hosts/houdini/plugins/create/create_alembic_camera.py @@ -43,3 +43,4 @@ class CreateAlembicCamera(plugin.Creator): # Lock the Use Sop Path setting so the # user doesn't accidentally enable it. instance.parm("use_sop_path").lock(True) + instance.parm("trange").set(1) diff --git a/website/docs/artist_hosts_houdini.md b/website/docs/artist_hosts_houdini.md new file mode 100644 index 0000000000..d9d85394e2 --- /dev/null +++ b/website/docs/artist_hosts_houdini.md @@ -0,0 +1,26 @@ +--- +id: artist_hosts_houdini +title: Houdini +sidebar_label: Houdini +--- + +## OpenPype global tools + +- [Work Files](artist_tools.md#workfiles) +- [Create](artist_tools.md#creator) +- [Load](artist_tools.md#loader) +- [Manage (Inventory)](artist_tools.md#inventory) +- [Publish](artist_tools.md#publisher) +- [Library Loader](artist_tools.md#library-loader) + +## Publishing +### Publishing Alembic Cameras +You can publish baked camera in Alembic format. Select your camera and go **OpenPype -> Create** and select **Camera (abc)**. +This will create Alembic Driver node in **out** with path and frame range already set. This node will have a name you've +assigned in the **Creator** menu. For example if you name the subset `Default`, output Alembic Driver will be named +`cameraDefault`. After that, you can **OpenPype -> Publish** and after some validations your camera will be published +to `abc` file. + +### Composite - Image Sequence +You can publish image sequence directly from Houdini. You can use any `cop` network you have and publish image +sequence generated from it. \ No newline at end of file diff --git a/website/sidebars.js b/website/sidebars.js index 488814a385..3a4b933b9a 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -22,6 +22,7 @@ module.exports = { "artist_hosts_maya", "artist_hosts_blender", "artist_hosts_harmony", + "artist_hosts_houdini", "artist_hosts_aftereffects", "artist_hosts_resolve", "artist_hosts_photoshop", From 2191385f9f9bbafb175b79fac44c9dda78478010 Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Thu, 19 Aug 2021 13:18:12 +0200 Subject: [PATCH 33/38] =?UTF-8?q?expanded=20documentation=20=F0=9F=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/create/create_pointcache.py | 1 + .../plugins/create/create_usdrender.py | 5 +- .../plugins/create/create_vbd_cache.py | 1 + website/docs/artist_hosts_houdini.md | 62 ++++++++++++++++-- .../docs/assets/houdini_imagesequence_cop.png | Bin 0 -> 19661 bytes .../docs/assets/houdini_pointcache_path.png | Bin 0 -> 80679 bytes website/docs/assets/houdini_usd_stage.png | Bin 0 -> 762416 bytes website/docs/assets/houdini_vdb_setup.png | Bin 0 -> 28411 bytes 8 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 website/docs/assets/houdini_imagesequence_cop.png create mode 100644 website/docs/assets/houdini_pointcache_path.png create mode 100644 website/docs/assets/houdini_usd_stage.png create mode 100644 website/docs/assets/houdini_vdb_setup.png diff --git a/openpype/hosts/houdini/plugins/create/create_pointcache.py b/openpype/hosts/houdini/plugins/create/create_pointcache.py index 28468bf073..feb683edf6 100644 --- a/openpype/hosts/houdini/plugins/create/create_pointcache.py +++ b/openpype/hosts/houdini/plugins/create/create_pointcache.py @@ -39,6 +39,7 @@ class CreatePointCache(plugin.Creator): parms.update({"sop_path": node.path()}) instance.setParms(parms) + instance.parm("trange").set(1) # Lock any parameters in this list to_lock = ["prim_to_detail_pattern"] diff --git a/openpype/hosts/houdini/plugins/create/create_usdrender.py b/openpype/hosts/houdini/plugins/create/create_usdrender.py index 5cf03a211f..9b98f59ac1 100644 --- a/openpype/hosts/houdini/plugins/create/create_usdrender.py +++ b/openpype/hosts/houdini/plugins/create/create_usdrender.py @@ -17,7 +17,7 @@ class CreateUSDRender(plugin.Creator): # Remove the active, we are checking the bypass flag of the nodes self.data.pop("active", None) - self.data.update({"node_type": "usdrender_rop"}) + self.data.update({"node_type": "usdrender"}) def _process(self, instance): """Creator main entry point. @@ -30,6 +30,9 @@ class CreateUSDRender(plugin.Creator): # Render frame range "trange": 1 } + if self.nodes: + node = self.nodes[0] + parms.update({"loppath": node.path()}) instance.setParms(parms) # Lock some Avalon attributes diff --git a/openpype/hosts/houdini/plugins/create/create_vbd_cache.py b/openpype/hosts/houdini/plugins/create/create_vbd_cache.py index 2047ae2e76..242c21fc72 100644 --- a/openpype/hosts/houdini/plugins/create/create_vbd_cache.py +++ b/openpype/hosts/houdini/plugins/create/create_vbd_cache.py @@ -28,6 +28,7 @@ class CreateVDBCache(plugin.Creator): parms = { "sopoutput": "$HIP/pyblish/%s.$F4.vdb" % self.name, "initsim": True, + "trange": 1 } if self.nodes: diff --git a/website/docs/artist_hosts_houdini.md b/website/docs/artist_hosts_houdini.md index d9d85394e2..f70eac625a 100644 --- a/website/docs/artist_hosts_houdini.md +++ b/website/docs/artist_hosts_houdini.md @@ -13,14 +13,66 @@ sidebar_label: Houdini - [Publish](artist_tools.md#publisher) - [Library Loader](artist_tools.md#library-loader) -## Publishing -### Publishing Alembic Cameras +## Publishing Alembic Cameras You can publish baked camera in Alembic format. Select your camera and go **OpenPype -> Create** and select **Camera (abc)**. -This will create Alembic Driver node in **out** with path and frame range already set. This node will have a name you've +This will create Alembic ROP in **out** with path and frame range already set. This node will have a name you've assigned in the **Creator** menu. For example if you name the subset `Default`, output Alembic Driver will be named `cameraDefault`. After that, you can **OpenPype -> Publish** and after some validations your camera will be published to `abc` file. -### Composite - Image Sequence +## Publishing Composites - Image Sequences You can publish image sequence directly from Houdini. You can use any `cop` network you have and publish image -sequence generated from it. \ No newline at end of file +sequence generated from it. For example I've created simple **cop** graph to generate some noise: +![Noise COP](assets/houdini_imagesequence_cop.png) + +If I want to publish it, I'll select node I like - in this case `radialblur1` and go **OpenPype -> Create** and +select **Composite (Image Sequence)**. This will create `/out/imagesequenceNoise` Composite ROP (I've named my subset +*Noise*) with frame range set. When you hit **Publish** it will render image sequence from selected node. + +## Publishing Point Caches (alembic) +Publishing point caches in alembic format is pretty straightforward, but it is by default enforcing better compatibility +with other DCCs, so it needs data do be exported prepared in certain way. You need to add `path` attribute so objects +in alembic are better structured. When using alembic round trip in Houdini (loading alembics, modifying then and +then publishing modifications), `path` is automatically resolved by alembic nodes. + +In this example, I've created this node graph on **sop** level, and I want to publish it as point cache. + +![Pointcache setup](assets/houdini_pointcache_path.png) + +*Note: `connectivity` will add index for each primitive and `primitivewrangle1` will add `path` attribute, so it will +be for each primitive (`sphere1` and `sphere2`) as Maya is expecting - `strange_GRP/strange0_GEO/strange0_GEOShape`. How +you handle `path` attribute is up to you, this is just an example.* + +Now select the `output0` node and go **OpenPype -> Create** and select **Point Cache**. It will create +Alembic ROP `/out/pointcacheStrange` + + +## Redshift +:::note Work in progress +This part of documentation is still work in progress. +::: + +## USD +### Publishing USD +You can publish your Solaris Stage as USD file. +![Solaris USD](assets/houdini_usd_stage.png) + +This is very simple test stage. I've selected `output` **lop** node and went to **OpenPype -> Create** where I've +selected **USD**. This created `/out/usdDefault` USD ROP node. + +### Publishing USD render + +USD Render works in similar manner as USD file, except it will create **USD Render** ROP node in out and will publish +images produced by it. If you have selected node in Solaris Stage it will by added as **lop path** to ROP. + +## Publishing VDB + +Publishing VDB files works as with other data types. In this example I've created simple PyroFX explosion from +sphere. In `pyro_import` I've converted the volume to VDB: + +![VDB Setup](assets/houdini_vdb_setup.png) + +I've selected `vdb1` and went **OpenPype -> Create** and selected **VDB Cache**. This will create +geometry ROP in `/out` and sets its paths to output vdb files. During the publishing process +whole dops are cooked. + diff --git a/website/docs/assets/houdini_imagesequence_cop.png b/website/docs/assets/houdini_imagesequence_cop.png new file mode 100644 index 0000000000000000000000000000000000000000..54ed5977b90c8b552098f22487907a21be7a3b90 GIT binary patch literal 19661 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 dw(Z{+SOb45i{{cBgxGDeu literal 0 HcmV?d00001 diff --git a/website/docs/assets/houdini_pointcache_path.png b/website/docs/assets/houdini_pointcache_path.png new file mode 100644 index 0000000000000000000000000000000000000000..3687a9c0ddffaf5f40d78c4872c853322a67125a GIT binary patch literal 80679 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≀iEVFnuB65 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 literal 0 HcmV?d00001 diff --git a/website/docs/assets/houdini_usd_stage.png b/website/docs/assets/houdini_usd_stage.png new file mode 100644 index 0000000000000000000000000000000000000000..cba942860483d4bb7e01fbb553354bc0a3af812d GIT binary patch literal 762416 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%0Dr_Q7Uw+!k&}Jy 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

XiYPn54?8TYoAba=chW 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∾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≥@bW1K#p<#5Oy>4;JecidR%kn~h+j{&+ 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�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

Z>1aNLv|ED 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

KY-igLP}{VuQ-qde(ok<|zH$ z$fejab7QM&-CvhE^JXx$^Xbuby*R3$J)-NveO3QX^2d}fYrACgRPFeDDyXnL8#3Lp z(3pJlu|<4p3HnwAEt$lh3D&SsC|`ckjx|PM^ztnz_$tRF;xw_=T}Czl)}&|H{W$Bp zucVRhU~`bf$CNnI)Rh0_&#%&8+Pcr?bH#V>#!MeX%+@8oJxC`HB@xR(AU@js9WG!J zQ~d(tQg0UfFL_r%u=<3X&%@ggr!`GRNP_ii_iR^*o@7aW3&YyVg_C(nA0h;wYtdAF z+1;;?mibno;^E??=#h{o#chs8P>?agJL{HmCZ?$LpHWj5i z@ZM=LVYJrYRz{l`-AXA2tF)HiO$MTx<+eo;u^^8VBsyWhjH%R1>1L)^#mlHEhke(p z84p7AZQo3JC)XO@=Op88?mF)(L1W{CfZ=NohBUFYVCYO-idR_O_ndj$v|s8`fRx{hu-)GhuB4vQCaUuF z*qxctE!Tp4h8XPdDzYk!s=p7WGVqsVa^=cTDIcXGxb14C3T(fUT~A*@_bIQi&%^m$ z)Cg9|+sP_zZ&LlJ1o7N*`O=|r{J5{0-kfi|DS5}_p!k`?3zab+7v7g6c5h90DD=1D ztz!vEB&|~iGXc72WLLL110$^-T$`-x-bcfxvy(P{WLDDggk>&)a3~<=xS*66_9|-} z-W*lp@gYNmf-m$mdp3~co~(~7`2f6}lF zdhmLwc17U{^T?26<*EVRnSeLBj5yFImG?*K{san4%o=-9CGiWr6(WSIn3HPSp`@1j zA}(8?)L1F;cN*6=%|qAZ%L9tR?tR8Q_TI-21j2v_ivcIOBRwT@%uv)KfI)YoVN_^! zlB5|KQO{jeLzovGM0^oH+5J~qo6-AlIz$`nwAO?meD?ZLsIFEI^N8Z{@+&CD%4a0k zdLri!#3iAeN7ai{Avl$<$Y|L!J%hTtEq0T_05jRBrlIuq7Xn1U1WD^IM`=d!r#|&< z;$sWAMScH41#dt?@1l&M^&O`mggC-f?-BKT*WgEHaugGQULFj)HMl^?zm|Qgi{ZEP zJ_s%NnfySEzbrhN)L*F)YyM{~W)=Qq^{0H7OwRYoM$Bh)eJLeNs9PPpG|2PIP6X;A z$w|>BPb^)y+ouCA#=0^ml>QwUH&YS17HKT3V*d9%kMKi6Z)1sI5G?x7wvX0l=d3G} zZd&0#_%{Bfx&o+x+)wLvN=JLwx1?BihEPvRK4sE+(aV3m&ze*=d- zU(bt}83g`?rxwEHYhPh7q*<0)Xw+PxvDY_}Tom<=*RTL<#8wqrZ2xF9kM5&2Jbx_I zo2r)HXlbqFRq$Y^0_IZaGdM7cAu-_da8OExOK`ufeiQG#mR;q0Qt531e~g2dW73ch zZInI}{61$jZ5ov++th%eWC>ROD5RHmq?DP@Z;1JVQJ*+fPP6Z%-eHGWCiD3s6# z*5x@TV!GH6eVu+z@MW&a`eb&=wVt8duwCJC(Ed<=;3DsijksD<(5l6HfF=y0r=!Gw zX6ieZAD=;enPrZD&Sh1j`_a2WgRaPIO95mKT)`a^2uI=%LR#-q$_(tege*EeL&=VvVtw_7CvLU!WR zFX(jJu8WW0vtbld%o1M=08rB(XTP>|qsOoQLeli7wz^pdz1=U>-b({=Wh25ajXjC5g> zZIiX57@)xAz=>~n(5$eTD2W*TF<)giz3##!X;)S`qT<3hF0Xj`ElJc!Ql=`3Phjv9 zov(xsCDtn!Tz%AV;%zBwewP>gNkTp_;P}rbew|#y34a6{%N=iVU|nZ?<6Rh&soD&5 z#Z8lN0kvLro;Fr<30psOL-Y`TJ)UFwhtWw&uPxEYJ+wf(X*6DyBcH`sF3uUFqVTv! zj-Xvu+(I`}N%HYUb628@L|-@bLlTw&Y8eb5k6s!TiHj_-iERqA;ii7EPIzWAk9%G- z{~kJk;k9bEXwlHbnf|2>DJE?M_MpS%bRqr#1yuz(MB*3XwBmFqWFR!;$aN}C05(^~ zn7JKw^UI1w=S~hrI}gLQc(OP+06B7KOh=zo2%IC6eAk)xK10@~hfmS@)(HuJEp`81 z@^RU`2j?xsKJ-C!7|RzFLP}FPRWb&C5VBZ?BY_7~7 zpu_gpm%eB!_XyQ44~9p!&f~-Xf<PWB_x03#tOq?n|0|K20 z5Aq2W!g=jZX$e?5FNYc4LBLFRi?_dR3`^zq(wOzUM+~)cCn|PWb?kjvb$|I7 zPZ2s|C&_Lf!LEJEwadC|o_cFq$yc(D%rfh~)Gs?MadJWOti1TtwN_4>`z*MuwT~Jk zjwT=5ERt(=Zy%pcl6{|rz-tXF6=s5`nM~*7el;!8En`=L2%uFR;+IS^)1V!#Z@kQC zE0HC)CD-mXq`B2)S`ZNe)-55epPRz=Q^w}?-C9aXvh74(0S=I|b@laQmcVs~AOC;Y zz*cW9=oRnYGREV(HmbQx4tutsBXQtP8`F&5{F}F14+2~*7lLW6+f6nPy%ZG#^}d;M zGj<5GSi?W(!v##9&-YBjSGy8Smy2dL!6nV`pG|D&{6MgwsKP2Qm5o20xA5!G09$~Y zLAY~<_&tL!@i?*|<-hUb{yJdsVAULROR}WpDx4!~UqQf90lTrR`H&i~j-80)M4T@D zcCr~COPg7*V!+>>)`4_y569|Q6B<)%USf>eLMgYPON#GAu!qfD1`?Hm0e)TPen3_} zm0qHAMFp2atmxZGmo|X#KI0Peu2h518q)=;CmoW}09}2xd#(B0H?A6@6DezK?F+$< zN;8T#=}os0iAot3qQqd!TFAmdLjX}vdA7L<=?$)j#LVsM7WVgGdDHc-m7kzmR2j5) zW&98J#&BV&B4c67ghZ9Iv9>{pFipC-?Q}QoqkVk0>R!Up8e*{q#@xgZFo;gm63u#P zsnWgN!mL*pgZj(5+~mIJ0Azn6B2u<+MP1AoqpC;9m(@;_QqwB{IZeEqzf{lz= z4%WNXa|=k7sAu+neUVJ>T63blufw+)Ef6oLS*1_CnJjf9ahmt=%D;I7yG7RIGwp{& zb;#ZwLRWaQ1l`N8j7L8I2ECSHVl^jiwzc?V|3#gAZLNRk;2k%D5?j02Q4IU30^~=2 zK%Q{$$$!ZGEB*(cBM>Cccl$O1#6H0E0+eUz0o&AiP!d+h02{KQCQf^h$| z=~3t?cQx_AZ1lVcX z?}HghiR+Q+-qHlm@@4>%-eJ7uMkzb9gdcA!`ZJiszkF}$o3Ja*bNEX%vT_xTZfM+nZ|q-yTqw`zVBMTU7^<=V-^_zbOcy+(lAMFdoh4@o!y@=SA90U@o_CG-2XwT6ub1H z5%v94;L!2aYk%}SLI2kxTe-#9{=HLb`Pwvvte5xxygku>=R->Jc&vhNzA0X`9vct; zfZk3$Hi0b)PafJ2Estrb^p|~VlWRe2$(0{xc@4hnU0^n7Dy3DpqZD?z5W%GZ#2zr0 zyb=fH=P=@+Jd$?IE&LjJBl>u(qPCILJaHfFQEZO16e&H`71{Hz<6JVPRD2)q7jx@p zub=xRZ2TOPbv@**=#L2)`PRk8MCyJGn!PbQifTeXuo5u#F?fG3joOU_C1wBw0UTnS z3SkAPY;O$S_{9R}-zav?0&-A(Cs1!N54cHsn+h5d$Hu;?3^u^|7iQZ%^ubQL3hC9T zoJRQ~HaaeRD0IgoeY1$K|NTJyUkD>dDZNj^l4qSo%TjoLX*`P--#-UMvWb|C+8x_^ zO)gd}^s$W|mARcriZE3g`fiBjw6^Q^uxAX5)+W}|h!iNKFK6{Q-Z|mfJzf6dE^60( zdDZUpglKQmJtNnu&*?>9-vQrTpMM#%S1g}o`bxIw=%TWyu`ZLPfUXYDzg)*MW~EE& zD+iJHIn&<6l0E`qt-~anr2peTWmD&tZpHV9Mw|I|?rl-x6-i#7!FA z-lhi{!d}gu@Ai?`d{=KP)oX{%&0rYZPEb55X=`d$nq~U9W;pUb_O#s)mMYS@x7N2J zN^QSh6)E@(`t>~?wLRARu)q%xR_92Qtv-uki?Ww1v6rcoK8epKAbp)flbrsQI7peM z+$%Yd9zdTotXbH)AuPSwajm^+{Jf@0`J%!Em|s{d%GMLTGt=L7&(i15@Q(td9{OTX zJ+I@x$%7n%tYP1tjgCJ?2zd&?GFM+#N8iRW=4oO3E~;mGck9l`UVc+dI}bV;zVrNi zS)+V?Imw>Br$uFQtGDp~024v%zB0p>D@*y3eAa5af*)m{MWU7*jon}Ut5x=sswAwp znDlsL)wovlcF(4ro>gN>+Z<2rS-l*c(e=G<*Dg=SrX<}Ea^+P|5?!4Jvb@N$^6!Q+gY&KdJ&87V-x1`!pkH^%0eB`%mg3BqT z_4W^}K2V91nKkLN>Ugf%a)n)^Kd@G(YxQ2=6{sj;QSy1 zL3_mlzM^)BGXiGo9=^(7E#>UY zpyO@^P%PKPV}h-(sQzvBg}5BJ^vP&UiMcWs4~9eWP5lShDsFO$L2CGilqjKXTsjz=c{!Bp$|0v1b^mh|0mRr=Xyg|iqdwz(l2O? zhy}EsOxi3Oc55DDIcx#|B;!`dWo>{`Sh9zrc{3KZj_Qx6(mpnMwJR*%;tH+R?s$9# z-1hL}0xJa%e6N1C)K20J4JFeRjd3;_vvqgXB{|e}lrz1)LwW9ZAMm5Ax(eZ_Ns3+3 zTv5N^g=%xxNAMYI5LXc3JFd2gkF$x| zso)ECiOfK^sq zV_a7MES>SSrBAXP}Q&OKne_<(f~ zt10}(EmbV5erVnq^Sar#cvh>5WD85AQ8Z=!MAEvUh{eF@|Jm=? z6cc|5Y_EBaCD>>@aOGuMV+a6=`$b$964xdzp0l8gt2LWx+;I8FSNv1$!;FLaMhv5t zwygRK2+DkqAP1_OKBocQ)MtP-6hr`_9@_;FgK<_m>ue@3o=c{p;xob80ZWk2lI{nj z>U8^-D`cH_@E(5Y$zVwWPgthNuulS!jt#kCddwIzqj+M)g8>o{Ff z-!zx{Rn0HSI%A~y3OGaG7@wr%FQPH;ONMc224LUU+QN$kajpQEaK$yz_#<0boFQ*% zEP~WWtYFfrYoz&{YPGDtQno~`uIJ0l^7*{A^(;(D?wG55M3B~+QmfQ$DqduoO|65H z4ZZY)wJuX90L^TuXNLN_f-6JuJBjN_m5~!anp#V6X;_RT?4s8Bs-AU;vv*jkP;hIQ zEI^Uk#3bOac0RtoB8zw1+q+g$+f$m;^Bnq1rXVXx{&=4s&osf0Uk}c7Cv~X2AWetI z>zp4^-%&zv-P8Rp&O}N+tPcvZIk6)*8N8@@oqp{F`sj(r>VvNB!x7cBP7SmkY-|L| zRliPI6mz3K&J(Vw4|$k9;1FziFyNjOXrF6)C^T~{z%Z{zm9M}{4BYXY# z{aIW6*6*E{^5W?7(@$D{W!3Vf)2+sS^&kIzyYG!}w(j(Kd*rc?%~P+XFV#gD0O!yA z%+J{0{F{Gsp7PZpfRm@5ddhzHcYoIbmY2QkW%f`1=|7!cJ)-0JzE%Xt^C$kqpRhN+ z@s0NR&wt+j?Z5rE^D9gGW~S82dAt3){`xZZ%96eyeZ#o+%B==2y*6*t@tTg$*(|?m zq2__R_X_PkGe5p)A%K(MRwv%A7lbNoLC1f^@UF2S-t`xReq%v=H0k?!n%=;Iz0Q~J zz?QV6B`xX8C%0hn*Zjj5evS{14qukLou+M7_pFgjxDx7>N_{#Wv-~)0&3MLQp{R`_ zAuH6YmWqx%*zdT*SJrXsrxLz^&&Db>5!Z|O)S8`+wIWduDqI|mEuni+CZeE^CR5f@ z9k}AbWASC>?`V(mlUM-6K_H-eCmblr-2IQXQ7G(gyih3w0j2c_(!IE?!sq!)K5J)6 zd7JbGZmoe8NJiI)`GBh>+>{Ypfw&?BJjRDUU%BHxtf_RAUtA|}zAMDGNo|-c8li=w*AP1HXH;NFMuHI0V7bf0IoPGKMza3wC9U_IF90EbdC*Nhagg3`Je<*XkbZ z8*7$nyX}?(^kGH)WxV-%99KL|%A3q=sCG`rBmWv7unIRhfH1_(zzq+3f_&qqYM^nP zXxyjbZ(e<vM56bm;EMnDW+n%Xm zu`}|o^?Q-HCDp=dI_*KRv0@sEM+BlSs@(*(mWa9KOb1>n?@P)hSMDZ?CACwsAzt)U zJ^}M_Z3GZ8W(<|i*S*N)NHR;H_0?qDmF#Gac)fR*4#`mOt@cbLjsG*h(kr6+BoL58oh(Zu5h<RK#UXOA_02PdG&1bAq2#!vhaq)$VEXY9@fP+p~ zg$6G2l8nE23_z5S+>UgAO!7kcNtJ;sHr!+}ANJE_N%hRi&3y-k`noqEzD70XShYp9 zR+#!nJPz8x90B~JcEBZo(~|D%YTl%jw_mBa)lN(ODb6&{3VF>ztq%YSs=MFrdTb&B zs$+G9OTrb+`GMpCU1U-%E>IqSs| zT1y)4BC*eSsBKt-5%?Ye1b2fO^|z;vv;Jt(yY;{jOSO7aGL*7`)(ZfyfsRMjy1Oxo zWyRBKO-rWcC~Jgxikm0a?x|QjT3ZXO@Kjf+-wS|#wPjUlSGCqM-wVo*6%Rs7pJXDYajXn__L6AGUaC1Cy6=rX2T{H^8!dOm z$T82hxcJX><4L`9b>A|%w7a7UD0qHD%EGA*=FfEIj^7s$&-%slA95f-X^Ry0eoJt9 zenlI*!##9#PjJ9_aPfGZ$Lm{MU)1Txey*#F%Kbi14K8r#w7A=|1efP2toiL$$F{Zt zS80nnLuwOr!#>Uvj_T9yaKA`Ds_$eUDb<4)@-({qvz^K^20|ZSi_t;jwk9n-p7M|;;zIjSIEupIZxNkwr4SSQn3|qcu15)Q4?nw`q42hxYQ@^sMO)ZQP&Om0H{`?2hfZddfDp zZn952bztwjD``*e^=weS-L_uxs(C3dj%a6bbxrI2>HT>0fsd=7YxagWf46=5!PDbN ze5n>JSdG2m4R5dyeBcA~l&=oG?sc!TYPIT?DYx8mi>;|YSg@QV@>TS^?78Qjo2PvB ziM4QRYs=RnT**HC@Wb;fOZsM}o4)mjmewmvx`w`CEK+i-W@ld-SfsrCEjIaQaQbc>{#gPQx3#yg$e-6tZ~(5!><1x1uy|vVOv!zXu3f$Ktc`LRi+B5WB^kGBG-Z47j7_6an`(iM4O(_48@C<4{2z@it`~WH z!V{ALmtc`h%Hn#d!FmE$G`M}aP5E%iQj5pTv3itEgQ2_2Y3t=TqDK`9O_Xfo+0+s` z=Bs^I9)?5y^*u^u9vZklBAu@-0b@{>5~G8d6Mz7>l#7PCWriXv8dllr9SU{bJM8t` zhdyq#Pfcrj^lRl#KW#= zz{L&y@pu+t^+(5mNqkks7yhKdbKdn)GN)7yTyLmtD77eLrEL%%!vDvPNg*dQwzr#`Y zA56LzS)yOKf&$5m8E(Z~TrfEVm+vT8eX0ZS&_+2NuIP;{U? zd6dJdm${q~UvLwblI)C>2lsg?rLjk`OdJ|49{?|LucQX}+;nBL)&_tm;_*~8*VCD_ zCG#1#RslpIz&h&zK%)mo7e4?cQIa$gCI5lA(y8iKAah3i6CaX*G5ll|Z@AAbLg=^T zDyi#O(si`v02oeGw~3DnCWra5K zQ@-!*)>uX*H!;o6aLmUbI+YA-T-&3eTfV3XmSz6Jf1LoRMbt;E3~{5f3b>$LwBO@b zDIaq`j8a$qt!NGskR6Z&pf!X{tB+Xu0C@H!AIKSNApjD*qECP`omN+KQ*xpCiCZrK z#y;}2qg5YX!wcp0*gv`#V2$wr$Yu<}jH&8r$8%awQkIxBEhG8v=)SV<=Y@fF4fzZK ze5x)0_nGEsQhnAe^fJR*JK}l{;Kr^j-gH%FMso~V!Id8`Pqdvjw;6A3Om*TlIr!aF zy=qHNW8#*L>9oi3;)8&M%EYqJV_B&m8bYm)5o@W>$RO(n>qJ}gn1?G?GAPNXYUhgD zUR662T6e-)FR+B{6jp3>i=HLAmd+$C$9k8``8tJbGTec6S{>_3rsHt}mgjxhrtCn` z&xrf!d{0M$Yy1r^_)(DN*L36w*FOLK$gfj{=L(Xk2AY>UKb-GLS(H1k^YCww?)fZgaqeSit8tK|Sh^n3XmiBaA8qmknZ_7(;=tF>$|Rx!GROtaY}L+#Bj;D9E>I3{HAI)iM7*pz|k%2n2);W zWPOW1;(~0X`MS2ga&3J_Cr*pI{co`IGLQPGM8Dui+OF;6NuDlTgiUiRwqI*#EtOn< zmA7Y}eb(~&4S{va5@7kprY{>{*}iP4Y|e5wunfWFZmw9exPJFtM|#$useR0zyV9{% zcWUcv8QWM5<`FShc6RG}y3Q<@$ylr1v_eR~7W8n7z5Fej2B6JS1#Jx*_(pj z{HG8A%f{9jyXV!fv(G>J`&!?Fpv3>nU;2A?W$%*xrT6|7d-wNzujYNz0h7P>*Z!JY zW?j8{)h)3SdfvbL-S4&^`>`LhcfIRf?$YaXpZlEMbkj|4y}}&)?(hC?E0szPF08Ju z+E4w|PuZXOGk?Y{O&)*zaqIW{Zg~O#f~Cig|M-vF2S4~h`-z|Ui9?rO-1oyj{KNL= z|NNh~@BGg1^f|;FgI)+=`PrZSS+^W%wOXDJp!c2ce5d{35B{LtcH3?C$Rm&VM?t66 z&oOOy&wJiuFMa7tz5RTsf@R!K|MXAmS)a1M`d9y|mCI%O_HX}oyZ`?Cy-wDppZmF= z^ER+n0_dDMbH?jl0xaMBg!RhitG{O%d*zQXEx?p-1R!O0^F20s)!VNFQbNP7g)e^o z>jtD8Kj!`gpaKD?EJ2keEon(h`pQ$}d*1s4L6Cbbvi`!Yy}vY*AX=mmjB(uBw`i~L zV8fMU-llqZWP1Z!2~F(wVasZ5y~OKB@~tT2^gv2$!*T_}r3|jX2$D~rNE8D+KDv4_ zDCwo6rJ8V6b51Wd1hih$G4b)_^) zdEHdPVolW^janLoA3fInSZ0L#fmH?y`MS!;DV-DGB z=?xt;O5jeb)f9hbR!AqUp%=$|w_{O_!62WrxY){<{27fk3RbLOaD7EQ6095m25|30 ztc@57Oyxn@oq*?R$C}c3fou;39%LTNhDI`Do%E`eMjab>>Ym=-zi?~R9gHoc zeyzi&@kl?y)K>LvLwp*kEXtW`k7W~lud5AN@rbx64sfY#zKn<00Cf||D}WjR7fN+^ zMI_mBiz@o0vU!C^nHy3*Vy<8X0vLzv>GzL*jcI&!9$h=@@pVR5FW98fcJL%2UI$;v z!_NQ|!J1`^{HXqJvmJm3Y9~BKwonL<2R$1CT#fYd->PXw$83_xTPVM3@qEd~iKJyv zG>ZpV*kDBg=;E$nR1QBj0Z+!Uh%10m?9x3rmfXt506RD)jE@`-rN;A*WX&+~-Xgnr{?ipze0Ym_zusE0&Hg(U?BDEclV*;?l z_#n%D?NOGYEKM^e@JPI8PT@vtlFe9K{SHxQzpr*_1?dpP9KKI2k42pJxN`&e>#1%P z=x)-myr?yrl6B2vwGr2afHJHT#N-*OPR50a4ycq-e{ey?y2g)Iw?><{=>R}U?TYGN zu4AwXLJ|J*4>nP{fM}AQ@m3{lv;6kxltJ#k>ef_G98P`2iO5 z;uCW3uH`gF$Uv>#@iI6bNS2suj5jieykJQa7mxeheqhO>cE**D@wjDb$Ts+Q&1nrC+j>}AH?Az3)VbY@rGwXkTS2=GXxoL)JOI&*vEO| zqCSc~%oY?PI;!umY;8gBj-~nei9XKhv_1mFUkkYCw}aNYuH-hbaOwJU-eb7%3=3-V zdn=W?Z4sM?_A2Q{eLUU>4*iUKJVoRO{0aKP;kAAA42Nk8fMu3QX-;?SWv_m%t!-OPaIgQ(Xo!+MPB!&x7yvWeVrwnm#i;&X%F@OaPN0nZtcvxlov;PmoM7J zP1n0AThIbvx$~tjvrj+x-wpwm?|l7t=^34|UwGgD&z}F>Wd}B}KK)1k=pXqWkmW-k z`j7*x8+tbV@-P3g{oe2Wp1t?I@3qU9FWZF+7woae9<#gezS}_vfCb(^{>I<<8}^A$ ze8PU=7kP4QqqrHe&MoxwSg4>c>|ELcHU;U-5UTYuX%@!-~49-Af>3^R-=9Zq&)T!i+<#n zkARfRkA7W&6f9E~)+tLsWl2j~(vrS5ggJ$Fi%m}#f8o?IJMBYrr3mpXP&(&&BkQM& zmI%kJGsRuS#A1V{HS}YDBObLxxoFL9-{P5!6{b_SVBl--_;BQ|hEP7E0K#QVFA}xw zZqM48v_(fjyogJiE7sC|#I69`K;f5GJ!{$kKU!)_7Vv}S>IIqr_a$qRS zSI**9M%Qq)gTn!W)AOY=ZjVyAg00?lk1ImE+t0fTGunaj5oY2h3PNFr!WJcCLTw^I zHwt=UZ?NZDK9TUi)F>ah?{c$kHSw)B99j#7N?R{~b=>2O{EK_WZ2O?%Uw-QiMtx}8 z`BBSm3J>j$=+NT5uGMEzdwdwPCle*NJlc=MZB2adXu};=qS3VcMCC=p7F%2OFSv7R zKNdL=$-qoM0USILV_j{fz5{&3)UK}Dh|=#s*NHL07yY;~8HZ99Nfj;KIxV&6XWcb#KID6LcjHm)d=IF_g`vTu~iUzi@lBA{j$j&6n#NY9H1SE0UuW zY1$KrJ(5h@)lk@0aV?~>>yn4DUOsX41z>hTJZEg%y}rjqF_nd4d0MI3Q0+q5?|#`; zCsr*004T2kXHeYYA`Vw>D11?#;`)gnL447VEDZUnq_i;Z$dtdB%Q=7o(13MPc>TPM zVo96qJnKqd0;KcxJTl)@UjZyoz9YY`?AAHp2E4~Y1TX~mOb$3Ochy(o8|BnatZ&Ax zijB6Pwf-}Y*sQkW0l$Z(4GW*W(l67$K4s4d*Y%H zU*e3~h7ynQMY+ek!L1+48MBZ7-plNVe)^LZ0XXS*Y+Tv3>Fy;n z{eTZQ53JX$s$R)2vMJssRSuxUB)6h+&suWzCYJ%zdR0&xyw8$BKm;sPSch?GhSgT1 z-n62wsEMmF6!18WUcCSU*QG$(QPyXuWF2(ze>zc2{6MrBCu1x3t22T~~b> zOIB7?Hm>7LV?b#5vHG+w9#48b+m}q0C9|wss>T5wEV^*jmX@rRBmz9ZN;|EY}lEt z4F`CLS#x!J*LJS%S!KVbXNIKE@1rbctcX7hj9*~$R1tZC{o?uWmk)PbKT2@7Tkv!~ z&VH|_1=s!0qRx}`DLo+aaCv^tWr#FC;JP;cAFI#LwJqx0->o()^F)2@ zuc=dq?1JmT5r>O9{g`BKnYSmnL4PQl^yBrBaJ)`!FWATV?uLD2&!#^fuSaXn#>SeR zIlJlccTk=-B>US}82f#zR_b)Yfc7^KTf#k#hUXp;zO^xo)R0miQRpZerF`}))~ay zJ#SdQh4Xp{ow?->d&S%Sv=wf7r9FHwvx^NrD!_5^i>Hx(x1MT2^CIcDKmJ=b81~&F zh2N5Z5`4%8NU*-nvq!&6R0l4=#(ExLrGbmQ^XJd|wUcz~t+)CfU#~N=f1#C(E9yxvETCickve@FsHr^=~o9l;^#>P7cz)JA(svEfhsA2xc|U$e=*e?sqtc?&;vzePXvuPy%1e$t}9@;_PRH-6T_AOBUGJ@*-# zRxY|uU;%irp~qNk03(YHFl4bE2SEDz!F1Y&%j3m{=ZwX+ub1w{Mhun3wxlI3X-P}^ z`cU|)Uc~qI4*Uy9y%zI}HF#OpVjjFWd#a_<8Jp=PVJBC%y<|oYgpjR_`xa@}ECtXI z4qGD}vB{MkkKsUY^~<_9t#rO-ovANLX=9t4+%mb9P2;CxHE^(Q<`43POUlqgWs48ei}OhM-sk z7)h^fT72tf8}D!1@ZhT7GuDRkt)P10A65`p!iXiV2u4Y_f+A2nOHzL%>Q*e77;#?o zt3t;p&v8M9l}2-ndor`O+J#%Aj?PD|mi1=pht4NS{cJd>SX$+yctL55OQ*)Z__(Wwo)J$tS@v*#Kk+nyw>Qd+k*_leIFaT3KWipTYM!WG@EzG{#t;Cd>n zK27?xKo9)s#F{!!Pi7WYe}_8fD}TnN8PD4|m9tFkip8fxo1&O!T$PU>LAcq$rPdJl zJ>qFhGSO@_?D1;D75j)G76~gVpMH;q0}rH))d+m#3tij_p}04-x0Fr?*L2TIH14TH z+)CozKrduiLh+?YT=&y{tV=TatX1@q3P>`=azeaDDO?cWvD(2c9f}&1`os^xMbboN z60-qIBEBrfjT|q$SVf?EnyF2IZt#+LH+(gTykJq$Q#tM2n&d2L>4Qsw1&qqfCR4_j zHVNfTX+IvTUZx+)UhQ!sQKr8QeY`CLSd_M0>p_VVv!1K1o3=1lR!vonnD5Ejf{b|NV_wuDZZlthqfgf>rDn8@Rk2n<7NZyEL zlsVYe7^eJdO8B>0+n4UJKlA^pIv~PY!+ghz#@bC=v!S)GJZqu) zRS%SiRa2*t%EG{9#wYsnKJYTw!9Rm1=rX#zovYM<(SfSC6PTL~I zyk&`5r8ZAh3>GjU$v{|ZOsLVc9+rXSq7780X$sQY8%!;Saeo37U8u(d3OAHtZLc0wF0ieHaCM9Bf$mzQ9eM*wT)Ffb9UXf zwl*xL^#HeI+gJAN>du~3DmCkMfc=hc3wHB^WA!bb{~TUJiyL{Md0tKz=UgO>J?C81 zZc*0a+^@|~7ImJiZ*d*s@I-x#@1o9nz2P#tvRVo*lg|F|5BvGSjrw@9KK>l5^LTyp z8-k79ocwTpeqA3=)(0K0lPkyS_MGegvHF5P?6|NvA%AfHJmru8pWS-*tG%h7CBX7W zhp^f_jc|*3n&rxZh{M+$M{TvBcNG1$h{XX6_`S|EU~I*Net+Y(GE%lm{G4s~!nXJS zXYWs-ZAq{CPH>-jp6>WwzLzgEl^RlsW+Z_I5RyQM!hj9fAUt)IDOcg{TDX^~wcPG* zo3-q+yL)xn<#xHt#sf7_cG-8}dt&(F8}_%qFCzB;+j~!m$>`DUzF@i+$n(X}RL_Q0;+O?25DQxV)SvoO zZkd9WhA(R2edi8@1qdL_-}`%i?{ot!0hosXD(*(O3d21auE@xPI^3(8D7DdQjgznuXoPk(d`q^xO8Yg*Hq zzGzBc)`xf%*EQpbuXts{okTeFXcMO&(Y?{w4ksDQr!sbV7+7;2+2!tuZBM2a>BIgw zPaJ@S&GdmEv3gW5zIBv-)v8;2pwMb4554)jE16AgxRN0*Mt3o_o<4RQj49=ffYFO) zJys^`UI3d>CS%Xb=z~YshSQn9Xz%M6H&w)?a3z|~;UH&y*E=qzX?c=sAeQ;nK%B$Y( z=!HUW6nqRtLwmSYwwGF98{IwI&_^UIq1(BZeLUZ?PQGeK#Br!sEr2h&ZF|13n(8;v zhM#6)cn}i@g?6J@uwWFr%N>;Sw7FkssEq(VPg`*u_XU7kS^N1?$rZ228{pVnb?t_c z;l=s-WbXWB<@lgfb}JcE9k3MGRUcZV>syqH((zhZe__+Reb?aM{s)L zC19RRUwZ5o)f=TKie-X-^RidfhbsLFD1sFXKvLMa zbz|i(?yqn)gzNx%5!(h=Ranyy@1|BQTSxUqvA)}=`AgWWKXj!xpWBOmpqIyj#{}7c z*XsMJE1Rd*>K<9Cebb8V8|ssh5itK`Ydkk1w}ctZpCod1V|xP87k)owbe&~#$IdC5wX}Xw?l074WS%ifT#~->fk!3X zTae7*R1G(3DWyA5dvQ${pzv4ufP2Iy$%+32z?V>2p#6#J#25nbJyyHB;!(f6VPo|N zre4I@NokJFq72osMx^GWlr{1Nd)GTJ*|)vv!}dde>BcffkXcQi64bG;IblQN18{CZ zY^H;o`VhEjvs<6H#o)wpgRaI^*H=xb5};s9RM?2$K@mo%ol*OsIZ7rG#(5+ z?p0gYvsW%#Uv=<0j90lq-@RY|9p7PZ`-z{lSN!mww+CPS-IlM^?c3k{Hv7+h=C9g+`hWf_RtUeiX!9%% z`bq#S_oDCo&hPZtEPvx~{0;l%U;bs=-``(ext(z1b@S#;k6)5(KlM{T<=+?2M!4X@ za)#I@xZe6g?s+yMmdfGb;qvG_aqW-%kw0R8>u>!n`{)1spSx?Ydl7ZR(gpB`#WBRF zS<^Qct*uwSap)@nr0`AqY(NTI0;I5gAwWv>6Myp*NJ;HIehQ@Ie*Q0>0V$t;&l*Ts z)0)<_rZs)hl;*>?TrSz>)<*1NL>txtD2i^}*wc&pp|v|b8-`=cm&z7Q$Cg`+Y-7~3 zlVaYw<$@jR1AP;vS|)9El%T`V-7(E;RsYZ?X2~smT=QU>=X2H{PwZqk^i})Q;mB8p zPqrF1&Pt?YbmnIN=cA@5cr1dzth{xf=5veLYuIu|BW2W|>8;&!AgKb!lCYcd_prOibXo0W>b^1V|ndkhEGt)V_DDqTfoOnQN3DrHwR^U)sZ z;WpHVQbE5S?*OIZ_7y!yGnRhp(_T-k3UFUW42F{SQOFV>1?v@6%W|rRE77%&1q8pn z0LN##rt_?Xrz{l9m0aE$#ZqkDk|j;xf1>n5m6xm4ZD%pIM|NxWz+zx8)K;xjY@RAuH`}tHv}w~z zSDi1cvWB@Rk+ED^pg?4GJLT*AQ1uCCQyVuf*$`#r$qj!o@|ZH}iY<;55m#xtd5R=k#KGyP?;_%iD6hKYpsw}+f&mH;*8_J`0A?q_P%knW3swG( zWC7rYm%NecnAUZ5k-I@F>OS0pxtk%4AKbH*_+S_Rak=I3X_ST)l=DjuIcS*c>`6|5 zR&=j;)a9DWpl@-pg<_e0;svXs4aGg64Hh5tFE4r8v8iMLtCh6I92QO``c`dAV&V{o z0xJXJ>A(x*F)O}t3|N4oi}*;hu&0;D8@AEgw`zA!`HpN@Ygq@trE%G^TbCUK#iF69 zJTJEz2(bf%TdF?++i|nuFS_DsN#}a-XfknETusS4FSvE}ebDct(U9OTTuE=u%N}zj zJ?=?H({7ajU{%oA+>#6e$hp;;`Zy;Z(1tCP&VU}ZT0Bm4EwAHlS@Tk^V0bOZ6`ZLZ zd9Pc}rh~p6Ph!P3pl?d^4xmwC5XP?7G$x2igVhag0@IPoQd^j3cxfL^Cn{s+fEX^? zkY|8o+8k*gu%)KHA8Q+q#Lf%n$fhs=p0*Ws`_bsbQW_5HL>=Xmy0eNzyGUwd*8cXYHxV+6E4rp1GF1uensWN z%aO(k;2+?U$9q!0^?Mx~xA$${-M8%F(-w9PEj5c&$B~WHZY(TP<(hcju&B9XLt-cG zT(xp@OY>(@^_}RWKx0^KBBmBRfkMfe1BQ}GTx1bo8X)sTm$Q;jeN(A?&2MVYQ1!?m z2kK9(`vyusE)^VP!m_Wb^jydN++1@)w|T{~bB*_2+XKi?H7}P{kD~ewFfF6~l%7L? zILN)bIn(`->Q|^$tflj5%@;Y{TOJIpp)p!g@l){`&@zym5Oa&zH#3z-y0-cs;AF_N zOgv970TP}=jALR!%?=N(qO?_HlGrMeg`#8})52(tYp1PTCz;oW-TZImEfe&&bs*IlEfs?d3snO_CfS z{w8;TXnLD+y)9yKd5L0|M{>yKCb9@JXw5Oefr_lM_{K6@5HYqbn zaXZCVpnJ9PPCSi|{h||R?$pNf6rYX%^1GTZe-{2sy?l8`=i+P3A;=9b#V%jDWS1`O z_*_l^d;k|*iQ!TVuH>3vPlgV|zcm+!yN zp7-#>_UiBbQTx^({b{@J(bwrcqGS)f@DY3C_k6#7*V}%;9=iI)#b1f^{3+;N{<)-@ z-ide@U~vI)M;?9j(d89=W9a!*uh-rBgl`1mvM}er?QL)KW2}r<-EQ5BD2Fk|eXoE0 z>mAfd2&2H2g5`Vm8gp!)>7|DE6Yo#mDDM7=y$C#8QDZ1 zB8NN#CR3}8^|;W>FR@Tql|J6ywo0dK(^A2L@z~wHr1SxgqL06SRd^uVzFZ3Q);S@YgT8Y zfaN!p%UdyC$^o`RaZwaXb*Z&hY^f=$B7FzyTHQif|NW?!RC6qX9`N{M=j7Etcq7_(oW(y5Yq*BRIHRvH>x&ANybN)eu-~0 z2!~dzRb44v*GE;;`%(PY`GM-jD!Z+)Z=0im>N2-kx9ivE^(~uk?pmf)apipGg-4#!h_3U^TIhm>Rv z@C^4&v>RpmMx|u;tFE|ULf$57^LD-F{Xf>n#GEQ}qqKlaxPl^|bg^hf z$s#N6v-6p|6~HQq0PeUOYpYJY+)+=JqKwB@RC|cE;g&1P1273o8}C2$1E+544!QE6*d|{jrD+pyP z7BnitI5cfmwrcO7r>K|DoP7rd06_+b^CC3f%Zm4suQpv{^paKpqimE&A zo{$-0B%x5QhzSMte;9TwZ*v>z4RhSsvTSq92C2N|G(M-D6AwhrM=ur)D8V!0FY%JF z$YBnkuDnF@%Q#TwERbyBY71+i;g&w;qoGx!p2}5!=sG+rt1cPwk+v|l0hux?i7f%4d070-a zVLk%WoDwil|2+sk?#=+*YT_}$^BI}EENc?e%~`8x1L#8* zLzPSXAY3Y{+ucmP$lRzpGv6F`dzNYJSgzi5ImkzWjfb7MZh%Mnt*Tz|6N{6D+6nL9 z|L^so`9Q^f;6FLCU;h^+kL|+PWSkIRi1`nRn#y2a z#PSH>EzmgtNyaAg!lu#(>IWiK~iFaSfkI4#}+mJwS9H-0>q=C#=MAkP}+bikgpo*QY^5sRgw zWTmH@tD0x#x!Af2ODf_J1u8dFE8B_s2a7147gu%f!Hd4dvW-oZNU8B(JOtj#>#nq<9k-={84wkTT=_3l~MJXI9HQ`$_)ZUf$_(vLj;mi|xnc9KXb0p+9-Ix_Iq$UpwCSl6&0B zAyddRecn^wd(eD63%MhwvCe(e1v<@hnOXc3pIa?2335*iEG%)iFA;A`*PmqrkpIBD zf8C;>Z_l>(AV@$3F5|s}q~6)v$N} z+OOKb`;}j@C!c=CI@65hHe^F80=0pJPrjw`Jn{m~!Qm@Ybq!aEUx=!e6h0~vqj&-@vW zmjdvBrN>*|@)mo?JKo_z=8uk!?CGbUzAZRCv>Lpg-yivrAMrr+Sckx0%HTXe4doLH z2J3GE&=XGu>y(Q@?uozh!$17P_V%~G-Q%qg)Sj_;vHW(s?dNcR25>|kSFT*~U*;76 zm(?Kl5M@xufB7%}rN^Ry-ul+J+RyyV&)5rJ_(FT&fd{<)*RNl{r=`!DzWxa7l}oSq zL3{FDe}8#qOR6zwfRflZ1b1C z)uwOwF`MakvGb6n^iBP=Cg+!tdMe95L0tT-}OK~Xv$xb@2Y^MyT`)8ldxE7mf) zpA}Wa4{=MARNAcw$|Drqdg4T5j|rhd92}`{Zdp+u1vZ~ps~gx+I%Nkso_G5mcoJ)d zr^3)i`W>-?I+d}iuD6wr704*3=V}Z91kP5Jx3@{%SAis53Rd-RUiI6OLz2vhw^q5`ATdo z3x>KEH(@CA3+c44Vuw)3QYTjFqrfE&2*K=$v5{9jsTZs1Q4q3v9#=NFEON`3eAcZC zGTF3MxmS7SGAY~HXu8WC2e#CQ4{mRWcXQh=6>Xr8uWkB3{fg3rm>`u})%w}24b&&w z09yKZoOZf)q;s3{mwsJdN0IJ7|dUDroS{-kF&t4&)pTUM%6Y^pxYj7R#A z3aq8N4O&+%OigU7f9!$SB}}eN2HbEEOUE1GKwI;FtwMJ zZ&-h9%_U>XBNES8ISx3|Qhq3Gc_D&VGu5T2Yq-D~t4-X?%0%1-5xBil%)6qcr@mnY zIj(|Gi~}5^G&%vi;)P5vg1qpcygyQ2$SUr@?JiYfn+y5K(9b2iY z+A|cjDQa&%sJ-`IHDhl=tlE?swW*qky|=1Sd&XY1MNuP0tlRf`T=(?{0oa?f2SbS0$Q!n|Jl$m0Kw@p1$@3E@VJ_JDcuegrxjTc|L~b9U+a`1w1SI& znBlrTTQ#`6GCB6}*)~ch%&IA%K+&)jjzO$vm)ud&h!W;84`7OK9Q0@}3}HX8)8QFI z+_{U^dkg=&p^X1I^^=nqZsyFTDeIh&;mxHXq1RG$^=l*vQM7!SWDWV~^Og+DhJj>5 ziwa=*w_==a*9bI6lgp~|xt8^pY#*17F7_tbnG_(&-9*sU55^jBz)`a|T{ozw;1z>1 z^;*b4?R=7{IqeG5n-gj+T`_np8oV7Au2&gpDD&K#?x%t;s!{dMn^IdErL;rU<>7?R zDJs-lnFO|;WD4BmCw!Xw6!8S<)AECx(7m6!MqY`_$}WYidGZ!)bQx6ohGVcHfx4D%Bnw?|yo6h_>8>P3CZo*YG<-IZfFo$g(d~^u)-d*auQ~^+NYd zVX6R-PCHMBCA?;jfZ+14G?0s(k?YaBU1G&SpmY6SE$gFZ%L|A^eWj#T=ceeZFN1eF zJ`7hMExa&*7RSfXdB9lyOB!jvsMO^oXL&$BmRG|Gj_Q(*SWWDL9Gq~|?)%YLhn)oe zH%0erA%iUZv(EPg$|to`I#~!m&V+i%%t%haue(pqqu*T@!h8lrCnaw%=@kN6S$?en zx64a-M+~VdCFRFU0A<jJ`PKLGC)+`k)cURjI~L(284=ZDTurZaf5WFTco{!3Ddp*3i^L^w+Xn~NJjD`M+{5=n zJ-0t@(~}g`<@SfqY+j&@b{~A{B_uFqEg_2b->i20O&8ven(!n3IEyOKSq(H zszx@Qrqk3pEZtLs%*?m)&*XVFlg}IA8K9Ho3j&@PWtQHegSDE%@An5VEn_E=CdlH|g>(0(>q6x=IOk zHbEvl%mh`h=vS5RpZ0~E_uNCTKA+wu|J@Hc0WQ^cIyU90RI03vAbG^69*BXVV<$le zRva0VTM4E=Ebi}~n!5h#)ij^p6-&81{VTXn@absj7{imwOBfMYi|4lJc9D9Rl>+^5 za_;VC34j}>BHSL?j?A9Q^MbD=M){osxpC>48311*YpIl2%{_@`Z!hdIKc>DeRFXXq zdn2pyWePD%uQx><3>w`tS#a?HQUT>rdpK99rj=Y?}9^xi)6u1rHH+yF=BfF4ig zvyq5dRVEk02h@7~L*RQD$Z)57w__=s6kkA0iPWV=^BhOhRj^L>!<8_0zuLzI_HJ28 zSrH+s6?A7ZaH~m|6UGdomMIym=bKTpzTeY5>+m4Fo+D4yXKB_0&u)$;)AAstLE)c6 zS`U^)HCh*UOA^RBd>#O2NcR;IxJ&V5BZHORB}Ei* z7zd~~Uk1T~uzyXNiPCnSpHJ8 z)0#QRco)Mn&Dh64!Fz!Jyaa6cg~Z#!PrPYdd)-X)_UDw4lV9UoPrCSo#V-jH5 zQmF3v%AE^nil~|K7_c`N-2te4X-vO$q*~A(Ny8O*_qi*4;gT>R_lC%oyj9&ADMT?} zr?xSnJ3i2xke9N)Jt=DNBa(4X-t489kYZ&f&MA4p7v>w0*{E3LgBN94bPmum0#7Ri?iAfQ-a} z=+qNb~}pP{~b;H2KTAFPk+fF?@CWzk9u z&nUZBXFf6b=moWDqE18H03qNrVQ>9j#Mzu{Y5TNl(R90-+G%2Zi^|PPXHOE&kTlt# z33OinQNzqXW|W}C>H3+<`S*)W94{9oTH?ofQNVP}Y-61x=emBvCaE=k(T*DVVt zib_t@xn{dHy2u>^%57B{g~XjHMsr54DY_5V6Z|7hZC(uB6Yb&G`B2+vJj7bJLATp( z;;~ffwCDU;7h~FF1GKmy7V_7EPI^al1+8%6vq0RyN%p78e3Lcx$>y}?8qb;M+pvzN zc21fGaaN%!Qc7kJ%*jf4GVmQ*cwu;JtG+DA(%XYLQ%XFgeGn8_UrAk=!#6K|IU#8k z8$X!a)YP?0NH%fd0x`AfR*gYluW_^yX1+VyZRj~$$C?>#xHzM$#)(g8FkV7z;plS` zpS{B8gwe#X@cXPghZwD=yO4W{i5btF_dBsK|3RQ`o@kd3>>qf*y~>Aqw261S>5<%Y zENTCkO8rlRv(DP$#nm3y6U(NS*73MBs?9qLsEgp|i~6IgkFw9+eFq3seVB@S)7p5w z1UPaTq(2hWENJ~FT)?Y}yDjs+okL~37{G(E$G*OwmJ~(cp+DM#D(ck1CnMYa=-TW% zX;SOG0uo!^_$p4Y>O=sz`GHxs$0`Imqddyx4i}HS|H-ZO50O*kIHJ|$)}(7%7(SD z!*$H$r^|xJSy$4Fo9$$t$?C(Lus6?@!66s>8TRv+yV}+%p4046Zo&}K=Ki-)Ty-DM zz-C@%_=jna-WJrTXYAzHhYsT(4*b$2oZ9C9jB|R`~6p3>K(98+4vMR$jS&@}c$8*yR7Wken!-yj7hX(UElwi^tW+ ztJfx7AS%(80g?m?BinsJPwf)Fa8A9Q3_j^d+<(ddUR9A0xJc%$Fj-6!H`r=b+ZLOy ze?R-ZSIny4m!Kdx(*>YueZ>ekBTdUQwi$2T zVad1N?7k(%jj+H$0RoQn0DnKtK|A-Rez`B3qi2c5 zGbs63<=3|Q(LtuKZlKNfdKy`oB}|*Xu)dSF`&J8VNtoFR#~j-^4)Q-wYu@t8zuET|@)QcLC)gcv2qSnmni?A+ipLll`}W@i;CbbV z>2?VA)7_69HF8vkl>ic`e#?#@n8{k&3`5oT^KFeY0l~POX#HXUp_WD&Rd~w- zTZTqpmEH=PP;IRYQa+c)7B@aEcBY+!|6DH=aLMJ)Qv5g|u_?RlZC)i@o~CVL#e|G3 z04QH{jvV^UwWJI>t_(gjla31HkU|Byg+Thw2T{h`e3_o{+|~$hs!XogS&8C&j@7y} zHkA-}!p|JF-H5pO=0#(sBiFl4kODX{70iB1^9mg}iIkmQlY#3otcsz{SfyhY@{4*w&hzPnbZztEDY9&5^mAPx+J~(^juPq)sv!2| z&xmUoJ2|A137E*x_+rKov`5)E<@KT$_lWhBWi5wv@&!}qcfr=NcplfNvS8UWLQCv_ zNmras0y&jEfL^{zoa1$6m0;^dWo3D%-XfqdG_%iil9$WK|M z_q?sCI>0sUob1#b578rzlh~U2DG}5B@pK`y`w9znFm(mtvs~xhcr85>^8{R-r%-BIQXe!!>-_V(I)$&;{1AtT>bc``tD6jcRDvQTJ`|th1PZOLx7i{;?`hOL-By9U9jtnePOY3FyGJ?sw3Y$C zn|%xHjq(}E5B?4E&!>u$dT<5fphK2c;Xyd3@BNDY`-Imo&A{cQkRf}!dt=flNuy{HO zU2|P+wd%Q4>1m`}*|7CSu7vg_Ng}Dq^2NKv8%lZ7y7M6v77uevId*-=%NXZNvRhUas?g;M(WJTpDlX|2at{7Se8uq{6UN?)x2p zew;J|XkaaGHy44ml5~q_RN1%XN1XyMKONSyGvG$nBv>F=G_$VH!Qp!REl0^<;A?d* z<$V`jC&P->+I&e>T-9}oBJmH@Bp1GHU+XZyX_M^CqeVCRyf9Oj!uQV2Fp<1vE@tzC zg}#qXcBen`04F7vfEvvT;*X$6sj+x7^wnc}&yB}$Z z=yg&~o}tRGKM`v|in;tSt0Q5n6RMD&9kDL!%>4uTRAO zWf)d1xmS|fjlBF!Xc+rqI1+7t2hhNai=+Vg>gt4LZ)+<72t zw>=^Vm5DqxOySbSvG&`<8?&h`U+cHbB0zUOkh~dZKXzoOYfYtbxZmD7{lO%8V65yl zmT@Acp94)j)a*HY6X!E7#_lzD+=d*fn|TxcBGW)J|B!H;|3o(419!3Tk!_Pt739h9 zKltT@BZiRSkO}&G*2R%Ix{nh2($87(uAg6;JZ&l>WYf~z@uGg0s%r5#O-V2!>0~ze zN8sz%KYAniMZ4gEuFWqihQ+_>6c9s^IrDuEZ>rJST6_IEyL=7gTNH&+)bh=+8brD7>Vx zE~S4GS<5m0LCeXYPN@IR`itEkAxLZzeqwtf1y9xImWGlxlB2;=gph9A7(>7F+k9eR zae@%N2qZfWg+VXLwbX|oKBAkd@Tjpj+Kpcsu1Cmn(&rkVuR;d)t%zuwY)_a#CzyBpq8A&rHe!%a?%F{56_W|A0}imh^xYLGHtUn~Q>i z$dI=I5(|S&XJ*U(C}NAGC#Iat3VV)yVo^W(^G1|cO4%cn%#8Kani?#%^lS;4%_BYk zfV$uWt*(eQRt}0noljR=?7Bs_3C{UK8CZ3wt@N<{&Ro}C79aU*i|e=m^B z*>uIfypzBQKl$%hh{5@~m!JLfXd5kdZ8@qlmAot>tQtZJQCfA?KOFe2@Son^KA-W{ zV!MeTY4SeXFF)QMbf|}sBx!`DolRLty?HM$zee=zorjP#3w-&%CpT1J;TYk=V)7Fw zH*>A2%q_mO%bIB1z9-O)uttqCQ`_=4S9lMhKx}L7 zWpm$C^##V!nPL0#Qz7L|qu z8ndIK$w2@617bfwl&6MIe;^j{h7{~gt8O1ifiO>#U@z!h6dMRn+~ZG{`^o-vrkZST zw!%&>@#zH*5N!I101EMywG6&gu49(?mDJ7rbK@%zJqSO~gx@!!(L=s5x4zvf`5tqw zAMn~C?*^as8K2RXYI0q4|6f}?9OFo#PIIv`gVwn)cx&jT3bVzM<4PP!K*R-h5E?y-cis}FJ zOXC=s;1J6}Idof@P^oQ#y!xNeUZM5){swGI#vb!OSe3p$zAj}7PV zmZos*Ihq)k9pInruMGyD&oKf&EC$<`c)y5r6wBKo?baz+_|2e`Ps|8P>Jx)LL^8Y1% zlQI0OJ4fbc!5mV=x%=!y+@`T)CZl!gII-(ugTl8JLUu5u}0j7Cc& zBI8Q>!m5d)zgs>3%Mxddposjq$oy`cw8h?KHSyoE7OcFLmrxYl7g&{~EL)Ow0l7=? zS!Rr5cvH^#z%C7$Xihs``En)6@qeHpJ92&7ghNI^&d=V63}RK<-W2B||8PDDXy<52 zc!X*&{ibokM(zzj^y5qVJy^<4McGe{+7Q2^vI~Kmnm_>VRubn_fHhgKPK)HM4`(TE zn547o-M!*!{)~A2Bfo}mllFOC^6siGwTG)=o0;3Zguaek{RScWlLNW~s4}0GPRnqM zJAp!>L3QbI_etn9?r$uL^h>m)jFt#)%=A~UBO=bHgS+onb?#XlJU5AB3>T~)pOF_B z(ne|*%s`!fG7lAcQ2%hB9c`~5y_&}LT)M-D10xYCM1;Cmq%E6}U3D(oQvyacKC;7Z zpe1-X+*9cQ$n#Cl6mWPXPPMP6?dZN;_)?!?`UH5Fl9{Gc1j8b~Ct2wG z&hO80wzAT4#Y*6OlV`}K*B_9dN>8FnZoUmo*rf9oc3hX9S2PPzMs=Y5``N~7mn{A^+(v1m~Q z64XUJU5Ud{VlBLqrujYoMo)Mp_eN8}$jM49{9eTTL=t$5F?4f2trdE|YA*$K5ioH0 z`)4FJpsT6LZlNGh`2q+qo}fz1MlORot~#TubSv7A$}+nVaLJl?dgg2DNv}YQW*D3s zxR)*fd|h_X@_Y%-B^~ryW1RVs_Inlkt@K{%_JzsL$8&Y5-fs!w`tKRp?6}Hf}0}#hKpj|3s+fFB4@ep7shJ z8wT8k6AX-xBH*Otq`KweK9{ZAu{ekCXB1^_CZ3jzQLG2-5`-3t}p2qXcr^Ij;@|2^@7>cWpi7G)oJe zu!9Z2rlnFok0U2Z$A8|bf`q9)>u)U9s`uS{pQk&L}m-&URU1~asI?zSiiZW{( z{dt?dpJyvF*5IJcYkgFQhh9wgM@-^WF6?~l#8-IrX4jCiwGAW(3!iIV_Gel;Fbou~ z)vq|1XU7~GT8@No-~F62>+n&6c48pWIF_t%xRV6u*256&O0{7lqilp}^{gj&^Hm2%S*%OhyBuMLZ$%=~5#X6}CfnI^d|)|ExN< zsL9m~TQ?;M3@kgn+wX*i9}PinhcwWT3hKh0|E?3$Cuy>#BwSjVG2GEj8T1LlM(QAJ z%6l;y#o7-xKxXl<{+2Ytc{Rw3-!#1b@4^&}c~8%y!)Y@u0up^-;h#!UM%xH+26^x2zOQl5+urnW- zZ8T7Ct#IxPn1id%DOLatfR6wH(wkD}e(N&|u}VLs`@>j`OCEi?F)*g_P!o-fu%?tX zZHp22lB&;v%BwnInfclTUfPvC=CcHU0jlk3&Fv}>8vPg4=Nmf1GTx`c$TEw%Y%6i% zXuN~o5MfSa10enBBp8K*p6rM+u-Oi)i~S?*=Q$9k33 z^rV|9%fIEpkVP4D8~F=q6>$vH*bhLywwabo{KCkHc2NWC^%=>JUW$jC8>Y9JX@XON z)BMalx4)ISXW{KT74)}bZSe)MgJJJ%GW{U&!!O+x3&3Be%<%TeY%=3rD3)}QrmVoN zhS$Zve<}~tb#5`%^3Yvq9qOBjN@;D3!+D;od~_-pmlt`(S9%nXi=pVm^74htqQvD<7p@@V&W4Lpi^*&F#)SCmrgmasjF`_ku=x zP1^V(pDVLDmNYbuoJq-3?O9UAGAm5OfL{&1dJlJ>a%tq2CMR!oZh4JzoU!$UbdPye z=#NC8kMD9G6cSSU0r(&btUC`Av(K|`%XDHyT+|S|X~T7ZC1Yu50qGYIB-_&BAs`dH zaL7ihy>%?UJ6WHo5?8}=9mHN1bm6TuT(sfaov0r2;QH{pU^Y#?vxkUy*VB5Jr0iJ( zs@_RsCoO1GpFOx0n|bYhkT*=jehY5BViysPcefjbFw1Rl$DoN{|`NnQ*muRMND z?g*}mSPccwHej_$l^9LXg&Z8mIt(_l$M_Y-=HCJMES%XFE(blM1Jy6r?{>;0>%{r) z;zM_9+V#$)?uVpo*4A(7ua5xN&Zu9?hBdEOAHVk8gc{}F{*tpG|GC#hwk=xj-Nx&kUj$sQ(47a07;UsNK0v05^C1?5k>Q?HM!D9A|;T4nrKPM0Lg z-HbrB=B?QBw#ZjI&B_`rXe+#g47=D;cM((X;`uu6OYZX5ug)%TNmneNEdTuAdz+SB zB%E(zaZQv9S`4Axu~GTbxQx}?hv#YS|>j6X+# zIKJAn&b~BYB@vsQrQXPIGfp{N)~|1>ier^l&v^HF@FGb6OW{CO6QVwIFq3?2#lhf| zEmAN}yMoYGe^Kx#Z?{ef-(tYlsTb4@)bB4I`!6nnV*b(0PH_^8cS5MY8^Xv(t( zhKpB+d$NA>=`3olFPR(63%`-13(EJlQvkZNLSlE{>vhE^3cn61_XZFENU*?Z>e*`0 z%Rpa73S;i3+8n2Ar1!W1xGWz9+cjZTy__+qYL&f<`c(wx%xvEK55$vhiuU4P#;do^ z&>kbZuOb#6bKB z3Mu3>6zS*TM!p*%#wP(3c7<&Ca*$Fx1^chk>}nK{J}0R=x%3E0Eo0hz|@CqY* zxFROyx^@S?QKH=$nL92%`Bso6L0A;gJP?3Jj11D-PlEFpov|&0r|?>pbfnN_U!P(x z1R6$cYJcL>1y&@rCL$8yQoEHH1`1DQ`^^G>jTHk*5v0yD82W-t))p@M+CM?1oqZfegZQ4T_gAQ*P(#tfQ8456Kn=NI1e! zKc@~I;{X><_|LOC0L|Tt(+EALuO5Au5sXzE3nRT0OZ=bQC;*TC;I*4IyE>!fIN|8h zF6$mwqPW;p?Vq9*R5oW4Q07UAqi{DOROT@zuBG(=aINc=3nR3Qy#Hcv!k1u2NXEg| z6eO9C`ta526-Oql61B~q%==-M;=?YFeyfWe(~v9LFYoX7tEn1ZQoJ^RS7-V3&w@n;ox418A$fq^v=jF4bn&WLq@rK{b3S#sYH0k<+SoB3onpg&`LdVVu7_0 za@+w{F|(=xWVd*i@%N*bj*Qng*WqMr!BYZV`(0?gR`;iG*O&MkXg?M3&twXcNXPFk zf`5*r{#jQVLZm)nKt7%^GK(mh8;TJA!=gZE)zOpEO?zb!Ge-CfhlIG`y z;4Rmb!vpMv|Sx-5r|7161o^1`?u>i zRc$xhrMtaw&Pe=hX3$|_=C&MdaVO#H{InPrUAkwK-=n&Ib|EaXmAM}gVnFhw)UG$s zn(d=}_Vxa6$cDuy3Ja6rhliFCz{+b6rMcJH!tdUY0`q_2p8;%O>t!GrP2TW*KEYP*A5%KzEP!C(o#jc+jQSa$6Af_I5`T?}SRI zNXc4*bFNfX;wjJ9n z+2qaR|Bhj0JQTKBB%rd#H%AWUYA6(kS^@(Zjl|g)ayM%~-~49Ft!|GS;A`+=!?8wk(_XzXOW__v7su8L@Yazm%61wlgWZqXd) z5rjRlolDfrB85(G#8)|w?&`Aqfp$pek6rPS zi{as!hROT9#mgTywCQaER7>`k@qOeiLanCk>_D0^&29EL!H2Dlp3KqZjB{C{#2$Z` zMfD!O{+dgG<+T>Gn-6@z5S$M+7SpMZRxooeE1mzwwTfJLo6|&`p7lcZsPdRne~tr~ zHYb;-c$;Jm+@_RZO~=7o0L=Zc0c_|y+990{}&_85Y5D$VgN-TQ=WOr%EPb6u;<|o%@07SrD z>T-rh$!#!+u`|_DNY69xkQDG*NO^*Am^SQ;ILuQON6Bxa$5Zu657N^oV@f1xM4r=?_>ve288pi_S;>(Ek8~JuRj6%=l5hIu!`UU^v*ZQV%hdd1NM7l(gZuWJH2gWVrY`SZ_TFEgTehtu_bj46croX(<)Or}d{||;8uDhQuWtkX(hoY@a z2$U@2r8Rm6>wSHx>MaGRGl7(cB_JEC?bBZQ*^agAl^m8I>qt{JNqkcSnSf6$6SOV6 z6bqF7X>DsN+^*wI=J7gGd4^?55FE>B%dya3LloTYn?4l_4YKlHX?qdwZ;Uu{n(IdB z=;%6D#P+0N+W_z@_?1fg(Au}y=-`CFRXU`Bp4}WXPRdQHmPE|Z_QfN8ZR6flx4+($ zkM)06A|y_#fDAWfZn6=c;{C~Ta~~nYe%&IFOtF>EcuK#Y#{zh}BJrG(SCA}nryha{>#%Cs7j@= z`=pgL(0luF%W+V5L3?@XvUZ^BL~Ilh)D_T7Ij3Y7wZ|uETbAI&jfapf<7-SKk5G%tTZE6Bf0qRE z(kEz%!@T&mXm4^uxv8@1)6)*{-V7Lz+$)v1xSc#Cs;R5A$1kKg!P_`1xEJBMXedDa zkhsXwXupS{Wz>YC!qLd4Te{DK{#Lm?>WmiGaF!^duqhiK);v<+4L_Fav8s=|of>N` zLiR(Q3vU17WDfCG{Y)2luqr|9D*k;Gx?gf*KT5B``huR9V~3`VP=S&_NH%(;u(eST zHjN?a5zkNo=>L;EjAy&pkbaNDJe&vuns-$pWOAc~K^szHK{t;ZwX0PuT&(FZ@0lir zcXn%@OO;>ixD;#%x8j{i_2rTSF>>lrCPPT|Npx^;a<&i0OF0Aa{XKrd_rcoihISQc z7_VP^@>+op-4LU`HKR($N4T8HIOd&!M%`Z4htwJ-kQsx3!uM|>7jW-ER3-07&-US* z(?~pyK!yOpZbAOUa|wO_7{GFoiwu-MN{JSW6tU9-|2t`q%6dCF;NhP}92d{oq&v)^J( z#U<7SEuN?gMizI%4K;?MRE#o3ql$(EHqFs}CI@x!2jtL;GQHiJG;6PaunXdeHhVSN z7a+Vji$h#LWDDw0rN#9B*Be-ohxJ;gr`#3t{`gnYa!NhHuEDejfKng!#_Pvw`BL{u zS8~YrhY=f7E$Z)e5{1o{RlHiu^d@fz%cV}D)2{t(saaQ8QnK^wAKV>Q5E`6;pHqeO z|NgqhQr>WP(HW-GS7bf+$cYRm_o>By#aAe})lJY=1QbPBRJ$RvJF;gU4SoCy+2h2^ z`FIlIQOy(fRdBH>lf6C}^3_-?nRKn&{%FWh%85!v7t(WhC02ZAZlY}vp4Z6;Srxs5cwa2tbkJ@T*>V70HWhu_?t@FmLLR5CF$7EFZZcsmZz)S4c$=_KtRSP?gLF(cFhbz(WFb#ghpHuLlhXRMIrsOF>4&3XjW}s{pNd2d!<>! zNjU<28ceOo-J#02*K-wGsHb;WxkzgiqA@BA1_Uc6W=L)U&g!WY`}4H*8;y>6%`}|z zhdDoGkXw|dUf)~WZWryP1;WX)6k zJTjjstphR- zLpO9pJ67=?DTHSbjeab{_EOUeWCp?wpo?9YbzP9Wh!a}sT&>Mhk$x{un_A{}E}oQJ zXxK&I*e$8z&n>TNZ(j&+I17QjlPW+>Og`NtHJqo4PiW^#DaSO}d+V>?-hI`zzrGFx z`;}q8{w)E}l}B3Xfk|eMuce{(+YkJ#mQ9@v4-L=xue=qC{S2Ba?bLVb9{YmTdj(T% zd=IBasBc>|29whLW??)X9VVkBXJ-4SPfjgo!2!?itg1QMUhreQxeM@ND*7)Y@LmEs z=Zu&PH|z3+8&f4eSXveh9z2dyUo9_m{uC4xs?tU?tq}hBPF^9>k*=;YHO;ocAptnw<5zu6L*P zeSVo=-y3ixPaNa{AFoHd_A_o2ZWdWiI%Pu%p54NP9AHM1n&2h~$$_gr+y9d+o=-`V zC69+Zk2Pnr$vC-J!iE9!dD^)SRzu0)UZ;YPG3~&uH__<3=8>|YA3Wvt)PZAbAsh97 zrtm5nO>9-YX*GURkL+ZfEgD$vBW1!ydC}(=(ubJhT#UI*?D*Gf9+Wr%93-XcXV^W z(kzW_mpCJ?=VGLP=sO5%5f;|Z8~xhGK@{E9yGEJ!pN#=}3o`zkD2fJe|Ev2C@}el( zS8`99)=gZ>MfuD9yc|=C$}5VF3DlfTFYuqwyYRSM;pcMbSA&VNU+JVp#wr8SrdTUP z;BLMA7CDhn-f@(rUM&BeY+>Y~0n zj@+4XbR8J4E#;8n`cFh3+I83sKbS8Px3x>uyl**4ETg5MY+3R35k2dDO-7;Q>nw8hwPnXg|hXO)*Di8yp}RJMtu?_psh0f38%=ZcI=8}5B`gYmJ|Cqn|HKDEaOU{}kXUh6 zB%>fWf7#Wz-r#5dFgran5PE_KR^>?asb0yk%I7cS;X7P|#88JG6-%jyy}st%baJ#h zkCsS$5lB|opDEHCh(eS8EEkSuzZdw&1w=q1eY7&bJUf<}Pv_x_)>aWG6QL12Q4(X& zhURrJ&9!SImZc~C8C3bxr%If89>Z)vAKIHNTVqwfcyts7xkiFecx3US!p|d1h%M@) zC*-a{yuJiASE=W$^2%cX`+c|_v4^+je?%^{@z@YuTTJK&Ya9BUp{*{EX%m8}*0<-F zUenm;d+<*2_h5h~3p=!eItiYywkt3#LI{A01IV;W?E=Bc3v-njtMv?eHEl<%FkNlL z)1z#CQ80ketG$8m@3Pvik~pxpvhhYLBY||_`b1&WX|1}W{0OV4!{*oWnAux)!aaeV z0_g{ENzuKQRBh?blJpbONyYN z%@of|*n8nC$#?HwdE~Z|wxQ)>7&0j6s8iQR?-5&C{%F>0IisLgyBd+g=qDl<|Wf3G_!(G(YrRr@zKwN-k zM6O7G?PlyjT{rG10K_Wn(gQRyyME0eJ{6Nf<%tne0RbC%c(ezE*+ewccWF{}NdGhG z*E-VJ!?*c6O&Y6T>rK*ZX>lvi8h=PEr^{z+yo(4M440(T+fZ&exnP|)F?9OL^Bkpt zN8^9o!sn5lQNVZeoz)dLJ_Ul#HR`GB9l*}6og??coc zB6Ehq&fPw~lbl;^?wh~(dmeFphe5vdBcD9>;y$rv0PiF+^-_syqJMwFQ{`%6A|{pC zujpnbOID(2_D+8I_M)WU`|)EV=V|kWO58=w@@eV&xMNiC;=LYD0 zou-7y;c_}h$0*d^`^-OmB8=maS||1K>fCkmc$L!Ed+SPFTsy z<%e?B$p!GjLw)kUb)eKk3gL5V=-<0!LSN6|gA;5;s?dNgF|<_vCy9qSoqWPm1x*XD zdyS{`C+KPD$!tMAi{zPBD9*Diy+Ls~0N|X&>N;31zGB?C-5xFGN9FYVGsq0Gpf--+ z_@B7nz|Em}XNR<80 z5POzXU>B{(I4K$W$mMsRTM$!o?lvb`H*uCPpO{@!IfNvGW{qA%5oOeg=No$PHK}vI zqLRo`GfRnney#D8!I##^Fgd>agJK6J*7qJ5YTqPK_Ple93co?t5EsabEZBCpwlL&Cf=UrMYPlX-tyutT;v< z7TPGR>x!4=shU*3{!4S|kDacL;4}Q@p0L7qr8Ibl&FiSVMPPUS_A8wC8Huv4RsN<7 z%RsBu*3&?bwW7jVGU-rOHJOQ3_~%!xkvE%knPx7qU_~RT8Ht_a>io_0W(K^!Rcc*o zYA#INv}8wDo${6!g{J^{6Xds-mwlx!%D3N#z7^6*>=x+fV@gLa^!vWT2?J$14);-2 z?)!Ejpf_@7D;RUoYFKGOg_;18IL-!u*0RY)!qvwoe@$FSW!}i7Vd(th9pehEFV_K$ zh((|5FsuzUt2{ecB21?g@}}*G&N{d7pF&ZRHsydj53Wm*=#;?#Y(zWX=IpnH>2ozi zjlFl0sMWFTYZsD%OWwMmb|fw1yjq*rs70{HyVb-mJNEBH&>)zaL>SM{W*Ofa?bktKOC_VbUuSda@blR8}Clanf4oL=T-3ie5@*QilROTaNxDEfmAPTH_t6Odei7G3~B5+kvo zgBZueUkVn9h?}U7m|;HHNHY#BT6}C;gZ^LC%i#i13u@QCOm3}p#WnE>7-v!?yiF8p ztMxBN-L zvb?Jm`HOVP6!epT;VhiBxZ?akqxbdRdrtdSbA!A!DwW9K_buq{_SEvfoWys2W1U0mGo4CIVrjEmNpNEsP(#z`(GoBYcMg0${phk^qj^)3mh&p z>0~tQL$a9R`CM9wjCCsa1*mTSe@wkqRGV$MZXKYM777%nMcYD=1S!ReOMw=OyL&0_ z5?qQ~fdIu_gS)%C1$UPcG(gauZ;k)oYae8cj2yj3d7t~auWQbH>sOi3myX$B^90~8 z&`)axs5aLtkV4Xzoy542bAir9TxizNZqRs|^V!RA8IZA^uG+v3)gP0#iH?ezz9F$K za8@J60v0V=g_upn@4+HGyqbf*ETw1B+CvG4!h}zJ$>R>F^a5xHe#1H31pU(Inade{ z=xQ5ND_3bgr+05u`x+jev6_;-WWN zl3hH$67X%q_|vp>XY)NhZyz|_M;FNWecNfauln;aoj2XoSlV#7@{L}LhqUWIsmYDb zn2XC08)O1zXCNo!Ja1C|j|HKd7dFZ_J?k|QFr=ww>#Eq7+=*ld} z=p&i$GRsUaU(rU9m$g;wdu%FaRKU+d5qu0TPu*-&Ez@(3GUH2x_8Myf=QnT6wSVjC zD_|O+S9ArXqZtH7p3s(6q6N|2xjC*U`!M8@0`JWBG=DcVjXzj1SWGCyn^7F_F8mJ^ z4OLRV{h6oi+neEfKbg?5D&+C}Fu((B{fScJpieo0I*1z3Ec~K$33Y(rt`3G|3a4qv zhlbytu1sLD+v6(SOI{?A-1=c6OLioU`AZT&WKjqe{hRKD%(Dj8;@=xkex1< zx?bSHj6UG7Hh+cDR@0kOgZogUNT&wO?(o`7hpDkG?eCiwIy4Q4hOTf@gAwTt5bml$ zg*U&+1~ej&wpWAaK%N0YJ|~6ynAg6m`}PjEojpF0>B`Hw;T(bQUB-l8LjHp9cx*sH z<%lOvO}~(8)M3zg%mC#dC`ux7%pSm2J=1PUX2LzAvM8p=#F%}${YdZF1kf@@9qid3RrNm=8a8HMn!})UZ)8Xu%6_Gr(~!yK z{p?=p8Lc)S&Y2)vW5VHa?&-=bSF)&%#>o@+dqFGql)nGy|8__QEQx@r)>~z^ZAX^K z(oM(z;I4~ON&>{Ad1)1C=y`V4Qi;66_A~(&v?!mVFluN1Wa~|fY0rI?sT=gVR0&!4 z0l9!41-fQ_4#?VJcm8>*#d6i#@5_!NAFD@v<{M0kei`6&keuO$a{^caX)Qxy1VXS} z|6yPUt$(EPf>;aw?pq_kyLu%1xdsW``v=GCLcAWoPCh&!rcUfe(^witr!B(A7^F#l zW%Z%7%|H0?8pZbpj}j>I?Rlbt=lm+dl&&7s+E@V6j+dv{b8bwC;~%E#&c|Q9^t!2% z%8XT&NTZuX*UKjCa1vCtN)6}@;Hfc4MH5TUIeNIq)C~4j6z*e&b zxGyJaET}3pgk$OUm7)H!QS}3n2mgCRYrmyWpc=asNve}IngU!-|z5Z58kR- zXN?&L20(dt$w>@zer;F9V0=?(pST88j8w89zBjKR&N+MqEk1Mr9~u>sFb7GI&{!K? zZUtdjJn4j8RwF?;p-D}l%WJbxf#u$`^G-r+*T8|Xng+uKWY0&#e&ey%p6QQ&4;I!x zWziKxT%_*m`~DJHhwPf}5@#?tm#|hCwp)&Bn!JgG_Ig@KjD0pMZo4SC{m1~GOEh6F zz@JirjZ37`U?voyfSN*|)FspZ)A`9$yfuHPm7@*1r}!FUg@)LX^baux~lZUdnd0sR!clR zD|1kh+}Q6Omq)PY6-Y>mEIN*85NvbqIX31YBy+C&X!ocCo}e1iSrMkUk#ngP7pf;A zj5|3uYos^rBTgi1#-dn)!(AM1(Z8dV6EH2!@$+KXVNY!G;-4=qOV^F5f2m$OHm`YS zwN!%=t#$Ik`(M)UolNvCB@bupxD;^rg{tju+M|L@_m7V;^%TCL7kh`Jj}Fbs6zX_J zO>U{F-^TQZlCp(@8&ClB71 zKD)}^_jwBDmP^e1iJ-%pM6>j?GVeX@Ww8VaXV>iG#MUX+*4w4hhXs$hqZpdIX_w2h z{sbx1oKa0Q3#1tLX%)Ok&(Kdt9!`>B5zWm$unC45&Jw|`0&+#XAjzdZp)C$J84r05;<9-tr!1NF67QY=}Nl;0gGBFXI zsDwY_B9b)!05w#WYE&GDcVkJG7i7Eq2s*C6T@xBV_oaUuRMryM4p3m6H|JsN)!<)` zDrt6Z*9+OJvv(Md@9k+9;g&4^+@Yq=7GF|>NlA;6c64d|%B=JSG8u6IK3>tcZ{vuF zj8KcvsC5y^zt~~#9DK;rxvR{Ja~pZ!BP$XHfb3+yw&45?)BXq&WsdFq{*5vxwb}Ch zPpKvyhw%51R*h2w`z~oOopRdGaJe5lW-9U}))m?YfK6}c+_c-YcM%L?U~yk0IPjUZ zVV?~^q3bQ%$ZD6+uqI%{xEG#1KNCAuv3-H7k zeHUkB^&nb8Ci01RuI62i$H%4uNfBd&YWa#Ik2cs#Bm(AQ0wiYpym$^qEYa1Bbjn8B z5B{pm7MfVD8EC{20TF5B$}<2CL)>RERMh zQs2Ju{ybLsIH<-oM{EoXMA{j=8D)#0sJBsE!D7Z||6LiC!UTHv!U5j^{hKCmo8?an z5gBG)>(99P(gYI{DDJI4FXI4yg09BhWW6WEFiWkpxHVP^RMFL`aNXx9C0F0H6E(#% zEP)mD#}5NWbuEAqS?YHv-{>32l9yI^JTq!sQ^<;I#wW!gouI3i<}&Sq6=3 zzzo`{QIhiPCxe7*bL)Pwczdv&N!FpnN{mm3vhQ1+w#gIa4#HjFpi`keZf5<&eboJi z+^P8>GHUFTBu;V)a4Y6knnTJ}jzK7KtXI6FAl2lfO1h%-j#-ZsV$`jvLWHJpWCb>( zm>{_)SR(;pqUTN4=`AArB)elMktn@3Eh zbDU2eXy&>T?E!N*C3cBmM0ro$TSbD3D^)6b=XN{EdBA7D0?19U6u!ht{I_aUO*5YC z={Bj_i{s33F!1lUwtFHP%e&1XW9{@GtfwiEy(D_Fn!SVjXqpSh0`AS{B_G;WT-R(; ze}Y$C;VRTA9QGY~T7tE98(@xC6?Sj-7hdzN`zt-;Nq5aNy^{OB`aMa(0X}TC_2vEO zInQbW!~OQTx^}^|^QkM2%rprfi=$=%o1V?Qn%u{|1f*A%b;~y>DM$lKpdRQNWYT=K z9&k0K-qOXo=Gsf$@Z=2y9(RsXJU#*p+A1A29o| z>(yI#Ypt8m>t|u)O#i>6fC81PfUB{! zyZWoaac=`K0xAOlLKA@6Yv)Q7@Dok9h-hE7NN&B;5LGt)N_d<+Xj}ltoDz|Kd#~F` zQds4&fE~Fjh?XGMYPgf8d*liKj6!CiUK-Qt-R?UJzQn6VMC>~@|Dy`HY2$7indgF4aM>rKNwk!5Y`j^~CfehJWuseah?~73(_LMLmtj8_FUj!9~o{?j+&bpvr^9Rc$qD$ zSsT;OY6q94h4}iLbkA-zL|-<1)^`(#u&TAf$m>tTv2nr9i`|io$pe~3)1Y2sS%#=gQ+`vTRZfCUEdu69(83N(60E!;)u)#ma0w#Z*8dT1b`W51;KKu7nc8?mN-#`6RF z&}hLLxO}Gbeiad>w#Df3BLW{bw!a*?+zcrc6`( zISi8dq!*!KPhH%`sG_)7;G7PF0XXJ{OjBSMY6{I)9HzrN=Pu^6j(K-K<^a7zo8x75 zg12o;wFhp8UJBDV%(RLrx6r4GhF>OCWxfo0FUq{#kUjqS(S)i8=)`7CSea2IdyN0U z1d()PMGk{Q?uOl%Zxa9|YEqTq?>)F*p`6TYue?l!hKM)e4e{aJAR@cYp5lAm!67<@ zc6^V7lUf!SzYB60mQwfYcrm-O$kP!|jkvJ+yi1q-jMWZErdW5#PSh@@8_iv=Wynz# zr1w)Xs{2I5*+HU+H&r>~N6-gX2C|T7#=n)60IR{`moa1AC!yyoM~^Xw9BRTF>CkBY zPY8U{4-Ma#VaztT&v`!)j_;pf8jD;{CpK`Rze0mBK_dchfv6P!JKy*70b@{4kRQNA zdMMx){TCiWTfG$xf1RY#RKXYHbyI4g98T@aqgdHv`M0=O-geqj%dd3Q4D)>Xfw*6e zRJmEG_AzukCCe&`-xPX*cl<_J=~4!`MI>||0wVSfxm+dG<3`Y?Octq9zKw;Pbn$jg zNv>?pYDPG3*0MjBbJ8Jr>T5E4hfKHhE`oYLa~R(jGGWypTJn6&+YS(Qc>8p4m4&#r zng3pHjP#rgTS~NAov)HE-MQA{RiWuMo-Pdm7^;{aiu@x25r(8}!OI{Yq1@S*QgvuT zc5}UnN_4CFL(WI0VMg`aG{ea`M=qJSR_~%Wr5MwRx(k>e(X@VWMpZBtg+6H%Z>+wm z=K;*bY`+Zj*1Im|ga3>|;-7}MVbK;r^**cwM68!Z@JfSWf;y@m zfKKUw+FK&1u!uq*pG_V4o@qQ5Ij5@dNOxrbIN~T9ZmcIj_%wVdzD*#44W_FQ=&&v1 zJK;Pu3Ob(#gL?mVhmaAFzKsoTfnBGg&i={;~_)vu-9|B2{lP6s30QKUYsqh|=BK=7M>ZnU6kj8Xs7! zbVOXGMxgD+K@(3#DWoNYu`1TA|2Emn7@lw?S4Ja9Ni-Jkoh=W%1jTYyeWU| z_lXTK32g+yQDu}p4jJNQm|OHicjVwG za0jId9@#;lASKZ!Q+?CFzxR=irBSbDMfyr;?CP|&cswqi`*N@)>?J15jmN*F-(itg z&YwnRT=d_6k2;x=Z114)t~3BgV}K%Xj0$z1X~ahI^0lAQJO*%R&PxfM6O4m$?Atw% z#eJ;f6oSTF&w~TXZrE$c+PCuxuBUt+@fw%;j_U$A|9iP4wyBB8n9(kvkc7!o)jQCC z$@}jsVkf-H@9>uHIy|h8wDo=_>R<3RpWpH<1lZnrQ&75Wn&&~M1b7=c$ z#@d6~Ci(XzHm^Wj8=d-F4E#knP~Z4?+-q^^ESttF_}J_8q1bgn?<&rx6OZO@!WxnO z>h@|s<374oVDa``_(}f;S+qJmcR4DfZ+;a2>|5iD{8MWWHrl}BFIY-?4;b9~=uES1 z&eY$KJ+^76ufn&nzQkpv=pS9tmF5X)=@<0>ca!6FfO0hQd;Vp;4+jTcvLjGE%&Z~P zr|0dD=Fptqurp5brmi@Wg>aR=y1kOsX!R!iFtF>9_;OV77zu~>s?}zV z1$~zThB zv2LUN&7vYSNZKlRrq~FmF{_9o?@mYWBzAmvP6Bx1tyF@AI4R~R*nP#qf!pF zJIkTyyEkUr!8-x{`w9yU&}5Qu_${`~t7t5-B?xs#tb2}%B--HL=a2&lf)v*kQ0SDd$gdyp_uaw^VIC$Sf>LP zWdP29hpQ!UphOJrKE+O2DXbUL7}>McWtWR8OOj*43Gow2!GrHF2<(j()6%IfgGkLi zQ>K30T2s{H)8`!?Nsn3?&nY2ffvSf>ZO}t)04wqNDMmQyxV&jIhnxVLg;i#uvxxjX z@f=;EX^J`PyBBwKudJMozGqXT&953Fl6eE-#y({8{|8lL?Y9@XV~^UPqeh=F zO8d&mupExmP~+3-G5i9V1EUn;uXSkA&(T^qsL>=UDz-jUWP)D}w?MW@!|_Dg^>`g* zn9%1g3`1c=q^z0<%u0)&O^Nm*BY&#KFod!?zC)=@5m+28Xx}~{OQCH5GOx7u>^t|y z7L3sd*OG|Br^1;Ui6SGEGLQztZ`ZTKS!Yod5plW~;8tB!>3<};9FL&4WL^{-#4qd7 zVlHP9Vn=bR|5jIcepN%md-*L|=5vWEvjtY!Il$#}QKR{9D3vl$3S;lx8ATO%@Pbz1 zfs>o#3y$)pM{7}wic4K4*z#vj#9wncokA*V`9c`6Jm9snECSg-~$5-%Zfe9}A#N+x%5mZKc#F1B5LO6G6+4%iI6j&*hTlGR)rv(nls zuHG$Fo_ZyG4j_3o(G@4GAon*@CW5z8g z1jjvU?Bn6EzU><$;VO@q0&mS=EUf;z%1OK7=H}Y7%bvqPI;wWEp#WYX;Pg`lsSjLl z$iycQKHnGbL5M@Ts;bd4u{eL~$z~IAWV6@fy|>c7(LXvHbjVrX*O!n+dA#%($#A?r z>wLtBTUkr(?7MU2ISJ^X}5NZTRSHfaWRA<-)7o3(o+2+Pnq_3!XtwE*;F=KZ^N^Lxd+a zns0-6P|y2Rrt5xuMA`A>cHVf_?ev}P)}Wb?vvzB=@R=gTa*GZAQ;hJ>ExmD;KlnoT zcj+g|ZQz69N*ufWMjQ$tj8BgM;#n2JSb)J{0z!0{Y zueQ+9-c2tRu5@RNw{mM+KjoXuQ`m{3bHA~K0I`de7D($|Vs+(>T;|h;z4kHTGz@;l zUZLGs6WMczHN;h~B9=5};SNz<+T@Ww{gG#+J;V=ed%nqrC}Y&uAxjH!RYj1%{VE7M zmC))nnRet;@wY=V;a;^dM$rLTT=8ad=YVg%wfzRX4(u2_@3V&bGWc6C1e1$}-H`OQ zLflkV3Q3;ujk?JA+k+&+2y~#7-wuPgYiT?Sgryj@U9+C2H2s1oJkj|4R>N?DRJhtk zaY{W6@B-ja(S?30GK)s{!X*lUjcpGQE3pzFuR9FG#J4{BuX=%IXFX4|AMtJOA}<^3 zbvd)}awY*=NCVrOUS?DdvJZw0XVNs#6Z*nYVyB1_7=#qul}F>t zx%JoJyvI7U0-I^JMzv(N&HUX%mUr2))vaRy0H(1t@e$NS&K7eU{zj1~p{``E{hc?# zfR8xxoYGK_E*&=^%C~2vKu3N#Mb+6>8~HOH*9KrV+JvHN@odv;zr91)8T3MKRlwVv zPX>8gnW?*=bU$TJojsYi{Fpl#m4zCF!cqyaS(Pt1g40c#ike7ensfr+$sXO}qA0IC zd13@knyr(2!s0J?&-cDFXP|PAsViSZXlJv#RG(b}>GE{ru2<2yEVhwITYcvJlYcpM3zV*1D3v{&Jw)Gq=M}p~j=Y`K3vnLDf zB_TS~wy{x;|H>it_cZz!0nG!W9BDLb(8&6D*R04zx$=XxBup8(a))^O4zb0h`nz&L z1KazuldAkF)D>IC*{4uopJBW0gSUK@{Vz7~!tg)qwd)7h7U6}aw5XM)$B1_AQnUmv zuS(80E+xqIdaeA-y~_=*@y9WETz}wtJCs)nP_RAhg;lpcQ4Ai0d#IIL^!5T z;xrL!%8wW_Sq zzK<-rL*vd=^)<~usgWsnFFkJA)GjTvcYhE(ahcP9+0nI$TOzMPH{E^~@ezL%$DLKF zZ?a#==(AU_E_lneh_&4^u?i@e`zBhR-#epm1E5+5I~abnKv#DxYKFV<=ehInZf>75 z3d(P2U(tS`ef!jUozLfimun()2~7Z>w7aR%1~Mq3=ijuA={{4MS3`^Yf9f%FG^XDB z^7lRChbfnrIVr*5d;5_uLK@D2`05WmW#yOt@_+6!ZR5{oh8FT-!+#{>${YpWgu!ty z9R%67K}$Hx@6j^$9-R7$a|XPolElVIdCv}Y}BoIYwqc4;v6Qcc9Q$4XeBYj+9idI8*SFExZ%~(oHfUa@}+WM zgM;FsqQ<}gAv`B@Nx3RhiumFn4CooiNr9pKDnVhF3AfDu75le-@2IOI zG9XUJD;?2|b1acw3@)g^;nqKxK8WmQz4L(_+rw2cH<}m%)hPW##^zR>4OAG6R=qpT zDLi5%sB~g1PGkHhFcuWG(i%0z7KZ8Ct3rma92Yuzp?UN*=FV2iFdV%;ac~K-83a=z zY8K|IW1W4bfyo$sYhn@H6io}4*qKb1FI}V2Ff6%4JP)DB%{~`UdE)wI%xasn&_%64 zT~gKlU2_P^s7K7hqf%c3tV>~D>O@~;N}`?Mk&Y5&q_(7ajS-FoAOgup;4>3XS;**t zUvs7;>U9wN_u3Y%0B{?u#RoOjRvCLMo^=hqXd{`Cr@smRSGWqm?^zTr3dfYT;7j<2 zuyXVd><%TFYMPygM1-vE6i4tI!+-(uykn}RNy zt~i1yY7p>zd49o77 zNimoEgc_t?LF$+v3WZL>u;Pq*f5r!Gb9_jT0tqbC->X!~>&6S8Ybbb0af*4;M~!?# zbfaT8_7Fb5R*tY2^2d(-gGnB_BTb=65S<@^TbZ9&R~Zmz-kY7xN2U7r-fJm;@gzhLlWi$ z+GB-uk`EQG5+SZb;R{nY`0+lH$Pe|HFhkb1NT96DiSR)JhDH+snQ_+D*6g@LEI$IH zW5bB^+)Z}CNPY|R+7x^S{i+2cq27p%t$RQGYzb?oQ}dhhh4Ob(4ty0AG7$Kq@7;_P z5~C%uL67MRuUV{zt3;6ihhpJl>OANE_jK4t9a#%wE3~H3if>9wRmntMI+LWxSSlIr zAEws7R`+Q=nDIqOfczlk83`NufZ8#Y^V(^+#!N}`tIbuGA>w1k=#=g(!D4s8=|b%` z=fNq2o3rrs(Vj}@XbjB-G;LdxQh#?&{zmpp-m}-I!S8dycOy*xIfXC=aC*WZmwd0# zoKsNMz4zF~IQ}NZx4q`!fTf}Ea&Q~v{&wT}%@(A}+jiY?Hg9-I-+^L5H~-3#Y-yko z)q7D}8hDS^r%?KQU1{>~w4=zDzXrQ5442I9bL+5y=Y(F?C;oGYu-q_Y_#8EL z(U;a$P9GyTeUH;vg!Og_3qGz$CqbIDsGFhI+vzvw9Kj8=1=G5ZZa<}~V|z{}LOp6H zuOGB@^w2AK86Q9ZnJVj(e_A;UHUHsV+^B!G$p1sKxyN{2U$?F3Wv=nBR5v;ETQ{Fw zPFwn#%Ib5BW_OgeT=gH{Ot8_S(MVwMq+!fEwm#%r07c`$N zt*!e$Gk6K_uxYvG5oCOvmC>{Dpt)ah1jw{yBW3$(9I4i;r;Cay{o-P|HCu;dL1;#M*2Al4nWAfa#kQ@lfvd5stbN_ZOD^(KoKlokBhq#K=tikxgw}vSPf`+ndEx!>%k5b;f z+3?bxq-JIGl2guIejJ(j9SzByu2T6fddbLcdyQCthKN0o zVGI?s_+MV7)-;chA!s94e)`5((`QpTRr4LyO=X!Gv$Jp@*H@B2f$I@cH58FVEm7%Bh1mL`w`N&3pftJPtT5GF0)AwDlRPW`5FPG+m!`&N{J8^rWf+@v z_Np1ve=6&BpDKO=1^|zd^)o>FJ%|IK{*f6U2bWlx@l7ckJe=q6_v&m4AU;GaEiOtm z9$)%9y2}aKkc-N%2AH(CHD2`6PqeaSr3CfX>!>K}_d>FO(w>Wh#~5JobdAK$F_Z<2 zz|WknQK@vu+nfba!E(x@GqF^jhdC?@k_<>agcy;D7?gRJxl;xQ0^gxPn~4TEgM{#M zyMfj>ikty-u1M9VZfb1T9iULf+fWju?@LDKV&|%!?P^2CG%e@hVSGx%RJW67NkapNv-uNU5xvcUj(d%f~9>Zu*vt3shw49HQ(3JA*^q~CTNHIzzDxg~aHDlG0oT!VSoLkf#{?NZ z%MZ0?nNB%&>i`nxu4Ft*TEM1s*8Z&4h?#~HS|NQ0sUk~9 z4wcUQR5JihTzMGlAMl9QKdaIDVgZU%HhC`a%C`PWSsWUdz@^_p7aSH?z6c~h4(%v| zXy0&~&#aIn_V+8b`I76x+JTMP@_iP;xKfAOuv)D%-jDQWqg(fda-Of#**^j{=`dPV z#{7-Ci*FTdita0iFx)XJI{9Q^Rmtfj5f6d4HQAiLyftjiweR%isD3{u9t6rNd*z3D zJQ|6G&6VF3>^_`CZ=2p^2XWf*p2&kE@Xddo8HCDZrf_LV6#KPZToLgg=QfxaA*P% z>o%jT4KNYuM`jAIT4_pnQAsD{cuwL;<1T5wD*dSES*TJwGAa%{Xx#Lt)$$_kmx8vx zKfYr0ni)zif&OCaj8AZx2yfr&>L zG?6Q+7|&$2rO}M1e68vsz}VH^z3j(Bqc+8t))rzSbEGcQ1*n{t9&l+u3x4J_r8<_L zr%8we;R}$-+wF0qd|jyLd;+!e?ntEfNdbGT?UjzxZH+y5UAlJYFZjnh*-TLIm*{!< zr@VF(pDPBRsmJN|Q=b~1RwPSZV-XUGXKuUn7mA8Uvjw=13;aAD_vxVa9M;!JM=rir zd*AuEdcMC<vecR`ftVIDDk)5LVS7etnJ2N3<`!%@w%)NE|D83C-m?gXk(=% zdBP$0c6w05R^UdUo*R6q+inprb8X&HAW-3rJ}a^^E^L_C{(!rAtc=&Ba?*T=)Ag}? zy$oR^bb@q$dU<^DbXPtvzIG>-V1`;xebXp6xp{Oy#7{7T{{R4cRGE&F0^$W`nFoVl z9BXZCRK|_(7hrw-8ddg!3(M1;4qKryQy#5?m&_@xa4GBCx{Rtp`Fq*$$BT^W!KFvX zl-Bj7%g3ea%l=jC1=mOG;imv$+XemmqXcB_)7TUZl1qE}9x{q0g_lX^i$yVERfQHo zN3rHVm;j(Xt83UIJ=ChgOewY8dFgbxZwB8)uKSt*a~ zCJa@l{aOvk7Z47eO_TGIJK3fQozqy|6H(Ze%?u(zHlI#9IvL{-BquwM9Yb-UKs#Bs z`6N3N+~ZC4HPpKOUC@&?=$!(!oTH|Gyl_dvgK;`+wBdDe#Af^^@)K>>a(r>4QfFA) zH(O?Rb2hc(L7lzSRrULVeq$LjRI*n{WA<{0-iK*1b&MsG)xENj zk3t(PP*E!JYwK*;-CdR+#LY4lZlDidNgQ8NK)xOU=i*06V``)8L6q>aD~jKe88-au zipPcSINtUu^*g2UqLuJ%cmuE(x61xPp1aCxa8_hf*`ZlRSdc=4^He3}1ZLT2__)q8 zV1FCli+!OgWK-ZpA6b_xDLd+EcsHKXScN-;yL3!b?DKwULeS4mSM^Je87-B)1S%&U zKwLlL({MbP$KldCjhKJ4a5j>EP!eAwO!O4$9N>{%K#$Y2LfiIYXtVJ!IQ#0cRMtc6 z0q=DmGg$elN}Ad(fb5$H}11Z`m|ap9(FnVm>rqw+NcNH%HlFc7Z=Kw=|1v!b^u|Bbp>Lt<=WM`fu6O zqD!YNwLiUW;NaCRTF6|iA|{nPWCxT?S{;gfVD+~feHIenPeO~yj(>y+5stujrOChD za0qE&?)hVG*{(9fIN4wjVNe;%mbfC_;YS9O$PpDlS-4kumOp_(kia?wx zM!2iV_u8~oaA2rV7J&egAZ3d~np=!7{asMCBDWOF;$if45zlN-owL`!XgvN9v_a9>`nq}Rb=kArIzCqT10Jvq){UB0l;gOIj`8SDY#e(IPSByG&0Ytxrd8b zd&Bw?-9EpvS{0n6gt@+cb;Q^AH81;7IbFjNmDZ4<@A!U#ajQy!N^0hd#)P300`cp; zGs}`?BoD)_VP=_U0#l8;qlyEi{UUFkjgf%_Z~lxBJESKzzgNj%e?kvA7nKr7h1+d! zVZF9tZEFy)xX)tkEDmh~aEbvGBEr>hc*2co#wkXF`UEn|2}9OK#z!)6MiZZAPn{zlS|ipi_(;NNxD(#r)TQeyN!h z5X>_A&UrrL>B-Q{+BcY1Fm5kI`T$G4Q(nP>WBPsm+}x&y=h0-U7dEmN&su2|7g4`4 z<*66@TJcaxlH`gI=z*EGtyMq7_DzB+TAuI58%d5&mI-A~lHBO%xY5u0gz94jft%H2!`dtIj6$vnPltlgy;#mOgxgcZz1u?H!@~zl z0{yQ7f>H(bbo^$>Ua9+!6c@+^1nfb%>4Us_Ih#)+>gOY5K@-6mL!I4ZNxqPYrwhN= z5#o+J_TL%k)a*R=9@U%w;hpH@{*4b+O1ZrA2%fcqtsH*-PF~RHNbzu!Zasti@1bt` z1fl(8<7s=gV%~68YaM3-wemR_sUXkyJ4~yF7u_VgX=N*xN6yVxmvI@cI19Cy!^v$b zhx$*2Tr_U+T-2WN&KdXX=l|5BL*A+TtiQwJ&b%N6A#q4Swoc*Eg-dl!)#4*ZKaaVASb9Tpmf*Hm~cu zgGk+4i5K{b^`b6%iLFfd3Cm}uRMw{TNf3S&&dco4e(gPu(RE1_Wu?<=?;h+OpkYjxOLlZ=t;GM$8m^H;Zjn9+ z+fB9~oRyx$chQeG3;e>pck-T7SF2AHE{zJ8^K?D17en+On&q}9(1a4wpf(F3nUe5c z9U5%R>m?tz`74nPMo%>MijN}i=3icl<>+t9W?rTobSIN#)#+{9x5NJa(6NsiuH1F| zDM)+@tKteWEO{{_hzZ-Wht1MRs3l1z zymhj67Xw&xXa|zQBmD#PE=q2(ELVro>r+Zy*}e-b`Ar=sfIMAOREy@kth7C8Q@6(BY%IPL1@wAxfHQfh(iXN}z1uiJNmjwKBi9T5W|wWPq4U)RJ@`x-Zxx^PpQ#i zT{P~x9FLR5GEqfWnF3{{uI$_oNu%fmX{eRK+H9UhB&@>wTa%%pbT+-?1}?Q*cYLlC zEYp0YaB)60FS(0GveE>kL_Ah$t})M-o%dhj>$k2qYYLj__{pVhxMR{ zA){u^d#>G8-R8vW#N+s`?c^>&eQdh3Q}myWovdXOmf+29#(6wqyye=b!v5(O_^Ocs zeNkKr<#qOHk6|n@d++;deE?OTwL-lMyvmVVS4ln>bBSg)3?*s+`DJv8@xM1bbs`&7 zpS@*fPtG+V7J5|@M?%^&^;T_n6)bh|>j#yS0VSz%jbfi)MXd}qPc>K3V}fviEaB!6 ze-^9&6XkUVfL@|S(Q)byIwJ(a!G!1{-+x*A{eP~Q|L)#QANQl5ZpLpfypW<)!bfrK zw~?-iJ;P!{`JEkIIVq1Qo@*bx38$A@4ZTMk?X^gwtcch$g{;$f(5jNcY$b=!BK|VR zCZqVjn56QSvQcB4-+&$H6r|rBGf7VO-3a#MkJ6vja%<`WQm`o^iE*Dx|Cx10-g$gy+;pZ%VCB~prJ0@7?e~afyxwl{IsyuzqZNZ1(85(f2nu10ax99SxTw2RZ_T<3sz+1?YS%C24_kY ztu%_My6@cV7IE&ebT5_scBql=nD2gehZNxW< z?|7I^@hjkExqUIs&!Cx*-+PbUyN6soT;+8efYdMAhi(Wi!9}6Py z?&mb|9rm%VN5LU(jt#nR?;PY$lE*ZQJ3zXQ2I_9=>SYUej&rGzg+$R_F)E`aJRiQZ z@0KXRaEqEsyrF(XFRO_ea!C{!;t6lrzyD?2zuQ|JADvOzVq(dfKA8}BI3DIjd{MHA z1+l|K82q|9k`kJ}D2l|QN=c*aVM7T9N3or&wT9i9@=Uod=v?g86d#tSB*8fquJvDU zC7xHnV{8m( z0(ER{)?(#C$r5cC%6 zI5>xQ-xEL2x%Fqa+;~41yihEDp-?rg{j@IIt0OD{-s_JxXWAh5L5|P>og z>Mq){u&lH7J8I*+XBr_GykpIn35Pmm#Jv|;&XBdj6_ibBi$)tD(=hgddw6Tb4>NW= z#)Qc7?Xrg9nJ*ODati>`Yy&b`|CB)DpP!u@JV;BuqAY2Rno%RZi0I~|O}=&2!_rZ_ zP`$j?7-43`-@`Grw#o||I_k*X|udPmO%I~!{7GiV&E)|)FDPaD2@_& z_{Bs9j5hXu`jU$#|5;fEW>(s_ppeP{XVQD%fl!Gg;D*%Vb7dT*Qw#_XN5b`Guw{AZ z^N%#uIFW-22LQ9|KGR`IKeude#r6XF9Kio!>#U;M3cqcSwYa;}QVJzVON%=cXwl#S zg1fsDw78WPDegsr1$UR?8r9tj|eg4aL zw3P9@GZ3UPXz~p91ngyDZxK$>d9KWN(%E`G#sBhY{ljzD;i>)M;?Szu-J3ewyXMoa zZVTP>TTxIcoQgCP6}h|X<9XJtaCAQl%{@wBbMFOZI$V(B^ItmbSMN>)n^FZDL1y4( ze%blLHgiqQk+h7LJWMSsdt;|1rE)#}@93qc@g`7B%|V?S152LNR;I-Fqwwhy#9==( zoxaWs#S9>k&MaDZ-HGeHTlySqqU-$hWS*p%q0@MRSXm=uutR>tl}1~oKR#&)e(A|C zZ7x@JeD^b8nnVt-cnv_M@5lgn^%ioAK5OgNXAyOChX_%#3v$0u_DecD;+9aOxbyy% z%0v6d&Sa?pgp!Z0R$fV|%Kw54wzFP>p&>~*JAC<*1-GXDsvfp zLXM`+z9Ln>y?ScVB_mxve?s#itrfv@1DGBtnBf&7<&cm&5$&vX zePG}665(Vf^_iorcx{SjfRtL)rOh;EzU;>m)n!X-iB;McKv~%GlyL4*B6m3P=p_<%K?xhRO@7J=wHmTBAgVd{>{T$XCHI@_)d)H=F3#gi`W12UM&NRSPMs%fX-#I)<*e1P#YtX=KXc(NsVf(=FA@3dAd)&-5LcrWeM25fC0J}3)R4LkMuE$ zHe<)2yYoklLpPhZPsYkYL_SGsOzMDBvcP|flOJyqfhz<$@ zeAf7LvA$HOQ8Kf~{}c7*)oL&|a@i3E%cwzzE%@(Zg=2nMS2a2n=XZ_*ujKMD{m~b~ zsnvxc(%N=$z8g|CBB*_!*j&d`Q;oNs(Z~@=CF|yO*ubU{HUY^qO9t#GQr^2|4Ds`D zsh}Qtg@=yHjdQcXJ~~8qkA`RN9vShmfSjr8>wu=^RBxS09+j3*jf%k*2z4R81N=*R zxF0;_HGEb)5sOT%c)^i`f2@aZum}&-je|`5MMRqQ`IiSTky7{xZ0tndlJXw4U%g5L z_N@}_r^KUqy4|6hEF^S6puHDZ8J|AHE;U37$9LDMukT!F!ubm?If=QQcLYta${WBsSWxox>)pSYq~05_OvvPV2x`T8YH$01sa1$|?KQ_6k%R zrg^a)qtg{^SjfLMD*^5+l3$eiB(>g(W?jq<5-|`Bl*Wsi8)3-!C%O7>g znyA_~!Kr7}`vKD;*>}mwCM6Is5|>#aZ#(tzB@z|J_HeN`TRu;M4854RDZz<39!A`- z<)Q2}_jA4uF7!JY(kX_9XsL~*NT$|OFPU4DhKiuaYnSRZo}W)CMK=B#?vBj9TpCLSjf&U!E!opZt+%o)O=KFUp5r(^MM zS0(YsfFX9I{kV?647w>vPm?M9fc>O#p)l%3xA!|_JX%Pe2=uIN@Hw7`V0;wb)Ki2n zDm(${C2$0^Bqgg!i?i7Ide!xh2Ic;JtB39s&Cg#C#y#-3Ly^3f-Li}gxulmAE4o^# z8f3tFEvKJumWE$ax9h)2wmpeo3El{ExRpecZ-njNs1F0U{dTFo)m*boPoU)*+ctM{Pk3;J)N7h2V;L&yZoxRCaZx|p8yOF( z@L{*Gx3{Q${N)K_HeHx+m*i9C2s3{+lI?qx>b&J5}yvy*&rLLSAoBc z?{Qe7ELzW5P``Y)aJ@o*IY}qbXkNPUxc}|OQ!=7Qz(2$X$%DQs6ZlzVLd2MNR9nh~ zZ>^sPfY>C`#^|rCWEY_thpkWTSFBPCR7&jX|K^YfD&$8(g0gi;R_9GabkcH(W9e6+ zXP--6EB26mWX+`rDFfl)t^jJG}l{F!fy^E)$a zW6*ghVr)VNw?HJs8E3Hq{+t3!>Fr&wm0|}cW&H-X-R(VrJR%?PDpEx-}pgOr7y^G_M?(d zQVF2QR;beD{$Jo)JL*Oqvno0Yu-z#8W!HTX8ClOmh_HtIBW98msA07dtKzLX2mhZj zU~;e(Jjj~3#9Pv|Zb!8)@Xd0M?|}%QXz2d6Ol!pZA+r*qC~$vNAicxuvCxE#4_g5} zie?0}EJ;;?Blg9wPXzfYkA-aaoaPehSX$iUTffj0mo(_aAvxIW`QAC}SlYRGCn~2a z6B#RirTHaZcYr0k$agF2eP){%`w{$M?R5qn-OE zD9QkVMuE(dAIOF!p&uR#5Bq*R0SYgSO7>MgCX&o&5kVPp;N&O(l2wfsYj;7^U}nl? zS(l!2N{BUnoG*znv|;V?p$S(k&-cnEd}9KHvG-|(`K zBP)tjBx))ekt z#fw#{UhchAVbMOU_B`Dx+)#I-K}}aKqoc8fYJtRx0wUTdjDUWATn{PBxcG4CFGNN)Y)n~ys4T=h~7 z(6)cpXCg2L7JJw-6CoYXq`&mGmylPT9A^QhA7vuKc%x4<7;?iZ+AwR?0!8e z4<`rZkhsXRQEj$D-E8-L**fkTYq1SjJVz~jOe@!+y$Agg8xk{BldbdFX3$Jz5Rw*o ziku3(QsE0Hm&O}^MEJhMW1X72|7SBXF*y^w$cAcP^Xg{K~(6&?;^FC1U#M ziw^3GLLqH5^e|%L{zsqYOt8o>EB|!tq*LGTJNop~p^eN<0a0_)-mgR1U0ufLgd+(b z8bNd}UQjn7>*wF^z!~~acUnh%TkMnXzB-B0pD-tBRt5fg*B`^I`+f8zec{hL(1g=< zwfw(H!+fGXTSG;Y=FjM;c5Y1&=*&BPglyVR>VGm#-$#7il1IQUFqKXR?br&;GaLaSC2i+-TqPrzN~TBY}}St4IE>$ zYc5qw*!FSV;oYcM{=E)s8gKDWW{V@)~rR z^Hak6r%%EGvuDdUk@ZJiqgx3Wh0OG0f}dS({}3Gx)cdt4M@yvS+lv-RSfQSBNd zWoFrS?C7D^`bf3F*prh^a!%Kkl{N#=t1+6Jo6<}rQ}ZfBOS zodLb937>_}ho7TK(TP7QU(p}b=`J}0?|t=29)6!le`zx&QkhnU0LrVl*I-AciP^en ziWOr=_-V`%SG~Fx=@zj_j5t1yB>yK1T??3GhY~qcQin}2r_4|U-GRoh?qcvJN(Rao zYB@|RzOfYDJ&8!en0_73kX9a`|263_e4f8L`60Tz`bKX|7|rLT_@oG*OwAuu|M~~#kV4SF-(fX_BFG?n1(M+sZOY96Sa4G0 z_;=VRwZ9^=T|uT?B=+1&q!+IaidUO^-R1UP&u3ah@xYmGaP?YVT8!>! zTK{t}q7w^=pVCM@&kLt#C1<-MVsj6;l@KWALx`_V&NhK`ifr;Hmy&qyyGgRuQbe)7 z-YuRh9zU&h$q+mfXmxbfu3WXX^o8G41MmGBC=q%DK?Qwbm>&srj>HEqq@ zBBM_OoUw?>KEa*rt=5&DnRPVZZ(b7>ZSos+O!qH!phraT;q2?(_|yKuSEr0GzOsG1 zVYp@jjRrwqXFi!rB_gZ=;C8wz-L+pbP#rN?{DA7~2dL-o`3 z*zwov3(Pssl0C}TlKq3RVSNKbFERH$)y6jX9bfMuA+O~?Y2i^YRobTNzl(r7N<{;; zDb{tpTlxL5BkrBbNsA`L$!mHkG9!|!ZAvJcvu4P9yhV(9mmm38>x8M*dd8lhm&axN zt5Buc2fAy&hAEF#_1gRMleS#MKubI6o!wocXo3Awn(4};=>Ep1m~50n6sC5pN*I?Q2vJ8;qSeY6)50f1`hD*SZO@StbIs{NP5CM*Jrnkdl1e4$E8#4+@e zZt<7K+xnJFq`0Ok7L);TwbV=RVEZ16_(DK|)`yn#{J>c*VNGrp9{~8|Ubh zmZ1QOr6QjSx;H@Kvv)ujZ3^uckXsg7u=n2;%_j0%+UTRd6C`U|6mtdwu=rY+2D2b= zf3KBf-o|2<`R|c%#J#R&{rb9@P~@%55Keqb{dIrkFC9-uyx=R6kKY!)`2e7Y^7&?U zmmR+`=iMyn8lmr-7juD1xvNvc-HM;U^a+tK>rg7K+!-L987mf5bVr&f{IF}rrOLQI z+wt!A!8rhIPtRdBz%*^~a4~v>i$?7RD=UGy+`7J|>nIdo;8&=`dsE^3js%c6;-oku zZX$k4dR=~~`os?Ep!7b&$kYFAbC%PEKy1_+9X9vJ;|!okZhYPe#(rk-j(~Jrv^p*p zTp^zt$cs2ogRFj{b)$30Y*=8a>`^KqvAS%Vmn@-OZ$-LVmHog@mnE7Kp{a#n{^aS< z5%P=Tr}5t_y6;cnypv;yGY1n?gd`0gxU$UUCbN$Sxs=$Iwip+Q-?(20>pcFBVP>{k zs>ZH+?v#Rit=%l!M9elUp84UZsBFQCnd9;=D>gsgJ8TdL`K{WNJ&S)rkb;`8v}FYi zvOJXKNW!OQ-5d*}?-K%fNO^@OjQv8QUphHw^IgSTpOG!wocktLdsNR|H=FoT9a*6d zg)68pz;s#dbApc<5x>6I)Tu!&^(dgU*wj%H&`s>JYWrQEybI(<__4N`d*4J?04i8# z|3y+&f9zeCk+iIs9{6}nfr_MT#jL>^=OGSG`igv{$g&!KezVvCTUr!#5h4E)6OJ8} zKxSFtb2`h^7-B^4za@fLdt(Rdj-CIdiFS@o)0q?Dp_05^#y()h8F8Bhc&aN6WRo|; zdqTEYpT@?f-JE2XayhZ#pwwt$gcAd?>THqXBx}McIP2X|JxuV@EpSL{>u6m7U&2&> zPWRcHAbO@=;2MAkcmD#=HW1y}cZB*oW-b?U_L z!uc(k4=#A_p2EXLTV7of!)Ul?4y=07-2gC_3f|}|lr8&R{_3BLXzQd5f@kqal1Kqz zs6SH6e=}59--Jmm0iD0z;Z{m+D$cI zRbghwgZGJ+BI@bfPe{iVcF0kH1h|q*c3A5rgl^ndx;uOlbzC;(v+ONJv^`klnSUE- zF8uiG7(pgp!M)d`FUXO0*gjnPX7|C*V=sG z>Gn>w8NgsKbglIdX-s4K;;uw!w?w`Y%pThXuZH%y+b}ZUC|D$KW7}@rx|luhKBptG zQM)-+*vB?Ms1E{0X(9VB0q~z-|H&(S8LXGT7X}nw(D+M@YHzn3w@5-%UYv)#^kX#< zTddSx1z1O$&L=P2<7VsRb%2a})ypC}JXFdF34m9z3tlH#bv_!e%R*A@uKrz~i&C6t!e^^gFdT>%Ps*J_!;=q7fX7f%wiESr!7 zm%ne9!~E*oi=iScyPZzMjkgi%3-`5gs*tI_vOGryuM=OP*0hZm>ij@a*((n>|NEuN z3*M=?f&on(N95`mgm%UC(HXwFS-qJhgBP>se8c1-OBk#zdZ;KwLhG=dHKdpiDWeb5 zhbx;X?f>DU&3_3FD&~~6F>)B<(y}JOrmLWqVunsAqvXmnXJFX*EE4%U0okA>G3QGv z!XWmOvZhsQtgLqM8JJuNNzQFRiWr;N{SQ}`f0_&!tI+c=_7Yo z9I2RUT%#6vnDR&CIbG3K2a6Tz^Si9V6K;~z?(#vf4|Y8+t$eA4Ws*>N89X+l9@Y5f z%btZ{v#!Q})i-Fn!GXNx#*5#FnJ((TrO1t3uqH8FA0St+MMo%6Xs%Q?p~ zi-s#)%^3RP7YNmR&t7emgQ&l~RK~^(PuYL^)aN9G3hXOJI%-I;p3+{{x-}IaUcCcY zW2=i)*8OC|MF2iHnZk6SMbW%S)V*;!tl2=NJ&IQbimq9>dj=*ykkO~QA1NIpuzszS z^(soy|EPDPE?UmKKP0yEoQNCBieE0&SUgf=$v`5*c>(Zmp>Cr5dDkvHO<;$dU0UMO zeTei8?JM*ITq9Lx5H~M$P(yoZgk!Yz11eIojC2n?)_gZgxfLnzf%6W&0lav-qa0%f zPps{Y&_41ho+`#uf%nAXt%mMaZVQ#T^iqk=1#Xi>Z`d^KXYEQ{h%;eL`Nf%d*f8~r zzngQ3*wzDM1g2cGo4)otJ1hLRrCL1_*SeLn>txvwNxpTbZ z_+jJZ*l04$9G?r{y+#!JrWYp8Z}yxBjp$&>g3w5X8-_JRocwe`y+~=!Q3jK?Cyk8$f46l9^cB-kmOkJS#xdR2o;&2wIdlO`Ci4t9=#*3|&; z7a5pEyX(3D18?UQj;vdBE&%)$eGyX+gG38XiyBncP3+UYuhoW(@AXu^f-}u@+f>XN za!-WBRN_EKTh}a_#CgELGcJchW^CI)MI-`x&4_|?V4b!JZLSse9{;5mUK)lrO zx9`l0#{CRhp_rBLJ3T$Q!^^)uJm&N@O86y)qVHWOa>=vcyB1;cT8t;uhc>CR*ruQsdXcu)-?`wxojJ-4h)t>{u z#=X1`^WD#v|N zJ(~b&)j@StVl%=hf6+bho$OfafI4$aqQtEq*=dsFU;R#2SCOMWwAINII?S_E>f@P4 zA59lG3E20MB~@f4{k)bVjF#4i!dU8--=SNo{c+|XQ}2%8OAJ8>)@aN?j)PdyZ>mch zo?Y!C=R?80NO)sDm3QKNt4Wc{-2Ps?tpaoHza85Gk~=(Cx1b#Jk=j`afUoA{l zdvu@dhx%9&20+S3X6}$8P?Y-^^og3I+nC(5_X?O3A3-%5m=NBQC6wMVyX2BQpQ6t1 zHn?GgDd!(#H|lPi+aC5BHQIcBe*BwpokP!e-Uyo_dK5pD!74f04xTS~YUVPRSOw0J zU%g8t9Ohor&69>t*N02IxXS%{iD&q`2|pC#A6cw(gmp47FDqwGjeaxMn(;9H9&p~t zuKm?}pFN_rtJJ#ok3xxy!{m8%aa%oc8*&|6zDmFJK&Dck_(juF>v6Chw}0xp_>X9@ zeQ#0fG(MAHo~BrYEO4%St(x_J;m9@I)cAb(m)SwIqZtzvw3zyYS4p~i!`e8cZCN?kLUuO&TuY!mq=~j&Pyq~BuBrk`;klzj2OYK zbBE;T2a|7MlaXQ!I3}r2w0JgHP!7+?<{t)Hzo$Cx3M2l3QTAq;LGLvgx#~FiU_?YO zUXmK<2LaIUt%%8!(Xa+ldA0$=#J_LOaY&b|-4g-zRFVm{g)1zctu6;;fIWvSbwc|< zUGNr)8%aG{h4~^yYQvq%IN#-u%vK}ikQ{uvzF^II2>h>>1ytl^<}_{ZmE}yL2~x`M zsf*hC3hAqSoi8Ik!=h6$+sTF6qxs#on>B}NIajF!=3J^#-v0tsmwJ)>EKST>!Q932;P6F+Aq?CcB2$LdWwH4|%|z>e->huU;7cM}NW;-#6j@lUp4iZMC}qxH>krI)CRKuxS*q?N_u76ol|j*WMOO_-<4lrstkj<7lE;cGy#g_62=)m2cyj+F^nywCY;J;k`0Bz=s@hCgKB)geR}EiL5># zf-$Yr;#bN$ld(hILrkY}dFREXk7cWyS zX~aS*ul+o+k`Q6t9u3arNTr7M`=9OhyoJJd?+=>KnY_1F{D!a)>`<`Zzw#O23?%U1 zwfzb>|J~2_8M@wdh;`dTB+oJJY=XOQYyzk78Mkt!(8C(N(?NpcPRYTy5>27)!VCsb z#cB&OZMc2?E$4Gd{)v!%veJ{aA5HeRwHC@PESYB3)pUQxYY*!EeZ)R6wmUoKKtIp> zf#@4U0NQ^atUWsFX*oYF)Eo`G5|OPe+ojC9~8>H1d0oy#Oi?6 z8nssNp&_m%WAXt~={Q_+IcR(&N4KO!xGRQTOXWuR$(S9M=9?Ff0b?6@R*yC2O~)WL z%2VJuc@>6|^Rl#C&+3S&cDWX+_>6(c(NW{8rB-xAA2&{X`~K>Sd%xev44oyuQMY9( zpN$~q@4Qhitm&0NG2CW)?@rN;1moyq)DqFS_z#cB2K3+;*1OBf;1^DCcRm0Un0GMhG`u7rZ*(2BLP#nA*6-lO;=t!BX}1* z(|Ab?=(kuChYn2_X~qz#p-+;$%q@SC>eN(wD%zL6iE%=UL?=o3C~8-bh_m8h&|}yq zK}r|Np4d|i0Fx#2_5PD^cF1n!atCS?pmvqE{&)t~SG=E_5EkL1=nB3I`juC(e1*-l zAkw<0fvVFO`U=BQyRvbG9v5QFW4s((*0`F)8LSxEa3jbmko!^cAC4_-xu_8TacwO4 zp}uM`t3pD#xb_u`!4wC{PZkx}y7<^juIrKeTKcx&@ean+vSj$g5x>4ce!OxU0Z*z0 zl_h(J_K}!vldFf#i@~j9-C1^r5!>CXKHs`f)QDFz=Tk3g^s7$3*p{5Du7z$MiSOT< z|5$qJV2gdP9&3aP)E2s~mU%h=5;grmkpi8gvqauOure0gfHD1x01B%58AiG(u>({M z^!lYBzg2t^x^9M!BN|iXiM7Ajty+b+zmMCmI8L<7;b%^e)8mPKXxS!STgctmm$p~H;vaj(oXeX+U?SImsmHjguEFjraspCF$!4mjr`Jlo&O zI{oc2?n6Ci>+&R3Jy0Y*_YIaMaV)7d*@yrSsUlb_A8Q?btHX3nH+tzCB<&zWr?x$F z-%oK1CQr;&x{$)SFG?mG)iA05MKW21WRzqoBYygws!o{Yj~c~4v`;U!kVeplGfQdV5i8-T1k!|Z=u;(`rGpJet3{F08y{vp%+)hl zts{x-I434O^?K!IgMePIz*QdRWpJS_OKt^DcS?9=&_s-DZnlT>%WvFj4T(2(??oDs zUv@N`s%mVjDvZSQt*TVGeS3=(b^`KTxvc45zzCucS`u7fNM~1>!}$Cj7I{qopL~7d zI?W)}dFE8_CdxD^^x=K;vN}$xWm;yNUe{g5Y3VO~{8YE2yM!B~R|jDHkPCh~7d!_@ z#L1;cN^I36VD%9G$bZb~h;`si%@=@e;g#ZaMd#o$b?&%0Uwp7{b9{f{91Ulb?Fs~# z7OS5@Z`_NyH@~js@beLiRvfnj%-7!192^Y07(nddeZOtYFKn0Rg>(QQmF~1j?F#R` zXaFe0YbSX(S#yl0VfQJ>w-5ck_S=7&{&dMHp-M+;nSr~n{|?eO=3T9Q*DicxN!7fLgqGc`UG0LP&;C+4@Nhg4B@MZmG+4Gj1c2a z_`|A~&E_qPt-}ksjvu3MmM{|=o5SMoUiW|)#dLbbWTR1);U=dQhR<9}Olo@ao!EW+ z@OFBJuF8A`xRSan;C>$;UDDn3M^?NCr-Z3x!k)Q`w83S@zI36E29?AB%RjB61=sAW zW^nC;g-Ngk4THDl(bDM7A!x_0BS+*7+GY=|=r!?SgFjGd2L3`5IcpCbiEHXh{=t+Q zPhHD4Q<|!}XR|yo83V6CBYOI^KLm~G=Oc=Sn?r=QW*>`VmN?KfRPuH9H*#Js7Fq=p zJXY?uS=DPUmMwcjVNeMMH?*IZgaOYiY75+Y^^u*rN`jfN0Rw}e;9mXeH~)C-Aix*{ z%+02A*R(PEnxdRWg14cTh{&^i+B4axJd4n&9>_NwC$8rfQ zB*YK#;9Jc;{>XfXtqEfF(u&7tc_drcT{JygiyCv6#t#*Sa=x#naEn?!CHuj{3NLLN z(iRwNmW(U(xt*JO->Jo!2o8@UdVb>&^cp*QfsOe|`AO~(b?JpJqT&?5RyGct|Huq$ z7pI6pYAtc>mOwG&)gZtaqD%_7!Mpa^JSr9zZ`sD;F6p0D(EUSL{&&@q#g_mr7o=S% z3gXJ50AP}Tk_6g?RnYk_p~9@ovMhQcY?Pr98I+~CpEY0jTA`rnp>AhokqUCX7E>+P z*rg|}ni`Ij>~`_6?L-?4svgZe^%f;<=C8in7-YgQ9tSIBTNz{ZPqE?esFcvzPd+zC z`L`6_!FCyHacpH8G`gwKU$9)>`;26y-ETYRQ8jg0z!f|aALl3eh#9T4fD4+|xMe&0 zRGD#9Kh}}*Nd{Owl07#EkPyhr?ZY!)ojqIMnW-)eC@WovG3u$LI+H@O?e=oH>`CDb zV`<&m7)*bf#3twG)oEG4LLb}iBJ;^%v=wDP`6S=-#lu|(I%npA$gh0mEwm0v{{_p|>2EOdJy)Esah1y#io zPmJDCnvO?8V})nO+h8foV%zv2(1vS50f)#MqmXV9D1`g#D9ZdXmUn5N2oDviML4xs zUGoGCT4P5oGIm3%hS#$oakNMHTh3JZrzNF}5L!zg48NZJ=-!&AgaPJ!{HH#rdT3>w`k$ao2I$S=!PWLty3lRhiDWGa)#Jefz%bm#~wb zzMHwh#sXJK2nP2ktXZ-?CV`Ne3~6x(#<6OIgPjzxODGkmGv4r4$3>*4PDD_+_36S7 z(!AQLIC}L?Was2);eNXCV2*L|Q_1<#OrLrq>W($d&IzVQlDT8qZ(h|Ia{;|?lZZ#| zk`rB@XSUWGpNkVn-)Fwj>6w#A%`YM__0h-cnSuhojg7k#fdq5I!rPb1bw(XwN)mhO zRN_F{&=aZSv?Mc$o5map50~^AS(%(d%=kwjD&HY^6U2oLrbGK-9>#3?pfW3`H+xd5>@FgBp^oo7jmtSKZ zlJ9R_aeOp7f4Z8lE{l^o4S2H6+Dg8zRWn`KUU~9^Ew()_)TZG;oN37bKKP9_5gGjT zZ=_*?!T(z{Uamo;^?^)JB-_71=4XD-Jr%9mOP~%LzKXpyTXK2AG%Ed@`l-hF!FhJb zl+s{6pGTdD0ioWAGe1Du(I%0mBRe6fy{(?$tyw=?W|geH#iNlyzE+99c>hOCROs$j zQ4(~v9tacI?gp73?gr_2{__r76?4sI5hqAge*E)_JmOUsn3;X84F~^U!8LUz9_@8V4NE2DkpP2OsD+zKyKK_cRNAo!|IMR74n9X}n7+gJYLA2)}X4k)h?;$jw(6?m%mIK#<3dO$r|#Tb|jF4D?C`| zr>2-m2uW*5=TJH(2zzm+j$g3(rO|rCkMoDl#IO^_;RwFt%b5Fc}DZUl@a>0Ywf0YL;hX!)opU%`oM zbR%D}-5Co6Zat#DK9}6!lADi3*ORfJ&aTCNOiHo?dm6@Z4Mn_Om|^GL2f>0GWpOei zg0s7`9q4p09hGa<)XhjXZCPk6^Vd+Urs?a~u}xROHy9!KO2jgGA2p+^H6bSGA}0t8 z-dJ?hI(dwQ*eeqP2B=6pImT{54s`^@;=mg(w>p_l{G}HKVNYfJ)#Qf+SL_7CO|oxv zfNwWIVBRHkN;WYgwscH{s4WKUKm8R=Vf9d69I;(8Z{IZdFScT)zW$L+sof;Pq zA>%+AHb%>YdG;NnRa8w|8u1n+1ELR4WWl0PH44f4s=Z(LhrKzbVSCNQAEBcy6aZJ1 zeIVCi_)1wyT8x^nEWI&GC6V?sHMCEJ?!%gRJqQX1dngJ0!g3b-qKKJK38uI4vxN{T`>xNoaRI`bXrqrOOc0tz|iWe!J(Vpw4QqUklJly&17*-G&@=eBnA`3wV#U8~wD}#uGoyWJSCW_*St8 zfQ(W{ZJdIwjV^)5&HZ-)zbVYqdNY5gI(qr6?`%eK&Uh-0dPv_HA|eeTHHvFD2?)pN z&mq5Q&gSM0QAXBRIyzu|y5Z$3V)U<4Z$=Cwp7%wCkVFY2F|o-@{sD`L_*O_cY}g1h zLsExjQ0F%9O|JtLomE z^-#>tvG1-yV6CV!PXku&WY}C!ndI6oziXD=@aDy&4v;STGyO-$_#ZJtLvovOrnt&C_!W+cAZ5pt(BI#Muqky#^iNqBGc-V_dAUM?cf{*NubQzD;{Kz=xhxNbF!!u?(l~??gWW#xRcS&|?vd z0ITnwo@)b)yHk!tn~y<(H`FW?9&Z@QUP&xh&R4ffja%5*GR+Xw?&&4hzhl)050wVD zbEe#kT$n*^YqaO=3iZ3@7K0hkqQYWe8Y>flZ>x5dHER%o zlTx*}=k=Qw+Zc9UOC4i@3i*RE>6{Zs9($SK6vPEn>h4AuA1AkR0XbQTaPpkO+A`)B z#cIxI_4ZDI+_)B=4DHuUVFNpePu%o4LLwN(v-a+b2qN*jy`4|8)Clu2WdRp5$Pa<# zqH->l*8@?(7QDpl;Yq)?v@a=lWz4{SZ%EddsAdc?Lb-U-{PoaCD(Mc2@aK!Uj9d1(z#JJ%cYb@yv zEjj*#9@@s35vvG*t5ufKg9qkX!6l9a)|mfx5tR;JJc)T5YaIySFj6;A?i_JJJEz-B zJ*x~pvf|0}Qh<;Y!2jmsS_|^Le4f1|o}1>z-k$XsU&H{|3F?U~AOsNZm)uUX`{iKd^XT$tIXGb+3J5R3wK&P2)9COs+T zZ>#5#4BMb|Q2s1PKiavwh-@A#y_lxoG?WWwcArJ1{%c*Qg{cw7ZUzrUrcD z?@A){M)6W)^$K6ySkpzu-ycZGt2X9Rbgz&QJbn7r^P~~GMHz3qg6x2{iAhr7fIz~B zjcJwq++3X*OQshGO0kGbgo+AHE%qSLd?6b_^3JfUH4GYfXBM3RbmQ)Mjs@uwraggo z96}}D6=6lgCE*}!LhQesK0~qW`f>fmW> zq(?7mTPT;zS2o)|rcJlWj|>zgZw;7IR|_16V3SMo!*i(?twN@=SaOuHOEEW&tP|;K z)y-!Xq`_o=3U|4PVs!?AU!nN33w|)(G;p)4l!8ou zX>DxjGZ!9 zWUbCawwm~TtF9Q8z!YbXjx(-PYqAQyLRauN=KyG3B;pQ=xb&kv%poObBRyZ;1) zMb58x>yHADms*bMIUbw01j3!u6H!JsE-pUv(f_cAjA;2B_tZ}~MyoPY^9S5K2@J=Y zpCYI71x(&QMC(+J_>rwx?o%nAEwy+XY^fBQs@O}IJBZZBJ}h=rAaB& zP5Qlo`Of}Mre^dHtM^B@JFQvQ<%z#^4{Vtvse{ zKagkmRrt-EEIlM=Rwq6CJ@+0zt&cW2y{f-k#`mCXCNzKra)o#~Qo7yDDS3OLV17MX zaC_8w1_*i`7ifI2$MMzN_z=6I4M8}&*=9`Co$iPD+atxZ-myAc``P7RNTs$t-?Lq- z!X$b(N>3++7Xz6F68=Z-Ao{jiM{Lr%le_Yqd&h<-HzY6G+tu&&9q!+s^m>Gy(8C1u zhipAAqz*=Q=(>b_vsH{DXV{zw&hu{TT{x|fczD##rfeYRrl z`Cr^Nj)~#I$m-uw>o=L; zyP{8jAYR>`r2AY{;sd@ zkh)RKi?K`Or{u|h*+pJ0_63uieRB{FS0p`_mRFZpA|g9tf_*-Q6L$1ecHhyZ8HzJ@(0cmirzf z2iLXMn!h<$aH2?K+yquqJhD^W{xF8)FeuWIuz6zzsCs8g@>19NV8|*O`TZRKIUfS0 z3Lj9F_*<;F6M3F5`I$D{1zINTWU?jl;GWZd=LakZ(kY`BI@6=oA08hwcul7-ZynWx z1`nztYhU;Qsm~jdii&l|8jvLsfq8|_0DEI7%g^1c)?E&HsnBGH`@pgcY#$X8RK#2g z@sIO9rh$hsP>0K#r?H(98PNsTUXK^ii%VJuJEeGkXVd}jrV1rGHUX?#F_N54$=Z~$9W~P ztZ2HAcU(658Il9HkHyZCcj$0<9~D?eZ%n^B^G=D98epNdG6hIMC5&53hKcJ+feS@1 zaD*&#A28mB#x?wgGLG3fcn@`edxzgXk_?6|I@2tF3XmlpRBJeA2$Jv5b%>GcEObZ7 zPW+6&5lX;-x-Os~kCp|}H__RSp+hD*6Px>0$Tn7MeRx?^H>>mKe1rZ_y}+Viek$2d zXxbe}V;9Aw%2D9gejdl){(C=sCQnNKKw(uniF01kR(AR0{204Ol!@kN`O>=Au^&l% zK;(H&Qfk5_M$Qdx^MyM#cluiQ^7%$zucJAWX7y#I(#TdatrBA8^@F$|-;v%$S3HT( zQ}_o%$&wSujYg~D{gh>5&4;Jnx_MP=;3u^h!d*s^BPc@3Sx=^4yF&2Uq(_b_jTmSm zZ-c582a+*)8)Z(a!gTXmDo}%2PtGhdBz^8X>NrgRXstKuT-VbXAfQHVhqLA#PMUF& zKQ%Ynok+9zS8MvlR`a{>!fn%0+#=+^1Zb058_lQ?CGl+f?~nZjf=KioprPuMW4eb8!PQf!?U$x4ivGerTt!9i;M z7g1a1OYHS*lTV;&MHuHA)p^buNoL3H^XSG>wL7VJT`05GmG*Suba<0>Vbz!TH2IS7v7x1q>A;|SDy3ZmHxfX+tFtwcl@Mmg^Jpu zj@NbC&8>8<2buXy!H#StgF|g=5Wi;9$evgTa&UR?7*rrLW--v6x*I*?ODBw147{(DBtW&+)q<^gSHV zgjdzsC(jcXp>jLu>pJ|jD10TCmB^=FL{89OSX8HVi5cu+&W9d=q$|6n1JK=C3NDaPt_I#Rc>q@>T*p7w zU1CfY$7r^Ham;@Ak-45<4`D6g1<=``!n@&v;f2f$erRdg;lbDBuf>mzqLh9b{$X{% z5{x&;sWMSdj+th?du3f$QR*5ybu7I$!+AKfQr4Jol?3B5B!h)?nQt~Om~a~Nt{XT~4%XA7_*Wr5)`exLhs#IP6q>IChLymUgU@o4yKvqE;;Aq=)k&=Iyv@UJTxzG461^veKP6 z_US%zM`LCWO@s2=bUKEfTGV6arjxKz*yCrgdHT1CrO7T5RD z7&A)7McDC1_j$hlm1#cxEL~_4D%~?sv8a_6i>c|T=+DrK4)3V~bt0*T;+!(5@8ZOy z4-0S5R)P|`ZQ5Oc8msT5JcYv7wCp=7C~#VDzg=s{%lRo^M<`e_iN=T|VRyr61C*2n zRcX;}SOL{z;Xw$XAr$3HG|go!zAoEGnA}{#8nxs;K}meKt<-HO-2lTanU1JUxatl<^zWMeq%1Jkp7Y?Ja&e>d0qi3ScI|ac~X_f35Yy zVY$e6sBvzCk+o^d4w!lL^zTlW$_6Mpr43GkVo3H!l%bM`%G_1flgJX!poDE!wzv$2 zKZ3$}6*k&PQaI8h5%`oQodx+ztb zyrP$j79~N(nl52B9Oy-DfOBy0Mw~Pu-6}GqsKhp;mpE>P)Ot*zje16EI+#9+OD0ci z3iJv@)On%5&BdV;#i1(^;ymg-#rwolfqmik)vWaFyO{Oxee*G27yID1siNDl#9A}SV5iM!O)MrQ9%;P zA+~)5 zi0jSqLBX?FEWTHP|Cac1qtC`Bt2U?ia)u!1-~BZ4UtVMYrx>0QXfNh}zg@KhoR-@A z2s1@v)!H?C@HJaj|3jB`(i?qr@La+7H@q*!JL3>btTtv0@#SuMB+>$AebwLe#=h|v{Mj7FUvQ33UeCwCUC zQwJW%mXik7)rSfP>uL-VHW(hmrIN2<)}fJ&>jV7j0Y>0 z#MtR1K@+kJ?Q1>2UszdOwJ$Im&e$w)#Yq{w+PV&CD~^X#!|!ncvuG+iLjovZQs&)2 zft5!*_}NIq;_tTWE)Qgy?bScuRa3_&PH{Vd6{H9J;c&A4zI$`V>n1|8(y;#gxc<4* z=V&Vx_kxDWg(u!f?N%Yldn-aS+i$4M(R;w7ZL_QXad>p@YEm0~mEE9oyU)ZvTcUTe zJ$spDTVFwbMEy8pzgQdb_5ZS7L^l;dQ$~-Afq~Ib^NgStAIF5YM&vDo*uUI|a&_>a zpiR%0#{cr^vaP;nJ-Ba-cI;;RtlJ?)`e5%a+G-;PkNeo%mE!?H`{TVle??M7QKIJq zg5ks4zAA~pu&8*unFMy*tX$LE60=*WSyCP>!UDt52&^}QjO3HOLV>G zsv!enQ+B#W*A@joF=w+!$gfmCntRG&-SAw+Ks;^CaU*Oh_nu4kBHU&Fa#f-Szm3(i z=qWqVf-o4aN{B z9OHDF>xW9!v?9uF!BMdV&&NABCPD-8*$Wyod?>~qmBi%6f16l+yn9(bmbY@Zf~tOC z{G3c%J2=E~EaUdbxb8|<>Wo=_N7J-6MatQe-=_j3!)a9%S8V~|u!~T~^0uOZd#8zl z>j+OLXm0*nUOtSlBqH#m+3u)btO@t}=|vREE3%WUy{Rzf(EH}Ks6#hF9I;u+=j>(# zK|**hYM(A+U595x`HE@d-ZsJDq!tMs@uU7(ZlXDfG6-Vq99kU)6Hh8HS;msYZjI+I z5qhs{R(>qgG`iv%u&&q# zED=_2Emudl6Aog5p%40^RZ~r`IKYh1_CGcwZ|@jb4^XQL>Iq*-R5ppV61Yaz$;z`; zM-gg}18Cl0K+rlWmI*qFyhK><*6IgpG4l3I{I0ugfeg?;bo^Lk2B7dH_hr(RYAZKz z71NEV!wr3fFOUUgyrs0RAkO8BUl=;IpV0UcvvqbEUF+aT zP4J9G($FcQbEglpp7_V1q@NmjyjmxBY7|rG9Ci46u1L_y2{Kamf^XE@s-y)1)CeSO zzM2B`Hs$lT_x0%}D&{XsAH6{2-TlGOP`}(9(3^N|S8(nX=X3zLR5d8K{aW&tMMC|S zNDH_@%{Cb2xpkqvDIw$#Gt0}_b74R39V;wb5Zwz%bp>`QkcShV@$_BMQ?~(3j;+b>(6|yXdIZcxV<2n@wpFD2fv?AYd z&LCNoO5ZGC#)Qji+GP-}bn%<^A3W5_|Lb+wU*xm$BLC%wJpk4>|@} zeVBV>w$x<8K!jSR={R=IZ@@Yq4i^~DnL*AE>LM$80Q*NgixDBxaN-Sh*H`ah<{Ft) z#?q3VDQr&6Jh!aDO1;~>R>rX>+0npkI|NB?JTWV27z5#S^ElWsSe#!zhY2kSPRfr~bJVK+`R?F+yrwOjd9W!*$Z>q|BA;IW zbr)}IV8OZ>);vd~8{fhR84~bGt6R^&XJ-baNK@g}?(6HP`!<_YPNNrJbY8WY?|E8- z>L!KN@#@t5;+)SiMC|-u*G3gc&7ZLOG@Ns8nrgN}Aam|&T3)-ptU8MT<_+zUKAxNovO(2H3Azg-Gi05RP~;9VZzPR)a< zUXS{^N9mP0nu%1vax2x>zK7D z%2WWizlBhAFaEH@0+|`+IM8SW;VO;@BI0^5)| zAl9nmTa2p&sBytj#0hUsa%_G11LkH`T|pJAiK;rmKi|MlwY<_&>$c{&a-X(4hRN;7 z;=vR9^Cko!Ert-=a@ocWhkgPlvH=@2VcS$HJ*}5!FU&n=q1^!n)vftfYS+^kUC*;v zRjPSskAK|!2FGLZe1x|cTnj_&<%OfMR0-!F5;OZl6)@?6w$f;^Ux!>YT_Z&14d#PO_T zpJ3fA2Xo)W^{;3nqBQ`=KYjF4*{QX_E6qoK!P|uP73MDW@8w2dFfN4cpXfnJDrYfF z$VZVC_juBOw5fF=6RH|{Sj<+3@G{F>QBca7sRM)`nkZ01Ky6j9fOle?6|&v`?J>_D z7_9nXt*j)xA>^oAXh4# zI>@z{YEPL2E^ibZ2+uEGNHqU70CTF-<&)7-W3hHfXO-kl)6m}P^j%uqj*+F3rn)OQ zfOs|j#jkC;u_|kfOYZ(+rcJmC)uV|ebRVuxu2#})&>JiP1mAt4x@0f#{x#vV4oTO5 zCv_h7oC7=PiuQ`k5S3rQ3o9U=UOGP;%98rX3OJ(V!8Vd}{e5 zQy`Diu7I|Pvq7)WaaFC&tyjlySPP;Y-^`rJ5dQ$<;Qc^GeJ?34{pVSrkke1{=%TSi zK8Ji){d?Grp?#hq$+vFddF-k`Ixuv4*FQm*j3a5D2*3qP+gS6S^&@-I5(~RTj&2!f zI$f1C3s-kkX7IDjaB;{eW&`xQILa-t3^teR->P2p4=EhrWgr8*TYcO$`~lo>X_8lO z$xB9Y*7XI}w}H=wy}X@;=&m3i$c%By=M6p)GyDY%8RXmJoz&G;Pp=f{jMscWBiT(? zfyP;p<=O<>YdL~8RDLut(_`fcA7Z%}k~LOx_)i|6jWS*pe=uZX)F zQ%Mb51dAT&8M-ljq`0X5d#*&PQhr>bRTtD))S9#)mT_!YXWg266_HXl)q`*IK?0e< zp#2nSOZ~WD!uUY~GrK;`(cS-7iI4v2k#z{N<>DrYR5|GjXszc=FDCt9LuDMV2Z!Qa zV%iOXqEHf7m(*5_QBwU91KDK9Q=XpPG?gyHdu8YBzJ}JVLpu>OSY;v;dHJUHT;FfM zB@rQV@W@HmF4Fe{cswOht<7$))i=YBESxRJbQ*IDA5MLn@M3I@9=zR z2%LwsY-YS+P0C!U@v?ldf33TB_9u87cZOT#DI0&WLd9QhmA^{%oRVlT<^Rs6)&!`Q zWI<}2%B23h7iU9}7sj7l!g1xpm_aU?ettPLe#OsQ$K@7S4b>FzB9Y&poV1m?zAboQ z&e3B{Ft28_?8 zeH@>o+|GADTR#c$2kY&SaqL{_2U@*Fij`>E4NiDCdHt{+Pouu(+-H1=Lcp>nB=ZT{ zUACQ3+y&1_d>qYgRuriMgq}pvED_up+0Z%rKrIVwBCYdbHnl$VQzyv zs12a>mqk-Juu=Eajm2jz{s#%Hj!yeM#iR;sOZ{(U1#SqolLJZ0*c4JgX_0zRu|W;W6cfLm z$?TYE|M#VRVaoO%cytf4$3t@j1}p zPll+9YSgu&9zw=guLTuwFLGM3aQR;X`+%)z<(`jtM%3yH?i0@6PY(7wTK_{H?OG`G z7h$%xwIvPpK87l&wlH}MoG+#Nzio1+FIpL@)ydv$S|J7*0I3(caZ<+ybe~}##qlpt z*Zf}_c2;*RM_bzyVNdl4?ob@mqt4F?9(Q4aiDvdQZeKR$8ihL8U7dXZFdg6~R8IEs z+`bqD4?gbodZ%Y^8RR%M=O!w(ND$2a@N{HVUVDR%+Q9id%*}ch_lkaT+ zTdLLd`kKwJM#||{Ix){2*kt|LTbA|;ME-7rszXm_%5ewywfr`H!>{hSr0iw>h z^))rFdB3(VM#U^gMK9uV1QIi@4r@mDyo|H7d<%a>A6)t*CfbcTc(43V`VbI4HFUZr zmvApQ{UT)X}qZvKRiGd5@AOP;R7#T&a>qo- ztEES%EY~fib^_kSB zanI8qYdYxsahIk}!NwfruBw#*nPCx+IK0DW)x@v;_7D*>$?1Zw0{Z9s28To$$QxA{ z@)8ge&!+jtUU08b(re0^>i)>JDVydW-EPd@J6LS~*#{T857JKE z#aKF35ylTuu|blA=`Npvk?z=!Pr z9qVYBQcm<;?mKl#zjX8FB=S@xG)4KJSXtP*iPbMFM7-#qCg0Nns)XptTQ@D(?ETNn z5+u#S!f|5+7AWXNiI$@le@zOJp#kafc^zPVEMSNl5uqv#opY7C2OW>dc@@tfOV;BL zQ01TA$`I%mFYL<%T7QWpm-pMUMi=V5c)W(2*6*7Q%$b(6w>$Gmnaq~S1<>aAySmobykmz3`cGzoMW-r-cDSkA*Vl_ zM=G4~W;o=b1gPNzR9jTE@MUy?8veI+z zlTw~YqE}CrEoyqs^S$qavBHz|-tE)i@ZBj(IH^Ra_ZWqSCJrku3WszczkFEUG`#P3lDPdjCu9O>ynEKja+%f!KLBUk_ z2w$#Mi$H~;yH2a}WB?wFh!FV5qT)yAMHD{%qv%OJ5mFp{!>R{8KVzo?0uF{XT!k2f zlj@F#vHz?(>Uj&-mLi6>q;1*j45OKxWOmP#$i63{hLI}hHupX_mc9jrtZ~0!d8<7Q z!P$5`6>9WR=Ob(rLRIm(nAY7F>pTGRaFB7K8q6B+dfgrQdfYzO!z#bzV+B_k`5<#I z4J(Ua!XFW!W@&~{a=OwoWlsfXcQIIP%Zwr?+5^NN(oo?G3m7V;23r=Oa4^+rHJsQi zzt#8F)p+)z&o`E|)}I8uk4m}S?_?3?=!smPF|Vj%+@1C_lef*yc4R@#K@HeS3^=Ie zfu`v|2YfId7A|@`Z+vO`c5Zii?k>?r)=^<@;jwq|o#9?mz z0!K7PiBX+n;!n@ge(h9y1ziW1grJ;z=S@?d#4gl37&g-^Yo@*>!bNs=XN_HLPqPTH}KvnZ@incp&lW@N!ZP$U;Xa`O+(1&=3IB1x0!!TPiC8d z77N6!qX!{rdqEz6{9a7P=CfsANy655tqS>kWxskA;QMsJ3ATw|Z~le8Juu0-JwTc6 zlOlSb@?suX%XUY$s+au~(1O+`B!Xu}ul)XJ!FZ{Z*GLRis;VQH01R~%I3H$#CRDJPsJMzLpwhzl^5DI`Y7)lIkPD(`)z(JDW)MLSbJd<{9v_8>Z z{1E=>L^c^4spkKFtD*wmZp8#@(lI;}B^;Y~BCV3Bp=AZdX-_v-h1*d0+gUPElP3|r z0?eAEsrQF#VfFH$lf054*CqbZ928{3bxnq0U~ zBZ;Z_Sok$F`VdU7&j}$L34P1?(Gf5|X{U7UWwB|+SGG%UhAqF_Uf*do`t(C0^Wzuf zjJ?CswdEK@stc)8JPe@k-=u31KN5^_OnpQVPo)5COQda`yV-S)PLE;aVQHM!h0;;i{8K~#0g#)w26dEZ?rDN(vq;gW>Z`v zM01x-?(-)XIU7tOJvyg^>+q@>nS~RP3BYnhz(yVdrnhQ?17n7}B@%0_A@c=WoeLO? ze>DmZIW{deC=%Q9rjl;3J)MC-s9}3dE65rH5uu@)gSeLdfBoG zCsN3tdwrd(yUP0Xtn|C#KKTSy&Q)~7x&FWim`dD9M z%rP;Kxk*?5zho8jIsu|YGiNo(G?;ZEM$$vmpMmyHTF`l2E@x4Jvt$+I4fRa(67)`H zxKa(v|Mo~LtszJpP0u!dWy1dq zy`}?pzwe=Q1}Q$se)8Qhs4%=hM&H(|E~=4fPJLX;t{RcwsQP8)U82TFqxQENd;rvr z3e>bXn$mY}NPh7@a_w|ag8UlCjQs!DwEp-UTI+=;D}n=Z%Da*8kHzh&8sMsIVi;ze z?t9lE56nvl%~z_HUCi>VU==Q6uH-UhpPzV4=kD~iUV@rb6b5W6bCo&jIN!T~^~aj^ zv=A)LEMQE*RncC_Y|R*ifs9`Swf-CZi;IIvJ4@p%KN^73m7lwN2&Z`V^I&3=>Nhf8 zPKCm;1s_f;UK@y;6xUZgtI@mgUtVlJCflE8{*20!56Jwk5!}2$u3q?GUf%5ZLtCHk z{F|eS&VIJ-o;e?RZnC|+xOSug+p?zk(D?aZJ@U|;+F;e-dAa-6=jPR~+1sFDyW-u- z*}mA@-V;cTL%Z<)w^q{3;nvQ^&OV>0&h07LcUlnZ#g*l{&Hv*XJCp(31&KXB;I_(T zV9}98B5<6kiHJcYDc83RyIOZbLhC>f*18`gJZzDcX&#DNl zbhN2Q35)q6$;BI+d_H|p`2U%O;HW>Z2A(-;8U3LGr2Boik7VLB!}_yf#%2@qOceHx z+;rKuf!+V4DA~tg@MWI{_0>^~%M`idy&neo7Yck9gAC3%v2e{~KxqJ)r3s6r=is6i zwLAN=t@je4M=KF|NY)1G^ml|CyB^zu^tSLzFwyQg$Dy6YbS2>mFIfUPi<;)RJw*O!{*LFc*rLA>FnwNti2V_ z+h28nz`6WIPj=P^kmS%Es)z=hpgvEqy@db=XGxdt=6$(8OmRTTY1n*5{octryazKF zi5>L-cOJc}w`7|I|N76O7%fNuIg|*Mzz`{q1vB! z(`1$UGx))LICx7B%`-=!LakU*ddk?+0j?Cq^><~JJ*rC`UL`|M@5`}}n5`tkKEo*| zHi?`5d!bVMs9xG;v93Ac$HBXj7eTL1X?&$GaXwpyJeyL7qhRCGg-r}GFD+@NX?H3H z$@x)coU2R~3kzysbbOfM);UA72N$qSg3Qo=LbS6S)i?OSHBcfOTT$!>eESONPY&ZK z+c7s~6HS}Jqm>$E9@?9+)gg_sxI#PMzsn*vkW~x6Gy@1n&HUVUiOWkWs2}%yW!;J; zN>|z!I#t*T{pxIz8Dl03kyFhv=Y>773|u|5+R5V6aKS<+wT@tWKx({(=b=P`*Sx8S>UqN9@C-L{)*qy~gl*DiLYmRj*w+zp@{ z{VtL__SG%Mu-oXsTigbZWC7bo>mMzldXSqBr=lU(r6X!LJ+?V>>h8G%(Qfg%usjcf z)snK?@1(8229}AHRMU@3-gbZM$XdrLEWF9fz0B(k7m{6s9(UEv70L~h{#e{_o~iyh zkn3mm*v{RbOt6s=y%)zv#6h4ovwruckjvcV>#=1%%6RhABb;*aV4yxqq@rmXwK% zK3G}D^#}hMG8W0UahrelP+G+ABg!~@)_lih?>XeraOo#fty5UCtDEQB(>6afjsBAx#cc=*H1|yWQpm2RW5s z4i>e(vi)$}-6#>lZNfsjCEf-O<7-we#zV?Jln~letRGOhj_G0BGI-1BUq=@x|(j3sbbdX zv`k%KrlOwD&uZQOY6K*nqQrjpHx>4zYGl8|3cdPiFE5r+%AV%ZV`G!khbaXtt9Lwz zs?JT5qu{Q|k|tmUOtr;8?y-8O@vg8oY5KxMD$XR0{pHQ3T3y%Rht5nX%7q4%a_tx5 zD4bT6^_%B!UNfSsf7#be`YN0sX2LB zMV(CX*6Y3f(eeSnK<&-e!qi6xetX8y07U5NpS_HbrKaAA!puQL|UDqu(U*40E;Q}iS4G-B z%ufOgVS|Z3}nGN!@gD^mern zZa8^QH|P;uBF+}jG#1ZSFiEO>rV5&vVh3rNtxRQ#&b(``4%{)$U&S?t8j@_yBwPF&$_Qu^t;0a7+Qh{oW|xV)L6nc)nG zHY~^Lo3p*Z3BDK}R*c|H>{$?p3>!@nIc{}mM>}bm_a5s*@LlvYMhteyL&1;k0rUg9 zu%Yhf_Ch=|YebmdXx>~!i6d4awnHK}3M(0#0t;BBNzQrxII&xz3Z3TVa~xAx6}HS& zR?WDl*;YhJvByo(TwQ!r57I+~OMyRg=CmI-QZzB-by4{~=A*`dmK;pBf2Ol%T9*6B z{jImLpv3&1bz#wmvHfd$+HmGO3Gqe1D(O6|E58y}WeXgoqa1mEmWy-T%f>32b_?>0 z2~iO(@vz{lcbG1$mffZ!Q&Dh70bQbXhME&!8b4Lb6;8Ki@2P80ABU*$BIo~_DG2Jm zFi*PoE{IWJ^7vewrlHWKnf=FJRjEg+15_H>SAH^Jfd10idk~_T+(GZ_XpPJD+%4KR zYl@l-b$O>spsaC*b!#{x(CERXZn{nc8Ik-_Uo;cIooW>Y^sx^&EQzKpY02a(N0I~X z*si`g>jX(NnVZh}(e$~OffInUFsjigSPJobs@-;G<+k$&E+?7Dx0#lw`>?jazq@9= z^_~rW@uH!Q1$KWexv79&MVl#ax9@e=rNy(WfMe_EB$GqQur1~hL7vFid#@Dn>uavo zI2F;h&=JvST~oo;zMIzPvsg@|Gx5I_2M+`0z-=5z$BZD-vta1s$i>ab^|)&mvu}N3 z#_a~&HkY2d^&6n2^{t;_Sncm>%d?)NMXSYrF^4~oH_sOu9lxe^Pm2U3wmtD3+REyD zEKa;fMUG-QUu0`r$wqa@N6sti!1KVVrB>7DrxU+KYVyEqe}xo*mVK`Kt>Qr03sLBD zvJ1M`8Sdy}YW6*NwB}`6{&Hmd6?AFm>+5uF0({!UF7Dg9M%79_A0e^*yz;T-E@LwtdY01M2+0Y)mEJ-zP#cw(`VXr2JX$^#!6P z%`Ee6)Z|7p?BD#e=W|Wro&TVwV*TMISarF|_jh4Dx6b0=U$%4=wz!4k8I0G)mb)=; zcbMT*jl0sb)rQ>(NP4*kl%-i(zs>Lw^rbQek$1HI&QgNTOsX?b2C4&+u%CU8!EkrF zAZHu#8ahbhoB`Ocwox6+E{wpc*hFYrLYg3AP2HWZ8W>*WkQeL(2;MJIum9?3ths(% z7SL_-+sahivz{H+Z00_lGgxR}U1Lt%@`~OG!ealyFKc{`?Drh$0C#eI%7A4Rk?ONe zXa9kjwjk6&@*O%?s7wD<($!BUni}%ZUv;>ezIwau0Ttd`9Mhe;!!ft*DF`ENF=^Et zgvatPbaJb@3id^cw+4+NgPa~ei_?`FZvJdl+t|)<`vf0Zu~`5?VF!ja+f@=F8UuHf z<&?W zH1EhZKD5f`ft*Z4Q8vCd9>(x^@)cEMg;(dRDIDeSVC2{6jejQm z0xshUjo^4kq@?PxJ_2T>OhKfAi!W?rgEu=+=vzqaLz^}EB6HQg`h9+NpKuq$s9da7 zC%LP*oa5jKXKgfF?-Y(*-b3}c!IkLrZh(xpfEVgWmWwtH^eazhM1TTL2NBXX%(?^z z44lHB@8(zl0Fg>=$guP>*<|BRnboIgwlAFazFb6`aw*^SuJ{~rHq1j(3P=tq6nK`* z2x-O5H!T*$&nC(_!V2TJ6?*!xJ<+hvce}qhZ-3F^jZ1d@{mm-ATwsZG%>_(R(%91! zR7ZiMKtcjig-v{MGiwm)m{EI=oF==WV8smk2a=W?4WGeeJAzttbfThv;3yZJ`43@S zr@tnxe8ExKN^&WqKoL_}OBb*-V7@IbQ z2|dkprpdppQPe5=XO%nyrTaEcq6gMu@FTinP`}e#spRNrFSBRg?LrV?n7Bp#+kJfG z^7U2%S;fU=OsZnU%edVIz$B20%yPk7o_K#Pw~vl;?nn%VWnBGrlTI;p;eq|Q-dE)N$c(zwE34P_`erHzwhKE#@tg-UFM{`hb&EnHEB}VPd$)v;zgt%gEUujzB=yL& zBV**xT$1HFd>f2dR2NC_98DJ@Ht7C9qiCspB#GUt3wp02)|wo>O1Q(RHWnS}IVCW& zL-8`2+3gp5OypHb zNYM3o>`mqoJn6#R`{1zB>5N*3{v4s$Okr2X_@ zDmY-fx>dmD?gjk(#=k-S6cL=w+AM#akbqnks#@vzxqSOTet45Sd$>0}D~h}F%8y}5 z`*rlM|Dyr?kF3AZmHuBC#iIme&iT*gC$=4Ez~W1dVN5k)#Ub4b$AGSBtwG( zD5001H5FX@2Y!k!V00MA6!A)Ah1F+YgyiYa4I%PG2%%>yd_R%qqML^73|FKMiQ9a_ z#HGlD!(IineqtpvD4F?gG(RmiC1xr|tFKR=tEsEJZN-El9#$tpujl}GFmE}fduJ0F z9NuT280@@61!7FD{<+5kNdXr%%}*=EVR(qum}MHw49<6A)!Uc(LOgP#q=N1<(fLap z=96_si?UMQYIv|x!L9RGVHjm$dGO+a(p9NCQ;}^KJK0?RD_I#ZUhhTPf;gWCS~*UG zq}9G*;FtgvUInoUdeX%oE-aMBUL+ohEdCW30B?&H3za31y7%|ww?G;1&hHt5YLsDd zl2OrZGWrl}qr?)2VnVpyNbtIDU65H+{X<}vS=GsnF8g2ftTVM- z`}zLoN6lNpUsA~o;<(3^1QrF|l6j+&Gz7a(OjGN{XvZAEt^V<@xP<6x1f8;oO@ zqlZ0$acRC|7#H_>TK(7*eJ)t=G>t2CR_A0DmkN_28ct(k`)SrNmJUD1-u~d64AqxW z9l{shs+0Q`R{UXwHd|4FH}d%p!{>ZjV?hPd#N>jeW_*++exABK{eSm@Z)JbC&ituZ zw$DIDY@9S#vUj_id?V9s7)bwZ2DS|Q-MHo)-OU8DfSKz0vqqD_>hp(z3=w*>V)YZy zSt8r5iofC}^P#rFi97|)?6Km&i8V_Sbp|AEFpDi~jEz-qI*O7s!;WdZBV4Vn#0t6vRA@K*;|5 zIcR+qYgn*Z#Lf$FX7A7by0pt)yQBH}f+mLdjF#iyah2SqPZg1NEoUhwc-Rd2v#Q+2 z-=@HrRLt31U^I!nq8_uL=*Z@cPelT2OsWl)D|$KS4uivyQ)3YsY@!CjjfpG^PqrVN zZQ!lr!$*iX@O2UMMj(GDS$>eVhRCw1(`~UlUJ6IRNURUIvzakCp%4b~ZtDl-=j5n6Vj&BZ@gzx&TTN<1981G0GyAOam{C%$f zA^AB*YY1C=dO+_#1#VGsgF>N*E|d}0>(#rhOU|#?*J{sVs7&OSYR{WIqgz1}3><$S z0*<2}*6RVAHSX-rE!W4?I%egFiwm^k)!2*f!pq5LrI+rc;MI<#6;HeXe@cpUIinOIYkJox7z z@5NOqSDAWzh6fh)>L174#qd`gRGuM@HJ*=o5>_hy_mRy8QUwl=T@0&s$Ye>P*#E!V z}D`M5+!{$C8)eI{n-crb`AFsSSsC+?^~e=e7Y(`^$V|BQ8Ai2(tt)TPbsax4UWk#%iRv?~@)Pz2}rnoQ^nykN+uYoD$ zhbNp&(}3YYOc2&@?K7p9WJqshSs>~oQ1JRt{Tv#`sMWX(&+HE=Ovy56Kw9lmvN^B> zM%0iL!STYVzJ*M2!)5VDkx}v zCW|g0(gy*KM&R|`neW!JXXl$te!Qsc__XMnTJK!8-nG-hwm#aA0ZJnbn%F36xrNNh z_(g<2Yq$F8N~qXMI70${>$!*z=R&VwaH*sySHi=#;xjNIyx3{PY8&;*N>BIxn2-|4 zDqSGuA@a-XMa3KMll479WL`E(Lc_>>I2;uhg%>Xoo@KQaF-aapi6nuv<(r^ws&}N} zuqmJG1fsu*3!mQkr}+?6`mqMN+79qXbR?jEW$tPmrfqElFY~O~!;72&lfS?GQHBAo z1<@4nc2vedPS%2=IMW7I0c4(1s<2i5IFR1;0DI0jh=$i-5;T7uY%)@Uk@bD$sMcku zZ?I zp~;=lhvf_)V&Hy>XXLA>?JP-CdF{?47h_ChUDD~lH6rIJeYrh>{y-Ce>xr1I@nLu~ z8&U}9`XY}d=kBR+L2j*(y4&8he^4tiLx-;4SG5P%>A%~;5NF6q(CMaBgH|4(fIL>OG=}@b%$MrdSga4oF-!&R~yqyQd^{mw^v$@-cIik5+NmQHnZW#+#$x*79 z&(XrnOhyNy;0+HsJ_{l!2&9OLo?GryyH0vKcC6Q8-$U}lc5=qv=iD*R=-0%tz%55q zYc8O*#Y8ipV~glsCSYSx>fev17aiA=>;p(S(qqa0aWeeZBLz{=D$!kOyE5?m6NWNW z%fq3#hx*zqvhG^^+o-64szX`2cQ^Hhx_5}5mk zBP5v21e9!5k@j;TW$jk~hD4cZjhUWM4o`%sy5)RsxNk8UHMD2Sm?1z@kGS#S>DVb)MF;NCW_=FF94R55qmu-CA4 zYj%CwLSUDk$GFv7&qypt`Ialate{%!aV{##y_hlhGZ4@XG;UfSe8H>vk-tz?WCZsb z9@X0%p+PM3N*N1bR`g51D;%%rb%roRTKk^Q&Qv$=f>-vAVs8(4X)L1sQlRpSSsz$) zv6?ayDTmiLEV?4Ec103cpwYEa4z9P9ty3hu7@(hDTB$rv|)=Ns_t!SX0(40dINR zpunUUK_>o~H{-O_B9!>;E|=a9F&SWhd^X z@Gkxt)}wwx9lv1Xc?8isVX_vL0^U=pfI^PLa!LmVP+uhazH*;1%7}kr?gfm#b86!q zf^MeQ+i#X)W!`E+x3PMgk)DkEz%?}r{#Og>qUq&J``wb*sMW5m^L@OpD&_@ELT>x^ z)4`0o{^!`V{5^DUHp8CK1AO(57-?-K3$DA~Ggo+7l)}iVV|z!>eyg%rRT^2TC`nW# z-9l)oQ;G$_jz%RK_4bOJ%+0?iS-S*qbxSA>Qrsdjs5t7uGuGGH9+vO8>hyRti_H~^ z_rXtpIj?Tg7EtvaEK7S4li8E%^#Kejl9Rc#t8Owamjy}N3dEol)!k*!fY!VXzn1BS z(h_E-sHcXxEBy|#O}J24>s9EmEDG}kZEi(@N_x>3Ge!wV){OAn-tP0 zpY!|sAc-+i@6G-s-O<`{N5P;R1(8$5&2Yq>nvzDz!P2)aCFk+QZD1P8tRk0s)N()*pW`0p8Rc8DHI zL)6c5{!WYm84!1kVH#bJ9v;}az^gQtJOc0yD9>HSiV~E(J3M$6)l#-c!7gaG@Au`* z*ygZ1MUxvObWSR?;|*^8Y3Q_6>*(*m?i3OD(YjoaRnPcI{ZGZiXzXrkX61?4pH*YL@cEvIh z37)@{2{66L&ym zRw3MsYjAOAMtZxQ$k|g-IdPu+aEV-BMn_{2uWColhj}|kCOEH7u=k%71@$Eri=^%s zuiMxbHMZUtVt4DOY3SRR{@4gFDuQq4o&vP(5lP{v{}jZ$y@3do)p@Cr&us^+POdHT z(!r54OmhmJgt~z4$)BdtQ0G_Do@!FzeI+bR9K&hat>Nziz78(D({_~+h00IX$(*m| zjTv9B?w=cLhMguXU$8Q-EtmD`X+Ii4fGnLxr6cySews@jGz?)7fh35CUFyL z%SyaaAeQSyeojw3I~QsKWA0a+{jZ;{l;j*Ua!2?o#V8u2ckRWZn)(IE?)$n686S-I zV&TMF^UsI~0fjVBC!DnywG9)ntE-#R_{f^DLo%s`iUuik zaL^_M76VD)>8mivay&-6UVG~CBoPt6$jg=sqRqHdq5@w0^p|>g8x0!Qc%o&gUbLmc zZ#SSCR>7>sfr%CpPkwzOaZR9yuxc%B`oa!yLJ2s(`_xgl9N0r%A3URu`#Y2xfj91@RI2nB5 zaY$BklC&#ZP32H@#f>r&NaNMFH@~SfVlx6VSoF?zW@9HXT}79yF5n92(Y!*2jovP| z=WSvT2>F{#G?ap@uNp-&$B2cnhY~;O-Q>3%7P6u<5-rx+M*2(|8U@px5_DFwoHS|e zauXO=L6BpOfcTBaR6B{;Ks8W~>atea!*B;OVJo{srG(lwj1An64o~Ak*RO-H}n$e*I7{DF>C=0H{lRSKiY$KQI4%VP&xPIWXHP_ zeCx69F(d}VW){pyHh~MM#k}5S46d(kw-e_$&O8LbXR-!$ypps8B4q0`8@hw1US!i% z9L7t*Q3bi`SiyZ4MY?_8*ehr_sF4Un1y)Dbu08!&iJR?#iByXEU;xhOtWxk`$(>vF zd-o+yxl>ek$`c_^eS}ENQ9GhzvU*gSw-sh`hHNCLP!@(DH_)FEnbbVvC%*c2G)X*} z=(rhH9B-=+7%F7Di?B@cinw(&&jby-!G-(b1-^hHA(;zXzRIrSMSKMEV!|S7tjb=@ zuXUfDXu!+l?k+GrpC-n?-nb+9=1mGBAR?%hh{2C8E*PoZfe6{SeX$fv6pRX$bU$=; z{|5l>>*g{}q#)tDY@-5SN_*H-%>464H*Wv2=%E>=DcBO2G)6`&aF>Vhp`)771G9R^ zM*#St_;KO=&=3Ea{-<96WzpLxqJyOv- zx)5ABG>H3u2|ew4Yuw#;6p2zl7$ySCATo$xBZglOVGz!f1Gti(s5MvH@bInEB3z3cv$5|fiet6qa{zVFZJw=7k3 zns~@aa0pAVHW63GG%`%}R<1&KNRK+jDSN0n^jjv*+23g{JmqEpZix^ua7`=rmY#z# z>4^w3`~wDcz_=BRpa_?{ia6Rj&4eEkbR&vmBao7t3D}KOmpGNS}Pym^WQro+UQI z>5>#XIO{2B+0BB9c@tcTlqY0z<1uPxn|};H4$1mx@Gd9d(^KzDwdt!q+0Ekmx-^C; zjCgWEK`3(hz1t@$u!gIJE?eY^I+(J$M#fd4KG#)xpk@IphuG9c7iZS8F;_MeMm~~J zG=6#h6*MS@_62F+m?8KH(hTF~meGh4@n@ni$?~-5q zq$y02$<8DBphV4rHO{K{DM&tRTwxw7&iLb3@2&uu^K7zf;~?6RVrS_3;cxz6d$VSc;I69f+-eAdGX9t zdIx+{;otW!gH&~0AaYL4V}uA}Z?lG7BbbPmTQpg~4C?vHTvR!ySaR(!@%8QGL5tu{ zz2gLEo)+6!Uyp(2Fq*Bx!{*j=u0grYqHHh2_cyEQEUg3mLg_5bu;`!j%^C>nzSo;E znJlO;$RsZ1{X~MkghC}jV_!n0TIMv~{D^2Frt@g5c6i^jmT46S4iBf&J1~efKtp!A zcM30*(0I>9Mwp7Bm@GqTdPp=(E0(t>ig8ep+>urCbrKD}kdF-OU9Uyhn1;Ax1%29E z{l5jjyChzUYihORw98JyC9bmscz;35zL<$8jYGfpi1s)J%v{htGNoIo5jWsRVV;HM z7x~CPMx#1WPgnCxtxSf>AGM1}+{G(lJe3zV`SsY{=~}mlg2PyDtR3|PrJWzR%fOZb z0m&MutW}a?oDMJtbG=WNs1F+{HuFmVMRJrCxc;}U5QuJYDf#q!KPJb{cj|gBvd?`# zs8uQn+Km5h_r()x8*mi$QS6a97ssmbksfGfZkVRbDVNzSF5j=$e9G}2Qrejv)o}#9 zG$>p382Z2&q2(auM5xdZw&%L_ZVXGpk zIUFCG)zU?bsee~GQ=fgIyfnNi^at-JEwJI`s@K9t!E`g*sb?h>|GtT%qy8>@>VaKu zL9g}U*rR$CNJ`7^JXSf-a!|Tg65r^4U;ChBKiV_3NzFiM$y$+67-S&+r#9}IYnM~d z49}}qg_a_z7PP_GJ!qbIDcrIrnIxZUgjNdEvnMR#*A4}vP-6)W{# zxmCYYau1c%PXf@c^9NUS;{X{z)Qju-z}RlEE}n7}$S~{lPv>z{D%V?Uo^1y;9nM?= zWv?XXEZ+?`vq6~DKi)j{XhoPoQJYfx%9JaVnvmAZ-Ny;Z`;$EA*0;x`6`FZ-S2wyl z(S!QsHZMNS>i?X=SI3VP$vHc&9xrY0Olq{c3Qi0<-$z~qpkL|klp39Dl8LH%MB%1Y zw&){&yu!CXhbt|ht4kLn)3MzEpQ{7dkE(^ynPlBT-GOzQx9#}8Tj{|4^%#arpM8Px zx5nZ`Q5`qRw9g-9ju*RBsXXrvj~<+FwL|vQ=exSX&`56|FP8tC0QqD1kZi9G7*{?X z7Yvrk1@@asn%;Y)C3wBM7ygIf6T6!{o8gGQgxCxm&hX4@z6Alrd@5;^mJ6+8HRO5R z_v?A~0wbk0d35m7zT=7Oh08STXVzE+J6vc2R}Zy~u$XBm9cISTIVs2`Tu)^EjHS!m z_j{FuDRIJ*`mGkTMywhn9Qe4iZHDHGRFrm;0!PzHdl{u&qdNiXEr#Y?%eE}SU4Nbx z43U={pzlocRIt!;@V2DJgN9}>Lt*e0i($l5S&;&s&LKo z7q)ygsL-(YvO+TQE34Jp*J>i^P|H^?POysN_HDS5C3z&f+%TqhWJ!8VvjZ#T^b1Zu z@s+3HzI5|2e(mKO)|#@t?Cl}Jzm$~|iw&-V36&CWnJQk0X1uI3ndeoG6B{%VtaLJ} z8>cEi#E2)tD)9GH5;me!ps$TtzCB*DjE$1+Z>Hw?F)ZGWr;LrYrT=05VZ`KVs+nJP z{IT?w=ztcs0;wL?z9HHZP@$bPNi}8KfKXvqD(??6B_Sd+Gp{qp&;`}3g;4J%c%I1_#yGx3?!Qw58O z%~RTndy#DwHSyB-l}*?3b@<(_L6?{9+f@tYf=rTq+2$mKj%en)&9W6uG80D{yWVm; z*w0|bFm#A@WEOLImbM}$yNbQ1aT|V>b__swN(dWCNdNx4H00u}^4r@y4CF8#oU$J{ zad=-25G8wz6p_+3C09=*ylWd5rDPlj`jOlJLF>wi@}O$@OTD7QH(7z~Jw)w2MYMA^pKZ!N^sd>Kgxsy{E(>4$GkE@`x_s#< z^{xJ@SxMMb7ug1Zx*6T36fIBi0}(9P8#Zbp=8^*y#TNX^v%iVT-b5>I0+67GVCJAm zb*m^9JLa@DYVBN(;g_eUxuM-rFv%C0RWPMMp|J109{au~zg+drz+Wm~uw1D_fL9-+ zgvH%|8YL}!oJf)q1t(X49#&=t;1frEKwDP`@`8Vi93lFR^6?~~g0G8x71M6eCC4Wy zBt6iXcGDOM>JYuJMG^GcvheEHJ%os06Lg#(wm3aDJ(`z2ROuhYF-!z>-|lboJaXNh z4?O;w*A6)xVh3J(EudjJ3!wilj$KDb3l*CCJrV_4)2!5)Tz zX1VLcEu6M~Y!dJU%8adK5k{Z*)9eNv=%%;$U%WyOiCj)qiIidnW@eg`z9M9t{3N8i zPIrE#Kp<)s!nB6=6&5@X`z(5FMA54b*aY08%Km17I|VWOO^95T|C<0Ed*MUOZ``ZQ zm!xhoO~cx)fcYtg_c=wAg3ag~p>L87QgqG%`D-TOn8>2_qIX9vCp@n*2W^)}@G*qE z|1zcZJW2&Wx`mMI4hqhykhH8+YE*CDECsE)aJ{8`F4i7ESFk2*G*0tzxj5>pYJ$Qt z(g?Qz;kg$+Yye&Bx^$b0D8%Yw>UOszsQU

t&}RRDy)M0!`Ut^2uhUdLdM$Q+Ts+ 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 EqI=9!#U|%*M2Q^B6(;YtngFpP_C~ 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


siY)n)J5wzfM+;J_?pWiot% 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 HrXT(fIVU|4 literal 0 HcmV?d00001 diff --git a/website/docs/assets/houdini_vdb_setup.png b/website/docs/assets/houdini_vdb_setup.png new file mode 100644 index 0000000000000000000000000000000000000000..e27e0b6c368370f071a9058b14e6e2bff8cdf719 GIT binary patch literal 28411 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 D>Z Date: Thu, 19 Aug 2021 13:22:33 +0200 Subject: [PATCH 34/38] =?UTF-8?q?fix=20hound=20=F0=9F=90=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openpype/hosts/houdini/api/plugin.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/houdini/api/plugin.py b/openpype/hosts/houdini/api/plugin.py index 989bae12e3..efdaa60084 100644 --- a/openpype/hosts/houdini/api/plugin.py +++ b/openpype/hosts/houdini/api/plugin.py @@ -20,4 +20,7 @@ class Creator(PypeCreatorMixin, houdini.Creator): instance = super(Creator, self).process() self._process(instance) except hou.Error as er: - six.reraise(OpenPypeCreatorError, OpenPypeCreatorError("Creator error"), sys.exc_info()[2]) + six.reraise( + OpenPypeCreatorError, + OpenPypeCreatorError("Creator error: {}".format(er)), + sys.exc_info()[2]) From c20c992f7ea4debfa32e8a399e114e47bb338308 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 19 Aug 2021 16:50:54 +0200 Subject: [PATCH 35/38] define hosts in CollectSceneVersion collector --- .../plugins/publish/collect_scene_version.py | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/openpype/plugins/publish/collect_scene_version.py b/openpype/plugins/publish/collect_scene_version.py index 669e6752f3..ca12f2900c 100644 --- a/openpype/plugins/publish/collect_scene_version.py +++ b/openpype/plugins/publish/collect_scene_version.py @@ -11,14 +11,22 @@ class CollectSceneVersion(pyblish.api.ContextPlugin): order = pyblish.api.CollectorOrder label = 'Collect Version' + hosts = [ + "aftereffects", + "blender", + "celaction", + "fusion", + "harmony", + "hiero", + "houdini", + "maya", + "nuke", + "photoshop", + "resolve", + "tvpaint" + ] def process(self, context): - if "standalonepublisher" in context.data.get("host", []): - return - - if "unreal" in pyblish.api.registered_hosts(): - return - assert context.data.get('currentFile'), "Cannot get current file" filename = os.path.basename(context.data.get('currentFile')) From 66a98a5dcb39eff57f8cb364acecb9fddf36b831 Mon Sep 17 00:00:00 2001 From: Derek Severin Date: Wed, 25 Aug 2021 12:12:30 +0700 Subject: [PATCH 36/38] Resolve path when adding to zip --- igniter/bootstrap_repos.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/igniter/bootstrap_repos.py b/igniter/bootstrap_repos.py index 8c081b8614..b49a2f6e7f 100644 --- a/igniter/bootstrap_repos.py +++ b/igniter/bootstrap_repos.py @@ -508,7 +508,7 @@ class BootstrapRepos: processed_path = file self._print(f"- processing {processed_path}") - zip_file.write(file, file.relative_to(openpype_root)) + zip_file.write(file, file.resolve().relative_to(openpype_root)) # test if zip is ok zip_file.testzip() From 498adfeeb9a2c4482cef6d05f76eee51b28d57bd Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Wed, 25 Aug 2021 12:22:15 +0200 Subject: [PATCH 37/38] mark USd as experimental --- openpype/hosts/houdini/plugins/create/create_usd.py | 2 +- openpype/hosts/houdini/plugins/create/create_usdrender.py | 2 +- repos/avalon-core | 2 +- website/docs/artist_hosts_houdini.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openpype/hosts/houdini/plugins/create/create_usd.py b/openpype/hosts/houdini/plugins/create/create_usd.py index 076197bace..5bcb7840c0 100644 --- a/openpype/hosts/houdini/plugins/create/create_usd.py +++ b/openpype/hosts/houdini/plugins/create/create_usd.py @@ -4,7 +4,7 @@ from openpype.hosts.houdini.api import plugin class CreateUSD(plugin.Creator): """Universal Scene Description""" - label = "USD" + label = "USD (experimental)" family = "usd" icon = "gears" enabled = False diff --git a/openpype/hosts/houdini/plugins/create/create_usdrender.py b/openpype/hosts/houdini/plugins/create/create_usdrender.py index 9b98f59ac1..cb3fe3f02b 100644 --- a/openpype/hosts/houdini/plugins/create/create_usdrender.py +++ b/openpype/hosts/houdini/plugins/create/create_usdrender.py @@ -5,7 +5,7 @@ from openpype.hosts.houdini.api import plugin class CreateUSDRender(plugin.Creator): """USD Render ROP in /stage""" - label = "USD Render" + label = "USD Render (experimental)" family = "usdrender" icon = "magic" diff --git a/repos/avalon-core b/repos/avalon-core index e5c8a15fde..52e24a9993 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit e5c8a15fde77708c924eab3018bda255f17b5390 +Subproject commit 52e24a9993e5223b0a719786e77a4b87e936e556 diff --git a/website/docs/artist_hosts_houdini.md b/website/docs/artist_hosts_houdini.md index f70eac625a..d2aadf05cb 100644 --- a/website/docs/artist_hosts_houdini.md +++ b/website/docs/artist_hosts_houdini.md @@ -52,7 +52,7 @@ Alembic ROP `/out/pointcacheStrange` This part of documentation is still work in progress. ::: -## USD +## USD (experimental support) ### Publishing USD You can publish your Solaris Stage as USD file. ![Solaris USD](assets/houdini_usd_stage.png) From 4d50db97806c97c5a96e071a962530eacca7f0f7 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Wed, 25 Aug 2021 12:22:29 +0200 Subject: [PATCH 38/38] validate extensions on ly on the main family --- .../hosts/houdini/plugins/publish/validate_file_extension.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/houdini/plugins/publish/validate_file_extension.py b/openpype/hosts/houdini/plugins/publish/validate_file_extension.py index c299a47e74..b26d28a1e7 100644 --- a/openpype/hosts/houdini/plugins/publish/validate_file_extension.py +++ b/openpype/hosts/houdini/plugins/publish/validate_file_extension.py @@ -40,7 +40,7 @@ class ValidateFileExtension(pyblish.api.InstancePlugin): node = instance[0] # Create lookup for current family in instance - families = instance.data.get("families", list()) + families = [] family = instance.data.get("family", None) if family: families.append(family)