diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2015-02-04 17:38:52 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2015-02-04 17:38:52 +0300 |
commit | fa3b54a975fd4204ffe9ad502b1f4b4035219260 (patch) | |
tree | 9c501df447e50cf2672045a0f78340732f98f60d /io_scene_fbx | |
parent | 6a090568c38e4fe6d6d096681de59ca940a054ba (diff) |
FBX import: fix for previous change to `elem_find_first_bytes`, add new `elem_find_first_string_as_bytes`, and remove exception for AllSame mapping...
Diffstat (limited to 'io_scene_fbx')
-rw-r--r-- | io_scene_fbx/import_fbx.py | 50 |
1 files changed, 43 insertions, 7 deletions
diff --git a/io_scene_fbx/import_fbx.py b/io_scene_fbx/import_fbx.py index 67dfd845..a31c10b3 100644 --- a/io_scene_fbx/import_fbx.py +++ b/io_scene_fbx/import_fbx.py @@ -81,6 +81,15 @@ def elem_find_first_string(elem, id_search): return None +def elem_find_first_string_as_bytes(elem, id_search): + fbx_item = elem_find_first(elem, id_search) + if fbx_item is not None: + assert(len(fbx_item.props) == 1) + assert(fbx_item.props_type[0] == data_types.STRING) + return fbx_item.props[0] # Keep it as bytes as requested... + return None + + def elem_find_first_bytes(elem, id_search, decode=True): fbx_item = elem_find_first(elem, id_search) if fbx_item is not None: @@ -684,8 +693,8 @@ def blen_read_animations(fbx_tmpl_astack, fbx_tmpl_alayer, stacks, scene): def blen_read_geom_layerinfo(fbx_layer): return ( elem_find_first_string(fbx_layer, b'Name'), - elem_find_first_string(fbx_layer, b'MappingInformationType'), - elem_find_first_string(fbx_layer, b'ReferenceInformationType'), + elem_find_first_string_as_bytes(fbx_layer, b'MappingInformationType'), + elem_find_first_string_as_bytes(fbx_layer, b'ReferenceInformationType'), ) @@ -706,6 +715,10 @@ def blen_read_geom_array_setattr(generator, blen_data, blen_attr, fbx_data, stri # generic generators. +def blen_read_geom_array_gen_allsame(data_len): + return zip(*(range(data_len), (0,) * data_len)) + + def blen_read_geom_array_gen_direct(fbx_data, stride): fbx_data_len = len(fbx_data) return zip(*(range(fbx_data_len // stride), range(0, fbx_data_len, stride))) @@ -748,6 +761,13 @@ def blen_read_geom_array_mapped_vert( blen_data, blen_attr, fbx_layer_data, stride, item_size, descr, xform) return True blen_read_geom_array_error_ref(descr, fbx_layer_ref) + elif fbx_layer_mapping == b'AllSame': + if fbx_layer_ref == b'IndexToDirect': + assert(fbx_layer_index is None) + blen_read_geom_array_setattr(blen_read_geom_array_gen_allsame(len(blen_data)), + blen_data, blen_attr, fbx_layer_data, stride, item_size, descr, xform) + return True + blen_read_geom_array_error_ref(descr, fbx_layer_ref) else: blen_read_geom_array_error_mapping(descr, fbx_layer_mapping) @@ -767,6 +787,13 @@ def blen_read_geom_array_mapped_edge( blen_data, blen_attr, fbx_layer_data, stride, item_size, descr, xform) return True blen_read_geom_array_error_ref(descr, fbx_layer_ref) + elif fbx_layer_mapping == b'AllSame': + if fbx_layer_ref == b'IndexToDirect': + assert(fbx_layer_index is None) + blen_read_geom_array_setattr(blen_read_geom_array_gen_allsame(len(blen_data)), + blen_data, blen_attr, fbx_layer_data, stride, item_size, descr, xform) + return True + blen_read_geom_array_error_ref(descr, fbx_layer_ref) else: blen_read_geom_array_error_mapping(descr, fbx_layer_mapping) @@ -797,6 +824,13 @@ def blen_read_geom_array_mapped_polygon( blen_data, blen_attr, fbx_layer_data, stride, item_size, descr, xform) return True blen_read_geom_array_error_ref(descr, fbx_layer_ref) + elif fbx_layer_mapping == b'AllSame': + if fbx_layer_ref == b'IndexToDirect': + assert(fbx_layer_index is None) + blen_read_geom_array_setattr(blen_read_geom_array_gen_allsame(len(blen_data)), + blen_data, blen_attr, fbx_layer_data, stride, item_size, descr, xform) + return True + blen_read_geom_array_error_ref(descr, fbx_layer_ref) else: blen_read_geom_array_error_mapping(descr, fbx_layer_mapping) @@ -824,6 +858,13 @@ def blen_read_geom_array_mapped_polyloop( blen_data, blen_attr, fbx_layer_data, stride, item_size, descr, xform) return True blen_read_geom_array_error_ref(descr, fbx_layer_ref) + elif fbx_layer_mapping == b'AllSame': + if fbx_layer_ref == b'IndexToDirect': + assert(fbx_layer_index is None) + blen_read_geom_array_setattr(blen_read_geom_array_gen_allsame(len(blen_data)), + blen_data, blen_attr, fbx_layer_data, stride, item_size, descr, xform) + return True + blen_read_geom_array_error_ref(descr, fbx_layer_ref) else: blen_read_geom_array_error_mapping(descr, fbx_layer_mapping) @@ -841,10 +882,6 @@ def blen_read_geom_layer_material(fbx_obj, mesh): fbx_layer_ref, ) = blen_read_geom_layerinfo(fbx_layer) - if fbx_layer_mapping == b'AllSame': - # only to quiet warning - return - layer_id = b'Materials' fbx_layer_data = elem_prop_first(elem_find_first(fbx_layer, layer_id)) @@ -1234,7 +1271,6 @@ def blen_read_texture_image(fbx_tmpl, fbx_obj, basedir, settings): data = elem_find_first_bytes(fbx_obj, b'Content') if (data): data_len = len(data) - print(data_len) if (data_len): image.pack(data=data, data_len=data_len) |