[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