def inset_faces_individual_multiple_values(verts, faces, thicknesses, depths, edges=None, face_mask=None, props=None): # It generate Bmesh per one face, inset face into it and merge the Bmesh to output Bmesh if props is None: props = set('use_even_offset') if not face_mask: iter_face_mask = cycle([True]) else: iter_face_mask = chain(face_mask, cycle([face_mask[-1]])) verts_number = 0 iter_thick = chain(thicknesses, cycle([thicknesses[-1]])) iter_depth = chain(depths, cycle([depths[-1]])) bm_out = bmesh.new() sv = bm_out.faces.layers.int.new('sv') mask = bm_out.faces.layers.int.new('mask') for i, (f, m, t, d) in enumerate(zip(faces, iter_face_mask, iter_thick, iter_depth)): # each instance of bmesh get a lot of operative memory, they should be illuminated as fast as possible bm = bmesh_from_sv([verts[i] for i in f], [list(range(len(f)))], face_int_layers={'sv': [i], 'mask': None}) mask = bm.faces.layers.int.get('mask') if m and (t or d): res = inset_individual(bm, faces=list(bm.faces), thickness=t, depth=d, use_even_offset='use_even_offset' in props, use_interpolate=True, use_relative_offset='use_relative_offset' in props) for rf in res['faces']: rf[mask] = 1 else: for face in bm.faces: face[mask] = 2 verts_number += merge_bmeshes(bm_out, verts_number, bm) bm.free() remove_doubles(bm_out, verts=bm_out.verts, dist=1e-6) return bm_out
def inset_faces_individual_one_value(verts, faces, thickness, depth, edges=None, face_mask=None, props=None): # It calling Bmesh function with one value of thickness and depth for all faces if props is None: props = set('use_even_offset') if not face_mask: face_mask = cycle([True]) else: face_mask = [m for m, _ in zip(chain(face_mask, cycle([face_mask[-1]])), range(len(faces)))] bm = bmesh_from_sv(verts, faces, edges, face_int_layers={'sv': list(range(len(faces))), 'mask': None}) mask = bm.faces.layers.int.get('mask') for face, m in zip(list(bm.faces), face_mask): if not m: face[mask] = 2 if thickness or depth: # it is creates new faces anyway even if all values are zero # returns faces without inner one # use_interpolate: Interpolate mesh data: e.g. UV’s, vertex colors, weights, etc. res = inset_individual(bm, faces=[f for f, m in zip(list(bm.faces), face_mask) if m], thickness=thickness, depth=depth, use_even_offset='use_even_offset' in props, use_interpolate=True, use_relative_offset='use_relative_offset' in props) for rf in res['faces']: rf[mask] = 1 return bm