diff options
-rw-r--r-- | io_scene_obj/__init__.py | 2 | ||||
-rw-r--r-- | io_scene_obj/import_obj.py | 51 |
2 files changed, 38 insertions, 15 deletions
diff --git a/io_scene_obj/__init__.py b/io_scene_obj/__init__.py index 17ef0f48..e6452eb9 100644 --- a/io_scene_obj/__init__.py +++ b/io_scene_obj/__init__.py @@ -21,7 +21,7 @@ bl_info = { "name": "Wavefront OBJ format", "author": "Campbell Barton, Bastien Montagne", - "version": (2, 1, 1), + "version": (2, 1, 2), "blender": (2, 74, 0), "location": "File > Import-Export", "description": "Import-Export OBJ, Import OBJ mesh, UV's, " diff --git a/io_scene_obj/import_obj.py b/io_scene_obj/import_obj.py index 330e0694..458a73a6 100644 --- a/io_scene_obj/import_obj.py +++ b/io_scene_obj/import_obj.py @@ -369,7 +369,7 @@ def split_mesh(verts_loc, faces, unique_materials, filepath, SPLIT_OB_OR_GROUP): if not SPLIT_OB_OR_GROUP or not faces: # use the filename for the object name since we aren't chopping up the mesh. - return [(verts_loc, faces, unique_materials, filename)] + return [(verts_loc, faces, unique_materials, filename, bool(verts_nor), bool(verts_tex))] def key_to_name(key): # if the key is a tuple, join it to make a string @@ -388,12 +388,19 @@ def split_mesh(verts_loc, faces, unique_materials, filepath, SPLIT_OB_OR_GROUP): if oldkey != key: # Check the key has changed. - (verts_split, faces_split, - unique_materials_split, vert_remap) = face_split_dict.setdefault(key, ([], [], {}, {})) + (verts_split, faces_split, unique_materials_split, vert_remap, + use_verts_nor, use_verts_tex) = face_split_dict.setdefault(key, ([], [], {}, {}, [], [])) oldkey = key face_vert_loc_indices = face[0] + # In case a face only uses zero indices for vnors/vtex (aka UV), we assume it actually does not use those... + if not use_verts_nor and face[1]: + use_verts_nor.append(True) + + if not use_verts_tex and face[2]: + use_verts_tex.append(True) + # Remap verts to new vert list and add where needed for enum, i in enumerate(face_vert_loc_indices): map_index = vert_remap.get(i) @@ -411,8 +418,9 @@ def split_mesh(verts_loc, faces, unique_materials, filepath, SPLIT_OB_OR_GROUP): faces_split.append(face) # remove one of the items and reorder - return [(verts_split, faces_split, unique_materials_split, key_to_name(key)) - for key, (verts_split, faces_split, unique_materials_split, _) in face_split_dict.items()] + return [(verts_split, faces_split, unique_materials_split, key_to_name(key), bool(use_vnor), bool(use_vtex)) + for key, (verts_split, faces_split, unique_materials_split, _, use_vnor, use_vtex) + in face_split_dict.items()] def create_mesh(new_objects, @@ -459,7 +467,8 @@ def create_mesh(new_objects, if len_face_vert_loc_indices == 1: faces.pop(f_idx) # cant add single vert faces - elif not face_vert_tex_indices or len_face_vert_loc_indices == 2: # faces that have no texture coords are lines + # Face with a single item in face_vert_nor_indices is actually a polyline! + elif len(face_vert_nor_indices) == 1 or len_face_vert_loc_indices == 2: if use_edges: edges.extend((face_vert_loc_indices[i], face_vert_loc_indices[i + 1]) for i in range(len_face_vert_loc_indices - 1)) @@ -490,11 +499,11 @@ def create_mesh(new_objects, [face_vert_nor_indices[ngon[0]], face_vert_nor_indices[ngon[1]], face_vert_nor_indices[ngon[2]], - ], + ] if face_vert_nor_indices else [], [face_vert_tex_indices[ngon[0]], face_vert_tex_indices[ngon[1]], face_vert_tex_indices[ngon[2]], - ], + ] if face_vert_tex_indices else [], context_material, context_smooth_group, context_object, @@ -600,11 +609,11 @@ def create_mesh(new_objects, context_material_old = context_material blen_poly.material_index = mat - if verts_nor: + if verts_nor and face_vert_nor_indices: for face_noidx, lidx in zip(face_vert_nor_indices, blen_poly.loop_indices): me.loops[lidx].normal[:] = verts_nor[face_noidx] - if verts_tex: + if verts_tex and face_vert_tex_indices: if context_material: image = unique_material_images[context_material] if image: # Can be none if the material dosnt have an image. @@ -865,6 +874,7 @@ def load(operator, context, filepath, face_vert_loc_indices = None face_vert_nor_indices = None face_vert_tex_indices = None + face_vert_nor_valid = face_vert_tex_valid = False face_items_usage = set() face_invalid_blenpoly = None prev_vidx = None @@ -930,6 +940,7 @@ def load(operator, context, filepath, if len(obj_vert) > 1 and obj_vert[1]: idx = int(obj_vert[1]) - 1 face_vert_tex_indices.append((idx + len(verts_tex) + 1) if (idx < 0) else idx) + face_vert_tex_valid = True else: # dummy face_vert_tex_indices.append(0) @@ -937,11 +948,19 @@ def load(operator, context, filepath, if len(obj_vert) > 2 and obj_vert[2]: idx = int(obj_vert[2]) - 1 face_vert_nor_indices.append((idx + len(verts_nor) + 1) if (idx < 0) else idx) + face_vert_nor_valid = True else: # dummy face_vert_nor_indices.append(0) if not context_multi_line: + # Clear nor/tex indices in case we had none defined for this face. + if not face_vert_nor_valid: + face_vert_nor_indices.clear() + if not face_vert_tex_valid: + face_vert_tex_indices.clear() + face_vert_nor_valid = face_vert_tex_valid = False + # Means we have finished a face, we have to do final check if ngon is suspected to be blender-invalid... if face_invalid_blenpoly: face_invalid_blenpoly.clear() @@ -962,8 +981,11 @@ def load(operator, context, filepath, # Instantiate a face face = create_face(context_material, context_smooth_group, context_object) face_vert_loc_indices = face[0] + # XXX A bit hackish, we use special 'value' of face_vert_nor_indices (a single True item) to tag this + # as a polyline, and not a regular face... + face[1][:] = [True] faces.append(face) - # Else, use face_vert_loc_indices and face_vert_tex_indices previously defined and used the obj_face + # Else, use face_vert_loc_indices previously defined and used the obj_face context_multi_line = b'l' if strip_slash(line_split) else b'' @@ -1087,13 +1109,14 @@ def load(operator, context, filepath, SPLIT_OB_OR_GROUP = bool(use_split_objects or use_split_groups) for data in split_mesh(verts_loc, faces, unique_materials, filepath, SPLIT_OB_OR_GROUP): - verts_loc_split, faces_split, unique_materials_split, dataname = data + verts_loc_split, faces_split, unique_materials_split, dataname, use_vnor, use_vtex = data # Create meshes from the data, warning 'vertex_groups' wont support splitting + #~ print(dataname, use_vnor, use_vtex) create_mesh(new_objects, use_edges, verts_loc_split, - verts_nor, - verts_tex, + verts_nor if use_vnor else [], + verts_tex if use_vtex else [], faces_split, unique_materials_split, unique_material_images, |