def init(self, context): if self.use_world_coords: if self.init_called[1]: return else: if self.init_called[0]: return bm = vabm.from_object( context.active_object, apply_modifiers=self.use_mirror_modifiers, settings="PREVIEW", modifier_types={"MIRROR"}, layer_name="original", add_faces_layers=True, ) vabm.LoopTris.index_update(bm) if self.use_world_coords: bm.transform(context.active_object.matrix_world) bm.normal_update() # 必要か? # LoopTris。要素の変更は無いのでキャッシュを有効にする loop_tris = LoopTris(bm) loop_tris.bm = bm loop_tris.vert_verts = vabm.vert_verts_dict(bm) memo = loop_tris.memoize memo.read = memo.write = True loop_tris.correct() # 編集中のbmeshの頂点インデックスから、modifier適用後のbmeshの頂点を # 参照する # vert用 loop_tris.derived_vert_from_original_index = d = {} layer = bm.verts.layers.int["original"] indices = set() for eve in bm.verts: i = eve[layer] if i != -1 and i not in indices: d[i] = eve indices.add(i) # face用 loop_tris.derived_face_from_original_index = d = {} layer = bm.faces.layers.int["original"] indices = set() for efa in bm.faces: i = efa[layer] if i != -1 and i not in indices: d[i] = efa indices.add(i) # --- Shift Outline --- loop_tris.eflags = eflags = {} for eed in bm.edges: flag = 0 selected = deselected = 0 for efa in eed.link_faces: if not efa.hide: if efa.select: selected += 1 else: deselected += 1 if eed.select and not eed.hide: if selected == 0 and deselected <= 2: flag = self.WIRE elif selected == 1 and deselected <= 1: flag = self.BORDER eflags[eed] = flag loop_tris.vflags = vflags = {} for eve in bm.verts: flag = 0 wire_num = border_num = 0 for eed in eve.link_edges: f = eflags[eed] if f & self.WIRE: wire_num += 1 elif f & self.BORDER: border_num += 1 if 1 <= wire_num <= 2 and border_num == 0: flag = self.WIRE elif wire_num == 0 and border_num == 2: flag = self.BORDER vflags[eve] = flag # --- Solidify --- # 頂点のhideとtriの面積により、法線計算に使えるか否かのフラグを付ける for eve in bm.verts: eve.tag = not eve.hide for tri in loop_tris: tri.tag = not tri[0].face.hide and tri.area > EPS if self.use_world_coords: self.init_called[1] = True self._loop_tris_world = loop_tris else: self._loop_tris = loop_tris self.init_called[0] = True