File size: 2,120 Bytes
876fa4c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | """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)
|