import socket
import struct

# IP de destino (localhost → mismo computador donde corre Blender)
UDP_IP = "127.0.0.1"

# Puerto UDP (debe coincidir con el receptor en Blender)
UDP_PORT = 5005

# Creación del socket UDP (IPv4 + datagramas)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)


# --- TUS ESTACIONES ---
# Cada estación representa un árbol y la posición de la cámara asociada
# pos_arbol: punto base del árbol en el espacio 3D
# pos_cam: posición fija de la cámara para esa estación
ESTACIONES = {
    "1": {"pos_arbol": (0, 0, 0), "pos_cam": (0, -5, 1.5)},
    "2": {"pos_arbol": (10, 0, 0), "pos_cam": (10, -5, 1.5)}
	}

print("--- Selección de punto de visualización:---")

# Se solicita al usuario elegir la estación
op = input("Selecciona Arbol (1 o 2): ")

# Se obtiene la estación elegida
# Si el valor no existe, se usa por defecto la estación "1"
est = ESTACIONES.get(op, ESTACIONES["1"])

print(f"Cámara moviéndose a {est['pos_cam']}...")


##########################################################
# Bucle infinito para ingresar coordenadas continuamente
while True:
    print(f"\nInspeccionando {est['pos_arbol']}. Ingresa X, Y, Z, ZOOM")

    # Entrada esperada: "x, y, z, zoom"
    entrada = input("> ")
    
    try:
        # Se separa la entrada por comas y se convierte cada valor a float
        d = [float(i) for i in entrada.split(",")]

        # --- CÁLCULO DE POSICIÓN DEL OBJETIVO ---
        # Se suma el desplazamiento ingresado a la posición base del árbol
        target_x = est["pos_arbol"][0] + d[0]
        target_y = est["pos_arbol"][1] + d[1]

        # Z se interpreta como altura absoluta del punto inspeccionado
        target_z = d[2]

        # Si el usuario ingresa zoom, se usa ese valor
        # Si no, se usa 50.0 por defecto
        zoom = d[3] if len(d) > 3 else 50.0
        
        # --- EMPAQUETADO DE DATOS ---
        # Se empaquetan 7 floats en este ORDEN (muy importante para Blender):
        # 1. target_x
        # 2. target_y
        # 3. target_z
        # 4. cam_x
        # 5. cam_y
        # 6. cam_z
        # 7. zoom
        paquete = struct.pack(
            'f' * 7,
            target_x,
            target_y,
            target_z,
            est['pos_cam'][0],
            est['pos_cam'][1],
            est['pos_cam'][2],
            zoom
        )

        # --- ENVÍO UDP ---
        # Se envía el paquete al receptor (Blender)
        sock.sendto(paquete, (UDP_IP, UDP_PORT))

    except:
        # Manejo básico de errores (formato incorrecto de entrada)
        print("Error. Ejemplo: 0, 0, 2.8, 120")

