"""Textured ArUco plane GLB for the viewer: two 70mm quads carrying the id240/id241 marker textures,
positioned at the UMI cube TOP (+y) and BACK (+x) recess faces. Referenced by umi_gripper.urdf."""
import numpy as np, trimesh
from PIL import Image
cube = trimesh.load("gnode_aruco_cube.stl", force="mesh")
lo, hi = cube.bounds
cx, cy, cz = (lo + hi) / 2
S = 35.0  # half sheet
def quad(corners, img):
    v = np.array(corners, float)
    f = np.array([[0, 1, 2], [0, 2, 3]])
    uv = np.array([[0, 0], [1, 0], [1, 1], [0, 1]], float)
    m = trimesh.Trimesh(v, f, process=False)
    m.visual = trimesh.visual.TextureVisuals(uv=uv, image=img)
    return m
top_img = Image.open("aruco_umi_top_id240.png").convert("RGB")
back_img = Image.open("aruco_umi_back_id241.png").convert("RGB")
e = 0.15
top = quad([[cx-S, hi[1]+e, cz-S], [cx+S, hi[1]+e, cz-S], [cx+S, hi[1]+e, cz+S], [cx-S, hi[1]+e, cz+S]], top_img)
back = quad([[hi[0]+e, cy-S, cz-S], [hi[0]+e, cy+S, cz-S], [hi[0]+e, cy+S, cz+S], [hi[0]+e, cy-S, cz+S]], back_img)
sc = trimesh.Scene()
sc.add_geometry(top, node_name="aruco_top", geom_name="aruco_top")
sc.add_geometry(back, node_name="aruco_back", geom_name="aruco_back")
sc = sc.scaled(0.001)                                   # export in meters so URDF scale=1
sc.export("aruco_planes.glb")
print("wrote aruco_planes.glb (textured, meters)")
