diff --git a/io_scene_fbx/import_fbx.py b/io_scene_fbx/import_fbx.py index cc299db822ed13efd6cf64e6d17d3b6e6ab2021e..c3be7369279b5876f207d0bb6fa557eedf5a8a2b 100644 --- a/io_scene_fbx/import_fbx.py +++ b/io_scene_fbx/import_fbx.py @@ -327,7 +327,7 @@ def blen_read_geom_array_mapped_vert( mesh, blen_data, blend_attr, fbx_layer_data, fbx_layer_index, fbx_layer_mapping, fbx_layer_ref, - stride, descr, + stride, item_size, descr, ): # TODO, generic mapping apply function if fbx_layer_mapping == b'ByVertice': @@ -335,7 +335,8 @@ def blen_read_geom_array_mapped_vert( assert(fbx_layer_index is None) # TODO, more generic support for mapping types for i, blen_data_item in enumerate(blen_data): - setattr(blen_data_item, blend_attr, fbx_layer_data[(i * stride): (i * stride) + stride]) + setattr(blen_data_item, blend_attr, + fbx_layer_data[(i * stride): (i * stride) + item_size]) return True else: print("warning layer %r ref type unsupported: %r" % (descr, fbx_layer_ref)) @@ -349,17 +350,19 @@ 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, + stride, item_size, 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]) + 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]) + setattr(blen_data_item, blend_attr, + fbx_layer_data[(i * stride): (i * stride) + item_size]) return True else: print("warning layer %r ref type unsupported: %r" % (descr, fbx_layer_ref)) @@ -373,17 +376,19 @@ def blen_read_geom_array_mapped_polygon( mesh, blen_data, blend_attr, fbx_layer_data, fbx_layer_index, fbx_layer_mapping, fbx_layer_ref, - stride, descr, + stride, item_size, descr, ): if fbx_layer_mapping == b'ByPolygon': if fbx_layer_ref == b'IndexToDirect': if stride == 1: for i, blen_data_item in enumerate(blen_data): - setattr(blen_data_item, blend_attr, fbx_layer_data[i]) + 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]) + setattr(blen_data_item, blend_attr, + fbx_layer_data[(i * stride): (i * stride) + item_size]) return True elif fbx_layer_ref == b'Direct': # looks like direct may have different meanings! @@ -403,14 +408,15 @@ def blen_read_geom_array_mapped_polyloop( mesh, blen_data, blend_attr, fbx_layer_data, fbx_layer_index, fbx_layer_mapping, fbx_layer_ref, - stride, descr, + stride, item_size, 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): - setattr(blen_data[i], blend_attr, fbx_layer_data[(j * stride): (j * stride) + stride]) + setattr(blen_data[i], blend_attr, + fbx_layer_data[(j * stride): (j * stride) + item_size]) return True else: print("warning layer %r ref type unsupported: %r" % (descr, fbx_layer_ref)) @@ -422,7 +428,8 @@ def blen_read_geom_array_mapped_polyloop( for p in polygons: for i in p.loop_indices: j = loops[i].vertex_index - setattr(blen_data[i], blend_attr, fbx_layer_data[(j * stride): (j * stride) + stride]) + setattr(blen_data[i], blend_attr, + fbx_layer_data[(j * stride): (j * stride) + item_size]) else: print("warning layer %r ref type unsupported: %r" % (descr, fbx_layer_ref)) else: @@ -442,6 +449,10 @@ 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)) @@ -450,7 +461,7 @@ def blen_read_geom_layer_material(fbx_obj, mesh): mesh, blen_data, "material_index", fbx_layer_data, None, fbx_layer_mapping, fbx_layer_ref, - 1, layer_id, + 1, 1, layer_id, ) @@ -474,10 +485,34 @@ def blen_read_geom_layer_uv(fbx_obj, mesh): mesh, blen_data, "uv", fbx_layer_data, fbx_layer_index, fbx_layer_mapping, fbx_layer_ref, - 2, layer_id, + 2, 2, layer_id, ) +def blen_read_geom_layer_color(fbx_obj, mesh): + # almost same as UV's + for layer_id in (b'LayerElementColor',): + for fbx_layer in elem_find_iter(fbx_obj, layer_id): + # all should be valid + (fbx_layer_name, + fbx_layer_mapping, + fbx_layer_ref, + ) = blen_read_geom_layerinfo(fbx_layer) + + fbx_layer_data = elem_prop_first(elem_find_first(fbx_layer, b'Colors')) + fbx_layer_index = elem_prop_first(elem_find_first(fbx_layer, b'ColorIndex')) + + color_lay = mesh.vertex_colors.new(name=fbx_layer_name) + blen_data = color_lay.data[:] + + # ignore alpha layer (read 4 items into 3) + blen_read_geom_array_mapped_polyloop( + mesh, blen_data, "color", + fbx_layer_data, fbx_layer_index, + fbx_layer_mapping, fbx_layer_ref, + 4, 3, layer_id, + ) + def blen_read_geom_layer_smooth(fbx_obj, mesh): fbx_layer = elem_find_first(fbx_obj, b'LayerElementSmoothing') @@ -507,7 +542,7 @@ def blen_read_geom_layer_smooth(fbx_obj, mesh): mesh, blen_data, "use_edge_sharp", fbx_layer_data, None, fbx_layer_mapping, fbx_layer_ref, - 1, layer_id, + 1, 1, layer_id, ) if ok_smooth: # ugh, need to negate @@ -520,7 +555,7 @@ def blen_read_geom_layer_smooth(fbx_obj, mesh): mesh, blen_data, "use_smooth", fbx_layer_data, None, fbx_layer_mapping, fbx_layer_ref, - 1, layer_id, + 1, 1, layer_id, ) else: print("warning layer %r mapping type unsupported: %r" % (fbx_layer.id, fbx_layer_mapping)) @@ -547,7 +582,7 @@ def blen_read_geom_layer_normal(fbx_obj, mesh): mesh, blen_data, "normal", fbx_layer_data, None, fbx_layer_mapping, fbx_layer_ref, - 3, layer_id, + 3, 3, layer_id, ) @@ -590,6 +625,7 @@ def blen_read_geom(fbx_tmpl, fbx_obj): blen_read_geom_layer_material(fbx_obj, mesh) blen_read_geom_layer_uv(fbx_obj, mesh) + blen_read_geom_layer_color(fbx_obj, mesh) if fbx_edges: # workaround for odd number of edge vertices