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