diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_mesh_has_uv.py b/client/ayon_core/hosts/max/plugins/publish/validate_mesh_has_uv.py
new file mode 100644
index 0000000000..3e966acc87
--- /dev/null
+++ b/client/ayon_core/hosts/max/plugins/publish/validate_mesh_has_uv.py
@@ -0,0 +1,45 @@
+
+import pyblish.api
+from ayon_core.hosts.max.api.action import SelectInvalidAction
+from ayon_core.pipeline.publish import (
+ ValidateMeshOrder,
+ OptionalPyblishPluginMixin,
+ PublishValidationError
+)
+from pymxs import runtime as rt
+
+
+class ValidateMeshHasUVs(pyblish.api.InstancePlugin,
+ OptionalPyblishPluginMixin):
+
+ """Validate the current mesh has UVs.
+
+ It validates whether the current UV set has non-zero UVs and
+ at least more than the vertex count. It's not really bulletproof,
+ but a simple quick validation to check if there are likely
+ UVs for every face.
+ """
+
+ order = ValidateMeshOrder
+ hosts = ['max']
+ families = ['model']
+ label = 'Validate Mesh Has UVs'
+ actions = [SelectInvalidAction]
+ optional = True
+
+
+ @classmethod
+ def get_invalid(cls, instance):
+ invalid = [member for member in instance.data["members"]
+ if not member.mesh.numTVerts > 0]
+ return invalid
+
+ def process(self, instance):
+ invalid = self.get_invalid(instance)
+ if invalid:
+ raise PublishValidationError(
+ title="Mesh has missing UVs",
+ message="Model meshes are required to have UVs.
"
+ "Meshes detected with invalid or missing UVs:
"
+ "{0}".format(invalid)
+ )
diff --git a/server_addon/max/server/settings/publishers.py b/server_addon/max/server/settings/publishers.py
index 5e28c1b467..6ea6a887d1 100644
--- a/server_addon/max/server/settings/publishers.py
+++ b/server_addon/max/server/settings/publishers.py
@@ -86,6 +86,10 @@ class PublishersModel(BaseSettingsModel):
default_factory=ValidateLoadedPluginModel,
title="Validate Loaded Plugin"
)
+ ValidateMeshHasUVs: BasicValidateModel = SettingsField(
+ default_factory=BasicValidateModel,
+ title="Validate Mesh Has UVs"
+ )
ExtractModelObj: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Extract OBJ",
@@ -134,6 +138,11 @@ DEFAULT_PUBLISH_SETTINGS = {
"optional": True,
"family_plugins_mapping": []
},
+ "ValidateMeshHasUVs": {
+ "enabled": True,
+ "optional": True,
+ "active": False
+ },
"ExtractModelObj": {
"enabled": True,
"optional": True,
diff --git a/server_addon/max/server/version.py b/server_addon/max/server/version.py
index 1276d0254f..0a8da88258 100644
--- a/server_addon/max/server/version.py
+++ b/server_addon/max/server/version.py
@@ -1 +1 @@
-__version__ = "0.1.5"
+__version__ = "0.1.6"