component-studio-coordinator / scripts /render_reference_registration.py
mantrakp's picture
Add bounded reference registration evidence to isolated refinement
876fa4c verified
Raw History Blame Contribute Delete
2.12 kB
"""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)