From f26299bacc19ef64ab8e11296694756d77e83449 Mon Sep 17 00:00:00 2001
From: Bastien Montagne <bastien@blender.org>
Date: Mon, 10 Jan 2022 11:20:59 +0100
Subject: [PATCH] Fix T94516: OBJ/MTL Material Roughness imported and exported
 inaccurately.

The addon would assume an OBJ range of [0.0-900.0] for the Ns value,
when it actually is supposed to be [0.0-1000.0].

WARNING: This is introducing a slight incompatibility (value shifting of
the roughness parameter) with older OBJ files exported by Blender.
---
 io_scene_obj/__init__.py   | 4 ++--
 io_scene_obj/export_obj.py | 7 ++++---
 io_scene_obj/import_obj.py | 6 +++---
 3 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/io_scene_obj/__init__.py b/io_scene_obj/__init__.py
index 400016894..78c2314e4 100644
--- a/io_scene_obj/__init__.py
+++ b/io_scene_obj/__init__.py
@@ -21,8 +21,8 @@
 bl_info = {
     "name": "Wavefront OBJ format",
     "author": "Campbell Barton, Bastien Montagne",
-    "version": (3, 8, 1),
-    "blender": (2, 81, 6),
+    "version": (3, 9, 0),
+    "blender": (3, 0, 0),
     "location": "File > Import-Export",
     "description": "Import-Export OBJ, Import OBJ mesh, UV's, materials and textures",
     "warning": "",
diff --git a/io_scene_obj/export_obj.py b/io_scene_obj/export_obj.py
index 796515cd2..e5466c764 100644
--- a/io_scene_obj/export_obj.py
+++ b/io_scene_obj/export_obj.py
@@ -74,9 +74,10 @@ def write_mtl(scene, filepath, path_mode, copy_set, mtl_dict):
                 use_transparency = mat_wrap.alpha != 1.0
 
                 # XXX Totally empirical conversion, trying to adapt it
-                #     (from 1.0 - 0.0 Principled BSDF range to 0.0 - 900.0 OBJ specular exponent range)...
-                spec = (1.0 - mat_wrap.roughness) * 30
-                spec *= spec
+                #     (from 1.0 - 0.0 Principled BSDF range to 0.0 - 1000.0 OBJ specular exponent range):
+                #         (1.0 - bsdf_roughness)^2 * 1000
+                spec = (1.0 - mat_wrap.roughness)
+                spec *= spec * 1000
                 fw('Ns %.6f\n' % spec)
 
                 # Ambient
diff --git a/io_scene_obj/import_obj.py b/io_scene_obj/import_obj.py
index 87ba4bd2a..0ba4f8985 100644
--- a/io_scene_obj/import_obj.py
+++ b/io_scene_obj/import_obj.py
@@ -361,9 +361,9 @@ def create_materials(filepath, relpath,
                         context_mat_wrap.emission_strength = 1.0
                     elif line_id == b'ns':
                         # XXX Totally empirical conversion, trying to adapt it
-                        #     (from 0.0 - 900.0 OBJ specular exponent range to 1.0 - 0.0 Principled BSDF range)...
-                        val = max(0.0, min(900.0, float_func(line_split[1])))
-                        context_mat_wrap.roughness = 1.0 - (sqrt(val) / 30)
+                        #     (from 0.0 - 1000.0 OBJ specular exponent range to 1.0 - 0.0 Principled BSDF range)...
+                        val = max(0.0, min(1000.0, float_func(line_split[1])))
+                        context_mat_wrap.roughness = 1.0 - (sqrt(val / 1000))
                         context_material_vars.add("roughness")
                     elif line_id == b'ni':  # Refraction index (between 0.001 and 10).
                         context_mat_wrap.ior = float_func(line_split[1])
-- 
GitLab