[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [1906] contrib/py/scripts/addons/ io_import_fbx.py: fix for importing meshes which define faces as 2 edges.

Campbell Barton ideasman42 at gmail.com
Sun May 8 09:09:15 CEST 2011


Revision: 1906
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=1906
Author:   campbellbarton
Date:     2011-05-08 07:09:15 +0000 (Sun, 08 May 2011)
Log Message:
-----------
fix for importing meshes which define faces as 2 edges.

Modified Paths:
--------------
    contrib/py/scripts/addons/io_import_fbx.py

Modified: contrib/py/scripts/addons/io_import_fbx.py
===================================================================
--- contrib/py/scripts/addons/io_import_fbx.py	2011-05-08 04:42:07 UTC (rev 1905)
+++ contrib/py/scripts/addons/io_import_fbx.py	2011-05-08 07:09:15 UTC (rev 1906)
@@ -233,6 +233,7 @@
 
                         verts = tag_get_single(value2, "Vertices")[1]
                         faces = tag_get_single(value2, "PolygonVertexIndex")[1]
+                        #EDGE: edges = tag_get_single(value2, "Edges")[1]
 
                         # convert odd fbx verts and faces to a blender mesh.
                         if verts and faces:
@@ -240,21 +241,71 @@
                             # get a list of floats as triples
                             blen_verts = [verts[i - 3:i] for i in range(3, len(verts) + 3, 3)]
 
-                            # get weirdo face indicies
+                            # get weirdo face indicies and proper edge indexs
+                            # edge_ends is referring to end vertex of the face.
+                            # Thas why we have link with first vertex of the face.
+
                             face = []
+                            #EDGE: ed = 0
+                            #EDGE: edge_ends = []
                             blen_faces = [face]
-                            for f in faces:
+                            blen_faces_edges = []  # faces that have a length of 2
+                            blen_poly_mapping = {}
+                            poly_idx = 0
+                            for idx, f in enumerate(faces):
                                 if f < 0:
-                                    face.append(int(-f) - 1)
+                                    face.append(f ^ -1)
                                     face = []
+
+                                    if len(blen_faces[-1]) == 2:
+                                        blen_faces_edges.append(blen_faces.pop())
+                                    else:
+                                        blen_poly_mapping[poly_idx] = len(blen_faces) - 1
+
                                     blen_faces.append(face)
+                                    poly_idx += 1
+
+                                    #EDGE: if ed == 0:
+                                    #EDGE:     edge_ends.append((idx, 0))
+                                    #EDGE:     ed = 1
+                                    #EDGE:     tuli = idx + 1
+                                    #EDGE: else:
+                                    #EDGE:     edge_ends.append((idx, tuli))
+                                    #EDGE:     tuli = idx + 1
+
                                 else:
-                                    face.append(int(f))
+                                    face.append(f)
 
+
+                            #EDGE:
+                            """
+                            edge_final = []
+
+                            for idx, e in enumerate(edges):
+                                if edge_ends[-1][0] == e:
+                                    edge1 = faces[edge_ends[-1][0]]
+                                    if edge1 < 0:
+                                        edge1 ^= -1
+                                    edge2 = faces[edge_ends[-1][1]]
+                                    if edge2 < 0:
+                                        edge2 ^= -1
+
+                                    edge_final.append((edge1, edge2))
+                                else:
+                                    edge1 = faces[e]
+                                    if edge1 < 0:
+                                        edge1 ^= -1
+                                    edge2 = faces[e + 1]
+                                    if edge2 < 0:
+                                        edge2 ^= -1
+
+                                    edge_final.append((edge1, edge2))
+                            """
                             if not blen_faces[-1]:
                                 del blen_faces[-1]
 
-                            me.from_pydata(blen_verts, [], blen_faces)
+                            #EDGE: me.from_pydata(blen_verts, edge_final + blen_faces_edges, blen_faces)
+                            me.from_pydata(blen_verts, blen_faces_edges, blen_faces)
                             me.update()
 
                             # Handle smoothing
@@ -265,8 +316,10 @@
                                 if type == "ByPolygon":
                                     smooth_faces = tag_get_single(i, "Smoothing")[1]
 
-                                    for idx, f in enumerate(me.faces):
-                                        f.use_smooth = smooth_faces[idx]
+                                    for idx, val in enumerate(smooth_faces):
+                                        new_idx = blen_poly_mapping.get(idx)
+                                        if new_idx is not None:
+                                            me.faces[new_idx].use_smooth = val
                                 elif type == "ByEdge":
                                     smooth_edges = tag_get_single(i, "Smoothing")[1]
 
@@ -275,6 +328,30 @@
                                 else:
                                     print("WARNING: %s, unsupported smoothing type: %s" % (fbx_name, type))
 
+
+                            #EDGE:
+                            """ 
+                            # Handle edge weighting
+                            for i in tag_get_iter(value2, "LayerElementEdgeCrease"):
+                                i = i[1]
+                                type = tag_get_single(i, "MappingInformationType")[1]
+
+                                if type == "ByPolygon":
+                                    crease_faces = tag_get_single(i, "Smoothing")[1]
+
+                                    for idx, f in enumerate(me.faces):
+                                        poly_idx = blen_poly_mapping.get(idx)
+                                        if poly_idx is not None:
+                                            f.use_smooth = crease_faces[idx]
+                                elif type == "ByEdge":
+                                    crease_edges = tag_get_single(i, "EdgeCrease")[1]
+
+                                    for idx, ed in enumerate(me.edges):
+                                        ed.crease = crease_edges[idx]
+                                else:
+                                    print("WARNING: %s, unsupported smoothing type: %s" % (fbx_name, type))
+                            """
+
                             obj = bpy.data.objects.new(fbx_name, me)
                             base = scene.objects.link(obj)
 



More information about the Bf-extensions-cvs mailing list