[Bf-extensions-cvs] [5088c8d9] master: glTF exporter: take care of active output node

Julien Duroure noreply at git.blender.org
Mon Nov 30 18:47:25 CET 2020


Commit: 5088c8d9d735a7fe91cd187d03d3afcb795bd6fa
Author: Julien Duroure
Date:   Mon Nov 30 18:47:05 2020 +0100
Branches: master
https://developer.blender.org/rBA5088c8d9d735a7fe91cd187d03d3afcb795bd6fa

glTF exporter: take care of active output node

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

M	io_scene_gltf2/__init__.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_unlit.py
M	io_scene_gltf2/blender/exp/gltf2_blender_get.py

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

diff --git a/io_scene_gltf2/__init__.py b/io_scene_gltf2/__init__.py
index 966347d0..4cf7b207 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, Scurest, Norbert Nopper, Urs Hanselmann, Moritz Becher, Benjamin Schmithüsen, Jim Eckerlein, and many external contributors',
-    "version": (1, 5, 3),
+    "version": (1, 5, 4),
     'blender': (2, 91, 0),
     'location': 'File > Import-Export',
     'description': 'Import-Export as glTF 2.0',
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_unlit.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_unlit.py
index b3012ea0..f000bb56 100644
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_unlit.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials_unlit.py
@@ -38,7 +38,7 @@ def detect_shadeless_material(blender_material, export_settings):
     info = {}
 
     for node in blender_material.node_tree.nodes:
-        if node.type == 'OUTPUT_MATERIAL':
+        if node.type == 'OUTPUT_MATERIAL' and node.is_active_output:
             socket = node.inputs[0]
             break
     else:
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_get.py b/io_scene_gltf2/blender/exp/gltf2_blender_get.py
index 58b835c0..ee63aa7e 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_get.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_get.py
@@ -60,6 +60,7 @@ def get_socket(blender_material: bpy.types.Material, name: str):
             type = bpy.types.ShaderNodeEmission
             name = "Color"
             nodes = [n for n in blender_material.node_tree.nodes if isinstance(n, type) and not n.mute]
+            nodes = [node for node in nodes if check_if_is_linked_to_active_output(node.outputs[0])]
             inputs = sum([[input for input in node.inputs if input.name == name] for node in nodes], [])
             if inputs:
                 return inputs[0]
@@ -72,6 +73,7 @@ def get_socket(blender_material: bpy.types.Material, name: str):
         else:
             type = bpy.types.ShaderNodeBsdfPrincipled
         nodes = [n for n in blender_material.node_tree.nodes if isinstance(n, type) and not n.mute]
+        nodes = [node for node in nodes if check_if_is_linked_to_active_output(node.outputs[0])]
         inputs = sum([[input for input in node.inputs if input.name == name] for node in nodes], [])
         if inputs:
             return inputs[0]
@@ -98,6 +100,17 @@ def get_socket_old(blender_material: bpy.types.Material, name: str):
 
     return None
 
+def check_if_is_linked_to_active_output(shader_socket):
+    for link in shader_socket.links:
+        if isinstance(link.to_node, bpy.types.ShaderNodeOutputMaterial) and link.to_node.is_active_output is True:
+            return True
+
+        if len(link.to_node.outputs) > 0: # ignore non active output, not having output sockets
+            ret = check_if_is_linked_to_active_output(link.to_node.outputs[0]) # recursive until find an output material node
+            if ret is True:
+                return True
+
+    return False
 
 def find_shader_image_from_shader_socket(shader_socket, max_hops=10):
     """Find any ShaderNodeTexImage in the path from the socket."""



More information about the Bf-extensions-cvs mailing list