diff --git a/io_scene_fbx/import_fbx.py b/io_scene_fbx/import_fbx.py index 76363a35df64490ce06470410618a4fddb4a33c2..ade884abdbafddd6e066a5a8ac2b66cd4be9d354 100644 --- a/io_scene_fbx/import_fbx.py +++ b/io_scene_fbx/import_fbx.py @@ -377,7 +377,7 @@ def blen_read_geom_array_mapped_polygon( ): if fbx_layer_mapping == b'ByPolygon': - if fbx_layer_ref in {b'IndexToDirect', b'Direct'}: + if fbx_layer_ref == b'IndexToDirect': if stride == 1: for i, blen_data_item in enumerate(blen_data): setattr(blen_data_item, blend_attr, fbx_layer_data[i]) @@ -385,6 +385,12 @@ def blen_read_geom_array_mapped_polygon( for i, blen_data_item in enumerate(blen_data): setattr(blen_data_item, blend_attr, fbx_layer_data[(i * stride): (i * stride) + stride]) return True + elif fbx_layer_ref == b'Direct': + # looks like direct may have different meanings! + assert(stride == 1) + for i in fbx_layer_data: + setattr(blen_data[i - 1], blend_attr, True) + return True else: print("warning layer %r ref type unsupported: %r" % (descr, fbx_layer_ref)) else: @@ -492,6 +498,10 @@ def blen_read_geom_layer_smooth(fbx_obj, mesh): return False if fbx_layer_mapping == b'ByEdge': + # some models have bad edge data, we cant use this info... + if not mesh.edges: + return False + blen_data = mesh.edges ok_smooth = blen_read_geom_array_mapped_edge( mesh, blen_data, "use_edge_sharp", @@ -582,8 +592,15 @@ def blen_read_geom(fbx_tmpl, fbx_obj): blen_read_geom_layer_uv(fbx_obj, mesh) if fbx_edges: - mesh.edges.add(len(fbx_edges) // 2) - mesh.edges.foreach_set("vertices", fbx_edges) + # workaround for odd number of edge vertices + tot_edges = len(fbx_edges) // 2 + + if len(fbx_edges) % 2: + print("Corrupt edges found in: %s" % elem_name_utf8) + else: + mesh.edges.add(tot_edges) + mesh.edges.foreach_set("vertices", fbx_edges) + # must be after edge, face loading. ok_smooth = blen_read_geom_layer_smooth(fbx_obj, mesh)