﻿"""
3,680개 메시 GLB → 단일 병합 메시 GLB 변환
trimesh로 로드 → 병합 → 버텍스 30만개로 축소 → 저장
"""
import trimesh
import numpy as np
from pathlib import Path

SRC = Path("E:/도진팩토리/3D스캔및티칭시스템/2026-05-10--04-49-06/GLB_Meshes/2026-05-10--04-49-06.glb")
OUT = Path("E:/도진팩토리/3D스캔및티칭시스템/output/merged.glb")

print("GLB 로드 중... (시간 걸림)")
scene = trimesh.load(str(SRC), force='scene')
print(f"로드 완료: {type(scene)}")

# 모든 지오메트리 수집
meshes = []
if hasattr(scene, 'geometry'):
    for name, geom in scene.geometry.items():
        if isinstance(geom, trimesh.Trimesh) and len(geom.faces) > 0:
            # world transform 적용
            try:
                tf = scene.graph.get(name)[0]
                geom = geom.copy()
                geom.apply_transform(tf)
            except Exception:
                pass
            meshes.append(geom)
elif isinstance(scene, trimesh.Trimesh):
    meshes = [scene]

print(f"메시 수: {len(meshes)}")

if not meshes:
    print("메시 없음 — 종료")
    exit(1)

# 병합
print("병합 중...")
merged = trimesh.util.concatenate(meshes)
print(f"병합 완료: 버텍스 {len(merged.vertices):,}개 / 페이스 {len(merged.faces):,}개")

# 축소 (open3d 사용)
target_faces = 150_000
if len(merged.faces) > target_faces:
    print(f"축소 중... {len(merged.faces):,} → {target_faces:,}개")
    import open3d as o3d
    o3d_mesh = o3d.geometry.TriangleMesh()
    o3d_mesh.vertices = o3d.utility.Vector3dVector(merged.vertices.astype(float))
    o3d_mesh.triangles = o3d.utility.Vector3iVector(merged.faces)
    o3d_mesh = o3d_mesh.simplify_quadric_decimation(target_faces)
    verts = np.asarray(o3d_mesh.vertices, dtype=np.float64)
    faces = np.asarray(o3d_mesh.triangles)
    merged = trimesh.Trimesh(vertices=verts, faces=faces, process=False)
    print(f"축소 완료: 버텍스 {len(merged.vertices):,}개 / 페이스 {len(merged.faces):,}개")

# 저장
print("저장 중...")
merged.export(str(OUT))
print(f"완료: {OUT}")
print(f"크기: {OUT.stat().st_size//1024//1024}MB")
