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:
Diffstat (limited to 'io_scene_fbx/export_fbx_bin.py')
-rw-r--r--io_scene_fbx/export_fbx_bin.py83
1 files changed, 47 insertions, 36 deletions
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()