[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [4690] trunk/py/scripts/addons/ io_scene_fbx/import_fbx.py: add support importing edge and face smoothing

Campbell Barton ideasman42 at gmail.com
Wed Aug 21 06:32:25 CEST 2013


Revision: 4690
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=4690
Author:   campbellbarton
Date:     2013-08-21 04:32:25 +0000 (Wed, 21 Aug 2013)
Log Message:
-----------
add support importing edge and face smoothing

Modified Paths:
--------------
    trunk/py/scripts/addons/io_scene_fbx/import_fbx.py

Modified: trunk/py/scripts/addons/io_scene_fbx/import_fbx.py
===================================================================
--- trunk/py/scripts/addons/io_scene_fbx/import_fbx.py	2013-08-21 04:31:23 UTC (rev 4689)
+++ trunk/py/scripts/addons/io_scene_fbx/import_fbx.py	2013-08-21 04:32:25 UTC (rev 4690)
@@ -345,6 +345,30 @@
     return False
 
 
+def blen_read_geom_array_mapped_edge(
+    mesh, blen_data, blend_attr,
+    fbx_layer_data, fbx_layer_index,
+    fbx_layer_mapping, fbx_layer_ref,
+    stride, descr,
+    ):
+
+    if fbx_layer_mapping == b'ByEdge':
+        if fbx_layer_ref == b'Direct':
+            if stride == 1:
+                for i, blen_data_item in enumerate(blen_data):
+                    setattr(blen_data_item, blend_attr, fbx_layer_data[i])
+            else:
+                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
+        else:
+            print("warning layer %r ref type unsupported: %r" % (descr, fbx_layer_ref))
+    else:
+        print("warning layer %r mapping type unsupported: %r" % (descr, fbx_layer_mapping))
+
+    return False
+
+
 def blen_read_geom_array_mapped_polygon(
     mesh, blen_data, blend_attr,
     fbx_layer_data, fbx_layer_index,
@@ -353,7 +377,7 @@
     ):
 
     if fbx_layer_mapping == b'ByPolygon':
-        if fbx_layer_ref == b'IndexToDirect':
+        if fbx_layer_ref in {b'IndexToDirect', b'Direct'}:
             if stride == 1:
                 for i, blen_data_item in enumerate(blen_data):
                     setattr(blen_data_item, blend_attr, fbx_layer_data[i])
@@ -401,7 +425,7 @@
     return False
 
 
-def blen_read_geom_layer_materials(fbx_obj, mesh):
+def blen_read_geom_layer_material(fbx_obj, mesh):
     fbx_layer = elem_find_first(fbx_obj, b'LayerElementMaterial')
 
     if fbx_layer is None:
@@ -415,8 +439,9 @@
     layer_id = b'Materials'
     fbx_layer_data = elem_prop_first(elem_find_first(fbx_layer, layer_id))
 
+    blen_data = mesh.polygons
     blen_read_geom_array_mapped_polygon(
-        mesh, mesh.polygons, "material_index",
+        mesh, blen_data, "material_index",
         fbx_layer_data, None,
         fbx_layer_mapping, fbx_layer_ref,
         1, layer_id,
@@ -447,6 +472,47 @@
                 )
 
 
+def blen_read_geom_layer_smooth(fbx_obj, mesh):
+    fbx_layer = elem_find_first(fbx_obj, b'LayerElementSmoothing')
+    
+    if fbx_layer is None:
+        return False
+
+    # all should be valid
+    (fbx_layer_name,
+     fbx_layer_mapping,
+     fbx_layer_ref,
+     ) = blen_read_geom_layerinfo(fbx_layer)
+
+    layer_id = b'Smoothing'
+    fbx_layer_data = elem_prop_first(elem_find_first(fbx_layer, layer_id))
+
+    if fbx_layer_mapping == b'ByEdge':
+        blen_data = mesh.edges
+        ok_smooth = blen_read_geom_array_mapped_edge(
+            mesh, blen_data, "use_edge_sharp",
+            fbx_layer_data, None,
+            fbx_layer_mapping, fbx_layer_ref,
+            1, layer_id,
+            )
+        if ok_smooth:
+            # ugh, need to negate
+            for e in mesh.edges:
+                e.use_edge_sharp = not e.use_edge_sharp
+        return ok_smooth
+    elif fbx_layer_mapping == b'ByPolygon':
+        blen_data = mesh.polygons
+        return blen_read_geom_array_mapped_polygon(
+            mesh, blen_data, "use_smooth",
+            fbx_layer_data, None,
+            fbx_layer_mapping, fbx_layer_ref,
+            1, layer_id,
+            )
+    else:
+        print("warning layer %r mapping type unsupported: %r" % (fbx_layer.id, fbx_layer_mapping))
+        return False
+
+
 def blen_read_geom_layer_normal(fbx_obj, mesh):
     fbx_layer = elem_find_first(fbx_obj, b'LayerElementNormal')
 
@@ -479,8 +545,7 @@
 
     fbx_verts = elem_prop_first(elem_find_first(fbx_obj, b'Vertices'))
     fbx_polys = elem_prop_first(elem_find_first(fbx_obj, b'PolygonVertexIndex'))
-    # TODO
-    # fbx_edges = elem_prop_first(elem_find_first(fbx_obj, b'Edges'))
+    fbx_edges = elem_prop_first(elem_find_first(fbx_obj, b'Edges'))
 
     if fbx_verts is None:
         fbx_verts = ()
@@ -509,9 +574,16 @@
         mesh.polygons.foreach_set("loop_start", poly_loop_starts)
         mesh.polygons.foreach_set("loop_total", poly_loop_totals)
 
-        blen_read_geom_layer_materials(fbx_obj, mesh)
+        blen_read_geom_layer_material(fbx_obj, mesh)
         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)
+
+    # must be after edge, face loading.
+    ok_smooth = blen_read_geom_layer_smooth(fbx_obj, mesh)
+
     ok_normals = blen_read_geom_layer_normal(fbx_obj, mesh)
 
     mesh.validate()
@@ -519,6 +591,10 @@
     if not ok_normals:
         mesh.calc_normals()
 
+    if not ok_smooth:
+        for p in mesh.polygons:
+            p.use_smooth = True
+
     return mesh
 
 
@@ -700,7 +776,6 @@
         operator.report({'ERROR'}, "Version %r unsupported, must be %r or later" % (version, 7100))
         return {'CANCELLED'}
 
-    # so we can set smooth in object mode
     if bpy.ops.object.mode_set.poll():
         bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
 
@@ -912,11 +987,6 @@
 
                 objects.append(obj)
 
-        # until we load smoothing info
-        context_copy = context.copy()
-        context_copy["selected_editable_objects"] = objects
-        bpy.ops.object.shade_smooth(context_copy)
-
     _(); del _
 
     def _():



More information about the Bf-extensions-cvs mailing list