diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 5a0ed1ae1d..e6badf936a 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -1,6 +1,6 @@
name: Bug Report
description: File a bug report
-title: ''
+title: 'Your issue title here'
labels:
- 'type: bug'
body:
diff --git a/.github/ISSUE_TEMPLATE/enhancement_request.yml b/.github/ISSUE_TEMPLATE/enhancement_request.yml
index da4d0d9319..31b2eb2edd 100644
--- a/.github/ISSUE_TEMPLATE/enhancement_request.yml
+++ b/.github/ISSUE_TEMPLATE/enhancement_request.yml
@@ -1,6 +1,6 @@
name: Enhancement Request
description: Create a report to help us enhance a particular feature
-title: ""
+title: "Your issue title here"
labels:
- "type: enhancement"
body:
@@ -49,4 +49,4 @@ body:
label: "Additional context:"
description: Add any other context or screenshots about the enhancement request here.
validations:
- required: false
\ No newline at end of file
+ required: false
diff --git a/client/ayon_core/hosts/max/plugins/create/create_workfile.py b/client/ayon_core/hosts/max/plugins/create/create_workfile.py
index 1552149413..058fe10eb2 100644
--- a/client/ayon_core/hosts/max/plugins/create/create_workfile.py
+++ b/client/ayon_core/hosts/max/plugins/create/create_workfile.py
@@ -98,21 +98,6 @@ class CreateWorkfile(plugin.MaxCreatorBase, AutoCreator):
created_inst.data_to_store()
)
- def remove_instances(self, instances):
- """Remove specified instance from the scene.
-
- This is only removing `id` parameter so instance is no longer
- instance, because it might contain valuable data for artist.
-
- """
- for instance in instances:
- instance_node = rt.GetNodeByName(
- instance.data.get("instance_node"))
- if instance_node:
- rt.Delete(instance_node)
-
- self._remove_instance_from_context(instance)
-
def create_node(self, product_name):
if rt.getNodeByName(product_name):
node = rt.getNodeByName(product_name)
diff --git a/client/ayon_core/hosts/max/plugins/publish/help/validate_model_name.xml b/client/ayon_core/hosts/max/plugins/publish/help/validate_model_name.xml
new file mode 100644
index 0000000000..e41146910a
--- /dev/null
+++ b/client/ayon_core/hosts/max/plugins/publish/help/validate_model_name.xml
@@ -0,0 +1,26 @@
+
+
+
+Invalid Model Name
+## Nodes found with Invalid Model Name
+
+Nodes were detected in your scene which have invalid model name which does not
+match the regex you preset in AYON setting.
+### How to repair?
+Make sure the model name aligns with validation regex in your AYON setting.
+
+
+
+### Invalid nodes
+
+{nodes}
+
+
+### How could this happen?
+
+This often happens if you have mesh with the model naming does not match
+with regex in the setting.
+
+
+
+
\ No newline at end of file
diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_model_name.py b/client/ayon_core/hosts/max/plugins/publish/validate_model_name.py
new file mode 100644
index 0000000000..a0cad4e454
--- /dev/null
+++ b/client/ayon_core/hosts/max/plugins/publish/validate_model_name.py
@@ -0,0 +1,120 @@
+# -*- coding: utf-8 -*-
+"""Validate model nodes names."""
+import re
+
+import pyblish.api
+
+from ayon_core.hosts.max.api.action import SelectInvalidAction
+
+from ayon_core.pipeline.publish import (
+ OptionalPyblishPluginMixin,
+ PublishXmlValidationError,
+ ValidateContentsOrder
+)
+
+class ValidateModelName(pyblish.api.InstancePlugin,
+ OptionalPyblishPluginMixin):
+ """Validate Model Name.
+
+ Validation regex is `(.*)_(?P.*)_(GEO)` by default.
+ The setting supports the following regex group name:
+ - project
+ - asset
+ - subset
+
+ Examples:
+ `{SOME_RANDOM_NAME}_{YOUR_SUBSET_NAME}_GEO` should be your
+ default model name.
+ The regex of `(?P.*)` can be replaced by `(?P.*)`
+ and `(?P.*)`.
+ `(.*)_(?P.*)_(GEO)` check if your model name is
+ `{SOME_RANDOM_NAME}_{CURRENT_ASSET_NAME}_GEO`
+ `(.*)_(?P.*)_(GEO)` check if your model name is
+ `{SOME_RANDOM_NAME}_{CURRENT_PROJECT_NAME}_GEO`
+
+ """
+ optional = True
+ order = ValidateContentsOrder
+ hosts = ["max"]
+ families = ["model"]
+ label = "Validate Model Name"
+ actions = [SelectInvalidAction]
+ # defined by settings
+ regex = r"(.*)_(?P.*)_(GEO)"
+ # cache
+ regex_compiled = None
+
+ def process(self, instance):
+ if not self.is_active(instance.data):
+ return
+
+ invalid = self.get_invalid(instance)
+ if invalid:
+ names = "\n".join(
+ "- {}".format(node.name) for node in invalid
+ )
+ raise PublishXmlValidationError(
+ plugin=self,
+ message="Nodes found with invalid model names: {}".format(invalid),
+ formatting_data={"nodes": names}
+ )
+
+ @classmethod
+ def get_invalid(cls, instance):
+ if not cls.regex:
+ cls.log.warning("No regex pattern set. Nothing to validate.")
+ return
+
+ members = instance.data.get("members")
+ if not members:
+ cls.log.error("No members found in the instance.")
+ return
+
+ cls.regex_compiled = re.compile(cls.regex)
+
+ invalid = []
+ for obj in members:
+ if cls.invalid_name(instance, obj):
+ invalid.append(obj)
+ return invalid
+
+ @classmethod
+ def invalid_name(cls, instance, obj):
+ """Function to check the object has invalid name
+ regarding to the validation regex in the AYON setttings
+
+ Args:
+ instance (pyblish.api.instance): Instance
+ obj (str): object name
+
+ Returns:
+ str: invalid object
+ """
+ regex = cls.regex_compiled
+ name = obj.name
+ match = regex.match(name)
+
+ if match is None:
+ cls.log.error("Invalid model name on: %s", name)
+ cls.log.error("Name doesn't match regex {}".format(regex.pattern))
+ return obj
+
+ # Validate regex groups
+ invalid = False
+ compare = {
+ "project": instance.context.data["projectName"],
+ "asset": instance.context.data["folderPath"],
+ "subset": instance.context.data["subset"],
+ }
+ for key, required_value in compare.items():
+ if key in regex.groupindex:
+ if match.group(key) != required_value:
+ cls.log.error(
+ "Invalid %s name for the model %s, "
+ "required name is %s",
+ key, name, required_value
+ )
+ invalid = True
+
+ if invalid:
+ return obj
diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_no_animation.py b/client/ayon_core/hosts/max/plugins/publish/validate_no_animation.py
new file mode 100644
index 0000000000..4b2a18d606
--- /dev/null
+++ b/client/ayon_core/hosts/max/plugins/publish/validate_no_animation.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+import pyblish.api
+from pymxs import runtime as rt
+from ayon_core.pipeline import (
+ PublishValidationError,
+ OptionalPyblishPluginMixin
+)
+from ayon_core.hosts.max.api.action import SelectInvalidAction
+
+
+def get_invalid_keys(obj):
+ """function to check on whether there is keyframe in
+
+ Args:
+ obj (str): object needed to check if there is a keyframe
+
+ Returns:
+ bool: whether invalid object(s) exist
+ """
+ for transform in ["Position", "Rotation", "Scale"]:
+ num_of_key = rt.NumKeys(rt.getPropertyController(
+ obj.controller, transform))
+ if num_of_key > 0:
+ return True
+ return False
+
+
+class ValidateNoAnimation(pyblish.api.InstancePlugin,
+ OptionalPyblishPluginMixin):
+ """Validates No Animation
+
+ Ensure no keyframes on nodes in the Instance
+ """
+
+ order = pyblish.api.ValidatorOrder
+ families = ["model"]
+ hosts = ["max"]
+ optional = True
+ label = "Validate No Animation"
+ actions = [SelectInvalidAction]
+
+ def process(self, instance):
+ if not self.is_active(instance.data):
+ return
+ invalid = self.get_invalid(instance)
+ if invalid:
+ raise PublishValidationError(
+ "Keyframes found on:\n\n{0}".format(invalid)
+ ,
+ title="Keyframes on model"
+ )
+
+ @staticmethod
+ def get_invalid(instance):
+ """Get invalid object(s) which have keyframe(s)
+
+
+ Args:
+ instance (pyblish.api.instance): Instance
+
+ Returns:
+ list: list of invalid objects
+ """
+ invalid = [invalid for invalid in instance.data["members"]
+ if invalid.isAnimated or get_invalid_keys(invalid)]
+
+ return invalid
diff --git a/client/ayon_core/hosts/resolve/api/plugin.py b/client/ayon_core/hosts/resolve/api/plugin.py
index 157b8de363..dfce3ea37a 100644
--- a/client/ayon_core/hosts/resolve/api/plugin.py
+++ b/client/ayon_core/hosts/resolve/api/plugin.py
@@ -410,6 +410,11 @@ class ClipLoader:
source_out = int(_clip_property("End"))
source_duration = int(_clip_property("Frames"))
+ # Trim clip start if slate is present
+ if "slate" in self.data["versionData"]["families"]:
+ source_in += 1
+ source_duration = source_out - source_in + 1
+
if not self.with_handles:
# Load file without the handles of the source media
# We remove the handles from the source in and source out
@@ -435,7 +440,7 @@ class ClipLoader:
handle_start = version_data.get("handleStart", 0)
handle_end = version_data.get("handleEnd", 0)
frame_start_handle = frame_start - handle_start
- frame_end_handle = frame_start + handle_end
+ frame_end_handle = frame_end + handle_end
database_frame_duration = int(
frame_end_handle - frame_start_handle + 1
)
diff --git a/client/ayon_core/plugins/publish/extract_thumbnail.py b/client/ayon_core/plugins/publish/extract_thumbnail.py
index 84c1000ba3..d1b6e4e0cc 100644
--- a/client/ayon_core/plugins/publish/extract_thumbnail.py
+++ b/client/ayon_core/plugins/publish/extract_thumbnail.py
@@ -478,7 +478,15 @@ class ExtractThumbnail(pyblish.api.InstancePlugin):
# Set video input attributes
max_int = str(2147483647)
video_data = get_ffprobe_data(video_file_path, logger=self.log)
- duration = float(video_data["format"]["duration"])
+ # Use duration of the individual streams since it is returned with
+ # higher decimal precision than 'format.duration'. We need this
+ # more precise value for calculating the correct amount of frames
+ # for higher FPS ranges or decimal ranges, e.g. 29.97 FPS
+ duration = max(
+ float(stream.get("duration", 0))
+ for stream in video_data["streams"]
+ if stream.get("codec_type") == "video"
+ )
cmd_args = [
"-y",
diff --git a/server_addon/applications/server/tools.json b/server_addon/applications/server/tools.json
index 54bee11cf7..3d8f400200 100644
--- a/server_addon/applications/server/tools.json
+++ b/server_addon/applications/server/tools.json
@@ -1,55 +1,149 @@
{
"tool_groups": [
{
- "environment": "{\n \"MTOA\": \"{STUDIO_SOFTWARE}/arnold/mtoa_{MAYA_VERSION}_{MTOA_VERSION}\",\n \"MAYA_RENDER_DESC_PATH\": \"{MTOA}\",\n \"MAYA_MODULE_PATH\": \"{MTOA}\",\n \"ARNOLD_PLUGIN_PATH\": \"{MTOA}/shaders\",\n \"MTOA_EXTENSIONS_PATH\": {\n \"darwin\": \"{MTOA}/extensions\",\n \"linux\": \"{MTOA}/extensions\",\n \"windows\": \"{MTOA}/extensions\"\n },\n \"MTOA_EXTENSIONS\": {\n \"darwin\": \"{MTOA}/extensions\",\n \"linux\": \"{MTOA}/extensions\",\n \"windows\": \"{MTOA}/extensions\"\n },\n \"DYLD_LIBRARY_PATH\": {\n \"darwin\": \"{MTOA}/bin\"\n },\n \"PATH\": {\n \"windows\": \"{PATH};{MTOA}/bin\"\n }\n}",
- "name": "mtoa",
- "label": "Autodesk Arnold",
+ "name": "htoa",
+ "label": "Arnold for Houdini (example)",
"variants": [
{
+ "name": "5-4-2-7",
+ "label": "",
+ "host_names": [
+ "houdini"
+ ],
+ "environment": "{\n \"HTOA_VERSION\": \"5.4.2.7\"\n}",
+ "app_variants": []
+ }
+ ],
+ "environment": "{\n \"_comment_\": \"{STUDIO_SW} points to software repository. Can be defined in Core addon globally\",\n\n \"HOUDINI_PATH\": [\n \"{STUDIO_SW}/APP/HTOA/{HTOA_VERSION}/HOUDINI{HOUDINI_VERSION}/WINDOWS/htoa-6.1.3.3_rdb15014_houdini-{HTOA_VERSION}\",\n \"{HOUDINI_PATH}\"\n ],\n \"PATH\": {\n \"windows\": [\n \"{STUDIO_SW}/APP/HTOA/{HTOA_VERSION}/HOUDINI{HOUDINI_VERSION}/WINDOWS/htoa-6.1.3.3_rdb15014_houdini-{HTOA_VERSION}/scripts/bin\",\n \"{PATH}\"\n ]\n }\n}"
+ },
+ {
+ "name": "mtoa",
+ "label": "Arnold for Maya (example)",
+ "variants": [
+ {
+ "name": "5-3-1-0",
+ "label": "",
"host_names": [],
- "app_variants": [],
- "environment": "{\n \"MTOA_VERSION\": \"3.2\"\n}",
- "name": "3-2",
- "label": "3.2"
+ "environment": "{\n \"MTOA_VERSION\": \"5.3.1.0\"\n}",
+ "app_variants": []
},
{
+ "name": "5-3-4-1",
+ "label": "",
"host_names": [],
- "app_variants": [],
- "environment": "{\n \"MTOA_VERSION\": \"3.1\"\n}",
- "name": "3-1",
- "label": "3.1"
+ "environment": "{\n \"MTOA_VERSION\": \"5.3.4.1\"\n}",
+ "app_variants": []
}
- ]
+ ],
+ "environment": "{\n \"_comment_\": \"{STUDIO_SW} points to software repository. Can be defined in Core addon globally\",\n\n \"MTOA\": {\n \"darwin\": \"{STUDIO_SW}/APP/MTOA/{MTOA_VERSION}/MAYA{MAYA_VERSION}/MAC\",\n \"linux\": \"{STUDIO_SW}/APP/MTOA/{MTOA_VERSION}/MAYA{MAYA_VERSION}/LINUX\",\n \"windows\": \"{STUDIO_SW}/APP/MTOA/{MTOA_VERSION}/MAYA{MAYA_VERSION}/WINDOWS\"\n },\n \"MAYA_MODULE_PATH\": [\n \"{STUDIO_SW}/APP/MTOA\",\n \"{MAYA_MODULE_PATH}\"\n ],\n \"DYLD_LIBRARY_PATH\": {\n \"darwin\": \"{MTOA}/bin\"\n },\n \"PATH\": {\n \"windows\": [\n \"{MTOA}/bin\",\n \"{PATH}\"\n ]\n },\n \"XBMLANGPATH\": [\n \"{MTOA}/icons\",\n \"{XBMLANGPATH}\"\n ],\n \"MAYA_RENDER_DESC_PATH\": [\n \"{MTOA}\",\n \"{MAYA_RENDER_DESC_PATH}\"\n ],\n \"MTOA_STARTUP_LOG_VERBOSITY\": \"3\"\n}"
},
{
- "environment": "{}",
- "name": "vray",
- "label": "Chaos Group Vray",
- "variants": []
- },
- {
- "environment": "{}",
- "name": "yeti",
- "label": "Peregrine Labs Yeti",
- "variants": []
- },
- {
- "environment": "{}",
- "name": "renderman",
- "label": "Pixar Renderman",
+ "name": "redshiftMaya",
+ "label": "Redshift for Maya (example)",
"variants": [
{
+ "name": "3-5-23",
+ "label": "",
+ "host_names": [],
+ "environment": "{\n \"REDSHIFT_VERSION\": \"3.5.23\"\n}",
+ "app_variants": []
+ }
+ ],
+ "environment": "{\n \"_comment_\": \"{STUDIO_SW} points to software repository. Can be defined in Core addon globally\",\n\n \"REDSHIFT_COREDATAPATH\": {\n \"darwin\": \"{STUDIO_SW}/APP/REDSHIFT/{REDSHIFT_VERSION}/MAC\",\n \"linux\": \"{STUDIO_SW}/APP/REDSHIFT/{REDSHIFT_VERSION}/LINUX\",\n \"windows\": \"{STUDIO_SW}/APP/REDSHIFT/{REDSHIFT_VERSION}/WINDOWS\"\n },\n \"REDSHIFT_ABORTONLICENSEFAIL\": \"0\",\n \"MAYA_MODULE_PATH\": [\n \"{STUDIO_SW}/APP/REDSHIFT\",\n \"{MAYA_MODULE_PATH}\"\n ],\n \"MAYA_PLUG_IN_PATH\": {\n \"windows\": [\n \"{REDSHIFT_COREDATAPATH}/Plugins/Maya/{MAYA_VERSION}/nt-x86-64\",\n \"{MAYA_PLUG_IN_PATH}\"\n ],\n \"linux\": [\n \"{REDSHIFT_COREDATAPATH}/redshift4maya/{MAYA_VERSION}\",\n \"{MAYA_PLUG_IN_PATH}\"\n ],\n \"darwin\": [\n \"{REDSHIFT_COREDATAPATH}/redshift4maya/{MAYA_VERSION}\",\n \"{MAYA_PLUG_IN_PATH}\"\n ]\n },\n \"MAYA_SCRIPT_PATH\": {\n \"windows\": [\n \"{REDSHIFT_COREDATAPATH}/Plugins/Maya/Common/scripts\",\n \"{MAYA_SCRIPT_PATH}\"\n ],\n \"linux\": [\n \"{REDSHIFT_COREDATAPATH}/redshift4maya/common/scripts\",\n \"{MAYA_SCRIPT_PATH}\"\n ],\n \"darwin\": [\n \"{REDSHIFT_COREDATAPATH}/redshift4maya/common/scripts\",\n \"{MAYA_SCRIPT_PATH}\"\n ]\n },\n \"REDSHIFT_PROCEDURALSPATH\": {\n \"windows\": [\n \"{REDSHIFT_COREDATAPATH}/Procedurals\",\n \"{REDSHIFT_PROCEDURALSPATH}\"\n ],\n \"linux\": [\n \"{REDSHIFT_COREDATAPATH}/procedurals\",\n \"{REDSHIFT_PROCEDURALSPATH}\"\n ],\n \"darwin\": [\n \"{REDSHIFT_COREDATAPATH}/procedurals\",\n \"{REDSHIFT_PROCEDURALSPATH}\"\n ]\n },\n \"REDSHIFT_MAYAEXTENSIONSPATH\": {\n \"windows\": [\n \"{REDSHIFT_COREDATAPATH}/Plugins/Maya/{MAYA_VERSION}/nt-x86-64/extensions\",\n \"{REDSHIFT_MAYAEXTENSIONSPATH}\"\n ],\n \"linux\": [\n \"{REDSHIFT_COREDATAPATH}/redshift4maya/{MAYA_VERSION}/extensions\",\n \"{REDSHIFT_MAYAEXTENSIONSPATH}\"\n ],\n \"darwin\": [\n \"{REDSHIFT_COREDATAPATH}/redshift4maya/{MAYA_VERSION}/extensions\",\n \"{REDSHIFT_MAYAEXTENSIONSPATH}\"\n ]\n },\n \"XBMLANGPATH\": {\n \"windows\": [\n \"{REDSHIFT_COREDATAPATH}/Plugins/Maya/Common/icons\",\n \"{XBMLANGPATH}\"\n ],\n \"linux\": [\n \"{REDSHIFT_COREDATAPATH}/redshift4maya/common/icons\",\n \"{XBMLANGPATH}\"\n ],\n \"darwin\": [\n \"{REDSHIFT_COREDATAPATH}/redshift4maya/common/icons\",\n \"{XBMLANGPATH}\"\n ]\n },\n \"MAYA_RENDER_DESC_PATH\": {\n \"windows\": [\n \"{REDSHIFT_COREDATAPATH}/Plugins/Maya/Common/rendererDesc\",\n \"{MAYA_RENDER_DESC_PATH}\"\n ],\n \"linux\": [\n \"{REDSHIFT_COREDATAPATH}/redshift4maya/common/rendererDesc\",\n \"{MAYA_RENDER_DESC_PATH}\"\n ],\n \"darwin\": [\n \"{REDSHIFT_COREDATAPATH}/redshift4maya/common/rendererDesc\",\n \"{MAYA_RENDER_DESC_PATH}\"\n ]\n },\n \"MAYA_CUSTOM_TEMPLATE_PATH\": {\n \"windows\": [\n \"{REDSHIFT_COREDATAPATH}/Plugins/Maya/Common/scripts/NETemplates\",\n \"{MAYA_CUSTOM_TEMPLATE_PATH}\"\n ],\n \"linux\": [\n \"{REDSHIFT_COREDATAPATH}/redshift4maya/common/scripts/NETemplates\",\n \"{MAYA_CUSTOM_TEMPLATE_PATH}\"\n ],\n \"darwin\": [\n \"{REDSHIFT_COREDATAPATH}/redshift4maya/common/scripts/NETemplates\",\n \"{MAYA_CUSTOM_TEMPLATE_PATH}\"\n ]\n },\n \"PATH\": {\n \"windows\": [\n \"{REDSHIFT_COREDATAPATH}/bin\",\n \"{PATH}\"\n ]\n }\n}"
+ },
+ {
+ "name": "redshift3dsmax",
+ "label": "Redshift for 3dsmax (example)",
+ "variants": [
+ {
+ "name": "3-5-19",
+ "label": "",
+ "host_names": [
+ "max"
+ ],
+ "environment": "{\n \"REDSHIFT_VERSION\": \"3.5.19\"\n}",
+ "app_variants": []
+ }
+ ],
+ "environment": "{\n \"_comment_\": \"{STUDIO_SW} points to software repository. Can be defined in Core addon globally\",\n\n \"REDSHIFT_COREDATAPATH\": {\n \"darwin\": \"{STUDIO_SW}/APP/REDSHIFT/{REDSHIFT_VERSION}/MAC\",\n \"linux\": \"{STUDIO_SW}/APP/REDSHIFT/{REDSHIFT_VERSION}/LINUX\",\n \"windows\": \"{STUDIO_SW}/APP/REDSHIFT/{REDSHIFT_VERSION}/WINDOWS\"\n },\n \"REDSHIFT_ABORTONLICENSEFAIL\": \"0\",\n \"REDSHIFT_PROCEDURALSPATH\": {\n \"windows\": [\n \"{REDSHIFT_COREDATAPATH}/Procedurals\",\n \"{REDSHIFT_PROCEDURALSPATH}\"\n ],\n \"linux\": [\n \"{REDSHIFT_COREDATAPATH}/procedurals\",\n \"{REDSHIFT_PROCEDURALSPATH}\"\n ],\n \"darwin\": [\n \"{REDSHIFT_COREDATAPATH}/procedurals\",\n \"{REDSHIFT_PROCEDURALSPATH}\"\n ]\n },\n \"PATH\": {\n \"windows\": [\n \"{REDSHIFT_COREDATAPATH}/bin\",\n \"{PATH}\"\n ]\n }\n}"
+ },
+ {
+ "name": "rendermanMaya",
+ "label": "Renderman for Maya (example)",
+ "variants": [
+ {
+ "name": "24-3-maya",
+ "label": "24.3 RFM",
"host_names": [
"maya"
],
+ "environment": "{\n \"RFMTREE\": {\n \"windows\": \"C:\\\\Program Files\\\\Pixar\\\\RenderManForMaya-24.3\",\n \"darwin\": \"/Applications/Pixar/RenderManForMaya-24.3\",\n \"linux\": \"/opt/pixar/RenderManForMaya-24.3\"\n },\n \"RMANTREE\": {\n \"windows\": \"C:\\\\Program Files\\\\Pixar\\\\RenderManProServer-24.3\",\n \"darwin\": \"/Applications/Pixar/RenderManProServer-24.3\",\n \"linux\": \"/opt/pixar/RenderManProServer-24.3\"\n }\n}",
"app_variants": [
"maya/2022"
- ],
- "environment": "{\n \"RFMTREE\": {\n \"windows\": \"C:\\\\Program Files\\\\Pixar\\\\RenderManForMaya-24.3\",\n \"darwin\": \"/Applications/Pixar/RenderManForMaya-24.3\",\n \"linux\": \"/opt/pixar/RenderManForMaya-24.3\"\n },\n \"RMANTREE\": {\n \"windows\": \"C:\\\\Program Files\\\\Pixar\\\\RenderManProServer-24.3\",\n \"darwin\": \"/Applications/Pixar/RenderManProServer-24.3\",\n \"linux\": \"/opt/pixar/RenderManProServer-24.3\"\n }\n}",
- "name": "24-3-maya",
- "label": "24.3 RFM"
+ ]
}
- ]
+ ],
+ "environment": "{\n \"_comment_\": \"{STUDIO_SW} points to software repository. Can be defined in Core addon globally\",\n\n \"RFMTREE\": {\n \"darwin\": \"{STUDIO_SW}/APP/RENDERMAN/{RM_VERSION}/MAC/MAYA\",\n \"linux\": \"{STUDIO_SW}/APP/RENDERMAN/{RM_VERSION}/LINUX/MAYA\",\n \"windows\": \"{STUDIO_SW}/APP/RENDERMAN/{RM_VERSION}/WINDOWS/MAYA\"\n },\n \"RMANTREE\": {\n \"darwin\": \"{STUDIO_SW}/APP/RENDERMAN/{RM_VERSION}/MAC/RenderManProServer-{RM_VERSION}\",\n \"linux\": \"{STUDIO_SW}/APP/RENDERMAN/{RM_VERSION}/LINUX/RenderManProServer-{RM_VERSION}\",\n \"windows\": \"{STUDIO_SW}/APP/RENDERMAN/{RM_VERSION}/WINDOWS/RenderManProServer-{RM_VERSION}\"\n },\n \"MAYA_MODULE_PATH\": [\n \"{STUDIO_SW}/APP/RENDERMAN\",\n \"{MAYA_MODULE_PATH}\"\n ],\n \"PIXAR_LICENSE_FILE\": \"{STUDIO_SW}/APP/RENDERMAN/pixar.license\",\n \"RFM_DO_NOT_CREATE_MODULE_FILE\": \"1\"\n}"
+ },
+ {
+ "name": "mGear",
+ "label": "mGear for Maya (example)",
+ "variants": [
+ {
+ "name": "4-0-7",
+ "label": "",
+ "host_names": [],
+ "environment": "{\n \"MGEAR_VERSION\": \"4.0.7\"\n}",
+ "app_variants": []
+ }
+ ],
+ "environment": "{\n \"_comment_\": \"{STUDIO_SW} points to software repository. Can be defined in Core addon globally\",\n\n \"MGEAR_ROOT\": \"{STUDIO_SW}/APP/MGEAR/{MGEAR_VERSION}/MAYA{MAYA_VERSION}/windows/x64\",\n \"MAYA_MODULE_PATH\": [\n \"{STUDIO_SW}/APP/MGEAR/{MGEAR_VERSION}/release\",\n \"{MAYA_MODULE_PATH}\"\n ]\n}"
+ },
+ {
+ "name": "yetiMaya",
+ "label": "Yeti for Maya (example)",
+ "variants": [
+ {
+ "name": "4.2.11",
+ "label": "",
+ "host_names": [],
+ "environment": "{\n \"YETI_VERSION\": \"4.2.11\"\n}",
+ "app_variants": []
+ }
+ ],
+ "environment": "{\n \"_comment_\": \"{STUDIO_SW} points to software repository. Can be defined in Core addon globally\",\n\n \"YETI_HOME\": {\n \"darwin\": \"{STUDIO_SW}/APP/YETI/{YETI_VERSION}/MAYA{MAYA_VERSION}/MAC\",\n \"linux\": \"{STUDIO_SW}/APP/YETI/{YETI_VERSION}/MAYA{MAYA_VERSION}/LINUX\",\n \"windows\": \"{STUDIO_SW}/APP/YETI/{YETI_VERSION}/MAYA{MAYA_VERSION}/WINDOWS\"\n },\n \"YETI_TMP\": {\n \"windows\": \"C:/temp\",\n \"darwin\": \"/tmp\",\n \"linux\": \"/tmp\"\n },\n \"peregrinel_LICENSE\": \"4202@35.158.197.250\",\n \"MAYA_MODULE_PATH\": [\n \"{STUDIO_SW}/APP/YETI\",\n \"{MAYA_MODULE_PATH}\"\n ]\n}"
+ },
+ {
+ "name": "vrayMaya",
+ "label": "Vray for Maya (example)",
+ "variants": [
+ {
+ "name": "6.10.01",
+ "label": "",
+ "host_names": [
+ ""
+ ],
+ "environment": "{\n \"VRAY_VERSION\": \"6.10.01\"\n}",
+ "app_variants": []
+ }
+ ],
+ "environment": "{\n \"_comment_\": \"{STUDIO_SW} points to software repository. Can be defined in Core addon globally\",\n\n \"MAYA_MODULE_PATH\": {\n \"windows\": [\n \"{STUDIO_SW}/APP/VRAY/{VRAY_VERSION}/MAYA{MAYA_VERSION}/WINDOWS/maya_root/modules\",\n \"{MAYA_MODULE_PATH}\"\n ],\n \"linux\": [\n \"{STUDIO_SW}/APP/VRAY/{VRAY_VERSION}/MAYA{MAYA_VERSION}/LINUX/maya_root/modules\",\n \"{MAYA_MODULE_PATH}\"\n ],\n \"darwin\": [\n \"{STUDIO_SW}/APP/VRAY/{VRAY_VERSION}/MAYA{MAYA_VERSION}/MAC/maya_root/modules\",\n \"{MAYA_MODULE_PATH}\"\n ]\n },\n \"VRAY_AUTH_CLIENT_FILE_PATH\": \"{STUDIO_SW}/APP/VRAY\"\n}"
+ },
+ {
+ "name": "vraynuke",
+ "label": "Vray for Nuke (example)",
+ "variants": [
+ {
+ "name": "5-20-00",
+ "label": "",
+ "host_names": [
+ "nuke"
+ ],
+ "environment": "{\n \"VRAYNUKE_VERSION\": \"5.20.00\"\n}",
+ "app_variants": []
+ }
+ ],
+ "environment": "{\n \"_comment_\": \"{STUDIO_SW} points to software repository. Can be defined in Core addon globally\",\n\n \"VRAY_FOR_NUKE_13_0_PLUGINS\": {\n \"windows\": \"{STUDIO_SW}/APP/VRAYNUKE/{VRAYNUKE_VERSION}/NUKE{NUKE_VRAY_VERSION}/WINDOWS/nuke_vray/plugins/vray\"\n },\n \"NUKE_PATH\": {\n \"windows\": [\n \"{STUDIO_SW}/APP/VRAYNUKE/{VRAYNUKE_VERSION}/NUKE{NUKE_VRAY_VERSION}/WINDOWS/nuke_root\",\n \"{NUKE_PATH}\"\n ]\n },\n \"PATH\": {\n \"windows\": [\n \"{STUDIO_SW}/APP/VRAYNUKE/{VRAYNUKE_VERSION}/NUKE{NUKE_VRAY_VERSION}/WINDOWS/nuke_vray\",\n \"{PATH}\"\n ]\n },\n \"VRAY_AUTH_CLIENT_FILE_PATH\": \"{STUDIO_SW}/APP/VRAY\"\n}"
}
]
-}
+}
\ No newline at end of file
diff --git a/server_addon/applications/server/version.py b/server_addon/applications/server/version.py
index 0a8da88258..f1380eede2 100644
--- a/server_addon/applications/server/version.py
+++ b/server_addon/applications/server/version.py
@@ -1 +1 @@
-__version__ = "0.1.6"
+__version__ = "0.1.7"
diff --git a/server_addon/max/server/settings/publishers.py b/server_addon/max/server/settings/publishers.py
index 571b04d056..819bca1509 100644
--- a/server_addon/max/server/settings/publishers.py
+++ b/server_addon/max/server/settings/publishers.py
@@ -49,6 +49,20 @@ class FamilyMappingItemModel(BaseSettingsModel):
)
+class ValidateModelNameModel(BaseSettingsModel):
+ enabled: bool = SettingsField(title="Enabled")
+ optional: bool = SettingsField(title="Optional")
+ active: bool = SettingsField(title="Active")
+ regex: str = SettingsField(
+ "(.*)_(?P.*)_(GEO)",
+ title="Validation regex",
+ description=(
+ "Regex for validating model name. You can use named "
+ " capturing groups:(?P.*) for Asset name"
+ )
+ )
+
+
class ValidateLoadedPluginModel(BaseSettingsModel):
enabled: bool = SettingsField(title="Enabled")
optional: bool = SettingsField(title="Optional")
@@ -86,6 +100,10 @@ class PublishersModel(BaseSettingsModel):
"the system automatically skips checking it"
)
)
+ ValidateNoAnimation: BasicValidateModel = SettingsField(
+ default_factory=BasicValidateModel,
+ title="Validate No Animation"
+ )
ValidateLoadedPlugin: ValidateLoadedPluginModel = SettingsField(
default_factory=ValidateLoadedPluginModel,
title="Validate Loaded Plugin"
@@ -94,6 +112,10 @@ class PublishersModel(BaseSettingsModel):
default_factory=BasicValidateModel,
title="Validate Mesh Has UVs"
)
+ ValidateModelName: ValidateModelNameModel = SettingsField(
+ default_factory=ValidateModelNameModel,
+ title="Validate Model Name"
+ )
ValidateRenderPasses: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Render Passes"
@@ -146,6 +168,12 @@ DEFAULT_PUBLISH_SETTINGS = {
"nearclip": 1.0,
"farclip": 1000.0
},
+ "ValidateModelName": {
+ "enabled": True,
+ "optional": True,
+ "active": False,
+ "regex": "(.*)_(?P.*)_(GEO)"
+ },
"ValidateLoadedPlugin": {
"enabled": False,
"optional": True,
@@ -156,6 +184,11 @@ DEFAULT_PUBLISH_SETTINGS = {
"optional": True,
"active": False
},
+ "ValidateNoAnimation": {
+ "enabled": True,
+ "optional": True,
+ "active": False,
+ },
"ValidateRenderPasses": {
"enabled": True,
"optional": True,
diff --git a/server_addon/max/server/version.py b/server_addon/max/server/version.py
index 0a8da88258..f1380eede2 100644
--- a/server_addon/max/server/version.py
+++ b/server_addon/max/server/version.py
@@ -1 +1 @@
-__version__ = "0.1.6"
+__version__ = "0.1.7"
diff --git a/server_addon/nuke/server/settings/publish_plugins.py b/server_addon/nuke/server/settings/publish_plugins.py
index 02ee9b3bab..7d9c914fee 100644
--- a/server_addon/nuke/server/settings/publish_plugins.py
+++ b/server_addon/nuke/server/settings/publish_plugins.py
@@ -56,7 +56,7 @@ class CollectInstanceDataModel(BaseSettingsModel):
sync_workfile_version_on_product_types: list[str] = SettingsField(
default_factory=list,
enum_resolver=nuke_product_types_enum,
- title="Sync workfile versions for familes"
+ title="Product types"
)
diff --git a/server_addon/nuke/server/version.py b/server_addon/nuke/server/version.py
index c11f861afb..569b1212f7 100644
--- a/server_addon/nuke/server/version.py
+++ b/server_addon/nuke/server/version.py
@@ -1 +1 @@
-__version__ = "0.1.9"
+__version__ = "0.1.10"