From 0b67d9c7581510ee271aa698a11000874680581d Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Fri, 17 Mar 2023 12:07:43 +0000 Subject: [PATCH 01/20] Initial working GPU extractor --- .../maya/plugins/publish/extract_gpu_cache.py | 45 +++++++++++++++++++ openpype/plugins/publish/integrate.py | 2 +- .../plugins/publish/integrate_hero_version.py | 20 ++++++++- 3 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 openpype/hosts/maya/plugins/publish/extract_gpu_cache.py diff --git a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py new file mode 100644 index 0000000000..0e69f6dc57 --- /dev/null +++ b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py @@ -0,0 +1,45 @@ +import os + +from maya import cmds + +from openpype.pipeline import publish +from openpype.hosts.maya.api.lib import ( + maintained_selection, attribute_values, delete_after +) + + +class ExtractGPUCache(publish.Extractor): + """Extract the content of the instance to an CPU cache file.""" + + label = "CPU Cache" + hosts = ["maya"] + families = ["model"] + + def process(self, instance): + staging_dir = self.staging_dir(instance) + filename = "{}.abc".format(instance.name) + + # Write out GPU cache file. + cmds.gpuCache( + instance[:], + directory=staging_dir, + fileName=filename, + saveMultipleFiles=False + ) + + if "representations" not in instance.data: + instance.data["representations"] = [] + + representation = { + "name": "gpu_cache", + "ext": "abc", + "files": filename, + "stagingDir": staging_dir, + "data": {"heroSuffix": "gpu_cache"} + } + + instance.data["representations"].append(representation) + + self.log.info( + "Extracted instance {} to: {}".format(instance.name, staging_dir) + ) diff --git a/openpype/plugins/publish/integrate.py b/openpype/plugins/publish/integrate.py index b117006871..f8fb6041b3 100644 --- a/openpype/plugins/publish/integrate.py +++ b/openpype/plugins/publish/integrate.py @@ -398,7 +398,7 @@ class IntegrateAsset(pyblish.api.InstancePlugin): self.log.debug("{}".format(op_session.to_data())) op_session.commit() - # Backwards compatibility + # Backwards compatibility used in hero integration. # todo: can we avoid the need to store this? instance.data["published_representations"] = { p["representation"]["_id"]: p for p in prepared_representations diff --git a/openpype/plugins/publish/integrate_hero_version.py b/openpype/plugins/publish/integrate_hero_version.py index e796f7b376..4d7d0accad 100644 --- a/openpype/plugins/publish/integrate_hero_version.py +++ b/openpype/plugins/publish/integrate_hero_version.py @@ -18,7 +18,7 @@ from openpype.client.operations import ( prepare_hero_version_update_data, prepare_representation_update_data, ) -from openpype.lib import create_hard_link +from openpype.lib import create_hard_link, StringTemplate from openpype.pipeline import ( schema ) @@ -306,6 +306,23 @@ class IntegrateHeroVersion(pyblish.api.InstancePlugin): anatomy_filled = anatomy.format(anatomy_data) template_filled = anatomy_filled[template_key]["path"] + # For representations that have the same extension, an + # additional suffix can be available to make the destination + # filename different. + hero_suffix = repre_info["representation"]["data"].get( + "heroSuffix" + ) + if hero_suffix: + fill_data = copy.deepcopy(template_filled.used_values) + template_filled.template = template_filled.replace( + "." + fill_data["ext"], + "_{}.{}".format(hero_suffix, fill_data["ext"]) + ) + template_filled = StringTemplate( + template_filled.template + ).format(fill_data) + + # Prepare new repre repre_data = { "path": str(template_filled), "template": hero_template @@ -316,7 +333,6 @@ class IntegrateHeroVersion(pyblish.api.InstancePlugin): if value is not None: repre_context[key] = value - # Prepare new repre repre = copy.deepcopy(repre_info["representation"]) repre["parent"] = new_hero_version["_id"] repre["context"] = repre_context From c05a3b3b1d8777861114e8ec88732f87f28f6c60 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Fri, 17 Mar 2023 12:17:58 +0000 Subject: [PATCH 02/20] Hound and BigRoy feedback --- openpype/hosts/maya/plugins/publish/extract_gpu_cache.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py index 0e69f6dc57..413561e409 100644 --- a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py +++ b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py @@ -1,17 +1,12 @@ -import os - from maya import cmds from openpype.pipeline import publish -from openpype.hosts.maya.api.lib import ( - maintained_selection, attribute_values, delete_after -) class ExtractGPUCache(publish.Extractor): """Extract the content of the instance to an CPU cache file.""" - label = "CPU Cache" + label = "GPU Cache" hosts = ["maya"] families = ["model"] From a6805987ca5d2ddaea8c1d97fa98e5a964a0b540 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Fri, 17 Mar 2023 14:58:28 +0000 Subject: [PATCH 03/20] Ensure gpu and alembic do not overwrite when integrating. --- openpype/hosts/maya/plugins/publish/extract_gpu_cache.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py index 413561e409..e77890b534 100644 --- a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py +++ b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py @@ -30,7 +30,8 @@ class ExtractGPUCache(publish.Extractor): "ext": "abc", "files": filename, "stagingDir": staging_dir, - "data": {"heroSuffix": "gpu_cache"} + "data": {"heroSuffix": "gpu_cache"}, + "outputName": "gpu_cache" } instance.data["representations"].append(representation) From 785c352407a2953a05bc958555e236a3771f4e09 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Fri, 17 Mar 2023 17:41:33 +0000 Subject: [PATCH 04/20] Adjust loader for extractor. --- openpype/hosts/maya/plugins/load/load_gpucache.py | 2 +- openpype/hosts/maya/plugins/publish/extract_gpu_cache.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/maya/plugins/load/load_gpucache.py b/openpype/hosts/maya/plugins/load/load_gpucache.py index 07e5734f43..b7ca7292f5 100644 --- a/openpype/hosts/maya/plugins/load/load_gpucache.py +++ b/openpype/hosts/maya/plugins/load/load_gpucache.py @@ -11,7 +11,7 @@ class GpuCacheLoader(load.LoaderPlugin): """Load Alembic as gpuCache""" families = ["model", "animation", "proxyAbc", "pointcache"] - representations = ["abc"] + representations = ["gpu_cache"] label = "Import Gpu Cache" order = -5 diff --git a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py index e77890b534..db84833722 100644 --- a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py +++ b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py @@ -8,7 +8,7 @@ class ExtractGPUCache(publish.Extractor): label = "GPU Cache" hosts = ["maya"] - families = ["model"] + families = ["model", "animation", "pointcache"] def process(self, instance): staging_dir = self.staging_dir(instance) From 0fe0e8c02cbafc56b202c828d5010e3d1b665d56 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Sat, 18 Mar 2023 10:03:28 +0000 Subject: [PATCH 05/20] Settings for GPU cache extractor --- .../maya/plugins/publish/extract_gpu_cache.py | 33 +++++++++-- .../defaults/project_settings/maya.json | 15 +++++ .../schemas/schema_maya_publish.json | 59 +++++++++++++++++++ 3 files changed, 102 insertions(+), 5 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py index db84833722..544a2d376a 100644 --- a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py +++ b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py @@ -1,3 +1,5 @@ +import json + from maya import cmds from openpype.pipeline import publish @@ -9,18 +11,39 @@ class ExtractGPUCache(publish.Extractor): label = "GPU Cache" hosts = ["maya"] families = ["model", "animation", "pointcache"] + simulationRate = 1.0 + sampleMultiplier = 1 + optimize = True + optimizationThreshold = 40000 + optimizeAnimationsForMotionBlur = True + writeMaterials = True + useBaseTessellation = True def process(self, instance): staging_dir = self.staging_dir(instance) filename = "{}.abc".format(instance.name) # Write out GPU cache file. - cmds.gpuCache( - instance[:], - directory=staging_dir, - fileName=filename, - saveMultipleFiles=False + kwargs = { + "directory": staging_dir, + "fileName": filename, + "saveMultipleFiles": False, + "simulationRate": self.simulationRate, + "sampleMultiplier": self.sampleMultiplier, + "optimize": self.optimize, + "optimizationThreshold": self.optimizationThreshold, + "optimizeAnimationsForMotionBlur": ( + self.optimizeAnimationsForMotionBlur + ), + "writeMaterials": self.writeMaterials, + "useBaseTessellation": self.useBaseTessellation + } + self.log.debug( + "Extract {} with:\n{}".format( + instance[:], json.dumps(kwargs, indent=4, sort_keys=True) + ) ) + cmds.gpuCache(instance[:], **kwargs) if "representations" not in instance.data: instance.data["representations"] = [] diff --git a/openpype/settings/defaults/project_settings/maya.json b/openpype/settings/defaults/project_settings/maya.json index 63ba4542f3..801a04d144 100644 --- a/openpype/settings/defaults/project_settings/maya.json +++ b/openpype/settings/defaults/project_settings/maya.json @@ -923,6 +923,21 @@ "enabled": true, "active": true, "ogsfx_path": "/maya2glTF/PBR/shaders/glTF_PBR.ogsfx" + }, + "ExtractGPUCache": { + "enabled": true, + "families": [ + "model", + "animation", + "pointcache" + ], + "simulationRate": 0.0, + "sampleMultiplier": 0, + "optimize": true, + "optimizationThreshold": 40000, + "optimizeAnimationsForMotionBlur": true, + "writeMaterials": true, + "useBaseTessellation": true } }, "load": { diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json index 3484f42f6b..03a447b05e 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json @@ -992,6 +992,65 @@ "label": "GLSL Shader Directory" } ] + }, + { + "type": "dict", + "collapsible": true, + "key": "ExtractGPUCache", + "label": "Extract GPU Cache", + "checkbox_key": "enabled", + "children": [ + { + "type": "boolean", + "key": "enabled", + "label": "Enabled" + }, + { + "key": "families", + "label": "Families", + "type": "list", + "object_type": "text" + }, + { + "key": "simulationRate", + "label": "Evaluate Every", + "type": "number", + "decimal": 4, + "minimum": 1 + }, + { + "key": "sampleMultiplier", + "label": "Save Every", + "type": "number", + "minimum": 1 + }, + { + "key": "optimize", + "label": "Optimize Hierarchy", + "type": "boolean" + }, + { + "key": "optimizationThreshold", + "label": "Optimization Threshold", + "type": "number", + "minimum": 1 + }, + { + "key": "optimizeAnimationsForMotionBlur", + "label": "Optimize Animations For Motion Blur", + "type": "boolean" + }, + { + "key": "writeMaterials", + "label": "Write Materials", + "type": "boolean" + }, + { + "key": "useBaseTessellation", + "label": "User Base Tesselation", + "type": "boolean" + } + ] } ] } From 69ff474801b4f7cb8aa463cac6119b868a2669b9 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Sat, 18 Mar 2023 10:26:59 +0000 Subject: [PATCH 06/20] Remove hero suffix logic. --- .../maya/plugins/publish/extract_gpu_cache.py | 1 - .../plugins/publish/integrate_hero_version.py | 16 ---------------- 2 files changed, 17 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py index 544a2d376a..6e8eaf57ce 100644 --- a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py +++ b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py @@ -53,7 +53,6 @@ class ExtractGPUCache(publish.Extractor): "ext": "abc", "files": filename, "stagingDir": staging_dir, - "data": {"heroSuffix": "gpu_cache"}, "outputName": "gpu_cache" } diff --git a/openpype/plugins/publish/integrate_hero_version.py b/openpype/plugins/publish/integrate_hero_version.py index 4d7d0accad..6e233dd5a9 100644 --- a/openpype/plugins/publish/integrate_hero_version.py +++ b/openpype/plugins/publish/integrate_hero_version.py @@ -306,22 +306,6 @@ class IntegrateHeroVersion(pyblish.api.InstancePlugin): anatomy_filled = anatomy.format(anatomy_data) template_filled = anatomy_filled[template_key]["path"] - # For representations that have the same extension, an - # additional suffix can be available to make the destination - # filename different. - hero_suffix = repre_info["representation"]["data"].get( - "heroSuffix" - ) - if hero_suffix: - fill_data = copy.deepcopy(template_filled.used_values) - template_filled.template = template_filled.replace( - "." + fill_data["ext"], - "_{}.{}".format(hero_suffix, fill_data["ext"]) - ) - template_filled = StringTemplate( - template_filled.template - ).format(fill_data) - # Prepare new repre repre_data = { "path": str(template_filled), From 6490c1e387b04fe13ad6d754fa0a8d18e695ad89 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Sat, 18 Mar 2023 10:27:49 +0000 Subject: [PATCH 07/20] Hound --- openpype/plugins/publish/integrate_hero_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/plugins/publish/integrate_hero_version.py b/openpype/plugins/publish/integrate_hero_version.py index 6e233dd5a9..7adb2b66ec 100644 --- a/openpype/plugins/publish/integrate_hero_version.py +++ b/openpype/plugins/publish/integrate_hero_version.py @@ -18,7 +18,7 @@ from openpype.client.operations import ( prepare_hero_version_update_data, prepare_representation_update_data, ) -from openpype.lib import create_hard_link, StringTemplate +from openpype.lib import create_hard_link from openpype.pipeline import ( schema ) From 03c6fab3ea0ed2a979e06b29eef6914bfa440d76 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Sat, 18 Mar 2023 10:29:01 +0000 Subject: [PATCH 08/20] Remove hero edits. --- openpype/plugins/publish/integrate_hero_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/plugins/publish/integrate_hero_version.py b/openpype/plugins/publish/integrate_hero_version.py index 7adb2b66ec..e796f7b376 100644 --- a/openpype/plugins/publish/integrate_hero_version.py +++ b/openpype/plugins/publish/integrate_hero_version.py @@ -306,7 +306,6 @@ class IntegrateHeroVersion(pyblish.api.InstancePlugin): anatomy_filled = anatomy.format(anatomy_data) template_filled = anatomy_filled[template_key]["path"] - # Prepare new repre repre_data = { "path": str(template_filled), "template": hero_template @@ -317,6 +316,7 @@ class IntegrateHeroVersion(pyblish.api.InstancePlugin): if value is not None: repre_context[key] = value + # Prepare new repre repre = copy.deepcopy(repre_info["representation"]) repre["parent"] = new_hero_version["_id"] repre["context"] = repre_context From b3e8fb2c175eb8de1a43b88550b8659a95c9966d Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Sat, 18 Mar 2023 10:40:30 +0000 Subject: [PATCH 09/20] Ensure unique extraction. --- openpype/hosts/maya/plugins/publish/extract_gpu_cache.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py index 6e8eaf57ce..b51242fa50 100644 --- a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py +++ b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py @@ -21,7 +21,7 @@ class ExtractGPUCache(publish.Extractor): def process(self, instance): staging_dir = self.staging_dir(instance) - filename = "{}.abc".format(instance.name) + filename = "{}_gpu_cache".format(instance.name) # Write out GPU cache file. kwargs = { @@ -51,9 +51,9 @@ class ExtractGPUCache(publish.Extractor): representation = { "name": "gpu_cache", "ext": "abc", - "files": filename, + "files": filename + ".abc", "stagingDir": staging_dir, - "outputName": "gpu_cache" + #"outputName": "gpu_cache" } instance.data["representations"].append(representation) From 12c54e22d6ebaa09f21621606f9dd1d96bd73aa7 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Sat, 18 Mar 2023 10:40:47 +0000 Subject: [PATCH 10/20] Ensure unique integration --- openpype/hosts/maya/plugins/publish/extract_gpu_cache.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py index b51242fa50..91efab38ed 100644 --- a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py +++ b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py @@ -53,7 +53,7 @@ class ExtractGPUCache(publish.Extractor): "ext": "abc", "files": filename + ".abc", "stagingDir": staging_dir, - #"outputName": "gpu_cache" + "outputName": "gpu_cache" } instance.data["representations"].append(representation) From f38bb352444caf23a624fffe26614161abb75a73 Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Mon, 20 Mar 2023 09:20:52 +0000 Subject: [PATCH 11/20] Update openpype/hosts/maya/plugins/publish/extract_gpu_cache.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: FabiĆ  Serra Arrizabalaga --- openpype/hosts/maya/plugins/publish/extract_gpu_cache.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py index 91efab38ed..965122822c 100644 --- a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py +++ b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py @@ -6,7 +6,7 @@ from openpype.pipeline import publish class ExtractGPUCache(publish.Extractor): - """Extract the content of the instance to an CPU cache file.""" + """Extract the content of the instance to a GPU cache file.""" label = "GPU Cache" hosts = ["maya"] From 2246fa15abeae14607ada49e189bc88c3280f3f0 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 21 Mar 2023 07:56:19 +0000 Subject: [PATCH 12/20] Documentation for settings --- website/docs/admin_hosts_maya.md | 37 ++++++++++++++++--- website/docs/assets/maya-admin_gpu_cache.png | Bin 0 -> 20248 bytes 2 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 website/docs/assets/maya-admin_gpu_cache.png diff --git a/website/docs/admin_hosts_maya.md b/website/docs/admin_hosts_maya.md index ae0cf76f53..d38b911062 100644 --- a/website/docs/admin_hosts_maya.md +++ b/website/docs/admin_hosts_maya.md @@ -6,7 +6,7 @@ sidebar_label: Maya ## Publish Plugins -### Render Settings Validator +### Render Settings Validator `ValidateRenderSettings` @@ -51,7 +51,7 @@ just one instance of this node type but if that is not so, validator will go thr instances and check the value there. Node type for **VRay** settings is `VRaySettingsNode`, for **Renderman** it is `rmanGlobals`, for **Redshift** it is `RedshiftOptions`. -### Model Name Validator +### Model Name Validator `ValidateRenderSettings` @@ -95,7 +95,7 @@ You can set various aspects of scene submission to farm with per-project setting - **Optional** will mark sumission plugin optional - **Active** will enable/disable plugin - - **Tile Assembler Plugin** will set what should be used to assemble tiles on Deadline. Either **Open Image IO** will be used + - **Tile Assembler Plugin** will set what should be used to assemble tiles on Deadline. Either **Open Image IO** will be used or Deadlines **Draft Tile Assembler**. - **Use Published scene** enable to render from published scene instead of scene in work area. Rendering from published files is much safer. - **Use Asset dependencies** will mark job pending on farm until asset dependencies are fulfilled - for example Deadline will wait for scene file to be synced to cloud, etc. @@ -107,6 +107,35 @@ or Deadlines **Draft Tile Assembler**. This is useful to fix some specific renderer glitches and advanced hacking of Maya Scene files. `Patch name` is label for patch for easier orientation. `Patch regex` is regex used to find line in file, after `Patch line` string is inserted. Note that you need to add line ending. +### Extract GPU Cache + +![Maya GPU Cache](assets/maya-admin_gpu_cache.png) + +- **Evaluate Every** Specifies which samples are saved during cache creation. For example, a value of 2 specifies that only every other sample specified by the Evaluate every # frame(s) option is saved to your Alembic file. + +- **Save Every** Specifies how often samples are taken during file creation. By default, one sample of your object's transformations is taken every frame and saved to the Alembic file. + + For example, a value of 2 caches the transformations of the current object at every other frame of the Cache Time Range. + +- **Optimize Hierarchy** When on, nodes and objects in a selected hierarchy are consolidated to maximize the performance of the cache file during playback. +- **Optimization Threshold** (Available only when Optimize Hierarchy is on.) Specifies the maximum number of vertices contained in a single draw primitive. The default value of 40000 may be ideal for most Maya supported graphics cards. When set to the default value, after optimization, each object in the GPU cache file(s) will have no more than 40000 vertices. This value can be set higher depending on the memory available on your system graphics card. + +- **Optimize Animations for Motion Blur** When on, objects with animated transform nodes display with motion blur when the cache is played back in Viewport 2.0 render mode. See Viewport 2.0 options. + + Maya first determines if the GPU cache includes animation data. If the GPU cache is static and does not contain animation data, Maya does not optimize the GPU cache for motion blur. + +:::note Motion Blur does not support Cached Playback. +::: + +- **Write Materials** When on, Maya exports the Lambert and Phong materials from source geometry to the GPU Cache file. These materials display when the GPU-cached file is played back in Viewport 2.0. + + GPU-cached objects support all the high-quality lighting and shading effects provide by the Viewport 2.0 rendering mode. See Viewport 2.0 options. + +:::note Lambert and Phong materials do not display on GPU-cached files when they are played back in scene view's High Quality Rendering or Default Quality Rendering modes. +::: + +- **Use Base Tessellation** Exports geometry with base tessellation and no smoothing applied. If this setting is turned off, the extractor will export geometry with the current Smooth Mesh Preview setting applied. + ## Custom Menu You can add your custom tools menu into Maya by extending definitions in **Maya -> Scripts Menu Definition**. ![Custom menu definition](assets/maya-admin_scriptsmenu.png) @@ -169,5 +198,3 @@ Fill in the necessary fields (the optional fields are regex filters) - Build your workfile ![maya build template](assets/maya-build_workfile_from_template.png) - - diff --git a/website/docs/assets/maya-admin_gpu_cache.png b/website/docs/assets/maya-admin_gpu_cache.png new file mode 100644 index 0000000000000000000000000000000000000000..8b07b06c1e26c91ce42a77b34182abd0c5db975e GIT binary patch literal 20248 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 Hr-UW|ar0GU literal 0 HcmV?d00001 From b40289c9b5df00ae2222d70fce6a5b8a1e37498d Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 21 Mar 2023 09:17:20 +0000 Subject: [PATCH 13/20] simulationRate > step, sampleMultiplier > stepSave --- openpype/hosts/maya/plugins/publish/extract_gpu_cache.py | 8 ++++---- openpype/settings/defaults/project_settings/maya.json | 4 ++-- .../projects_schema/schemas/schema_maya_publish.json | 8 ++++---- website/docs/admin_hosts_maya.md | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py index 965122822c..f92bb9c67f 100644 --- a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py +++ b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py @@ -11,8 +11,8 @@ class ExtractGPUCache(publish.Extractor): label = "GPU Cache" hosts = ["maya"] families = ["model", "animation", "pointcache"] - simulationRate = 1.0 - sampleMultiplier = 1 + step = 1.0 + stepSave = 1 optimize = True optimizationThreshold = 40000 optimizeAnimationsForMotionBlur = True @@ -28,8 +28,8 @@ class ExtractGPUCache(publish.Extractor): "directory": staging_dir, "fileName": filename, "saveMultipleFiles": False, - "simulationRate": self.simulationRate, - "sampleMultiplier": self.sampleMultiplier, + "step": self.step, + "stepSave": self.stepSave, "optimize": self.optimize, "optimizationThreshold": self.optimizationThreshold, "optimizeAnimationsForMotionBlur": ( diff --git a/openpype/settings/defaults/project_settings/maya.json b/openpype/settings/defaults/project_settings/maya.json index 8fec46ccf2..b06a97dce3 100644 --- a/openpype/settings/defaults/project_settings/maya.json +++ b/openpype/settings/defaults/project_settings/maya.json @@ -932,8 +932,8 @@ "animation", "pointcache" ], - "simulationRate": 0.0, - "sampleMultiplier": 0, + "step": 0.0, + "stepSave": 0, "optimize": true, "optimizationThreshold": 40000, "optimizeAnimationsForMotionBlur": true, diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json index 24a4805656..09b235fa0e 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json @@ -1016,15 +1016,15 @@ "object_type": "text" }, { - "key": "simulationRate", - "label": "Evaluate Every", + "key": "step", + "label": "Step", "type": "number", "decimal": 4, "minimum": 1 }, { - "key": "sampleMultiplier", - "label": "Save Every", + "key": "stepSave", + "label": "Step Save", "type": "number", "minimum": 1 }, diff --git a/website/docs/admin_hosts_maya.md b/website/docs/admin_hosts_maya.md index 3cfd28b20a..e07bb7d669 100644 --- a/website/docs/admin_hosts_maya.md +++ b/website/docs/admin_hosts_maya.md @@ -110,12 +110,12 @@ This is useful to fix some specific renderer glitches and advanced hacking of Ma ![Maya GPU Cache](assets/maya-admin_gpu_cache.png) -- **Evaluate Every** Specifies which samples are saved during cache creation. For example, a value of 2 specifies that only every other sample specified by the Evaluate every # frame(s) option is saved to your Alembic file. - -- **Save Every** Specifies how often samples are taken during file creation. By default, one sample of your object's transformations is taken every frame and saved to the Alembic file. +- **Step** Specifies how often samples are taken during file creation. By default, one sample of your object's transformations is taken every frame and saved to the Alembic file. For example, a value of 2 caches the transformations of the current object at every other frame of the Cache Time Range. +- **Step Save** Specifies which samples are saved during cache creation. For example, a value of 2 specifies that only every other sample specified by the Step # frame(s) option is saved to your Alembic file. + - **Optimize Hierarchy** When on, nodes and objects in a selected hierarchy are consolidated to maximize the performance of the cache file during playback. - **Optimization Threshold** (Available only when Optimize Hierarchy is on.) Specifies the maximum number of vertices contained in a single draw primitive. The default value of 40000 may be ideal for most Maya supported graphics cards. When set to the default value, after optimization, each object in the GPU cache file(s) will have no more than 40000 vertices. This value can be set higher depending on the memory available on your system graphics card. From e083a18dda71214eb33c5b1f3872cc324f7ff915 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 21 Mar 2023 09:19:54 +0000 Subject: [PATCH 14/20] Default values for step and stepSave. --- openpype/settings/defaults/project_settings/maya.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/settings/defaults/project_settings/maya.json b/openpype/settings/defaults/project_settings/maya.json index b06a97dce3..7757f201ad 100644 --- a/openpype/settings/defaults/project_settings/maya.json +++ b/openpype/settings/defaults/project_settings/maya.json @@ -932,8 +932,8 @@ "animation", "pointcache" ], - "step": 0.0, - "stepSave": 0, + "step": 1.0, + "stepSave": 1, "optimize": true, "optimizationThreshold": 40000, "optimizeAnimationsForMotionBlur": true, From 7e7f6ced16d0e867ed2f6a67c05012c5020c0c52 Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Tue, 21 Mar 2023 10:54:07 +0000 Subject: [PATCH 15/20] Update openpype/hosts/maya/plugins/publish/extract_gpu_cache.py --- openpype/hosts/maya/plugins/publish/extract_gpu_cache.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py index f92bb9c67f..deee456982 100644 --- a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py +++ b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py @@ -28,8 +28,8 @@ class ExtractGPUCache(publish.Extractor): "directory": staging_dir, "fileName": filename, "saveMultipleFiles": False, - "step": self.step, - "stepSave": self.stepSave, + "simulationRate": self.step, + "sampleMultiplier": self.stepSave, "optimize": self.optimize, "optimizationThreshold": self.optimizationThreshold, "optimizeAnimationsForMotionBlur": ( From 9f6bc9459a5288bfa55e7b78a4cb8c49e0ae681c Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 21 Mar 2023 18:03:48 +0000 Subject: [PATCH 16/20] Revert alembic representation exclusion. --- openpype/hosts/maya/plugins/load/load_gpucache.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/load/load_gpucache.py b/openpype/hosts/maya/plugins/load/load_gpucache.py index b7ca7292f5..c447311454 100644 --- a/openpype/hosts/maya/plugins/load/load_gpucache.py +++ b/openpype/hosts/maya/plugins/load/load_gpucache.py @@ -11,7 +11,7 @@ class GpuCacheLoader(load.LoaderPlugin): """Load Alembic as gpuCache""" families = ["model", "animation", "proxyAbc", "pointcache"] - representations = ["gpu_cache"] + representations = ["abc", "gpu_cache"] label = "Import Gpu Cache" order = -5 From 2e8ba574e258384d3ee3b630b4af4e31a25878db Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 21 Mar 2023 18:04:10 +0000 Subject: [PATCH 17/20] Appropriate label --- openpype/hosts/maya/plugins/load/load_gpucache.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/load/load_gpucache.py b/openpype/hosts/maya/plugins/load/load_gpucache.py index c447311454..f342679791 100644 --- a/openpype/hosts/maya/plugins/load/load_gpucache.py +++ b/openpype/hosts/maya/plugins/load/load_gpucache.py @@ -13,7 +13,7 @@ class GpuCacheLoader(load.LoaderPlugin): families = ["model", "animation", "proxyAbc", "pointcache"] representations = ["abc", "gpu_cache"] - label = "Import Gpu Cache" + label = "Load Gpu Cache" order = -5 icon = "code-fork" color = "orange" From e516a75ce3649be96ab9a53abca42e4d7c417e35 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 21 Mar 2023 18:04:16 +0000 Subject: [PATCH 18/20] Code cosmetics --- .../hosts/maya/plugins/load/load_gpucache.py | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/openpype/hosts/maya/plugins/load/load_gpucache.py b/openpype/hosts/maya/plugins/load/load_gpucache.py index f342679791..794b21eb5d 100644 --- a/openpype/hosts/maya/plugins/load/load_gpucache.py +++ b/openpype/hosts/maya/plugins/load/load_gpucache.py @@ -1,5 +1,9 @@ import os +import maya.cmds as cmds + +from openpype.hosts.maya.api.pipeline import containerise +from openpype.hosts.maya.api.lib import unique_namespace from openpype.pipeline import ( load, get_representation_path @@ -20,10 +24,6 @@ class GpuCacheLoader(load.LoaderPlugin): def load(self, context, name, namespace, data): - import maya.cmds as cmds - from openpype.hosts.maya.api.pipeline import containerise - from openpype.hosts.maya.api.lib import unique_namespace - asset = context['asset']['name'] namespace = namespace or unique_namespace( asset + "_", @@ -42,10 +42,9 @@ class GpuCacheLoader(load.LoaderPlugin): c = colors.get('model') if c is not None: cmds.setAttr(root + ".useOutlinerColor", 1) - cmds.setAttr(root + ".outlinerColor", - (float(c[0])/255), - (float(c[1])/255), - (float(c[2])/255) + cmds.setAttr( + root + ".outlinerColor", + (float(c[0]) / 255), (float(c[1]) / 255), (float(c[2]) / 255) ) # Create transform with shape @@ -74,9 +73,6 @@ class GpuCacheLoader(load.LoaderPlugin): loader=self.__class__.__name__) def update(self, container, representation): - - import maya.cmds as cmds - path = get_representation_path(representation) # Update the cache @@ -96,7 +92,6 @@ class GpuCacheLoader(load.LoaderPlugin): self.update(container, representation) def remove(self, container): - import maya.cmds as cmds members = cmds.sets(container['objectName'], query=True) cmds.lockNode(members, lock=False) cmds.delete([container['objectName']] + members) From 525db92e4aaf083d6c92b08edde1ed84c0ed1710 Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Thu, 23 Mar 2023 15:43:19 +0000 Subject: [PATCH 19/20] Update openpype/settings/defaults/project_settings/maya.json --- openpype/settings/defaults/project_settings/maya.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/settings/defaults/project_settings/maya.json b/openpype/settings/defaults/project_settings/maya.json index 7757f201ad..7b3d54f869 100644 --- a/openpype/settings/defaults/project_settings/maya.json +++ b/openpype/settings/defaults/project_settings/maya.json @@ -926,7 +926,7 @@ "ogsfx_path": "/maya2glTF/PBR/shaders/glTF_PBR.ogsfx" }, "ExtractGPUCache": { - "enabled": true, + "enabled": false, "families": [ "model", "animation", From e218fb4b6d0d24581c35d5a935058bfbecc918b9 Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Mon, 3 Apr 2023 12:58:28 +0100 Subject: [PATCH 20/20] Update openpype/hosts/maya/plugins/publish/extract_gpu_cache.py Co-authored-by: Roy Nieterau --- openpype/hosts/maya/plugins/publish/extract_gpu_cache.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py index deee456982..422f5ad019 100644 --- a/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py +++ b/openpype/hosts/maya/plugins/publish/extract_gpu_cache.py @@ -20,6 +20,8 @@ class ExtractGPUCache(publish.Extractor): useBaseTessellation = True def process(self, instance): + cmds.loadPlugin("gpuCache", quiet=True) + staging_dir = self.staging_dir(instance) filename = "{}_gpu_cache".format(instance.name)