[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [4670] trunk/py/scripts/addons/ io_scene_fbx/import_fbx.py: add support for reading vertex normals
Campbell Barton
ideasman42 at gmail.com
Mon Aug 12 04:59:36 CEST 2013
Revision: 4670
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=4670
Author: campbellbarton
Date: 2013-08-12 02:59:35 +0000 (Mon, 12 Aug 2013)
Log Message:
-----------
add support for reading vertex normals
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-12 01:52:58 UTC (rev 4669)
+++ trunk/py/scripts/addons/io_scene_fbx/import_fbx.py 2013-08-12 02:59:35 UTC (rev 4670)
@@ -70,16 +70,12 @@
def elem_split_name_class(elem):
- """ Return
- """
assert(elem.props_type[-2] == data_types.STRING)
elem_name, elem_class = elem.props[-2].split(b'\x00\x01')
return elem_name, elem_class
def elem_split_name_class_nodeattr(elem):
- """ Return
- """
assert(elem.props_type[-2] == data_types.STRING)
elem_name, elem_class = elem.props[-2].split(b'\x00\x01')
assert(elem_class == b'NodeAttribute')
@@ -206,7 +202,7 @@
# ----
# Misc Attributes
- obj.color = elem_props_get_color_rgb(fbx_props, b'Color', (0.8, 0.8, 0.8))
+ obj.color[0:3] = elem_props_get_color_rgb(fbx_props, b'Color', (0.8, 0.8, 0.8))
# ----
# Transformation
@@ -229,11 +225,12 @@
pst_rot = elem_props_get_vector_3d(fbx_props, b'PostRotation', const_vector_zero_3d)
rot_ord = {
0: 'XYZ',
- 1: 'XZY',
- 2: 'YZX',
- 3: 'YXZ',
- 4: 'ZXY',
- 5: 'ZYX',
+ 1: 'XYZ',
+ 2: 'XZY',
+ 3: 'YZX',
+ 4: 'YXZ',
+ 5: 'ZXY',
+ 6: 'ZYX',
}.get(elem_props_get_enum(fbx_props, b'RotationOrder', 0))
else:
pre_rot = const_vector_zero_3d
@@ -296,41 +293,102 @@
)
-def blen_read_geom_uv(fbx_obj, mesh):
+def blen_read_geom_array_mapped_vert(
+ blen_data,
+ fbx_layer_data, fbx_layer_index,
+ fbx_layer_mapping, fbx_layer_ref,
+ stride, descr,
+ ):
+ # TODO, generic mapping apply function
+ if fbx_layer_mapping == b'ByVertice':
+ if fbx_layer_ref == b'Direct':
+ assert(fbx_layer_index is None)
+ # TODO, more generic support for mapping types
+ for i, blen_data_item in enumerate(blen_data):
+ blen_data_item[:] = 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))
- for uvlayer_id in (b'LayerElementUV',):
- fbx_uvlayer = elem_find_first(fbx_obj, uvlayer_id)
+ return False
- if fbx_uvlayer is None:
+
+def blen_read_geom_array_mapped_poly(
+ blen_data,
+ fbx_layer_data, fbx_layer_index,
+ fbx_layer_mapping, fbx_layer_ref,
+ stride, descr,
+ ):
+
+ if fbx_layer_mapping == b'ByPolygonVertex':
+ if fbx_layer_ref == b'IndexToDirect':
+ assert(fbx_layer_index is not None)
+ for i, j in enumerate(fbx_layer_index):
+ blen_data[i][:] = fbx_layer_data[(j * stride): (j * 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_layer_uv(fbx_obj, mesh):
+
+ for layer_id in (b'LayerElementUV',):
+ fbx_layer = elem_find_first(fbx_obj, layer_id)
+
+ if fbx_layer is None:
continue
# all should be valid
- (fbx_uvlayer_name,
- fbx_uvlayer_mapping,
- fbx_uvlayer_ref,
- ) = blen_read_geom_layerinfo(fbx_uvlayer)
+ (fbx_layer_name,
+ fbx_layer_mapping,
+ fbx_layer_ref,
+ ) = blen_read_geom_layerinfo(fbx_layer)
- # print(fbx_uvlayer_name, fbx_uvlayer_mapping, fbx_uvlayer_ref)
+ fbx_layer_data = elem_prop_first(elem_find_first(fbx_layer, b'UV'))
+ fbx_layer_index = elem_prop_first(elem_find_first(fbx_layer, b'UVIndex'))
- fbx_layer_data = elem_prop_first(elem_find_first(fbx_uvlayer, b'UV'))
- fbx_layer_index = elem_prop_first(elem_find_first(fbx_uvlayer, b'UVIndex'))
+ uv_tex = mesh.uv_textures.new(name=fbx_layer_name)
+ uv_lay = mesh.uv_layers[fbx_layer_name]
+ blen_data = [luv.uv for luv in uv_lay.data]
- # TODO, generic mappuing apply function
- if fbx_uvlayer_mapping == b'ByPolygonVertex':
- if fbx_uvlayer_ref == b'IndexToDirect':
- # TODO, more generic support for mapping types
- uv_tex = mesh.uv_textures.new(name=fbx_uvlayer_name)
- uv_lay = mesh.uv_layers[fbx_uvlayer_name]
- uv_data = [luv.uv for luv in uv_lay.data]
+ blen_read_geom_array_mapped_poly(
+ blen_data,
+ fbx_layer_data, fbx_layer_index,
+ fbx_layer_mapping, fbx_layer_ref,
+ 2, layer_id,
+ )
- for i, j in enumerate(fbx_layer_index):
- uv_data[i][:] = fbx_layer_data[(j * 2): (j * 2) + 2]
- else:
- print("warning uv layer ref type unsupported:", fbx_uvlayer_ref)
- else:
- print("warning uv layer mapping type unsupported:", fbx_uvlayer_mapping)
+def blen_read_geom_layer_normal(fbx_obj, mesh):
+ fbx_layer = elem_find_first(fbx_obj, b'LayerElementNormal')
+ if fbx_layer is None:
+ return False
+
+ (fbx_layer_name,
+ fbx_layer_mapping,
+ fbx_layer_ref,
+ ) = blen_read_geom_layerinfo(fbx_layer)
+
+ layer_id = b'Normals'
+ fbx_layer_data = elem_prop_first(elem_find_first(fbx_layer, layer_id))
+
+ blen_data = [v.normal for v in mesh.vertices]
+
+ return blen_read_geom_array_mapped_vert(
+ blen_data,
+ fbx_layer_data, None,
+ fbx_layer_mapping, fbx_layer_ref,
+ 3, layer_id,
+ )
+
+
def blen_read_geom(fbx_obj):
elem_name, elem_class = elem_split_name_class(fbx_obj)
assert(elem_class == b'Geometry')
@@ -370,11 +428,15 @@
mesh.polygons.foreach_set("loop_start", poly_loop_starts)
mesh.polygons.foreach_set("loop_total", poly_loop_totals)
- blen_read_geom_uv(fbx_obj, mesh)
+ blen_read_geom_layer_uv(fbx_obj, mesh)
+ ok_normals = blen_read_geom_layer_normal(fbx_obj, mesh)
+
mesh.validate()
- mesh.calc_normals()
+ if not ok_normals:
+ mesh.calc_normals()
+
return mesh
More information about the Bf-extensions-cvs
mailing list