[Bf-extensions-cvs] [1e202360] master: glTF exporter: add alpha export support

Julien Duroure noreply at git.blender.org
Sat Aug 3 07:18:44 CEST 2019


Commit: 1e20236039c8929406cf3d86bddcbfd2df5d9a17
Author: Julien Duroure
Date:   Sat Aug 3 07:18:25 2019 +0200
Branches: master
https://developer.blender.org/rBA1e20236039c8929406cf3d86bddcbfd2df5d9a17

glTF exporter: add alpha export support

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

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_pbr_metallic_roughness.py
M	io_scene_gltf2/blender/exp/gltf2_blender_image.py

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

diff --git a/io_scene_gltf2/__init__.py b/io_scene_gltf2/__init__.py
index 9ce2d9da..8d849b63 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, 37),
+    "version": (0, 9, 38),
     '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 07600fcf..a92de291 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_image.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_image.py
@@ -91,6 +91,11 @@ def __gather_extras(sockets_or_slots, export_settings):
 
 
 def __gather_mime_type(sockets_or_slots, export_settings):
+    # force png if Alpha contained so we can export alpha
+    for socket in sockets_or_slots:
+        if socket.name == "Alpha":
+            return "image/png"
+
     if export_settings["gltf_image_format"] == "NAME":
         extension = __get_extension_from_slot(sockets_or_slots, export_settings)
         extension = extension.lower()
@@ -175,13 +180,16 @@ def __get_image_data(sockets_or_slots, export_settings) -> gltf2_blender_image.E
 
             target_channel = None
 
-            # Change target channel for metallic and roughness.
+            # some sockets need channel rewriting (gltf pbr defines fixed channels for some attributes)
             if socket.name == 'Metallic':
                 target_channel = 2
             elif socket.name == 'Roughness':
                 target_channel = 1
             elif socket.name == 'Occlusion' and len(sockets_or_slots) > 1 and sockets_or_slots[1] is not None:
                 target_channel = 0
+            elif socket.name == 'Alpha' and len(sockets_or_slots) > 1 and sockets_or_slots[1] is not None:
+                composed_image.set_alpha(True)
+                target_channel = 3
 
             if target_channel is not None:
                 if composed_image is None:
@@ -189,8 +197,8 @@ def __get_image_data(sockets_or_slots, export_settings) -> gltf2_blender_image.E
 
                 composed_image[target_channel] = image[source_channel]
             else:
-                # If we're not assigning target channels, just return the first valid image.
-                return image
+                # copy full image...eventually following sockets might overwrite things
+                composed_image = image
 
         return composed_image
 
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 ef4c788f..04a0fcd1 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
@@ -94,7 +94,14 @@ def __gather_base_color_texture(blender_material, export_settings):
         base_color_socket = gltf2_blender_get.get_socket_or_texture_slot_old(blender_material, "BaseColor")
     if base_color_socket is None:
         base_color_socket = gltf2_blender_get.get_socket_or_texture_slot(blender_material, "Background")
-    return gltf2_blender_gather_texture_info.gather_texture_info((base_color_socket,), export_settings)
+
+    alpha_socket = gltf2_blender_get.get_socket_or_texture_slot(blender_material, "Alpha")
+    if alpha_socket is not None and alpha_socket.is_linked:
+        inputs = (base_color_socket, alpha_socket, )
+    else:
+        inputs = (base_color_socket,)
+ 
+    return gltf2_blender_gather_texture_info.gather_texture_info(inputs, export_settings)
 
 
 def __get_tex_from_socket(blender_shader_socket: bpy.types.NodeSocket):
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_image.py b/io_scene_gltf2/blender/exp/gltf2_blender_image.py
index 24abca62..707feb91 100644
--- a/io_scene_gltf2/blender/exp/gltf2_blender_image.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_image.py
@@ -41,6 +41,9 @@ class ExportImage:
         self._blender_image = blender_image
         self._has_alpha = has_alpha
 
+    def set_alpha(self, alpha: bool):
+        self._has_alpha = alpha
+
     @classmethod
     def from_blender_image(cls, blender_image: bpy.types.Image):
         img = np.array(blender_image.pixels)



More information about the Bf-extensions-cvs mailing list