Download scripts/render_reference_registration.py from mantrakp/component-studio-coordinator: direct link, hf CLI and curl.
- Browser
- Download file 2.12 kB
-
https://huggingface.co/spaces/mantrakp/component-studio-coordinator/resolve/main/scripts/render_reference_registration.py
- Command line
-
hf download hf://spaces/mantrakp/component-studio-coordinator/scripts/render_reference_registration.py
-
curl -L -o render_reference_registration.py https://huggingface.co/spaces/mantrakp/component-studio-coordinator/resolve/main/scripts/render_reference_registration.py
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) | |