import bpy
import bmesh

mesh_name = "chassis_low"
output_path = "C:\\Work\\Projects\\space-game001\\blender scripts\\output\\spaceship005.txt"

mesh_obj = bpy.data.objects.get(mesh_name)

if mesh_obj and mesh_obj.type == 'MESH':
    # Обязательно применяем трансформации, чтобы координаты были актуальными
    # Но для чистоты эксперимента берем mesh data как есть
    
    # Работаем с копией меша, чтобы применить триангуляцию (если нужно) 
    # и не испортить сцену, но пока используем bmesh напрямую
    bm = bmesh.new()
    bm.from_mesh(mesh_obj.data)
    
    # Получаем слой UV
    uv_layer = bm.loops.layers.uv.active
    
    # Словарь для хранения уникальных вершин: 
    # Ключ: (x, y, z, nx, ny, nz, u, v) -> Значение: новый_индекс
    unique_verts_map = {}
    final_vertices = [] # Список для записи в файл
    final_indices = []  # Список индексов треугольников
    
    # Проходим по всем фейсам
    for face in bm.faces:
        face_indices = []
        
        # Проходим по углам (loops) фейса
        for loop in face.loops:
            vert = loop.vert
            
            # 1. Координаты (округляем для надежности сравнения float)
            co = (round(vert.co.x, 6), round(vert.co.y, 6), round(vert.co.z, 6))
            
            # 2. Нормаль (если используете Smooth shading, берите vert.normal, если Flat - face.normal)
            # Для простоты берем нормаль вершины
            no = (round(vert.normal.x, 6), round(vert.normal.y, 6), round(vert.normal.z, 6))
            
            # 3. UV координаты
            if uv_layer:
                raw_uv = loop[uv_layer].uv
                uv = (round(raw_uv.x, 6), round(raw_uv.y, 6))
            else:
                uv = (0.0, 0.0)
            
            # Собираем уникальный ключ данных вершины
            vert_data_key = (co, no, uv)
            
            # Проверяем, есть ли такая комбинация уже
            if vert_data_key in unique_verts_map:
                index = unique_verts_map[vert_data_key]
            else:
                index = len(final_vertices)
                unique_verts_map[vert_data_key] = index
                final_vertices.append(vert_data_key)
            
            face_indices.append(index)
        
        # Триангуляция "на лету" (если фейс - квадрат, делим на два треугольника)
        # Простейший метод fan (0, 1, 2), (0, 2, 3)...
        for i in range(1, len(face_indices) - 1):
            final_indices.append(face_indices[0])
            final_indices.append(face_indices[i])
            final_indices.append(face_indices[i+1])

    # --- ЗАПИСЬ В ФАЙЛ ---
    with open(output_path, "w") as file:
        file.write(f"===Vertices (Split by UV/Normal): {len(final_vertices)}\n")
        # Формат строки: ID: X Y Z | NX NY NZ | U V
        for idx, v_data in enumerate(final_vertices):
            co, no, uv = v_data
            file.write(f"V {idx}: Pos({co[0]}, {co[1]}, {co[2]}) Norm({no[0]}, {no[1]}, {no[2]}) UV({uv[0]}, {uv[1]})\n")
            
        file.write(f"\n===Triangles (Indices): {len(final_indices) // 3}\n")
        # Записываем тройками
        for i in range(0, len(final_indices), 3):
            file.write(f"Tri: {final_indices[i]} {final_indices[i+1]} {final_indices[i+2]}\n")

    bm.free()
    print(f"Export done. Original verts: {len(mesh_obj.data.vertices)}, Split verts: {len(final_vertices)}")

else:
    print("Mesh not found")