# -*- coding: utf-8 -*- """Reads every exported FBX back into an empty Blender and compares it with build_report.json. blender -b --factory-startup --python verify_fbx.py """ import bpy, os, json, glob HERE = os.path.dirname(os.path.abspath(__file__)) ROOT = os.path.dirname(HERE) report = json.load(open(os.path.join(HERE, 'build_report.json'))) manifest = json.load(open(os.path.join(ROOT, 'OrePatches.json'))) out, bad = {}, [] def clear(): for ob in list(bpy.data.objects): bpy.data.objects.remove(ob) for me in list(bpy.data.meshes): bpy.data.meshes.remove(me) def load(path): clear() try: bpy.ops.wm.fbx_import(filepath=path) except Exception: bpy.ops.import_scene.fbx(filepath=path) return list(bpy.data.objects) for path in sorted(glob.glob(os.path.join(ROOT, 'fbx', '*.fbx'))): name = os.path.splitext(os.path.basename(path))[0] objs = load(path) mesh = [o for o in objs if o.type == 'MESH' and not o.name.startswith('UCX_')] ucx = [o for o in objs if o.name.startswith('UCX_')] row = dict(meshes=len(mesh), hulls=len(ucx)) if len(mesh) == 1: m = mesh[0] tris = sum(len(p.vertices) - 2 for p in m.data.polygons) row.update(name=m.name, tris=tris, expected=report['meshes'][name]['game_tris'], uv=bool(m.data.uv_layers), materials=[s.material.name for s in m.material_slots if s.material], size_m=[round(v, 3) for v in m.dimensions], origin=[round(v, 4) for v in m.matrix_world.translation], hull_named=[u.name for u in ucx] == ['UCX_%s_01' % name]) if m.name != name or tris != row['expected'] or not row['uv'] or not row['hull_named'] or max(abs(v) for v in row['origin']) > 1e-4: bad.append(name) else: bad.append(name) out[name] = row for p in manifest['patches']: path = os.path.join(ROOT, 'fbx', 'assembled', p['name'] + '.fbx') objs = load(path) mesh = [o for o in objs if o.type == 'MESH' and not o.name.startswith('UCX_')] row = dict(meshes=len(mesh), expected=1 + len(p['clusters']), empties=sum(o.type == 'EMPTY' for o in objs)) if row['meshes'] != row['expected']: bad.append(p['name']) out['assembled/' + p['name']] = row json.dump(dict(files=out, bad=bad), open(os.path.join(HERE, 'verify_report.json'), 'w'), indent=1) print('[verify] %d files read back, problems: %s' % (len(out), bad or 'none'))