{"path": "tools\\blender\\meshy_old_port\\reskin.py", "sha256": "de60e67a5981b781c8d3a627a1531bb9d98debc4656b7ad0d2beeb999ebee37a", "replacements": [{"old": "    # Stone: cut the surface along block borders so each block moves as one rigid piece. A face takes\n    # the bone most of its corners follow; edges between faces of different bones are split, and every\n    # vertex then follows its faces' bone alone. Blocks part slightly at the joints instead of smearing.\n    bm = bmesh.new(); bm.from_mesh(me.data)\n    deform = bm.verts.layers.deform.verify()\n    def bone_of(vert):\n        d = vert[deform]\n        return max(d.items(), key=lambda kv: kv[1])[0] if d else -1\n    face_bone = {}\n    for f in bm.faces:\n        votes = collections.Counter(bone_of(v) for v in f.verts)\n        face_bone[f.index] = votes.most_common(1)[0][0]\n    border = [e for e in bm.edges if len(e.link_faces) == 2\n              and face_bone[e.link_faces[0].index] != face_bone[e.link_faces[1].index]]\n    bmesh.ops.split_edges(bm, edges=border)\n    bm.faces.ensure_lookup_table()\n    owner = {}\n    for f in bm.faces:\n        for v in f.verts:\n            owner.setdefault(v.index, collections.Counter())[face_bone[f.index]] += 1\n    for v in bm.verts:\n        if v.index in owner:\n            b = owner[v.index].most_common(1)[0][0]\n            v[deform].clear(); v[deform][b] = 1.0\n    bm.to_mesh(me.data); bm.free()\n    log(\"split along\", len(border), \"border edges ->\", len(me.data.vertices), \"vertices\")\n", "new": "    # Close every rigid piece, including its interior joint faces.\n    sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))\n    from close_rigid_blocks import seal_rigid_blocks\n    log(\"sealed rigid blocks\", seal_rigid_blocks(me))\n", "count": 1}, {"old": "if Z.get(\"rigid\") and (RIGID or not KEEP):", "new": "if Z.get(\"rigid\") and (RIGID or not KEEP) and not SPLIT:", "count": 1}]}