Skip to content
Snippets Groups Projects
import_obj.py 47.8 KiB
Newer Older
  • Learn to ignore specific revisions
  •                     context_multi_line = b'l' if strip_slash(line_split) else b''
    
                        for v in line_split:
                            obj_vert = v.split(b'/')
                            idx = int(obj_vert[0]) - 1
                            face_vert_loc_indices.append((idx + len(verts_loc) + 1) if (idx < 0) else idx)
    
                    elif line_start == b's':
                        if use_smooth_groups:
                            context_smooth_group = line_value(line_split)
                            if context_smooth_group == b'off':
                                context_smooth_group = None
                            elif context_smooth_group:  # is not None
                                unique_smooth_groups[context_smooth_group] = None
    
                    elif line_start == b'o':
                        if use_split_objects:
                            context_object = line_value(line_split)
                            # unique_obects[context_object]= None
    
                    elif line_start == b'g':
                        if use_split_groups:
                            context_object = line_value(line.split())
                            # print 'context_object', context_object
                            # unique_obects[context_object]= None
                        elif use_groups_as_vgroups:
                            context_vgroup = line_value(line.split())
                            if context_vgroup and context_vgroup != b'(null)':
                                vertex_groups.setdefault(context_vgroup, [])
                            else:
                                context_vgroup = None  # dont assign a vgroup
    
                    elif line_start == b'usemtl':
                        context_material = line_value(line.split())
                        unique_materials[context_material] = None
                    elif line_start == b'mtllib':  # usemap or usemat
                        # can have multiple mtllib filenames per line, mtllib can appear more than once,
                        # so make sure only occurrence of material exists
                        material_libs = list(set(material_libs) | set(line.split()[1:]))
    
                        # Nurbs support
                    elif line_start == b'cstype':
                        context_nurbs[b'cstype'] = line_value(line.split())  # 'rat bspline' / 'bspline'
                    elif line_start == b'curv' or context_multi_line == b'curv':
                        curv_idx = context_nurbs[b'curv_idx'] = context_nurbs.get(b'curv_idx', [])  # in case were multiline
    
                        if not context_multi_line:
                            context_nurbs[b'curv_range'] = float_func(line_split[1]), float_func(line_split[2])
                            line_split[0:3] = []  # remove first 3 items
    
                        if strip_slash(line_split):
                            context_multi_line = b'curv'
                        else:
                            context_multi_line = b''
    
                        for i in line_split:
                            vert_loc_index = int(i) - 1
    
                            if vert_loc_index < 0:
                                vert_loc_index = len(verts_loc) + vert_loc_index + 1
    
                            curv_idx.append(vert_loc_index)
    
                    elif line_start == b'parm' or context_multi_line == b'parm':
                        if context_multi_line:
                            context_multi_line = b''
    
                            context_parm = line_split[1]
                            line_split[0:2] = []  # remove first 2
    
                        if strip_slash(line_split):
                            context_multi_line = b'parm'
                        else:
                            context_multi_line = b''
    
                        if context_parm.lower() == b'u':
                            context_nurbs.setdefault(b'parm_u', []).extend([float_func(f) for f in line_split])
                        elif context_parm.lower() == b'v':  # surfaces not supported yet
                            context_nurbs.setdefault(b'parm_v', []).extend([float_func(f) for f in line_split])
                        # else: # may want to support other parm's ?
    
                    elif line_start == b'deg':
                        context_nurbs[b'deg'] = [int(i) for i in line.split()[1:]]
                    elif line_start == b'end':
                        # Add the nurbs curve
                        if context_object:
                            context_nurbs[b'name'] = context_object
                        nurbs.append(context_nurbs)
                        context_nurbs = {}
                        context_parm = b''
    
                    ''' # How to use usemap? depricated?
                    elif line_start == b'usema': # usemap or usemat
                        context_image= line_value(line_split)
                    '''
    
            progress.step("Done, loading materials and images...")
    
            create_materials(filepath.encode(), relpath, material_libs, unique_materials,
                             unique_material_images, use_image_search, float_func)
    
            progress.step("Done, building geometries (verts:%i faces:%i materials: %i smoothgroups:%i) ..." %
                          (len(verts_loc), len(faces), len(unique_materials), len(unique_smooth_groups)))
    
            # deselect all
            if bpy.ops.object.select_all.poll():
                bpy.ops.object.select_all(action='DESELECT')
    
            scene = context.scene
            new_objects = []  # put new objects here
    
            # Split the mesh by objects/materials, may
            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, 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 if use_vnor else [],
                            verts_tex if use_vtex else [],
                            faces_split,
                            unique_materials_split,
                            unique_material_images,
                            unique_smooth_groups,
                            vertex_groups,
                            dataname,
                            )
    
            # nurbs support
            for context_nurbs in nurbs:
                create_nurbs(context_nurbs, verts_loc, new_objects)
    
            # Create new obj
            for obj in new_objects:
                base = scene.objects.link(obj)
                base.select = True
    
                # we could apply this anywhere before scaling.
                obj.matrix_world = global_matrix
    
            axis_min = [1000000000] * 3
            axis_max = [-1000000000] * 3
    
            if global_clamp_size:
                # Get all object bounds
                for ob in new_objects:
                    for v in ob.bound_box:
                        for axis, value in enumerate(v):
                            if axis_min[axis] > value:
                                axis_min[axis] = value
                            if axis_max[axis] < value:
                                axis_max[axis] = value
    
                # Scale objects
                max_axis = max(axis_max[0] - axis_min[0], axis_max[1] - axis_min[1], axis_max[2] - axis_min[2])
                scale = 1.0
    
                while global_clamp_size < max_axis * scale:
                    scale = scale / 10.0
    
                for obj in new_objects:
                    obj.scale = scale, scale, scale
    
            progress.leave_substeps("Done.")
            progress.leave_substeps("Finished importing: %r" % filepath)