diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2015-02-22 12:23:05 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2015-02-22 12:23:05 +0300 |
commit | dbf6ce9318fd19f6e579569ed9f3480ede6c576f (patch) | |
tree | 9fa3e51c1463d8f69693341868890cbce9987a01 /io_scene_fbx | |
parent | 31e93af167e38459e9e34c041f14e3107feee8af (diff) |
FBX import: also import 'polygon' normals as custom lnors.
Some FBX files store their normals as polygon ones (flat shading...).
Note this code becomes a bit messy, will need some cleanup!
Diffstat (limited to 'io_scene_fbx')
-rw-r--r-- | io_scene_fbx/import_fbx.py | 61 |
1 files changed, 45 insertions, 16 deletions
diff --git a/io_scene_fbx/import_fbx.py b/io_scene_fbx/import_fbx.py index 957f7d2d..48943d36 100644 --- a/io_scene_fbx/import_fbx.py +++ b/io_scene_fbx/import_fbx.py @@ -717,17 +717,40 @@ def blen_read_geom_array_setattr(generator, blen_data, blen_attr, fbx_data, stri return False if xform is not None: - for blen_idx, fbx_idx in generator: - if check_skip(blen_idx, fbx_idx): - continue - setattr(blen_data[blen_idx], blen_attr, - xform(fbx_data[fbx_idx] if (item_size == 1) else fbx_data[fbx_idx:fbx_idx + item_size])) + if isinstance(blen_data, list): + if item_size == 1: + def _process(blend_data, blen_attr, xform, item_size, blen_idx, fbx_idx): + blen_data[blen_idx] = xform(fbx_data[fbx_idx]) + else: + def _process(blend_data, blen_attr, xform, item_size, blen_idx, fbx_idx): + blen_data[blen_idx] = xform(fbx_data[fbx_idx:fbx_idx + item_size]) + else: + if item_size == 1: + def _process(blend_data, blen_attr, xform, item_size, blen_idx, fbx_idx): + setattr(blen_data[blen_idx], blen_attr, xform(fbx_data[fbx_idx])) + else: + def _process(blend_data, blen_attr, xform, item_size, blen_idx, fbx_idx): + setattr(blen_data[blen_idx], blen_attr, xform(fbx_data[fbx_idx:fbx_idx + item_size])) else: - for blen_idx, fbx_idx in generator: - if check_skip(blen_idx, fbx_idx): - continue - setattr(blen_data[blen_idx], blen_attr, - fbx_data[fbx_idx] if (item_size == 1) else fbx_data[fbx_idx:fbx_idx + item_size]) + if isinstance(blen_data, list): + if item_size == 1: + def _process(blend_data, blen_attr, xform, item_size, blen_idx, fbx_idx): + blen_data[blen_idx] = fbx_data[fbx_idx] + else: + def _process(blend_data, blen_attr, xform, item_size, blen_idx, fbx_idx): + blen_data[blen_idx] = fbx_data[fbx_idx:fbx_idx + item_size] + else: + if item_size == 1: + def _process(blend_data, blen_attr, xform, item_size, blen_idx, fbx_idx): + setattr(blen_data[blen_idx], blen_attr, fbx_data[fbx_idx]) + else: + def _process(blend_data, blen_attr, xform, item_size, blen_idx, fbx_idx): + setattr(blen_data[blen_idx], blen_attr, fbx_data[fbx_idx:fbx_idx + item_size]) + + for blen_idx, fbx_idx in generator: + if check_skip(blen_idx, fbx_idx): + continue + _process(blen_data, blen_attr, xform, item_size, blen_idx, fbx_idx) # generic generators. @@ -1046,15 +1069,21 @@ def blen_read_geom_layer_normal(fbx_obj, mesh, xform=None): fbx_layer_index = elem_prop_first(elem_find_first(fbx_layer, b'NormalsIndex')) # try loops, then vertices. - tries = ((mesh.loops, blen_read_geom_array_mapped_polyloop), - (mesh.vertices, blen_read_geom_array_mapped_vert)) - for blen_data, func in tries: - if func(mesh, blen_data, "normal", + tries = ((mesh.loops, False, blen_read_geom_array_mapped_polyloop), + (mesh.polygons, True, blen_read_geom_array_mapped_polygon), + (mesh.vertices, True, blen_read_geom_array_mapped_vert)) + for blen_data, is_fake, func in tries: + bdata = [None] * len(blen_data) if is_fake else blen_data + if func(mesh, bdata, "normal", fbx_layer_data, fbx_layer_index, fbx_layer_mapping, fbx_layer_ref, 3, 3, layer_id, xform): - if blen_data == mesh.vertices: + if blen_data is mesh.polygons: + for pidx, p in enumerate(mesh.polygons): + for lidx in range(p.loop_start, p.loop_start + p.loop_total): + mesh.loops[lidx].normal[:] = bdata[pidx] + elif blen_data is mesh.vertices: # We have to copy vnors to lnors! Far from elegant, but simple. for l in mesh.loops: - l.normal[:] = mesh.vertices[l.vertex_index].normal + l.normal[:] = bdata[l.vertex_index] return True return False |