Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2019-08-21 16:14:03 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2019-08-21 16:14:03 +0300
commit346320d012f5bd6e3fabd888d0186c417e78b9c0 (patch)
treea5b2a062fec4fcd48361b6c22b72caa21b901513
parent1faadc1aeb1837e1940efca72e9b14567ef9182c (diff)
Fix T68967: Export to .fbx error.
Handle more gracefully the case where we cannot compute tangent space for a mesh.
-rw-r--r--io_scene_fbx/__init__.py2
-rw-r--r--io_scene_fbx/export_fbx_bin.py83
2 files changed, 48 insertions, 37 deletions
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()