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)