diff --git a/io_scene_fbx/import_fbx.py b/io_scene_fbx/import_fbx.py index 023192718a992bffd1a4457c93472da7ebe102ba..8b52093a9f82e01c1594773f70c289dff2e0d500 100644 --- a/io_scene_fbx/import_fbx.py +++ b/io_scene_fbx/import_fbx.py @@ -616,7 +616,7 @@ def blen_read_geom(fbx_tmpl, fbx_obj): poly_loop_starts.append(poly_loop_prev) poly_loop_totals.append((i - poly_loop_prev) + 1) poly_loop_prev = i + 1 - index = -(index + 1) + index = index ^ -1 l.vertex_index = index mesh.polygons.add(len(poly_loop_starts)) @@ -628,15 +628,33 @@ def blen_read_geom(fbx_tmpl, fbx_obj): blen_read_geom_layer_color(fbx_obj, mesh) if fbx_edges: - # workaround for odd number of edge vertices - tot_edges = len(fbx_edges) // 2 + # edges in fact index the polygons (NOT the vertices) + import array + tot_edges = len(fbx_edges) + edges_conv = array.array('i', [0]) * (tot_edges * 2) + + edge_index = 0 + for i in fbx_edges: + if fbx_polys[i] >= 0: + e_a, e_b = fbx_polys[i], fbx_polys[i + 1] + if e_b < 0: + e_b = e_b ^ -1 + else: + # Last index of polygon, wrap back to the start. - 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) + # ideally we wouldn't have to search back, + # but it should only be 2-3 iterations. + j = i - 1 + while j >= 0 and fbx_polys[j] >= 0: + j -= 1 + e_a, e_b = fbx_polys[i] ^ -1, fbx_polys[j + 1] + + edges_conv[edge_index] = e_a + edges_conv[edge_index + 1] = e_b + edge_index += 2 + mesh.edges.add(tot_edges) + mesh.edges.foreach_set("vertices", edges_conv) # must be after edge, face loading. ok_smooth = blen_read_geom_layer_smooth(fbx_obj, mesh)