[Bf-extensions-cvs] [a77bee47] blender2.8: glTF: Various export fixs/enhancements

Julien Duroure noreply at git.blender.org
Mon Dec 3 23:35:03 CET 2018


Commit: a77bee47665d33ec64d6225f6fdce47572e9cb5f
Author: Julien Duroure
Date:   Mon Dec 3 23:33:02 2018 +0100
Branches: blender2.8
https://developer.blender.org/rBAa77bee47665d33ec64d6225f6fdce47572e9cb5f

glTF: Various export fixs/enhancements

* Extras
* AlphaMode, material names
* fix camera export
* refactoring export option
* apply modifier option

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

M	io_scene_gltf2/__init__.py
M	io_scene_gltf2/blender/exp/gltf2_blender_export.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py
M	io_scene_gltf2/blender/exp/gltf2_blender_gltf2_exporter.py

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

diff --git a/io_scene_gltf2/__init__.py b/io_scene_gltf2/__init__.py
index e2877db9..10577813 100755
--- a/io_scene_gltf2/__init__.py
+++ b/io_scene_gltf2/__init__.py
@@ -348,7 +348,7 @@ class ExportGLTF2_Base:
         export_settings['gltf_binary'] = bytearray()
         export_settings['gltf_binaryfilename'] = os.path.splitext(os.path.basename(self.filepath))[0] + '.bin'
 
-        return gltf2_blender_export.save(self, context, export_settings)
+        return gltf2_blender_export.save(context, export_settings)
 
     def draw(self, context):
         layout = self.layout
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_export.py b/io_scene_gltf2/blender/exp/gltf2_blender_export.py
index 1adbe473..7ef3941d 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_export.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_export.py
@@ -12,76 +12,93 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import bpy
 import sys
 import traceback
 
-from . import gltf2_blender_export_keys
-from . import gltf2_blender_gather
-from .gltf2_blender_gltf2_exporter import GlTF2Exporter
-from ..com import gltf2_blender_json
-from ...io.exp import gltf2_io_export
-from ...io.com.gltf2_io_debug import print_console, print_newline
+from io_scene_gltf2.blender.com import gltf2_blender_json
+from io_scene_gltf2.blender.exp import gltf2_blender_export_keys
+from io_scene_gltf2.blender.exp import gltf2_blender_gather
+from io_scene_gltf2.blender.exp.gltf2_blender_gltf2_exporter import GlTF2Exporter
+from io_scene_gltf2.io.com.gltf2_io_debug import print_console, print_newline
+from io_scene_gltf2.io.exp import gltf2_io_export
 
 
-def save(operator,
-         context,
-         export_settings):
+def save(context, export_settings):
     """Start the glTF 2.0 export and saves to content either to a .gltf or .glb file."""
-    print_console('INFO', 'Starting glTF 2.0 export')
-    context.window_manager.progress_begin(0, 100)
-    context.window_manager.progress_update(0)
+    __notify_start(context)
+    json, buffer = __export(export_settings)
+    __write_file(json, buffer, export_settings)
+    __notify_end(context)
+    return {'FINISHED'}
+
+
+def __export(export_settings):
+    exporter = GlTF2Exporter(__get_copyright(export_settings))
+    __add_root_objects(exporter, export_settings)
+    buffer = __create_buffer(exporter, export_settings)
+    exporter.finalize_images(export_settings[gltf2_blender_export_keys.FILE_DIRECTORY])
+    json = __fix_json(exporter.glTF.to_dict())
 
-    if not export_settings[gltf2_blender_export_keys.COPYRIGHT]:
-        export_settings[gltf2_blender_export_keys.COPYRIGHT] = None
+    return json, buffer
 
+
+def __get_copyright(export_settings):
+    if export_settings[gltf2_blender_export_keys.COPYRIGHT]:
+        return export_settings[gltf2_blender_export_keys.COPYRIGHT]
+    return None
+
+
+def __add_root_objects(exporter, export_settings):
     scenes, animations = gltf2_blender_gather.gather_gltf2(export_settings)
-    exporter = GlTF2Exporter(copyright=export_settings[gltf2_blender_export_keys.COPYRIGHT])
     for scene in scenes:
         exporter.add_scene(scene)
     for animation in animations:
         exporter.add_animation(animation)
 
+
+def __create_buffer(exporter, export_settings):
     buffer = bytes()
-    if export_settings[gltf2_blender_export_keys.FORMAT] != 'GLB':
-        # .gltf
+    if export_settings[gltf2_blender_export_keys.FORMAT] == 'GLB':
+        buffer = exporter.finalize_buffer(export_settings[gltf2_blender_export_keys.FILE_DIRECTORY], is_glb=True)
+    else:
         if export_settings[gltf2_blender_export_keys.FORMAT] == 'GLTF':
             exporter.finalize_buffer(export_settings[gltf2_blender_export_keys.FILE_DIRECTORY])
         else:
             exporter.finalize_buffer(export_settings[gltf2_blender_export_keys.FILE_DIRECTORY],
                                      export_settings[gltf2_blender_export_keys.BINARY_FILENAME])
-    else:
-        # .glb
-        buffer = exporter.finalize_buffer(export_settings[gltf2_blender_export_keys.FILE_DIRECTORY], is_glb=True)
-    exporter.finalize_images(export_settings[gltf2_blender_export_keys.FILE_DIRECTORY])
-    glTF = exporter.glTF
 
-    #
+    return buffer
+
 
+def __fix_json(obj):
     # TODO: move to custom JSON encoder
-    def dict_strip(obj):
-        o = obj
-        if isinstance(obj, dict):
-            o = {}
-            for k, v in obj.items():
-                if v is None:
-                    continue
-                elif isinstance(v, list) and len(v) == 0:
-                    continue
-                o[k] = dict_strip(v)
-        elif isinstance(obj, list):
-            o = []
-            for v in obj:
-                o.append(dict_strip(v))
-        elif isinstance(obj, float):
-            # force floats to int, if they are integers (prevent INTEGER_WRITTEN_AS_FLOAT validator warnings)
-            if int(obj) == obj:
-                return int(obj)
-        return o
+    fixed = obj
+    if isinstance(obj, dict):
+        fixed = {}
+        for key, value in obj.items():
+            if value is None:
+                continue
+            elif isinstance(value, list) and len(value) == 0:
+                continue
+            fixed[key] = __fix_json(value)
+    elif isinstance(obj, list):
+        fixed = []
+        for value in obj:
+            fixed.append(__fix_json(value))
+    elif isinstance(obj, float):
+        # force floats to int, if they are integers (prevent INTEGER_WRITTEN_AS_FLOAT validator warnings)
+        if int(obj) == obj:
+            return int(obj)
+    return fixed
 
+
+def __write_file(json, buffer, export_settings):
     try:
-        gltf2_io_export.save_gltf(dict_strip(glTF.to_dict()), export_settings, gltf2_blender_json.BlenderJSONEncoder,
-                                  buffer)
+        gltf2_io_export.save_gltf(
+            json,
+            export_settings,
+            gltf2_blender_json.BlenderJSONEncoder,
+            buffer)
     except AssertionError as e:
         _, _, tb = sys.exc_info()
         traceback.print_tb(tb)  # Fixed format
@@ -92,9 +109,15 @@ def save(operator,
         print_console('ERROR', str(e))
         raise e
 
+
+def __notify_start(context):
+    print_console('INFO', 'Starting glTF 2.0 export')
+    context.window_manager.progress_begin(0, 100)
+    context.window_manager.progress_update(0)
+
+
+def __notify_end(context):
     print_console('INFO', 'Finished glTF 2.0 export')
     context.window_manager.progress_end()
     print_newline()
 
-    return {'FINISHED'}
-
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather.py
index 6f4f3b1e..ad9e7619 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather.py
@@ -50,8 +50,6 @@ def __gather_scene(blender_scene, export_settings):
             if node is not None:
                 scene.nodes.append(node)
 
-    # TODO: lights
-
     return scene
 
 
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 357b9061..4e97f3a9 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_materials.py
@@ -21,6 +21,7 @@ from io_scene_gltf2.blender.exp import gltf2_blender_gather_material_normal_text
 from io_scene_gltf2.blender.exp import gltf2_blender_gather_material_occlusion_texture_info_class
 
 from io_scene_gltf2.blender.exp import gltf2_blender_gather_materials_pbr_metallic_roughness
+from io_scene_gltf2.blender.exp import gltf2_blender_generate_extras
 from io_scene_gltf2.blender.exp import gltf2_blender_get
 
 
@@ -76,10 +77,16 @@ def __filter_material(blender_material, export_settings):
 
 
 def __gather_alpha_cutoff(blender_material, export_settings):
+    if blender_material.blend_method == 'CLIP':
+        return blender_material.alpha_threshold
     return None
 
 
 def __gather_alpha_mode(blender_material, export_settings):
+    if blender_material.blend_method == 'CLIP':
+        return 'MASK'
+    elif blender_material.blend_method == 'BLEND':
+        return 'BLEND'
     return None
 
 
@@ -90,7 +97,7 @@ def __gather_double_sided(blender_material, export_settings):
 def __gather_emmissive_factor(blender_material, export_settings):
     emissive_socket = gltf2_blender_get.get_socket_or_texture_slot(blender_material, "Emissive")
     if isinstance(emissive_socket, bpy.types.NodeSocket):
-        return list(emissive_socket.default_value)
+        return list(emissive_socket.default_value)[0:3]
     return None
 
 
@@ -108,13 +115,14 @@ def __gather_extensions(blender_material, export_settings):
     return extensions if extensions else None
 
 
-def __gather_extras(blender_material, export_setttings):
+def __gather_extras(blender_material, export_settings):
+    if export_settings['gltf_extras']:
+        return gltf2_blender_generate_extras.generate_extras(blender_material)
     return None
 
 
 def __gather_name(blender_material, export_settings):
-
-    return None
+    return blender_material.name
 
 
 def __gather_normal_texture(blender_material, export_settings):
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py
index 57903287..f32eb733 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py
@@ -17,15 +17,17 @@ from typing import Optional, Dict, List, Any
 from io_scene_gltf2.blender.exp.gltf2_blender_gather_cache import cached
 from io_scene_gltf2.io.com import gltf2_io
 from io_scene_gltf2.blender.exp import gltf2_blender_gather_primitives
+from io_scene_gltf2.blender.exp import gltf2_blender_generate_extras
 
 
 @cached
 def gather_mesh(blender_mesh: bpy.types.Mesh,
                 vertex_groups: Optional[bpy.types.VertexGroups],
                 modifiers: Optional[bpy.types.ObjectModifiers],
+                skip_filter: bool,
                 export_settings
                 ) -> Optional[gltf2_io

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list