[Bf-extensions-cvs] [346320d0] master: Fix T68967: Export to .fbx error.

Bastien Montagne noreply at git.blender.org
Wed Aug 21 15:15:10 CEST 2019


Commit: 346320d012f5bd6e3fabd888d0186c417e78b9c0
Author: Bastien Montagne
Date:   Wed Aug 21 15:14:03 2019 +0200
Branches: master
https://developer.blender.org/rBA346320d012f5bd6e3fabd888d0186c417e78b9c0

Fix T68967: Export to .fbx error.

Handle more gracefully the case where we cannot compute tangent space
for a mesh.

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

M	io_scene_fbx/__init__.py
M	io_scene_fbx/export_fbx_bin.py

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

diff --git a/io_scene_fbx/__init__.py b/io_scene_fbx/__init__.py
index 327210cf..bb9528af 100644
--- a/io_scene_fbx/__init__.py
+++ b/io_scene_fbx/__init__.py
@@ -21,7 +21,7 @@
 bl_info = {
     "name": "FBX format",
     "author": "Campbell Barton, Bastien Montagne, Jens Restemeier",
-    "version": (4, 14, 14),
+    "version": (4, 14, 15),
     "blender": (2, 80, 0),
     "location": "File > Import-Export",
     "description": "FBX IO meshes, UV's, vertex colors, materials, textures, cameras, lamps and actions",
diff --git a/io_scene_fbx/export_fbx_bin.py b/io_scene_fbx/export_fbx_bin.py
index 35c17c3d..9292d656 100644
--- a/io_scene_fbx/export_fbx_bin.py
+++ b/io_scene_fbx/export_fbx_bin.py
@@ -1032,42 +1032,53 @@ def fbx_data_mesh_elements(root, me_obj, scene_data, done_meshes):
         if scene_data.settings.use_tspace:
             tspacenumber = len(me.uv_layers)
             if tspacenumber:
-                t_ln = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.loops) * 3
-                # t_lnw = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.loops)
-                uv_names = [uvlayer.name for uvlayer in me.uv_layers]
-                for name in uv_names:
-                    me.calc_tangents(uvmap=name)
-                for idx, uvlayer in enumerate(me.uv_layers):
-                    name = uvlayer.name
-                    # Loop bitangents (aka binormals).
-                    # NOTE: this is not supported by importer currently.
-                    me.loops.foreach_get("bitangent", t_ln)
-                    lay_nor = elem_data_single_int32(geom, b"LayerElementBinormal", idx)
-                    elem_data_single_int32(lay_nor, b"Version", FBX_GEOMETRY_BINORMAL_VERSION)
-                    elem_data_single_string_unicode(lay_nor, b"Name", name)
-                    elem_data_single_string(lay_nor, b"MappingInformationType", b"ByPolygonVertex")
-                    elem_data_single_string(lay_nor, b"ReferenceInformationType", b"Direct")
-                    elem_data_single_float64_array(lay_nor, b"Binormals",
-                                                   chain(*nors_transformed_gen(t_ln, geom_mat_no)))
-                    # Binormal weights, no idea what it is.
-                    # elem_data_single_float64_array(lay_nor, b"BinormalsW", t_lnw)
-
-                    # Loop tangents.
-                    # NOTE: this is not supported by importer currently.
-                    me.loops.foreach_get("tangent", t_ln)
-                    lay_nor = elem_data_single_int32(geom, b"LayerElementTangent", idx)
-                    elem_data_single_int32(lay_nor, b"Version", FBX_GEOMETRY_TANGENT_VERSION)
-                    elem_data_single_string_unicode(lay_nor, b"Name", name)
-                    elem_data_single_string(lay_nor, b"MappingInformationType", b"ByPolygonVertex")
-                    elem_data_single_string(lay_nor, b"ReferenceInformationType", b"Direct")
-                    elem_data_single_float64_array(lay_nor, b"Tangents",
-                                                   chain(*nors_transformed_gen(t_ln, geom_mat_no)))
-                    # Tangent weights, no idea what it is.
-                    # elem_data_single_float64_array(lay_nor, b"TangentsW", t_lnw)
-
-                del t_ln
-                # del t_lnw
-                me.free_tangents()
+                # We can only compute tspace on tesellated meshes, need to check that here...
+                t_lt = [None] * len(me.polygons)
+                me.polygons.foreach_get("loop_total", t_lt)
+                if any((lt > 4 for lt in t_lt)):
+                    del t_lt
+                    scene_data.settings.report(
+                        {'WARNING'},
+                        "Mesh '%s' has polygons with more than 4 vertices, "
+                        "cannot compute/export tangent space for it" % me.name)
+                else:
+                    del t_lt
+                    t_ln = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.loops) * 3
+                    # t_lnw = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.loops)
+                    uv_names = [uvlayer.name for uvlayer in me.uv_layers]
+                    for name in uv_names:
+                        me.calc_tangents(uvmap=name)
+                    for idx, uvlayer in enumerate(me.uv_layers):
+                        name = uvlayer.name
+                        # Loop bitangents (aka binormals).
+                        # NOTE: this is not supported by importer currently.
+                        me.loops.foreach_get("bitangent", t_ln)
+                        lay_nor = elem_data_single_int32(geom, b"LayerElementBinormal", idx)
+                        elem_data_single_int32(lay_nor, b"Version", FBX_GEOMETRY_BINORMAL_VERSION)
+                        elem_data_single_string_unicode(lay_nor, b"Name", name)
+                        elem_data_single_string(lay_nor, b"MappingInformationType", b"ByPolygonVertex")
+                        elem_data_single_string(lay_nor, b"ReferenceInformationType", b"Direct")
+                        elem_data_single_float64_array(lay_nor, b"Binormals",
+                                                       chain(*nors_transformed_gen(t_ln, geom_mat_no)))
+                        # Binormal weights, no idea what it is.
+                        # elem_data_single_float64_array(lay_nor, b"BinormalsW", t_lnw)
+
+                        # Loop tangents.
+                        # NOTE: this is not supported by importer currently.
+                        me.loops.foreach_get("tangent", t_ln)
+                        lay_nor = elem_data_single_int32(geom, b"LayerElementTangent", idx)
+                        elem_data_single_int32(lay_nor, b"Version", FBX_GEOMETRY_TANGENT_VERSION)
+                        elem_data_single_string_unicode(lay_nor, b"Name", name)
+                        elem_data_single_string(lay_nor, b"MappingInformationType", b"ByPolygonVertex")
+                        elem_data_single_string(lay_nor, b"ReferenceInformationType", b"Direct")
+                        elem_data_single_float64_array(lay_nor, b"Tangents",
+                                                       chain(*nors_transformed_gen(t_ln, geom_mat_no)))
+                        # Tangent weights, no idea what it is.
+                        # elem_data_single_float64_array(lay_nor, b"TangentsW", t_lnw)
+
+                    del t_ln
+                    # del t_lnw
+                    me.free_tangents()
 
         me.free_normals_split()



More information about the Bf-extensions-cvs mailing list