[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