---
name: comfyui_export_asset_to_godot
kind: pipeline
lang: py
domain: pipelines
version: "1.0.0"
purity: impure
signature: "def comfyui_export_asset_to_godot(asset_path: str, kind: str, godot_project: str, *, name: str | None = None, reimport: bool = True, godot_bin: str | None = None) -> dict"
description: "Puente ComfyUI -> Godot: copia un asset generado a la subcarpeta correcta de un proyecto Godot 4 (res://assets/{sprites,tilesets,vfx,audio/{sfx,music},models}/ segun kind), escribe el .import adecuado al tipo (textura Lossless+mipmaps off / audio loop on-off / escena glTF), asegura el filtro Nearest del proyecto si es pixelart (default_texture_filter=0 en project.godot), y lanza reimport headless si el binario de Godot esta disponible. Compone godot_map_asset_dir + godot_clean_asset_name. NO toca ningun proyecto salvo el que se le pasa; idempotente (preserva uid existente). Devuelve {ok, dest_res_path, dest_abs_path, import_path, import_written, pixelart_filter_set, reimported, warnings, error}. Impuro: disco + subprocess."
tags: [godot, gamedev-2d, comfyui, pipelines, export, import, launcher]
uses_functions: [godot_map_asset_dir_py_core, godot_clean_asset_name_py_core]
uses_types: []
returns: []
returns_optional: false
error_type: "error_py_core"
imports: [godot_map_asset_dir_py_core, godot_clean_asset_name_py_core]
params:
  - name: asset_path
    desc: "ruta del asset de origen (p.ej. en ~/ComfyUI/output/)."
  - name: kind
    desc: "tipo de asset: 'sprite', 'pixelart', 'tileset', 'vfx', 'sfx', 'music' o 'model'."
  - name: godot_project
    desc: "ruta raiz del proyecto Godot destino (debe contener project.godot)."
  - name: name
    desc: "nombre base deseado para el archivo destino (sin extension); None lo deriva del origen (snake_case sin _NNNNN_). keyword-only."
  - name: reimport
    desc: "si True intenta reimport headless con el binario de Godot. keyword-only."
  - name: godot_bin
    desc: "ruta del binario de Godot; None autodetecta (PATH y rutas conocidas como ~/godot/Godot_v4.7-stable_linux.x86_64). keyword-only."
output: "dict con ok (bool), dest_res_path (res://...), dest_abs_path, import_path, import_written (bool), pixelart_filter_set (bool), reimported (bool), warnings (list[str]), error (str)."
tested: true
tests: [test_golden_pixelart, test_edge_music_loop_on, test_edge_sfx_loop_off, test_edge_model_glb_scene, test_edge_tileset_warns, test_idempotent_preserves_uid, test_error_missing_asset, test_error_bad_kind, test_error_not_a_godot_project, test_godot_cli_absent_leaves_import]
test_file_path: "python/functions/pipelines/comfyui_export_asset_to_godot_test.py"
file_path: "python/functions/pipelines/comfyui_export_asset_to_godot.py"
---

## Ejemplo

```python
import sys, os
sys.path.insert(0, os.path.join(os.environ["HOME"], "fn_registry", "python", "functions"))
from pipelines.comfyui_export_asset_to_godot import comfyui_export_asset_to_godot

# Pixelart -> sprites/ con Nearest global + reimport headless automatico
res = comfyui_export_asset_to_godot(
    os.path.expanduser("~/ComfyUI/output/hero_00001_.png"),
    "pixelart",
    os.path.expanduser("~/gamedev/projects/crossy_road"),
)
# {'ok': True, 'dest_res_path': 'res://assets/sprites/hero.png',
#  'import_written': True, 'pixelart_filter_set': True, 'reimported': True, ...}

# Musica con loop ON
comfyui_export_asset_to_godot("/tmp/theme.ogg", "music", "/tmp/godot_proj")
```

## Cuando usarla

Para llevar un asset recien generado en ComfyUI a un proyecto Godot sin tocar el
import a mano: resuelve carpeta + escribe el `.import` por tipo + arregla el filtro
pixelart + reimporta. Es el ultimo paso del flujo gen -> (pixelize / matting) ->
export. Si solo quieres el mapeo o el nombre limpio sin copiar, usa los helpers
`godot_map_asset_dir` / `godot_clean_asset_name` directamente.

## Gotchas

- **Seguridad**: solo escribe en el `godot_project` que se le pasa. Aborta con
  `ok=False` si ese directorio no tiene `project.godot`. Nunca toca otros proyectos.
- **Filtro Nearest (Godot 4)**: NO es un campo del `.import` por defecto; se setea
  global en `project.godot` (`default_texture_filter=0`). Con `kind="pixelart"` la
  función lo asegura (idempotente). Para sprites no-pixelart deja el filtro por
  defecto del proyecto.
- **Godot no deriva TileSet ni SpriteFrames**: para `tileset`/`vfx` copia la textura
  y **avisa** (en `warnings`) que el `.tres` hay que crearlo en editor o por script.
- **reimport best-effort**: si no encuentra el binario de Godot, deja el `.import`
  escrito y lo anota en `warnings` (`reimported=False`) — no falla. Autodetecta en
  PATH y en `~/godot/Godot_v4.7-stable_linux.x86_64`; override con `godot_bin`.
- **Idempotente**: re-exportar preserva el `uid://` de un `.import` ya existente (no
  rompe las referencias de escenas que ya usan el asset).
- **WEBP animado (SVD)**: para usarlo como animación en Godot, descomponer en frames
  PNG antes; este pipeline lo copia como textura tal cual (no lo descompone).
- El `.import` escrito es el mínimo correcto por tipo; Godot completa los campos que
  falten en el primer reimport.
