"""Read immutable mesh and source textures; write reference-coordinate evidence only.""" import argparse import json from pathlib import Path import sys import bpy import numpy as np sys.path.insert(0, str(Path(__file__).resolve().parent)) from reference_registration_raster import rasterize parser = argparse.ArgumentParser() parser.add_argument('--folder', required=True) parser.add_argument('--front-axis', choices=['-Y', '+Y', '-X', '+X'], default='-Y') args = parser.parse_args(sys.argv[sys.argv.index('--') + 1:]) folder = Path(args.folder) bpy.ops.wm.read_factory_settings(use_empty=True) bpy.ops.import_scene.gltf(filepath=str(folder / 'source.glb')) objects = [obj for obj in bpy.context.scene.objects if obj.type == 'MESH'] parts = [] for item in json.loads((folder / 'inputs.json').read_text()): matches = [obj for obj in objects if obj.name == item['part_id'] or obj.name.startswith(item['part_id'] + ' ')] if len(matches) != 1: raise ValueError('Cannot identify unique diagnostic component ' + item['part_id']) obj = matches[0] obj.data.calc_loop_triangles() if obj.data.uv_layers.active is None: raise ValueError('Registration diagnostic requires source UVs') parts.append({ 'vertices': np.array([obj.matrix_world @ vertex.co for vertex in obj.data.vertices]), 'faces': np.array([triangle.vertices[:] for triangle in obj.data.loop_triangles]), 'uvs': np.array([[obj.data.uv_layers.active.data[i].uv[:] for i in triangle.loops] for triangle in obj.data.loop_triangles]), 'texture': np.load(folder / item['file']), 'alpha_mode': item.get('alpha_mode', 'OPAQUE'), 'alpha_cutoff': item.get('alpha_cutoff', .5), 'base_color_factor': item.get('base_color_factor', [1, 1, 1, 1]), }) reference = np.load(folder / 'reference.npz') front = {'-Y': [0, -1, 0], '+Y': [0, 1, 0], '-X': [-1, 0, 0], '+X': [1, 0, 0]}[args.front_axis] result = rasterize(parts, reference['bounds'], reference['mask'].shape, front) np.savez_compressed(folder / 'registration-raster.npz', **result)