[Bf-extensions-cvs] [447abeb9] master: glTF exporter: image texture: manage rough without metal, metal without rough

Julien Duroure noreply at git.blender.org
Tue May 7 10:00:28 CEST 2019


Commit: 447abeb9be69dcef24ea9c47bb2bde4488f9cb83
Author: Julien Duroure
Date:   Tue May 7 09:59:14 2019 +0200
Branches: master
https://developer.blender.org/rBA447abeb9be69dcef24ea9c47bb2bde4488f9cb83

glTF exporter: image texture: manage rough without metal, metal without rough

===================================================================

M	io_scene_gltf2/__init__.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_image.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_pbr_metallic_roughness.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_texture_info.py

===================================================================

diff --git a/io_scene_gltf2/__init__.py b/io_scene_gltf2/__init__.py
index 1c8c5db0..6b14b8e9 100755
--- a/io_scene_gltf2/__init__.py
+++ b/io_scene_gltf2/__init__.py
@@ -15,7 +15,7 @@
 bl_info = {
     'name': 'glTF 2.0 format',
     'author': 'Julien Duroure, Norbert Nopper, Urs Hanselmann, Moritz Becher, Benjamin Schmithüsen, Jim Eckerlein, and many external contributors',
-    "version": (0, 9, 4),
+    "version": (0, 9, 5),
     'blender': (2, 80, 0),
     'location': 'File > Import-Export',
     'description': 'Import-Export as glTF 2.0',
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_image.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_image.py
index 85985e41..8550610f 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_image.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_image.py
@@ -168,7 +168,7 @@ def __get_image_data(sockets_or_slots, export_settings) -> gltf2_blender_image.E
                 composed_image[2] = image[source_channel]
             elif socket.name == 'Roughness':
                 composed_image[1] = image[source_channel]
-            elif socket.name == 'Occlusion' and len(sockets_or_slots) > 2:
+            elif socket.name == 'Occlusion' and len(sockets_or_slots) > 1 and sockets_or_slots[1] is not None:
                 composed_image[0] = image[source_channel]
             else:
                 composed_image.update(image)
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py
index 1242c08d..1eccdeeb 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py
@@ -165,15 +165,28 @@ def __gather_orm_texture(blender_material, export_settings):
 
     metallic_socket = gltf2_blender_get.get_socket_or_texture_slot(blender_material, "Metallic")
     roughness_socket = gltf2_blender_get.get_socket_or_texture_slot(blender_material, "Roughness")
-    if metallic_socket is None or roughness_socket is None\
-            or not __has_image_node_from_socket(metallic_socket)\
-            or not __has_image_node_from_socket(roughness_socket):
+
+    hasMetal = metallic_socket is not None and __has_image_node_from_socket(metallic_socket)
+    hasRough = roughness_socket is not None and __has_image_node_from_socket(roughness_socket)
+
+    if not hasMetal and not hasRough:
         metallic_roughness = gltf2_blender_get.get_socket_or_texture_slot_old(blender_material, "MetallicRoughness")
         if metallic_roughness is None or not __has_image_node_from_socket(metallic_roughness):
             return None
-        return (occlusion, metallic_roughness, metallic_roughness)
+        result = (occlusion, metallic_roughness)
+    elif not hasMetal:
+        result = (occlusion, roughness_socket)
+    elif not hasRough:
+        result = (occlusion, metallic_socket)
+    else:
+        result = (occlusion, roughness_socket, metallic_socket)
+
+    # Double-check this will past the filter in texture_info (otherwise there are different resolutions or other problems).
+    info = gltf2_blender_gather_texture_info.gather_texture_info(result, export_settings)
+    if info is None:
+        return None
 
-    return (occlusion, roughness_socket, metallic_socket)
+    return result
 
 def __gather_occlusion_texture(blender_material, orm_texture, export_settings):
     if orm_texture is not None:
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_pbr_metallic_roughness.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_pbr_metallic_roughness.py
index ffbf9914..26ef0f0a 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_pbr_metallic_roughness.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_pbr_metallic_roughness.py
@@ -130,11 +130,18 @@ def __gather_metallic_roughness_texture(blender_material, orm_texture, export_se
         metallic_socket = gltf2_blender_get.get_socket_or_texture_slot(blender_material, "Metallic")
         roughness_socket = gltf2_blender_get.get_socket_or_texture_slot(blender_material, "Roughness")
 
-        if metallic_socket is None and roughness_socket is None:
-            metallic_roughness = gltf2_blender_get.get_socket_or_texture_slot(blender_material, "MetallicRoughness")
-            if metallic_roughness is None:
-                metallic_roughness = gltf2_blender_get.get_socket_or_texture_slot_old(blender_material, "MetallicRoughness")
+        hasMetal = metallic_socket is not None and __has_image_node_from_socket(metallic_socket)
+        hasRough = roughness_socket is not None and __has_image_node_from_socket(roughness_socket)
+
+        if not hasMetal and not hasRough:
+            metallic_roughness = gltf2_blender_get.get_socket_or_texture_slot_old(blender_material, "MetallicRoughness")
+            if metallic_roughness is None or not __has_image_node_from_socket(metallic_roughness):
+                return None
             texture_input = (metallic_roughness,)
+        elif not hasMetal:
+            texture_input = (roughness_socket,)
+        elif not hasRough:
+            texture_input = (metallic_socket,)
         else:
             texture_input = (metallic_socket, roughness_socket)
 
@@ -149,3 +156,11 @@ def __gather_roughness_factor(blender_material, export_settings):
         return roughness_socket.default_value
     return None
 
+def __has_image_node_from_socket(socket):
+    result = gltf2_blender_search_node_tree.from_socket(
+        socket,
+        gltf2_blender_search_node_tree.FilterByType(bpy.types.ShaderNodeTexImage))
+    if not result:
+        return False
+    return True
+
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_texture_info.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_texture_info.py
index 06cfaaed..354ddf2c 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_texture_info.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_texture_info.py
@@ -57,7 +57,7 @@ def __filter_texture_info(blender_shader_sockets_or_texture_slots, export_settin
         if any(any(a != b for a, b in zip(__get_tex_from_socket(elem).shader_node.image.size, resolution))
                for elem in blender_shader_sockets_or_texture_slots):
             def format_image(image_node):
-                return "{} ({}x{})".format(image_node.name, image_node.image.size[0], image_node.image.size[1])
+                return "{} ({}x{})".format(image_node.image.name, image_node.image.size[0], image_node.image.size[1])
 
             images = [format_image(__get_tex_from_socket(elem).shader_node) for elem in
                       blender_shader_sockets_or_texture_slots]



More information about the Bf-extensions-cvs mailing list