# vr_check.py - clash check: no two parts on different bones may intersect (evaluated meshes, # current pose). Also counts quads / tris / n-gons on the base meshes. import bpy, itertools from mathutils.bvhtree import BVHTree def check(): dg = bpy.context.evaluated_depsgraph_get() objs = [o for o in bpy.data.objects if o.type == 'MESH' and "vr_bone" in o.keys() and not o.name.startswith("VR_Decal")] trees = {} for o in objs: e = o.evaluated_get(dg); me = e.to_mesh() vs = [e.matrix_world @ v.co for v in me.vertices]; ps = [tuple(p.vertices) for p in me.polygons] trees[o.name] = (BVHTree.FromPolygons(vs, ps), o["vr_bone"], [min(v[i] for v in vs) for i in range(3)], [max(v[i] for v in vs) for i in range(3)]) e.to_mesh_clear() hits = [] for a, b in itertools.combinations(trees, 2): ta, ba, mna, mxa = trees[a]; tb, bb, mnb, mxb = trees[b] if ba == bb or any(mxa[i] < mnb[i] or mxb[i] < mna[i] for i in range(3)): continue n = len(ta.overlap(tb)) if n: hits.append((a, b, n)) q = t = g = 0 for o in objs: for p in o.data.polygons: k = len(p.vertices); q += k == 4; t += k == 3; g += k > 4 return {"parts": len(objs), "clashes": hits, "quads": q, "tris": t, "ngons": g}