feat(gamedev): sistema de style presets reutilizable (gameboy/ghibli/pixel-art-retro)
Calidad por ESTILO en vez de por tipo: un dev fija el look del juego una vez y todos los assets salen coherentes. Diseño (A) datos puros + helper, no pipeline monolítico (issue 0087, crecer por composición). - comfyui_get_gamedev_style_preset(name=None): recetas curadas o catálogo. gameboy (sin LoRA, post pixelize paleta game-boy 4 tonos), ghibli (degrada a watercolor_style_sd15 gratis instalado, sin LoRA Ghibli gated), pixel-art-retro (reutiliza pixel-art-xl SDXL + juggernaut + post pixelize 16 colores). Extensible. - comfyui_apply_style_preset(preset, subject): traduce a kwargs **spread-ables para cualquier builder de sujeto + size/transparent/post. Pura, no muta. - 16 tests offline verdes. Validado e2e GPU: mismo 'knight character' en 3 estilos visiblemente distintos (4 vs 78552 vs 16 colores). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -137,6 +137,54 @@ del dibujo del dev, no inventar un tipo nuevo desde texto.
|
||||
| `godot_map_asset_dir_py_core` | `(kind) -> str` | Mapea `kind` -> subcarpeta de `res://assets/`. Pura. |
|
||||
| `godot_clean_asset_name_py_core` | `(filename, *, override=None) -> str` | Normaliza el nombre `<prefijo>_NNNNN_.<ext>` a snake_case seguro para `res://`. Pura. |
|
||||
|
||||
## Estilos (style presets) — calidad por ESTILO reutilizable
|
||||
|
||||
Un *style preset* es la receta curada de un look visual que se aplica a **TODOS** los
|
||||
assets de un juego de una vez ("todo en Game Boy", "estilo Ghibli", "pixel-art retro").
|
||||
En vez de repetir a mano `style`/`checkpoint`/`lora`/`negative` + post-proceso en cada
|
||||
builder, el preset los empaqueta como DATOS puros y el helper los traduce a los kwargs de
|
||||
cualquier builder de sujeto (item_icon, enemy_creature, prop_object, …) o del pipeline
|
||||
`comfyui_generate_asset_pack_oneshot`. Diseño (issue 0087): función pura de presets +
|
||||
helper de aplicación (NO un pipeline monolítico) — máxima composabilidad, sin acoplar
|
||||
firmas. Extensible: añadir un estilo = una entrada en `_PRESETS`.
|
||||
|
||||
| ID | Firma corta | Qué hace |
|
||||
|---|---|---|
|
||||
| `comfyui_get_gamedev_style_preset_py_ml` | `(name=None) -> dict` | Devuelve la receta de un STYLE PRESET curado o el catálogo si `name=None`. Receta = `{subject_prefix, subject_suffix, style, negative, checkpoint, lora, lora_strength, size, transparent, post, notes}`. Pura, copias profundas. Estilos iniciales: **gameboy** (sin LoRA → prompt + post `pixelize` paleta `game-boy` 4 tonos verde), **ghibli** (degrada a `watercolor_style_sd15` gratis instalado + prompt; no hay LoRA Ghibli dedicado ni se descargó nada gated), **pixel-art-retro** (reutiliza `pixel-art-xl` SDXL ya instalado → checkpoint `juggernaut_xl_v11` + size 768 + post `pixelize` 16 colores). |
|
||||
| `comfyui_apply_style_preset_py_ml` | `(preset, subject, *, style=None, negative=None) -> dict` | Traduce un preset + un `subject` a `{name, subject (con prefijo/sufijo), builder_kwargs={style,checkpoint,lora,lora_strength,negative}, size, transparent, post}`. Los `builder_kwargs` hacen `**spread` directo en cualquier builder de sujeto; `size`/`transparent` van aparte (recomendaciones); el caller aplica `post["pixelize"]` al PNG si existe. Pura, no muta el preset; `negative` se mergea (no reemplaza). |
|
||||
|
||||
**Ejemplo canónico (mismo subject, look del juego entero):**
|
||||
|
||||
```python
|
||||
import sys, os
|
||||
sys.path.insert(0, os.path.join(os.environ["HOME"], "fn_registry", "python", "functions"))
|
||||
from ml.comfyui_get_gamedev_style_preset import comfyui_get_gamedev_style_preset
|
||||
from ml.comfyui_apply_style_preset import comfyui_apply_style_preset
|
||||
from ml.comfyui_build_enemy_creature_workflow import comfyui_build_enemy_creature_workflow
|
||||
from ml.comfyui_submit_workflow import comfyui_submit_workflow
|
||||
from ml.comfyui_wait_result import comfyui_wait_result
|
||||
from ml.comfyui_fetch_output_image import comfyui_fetch_output_image
|
||||
from ml.comfyui_pixelize_image import comfyui_pixelize_image
|
||||
|
||||
preset = comfyui_get_gamedev_style_preset("gameboy") # o "ghibli" / "pixel-art-retro"
|
||||
ap = comfyui_apply_style_preset(preset, "knight character")
|
||||
wf = comfyui_build_enemy_creature_workflow(ap["subject"], size=ap["size"],
|
||||
transparent=ap["transparent"], seed=7, **ap["builder_kwargs"])
|
||||
pid = comfyui_submit_workflow(wf)["prompt_id"]
|
||||
outs = comfyui_wait_result(pid, timeout=500)
|
||||
fn = next(i["filename"] for o in outs.values() for i in o.get("images", []))
|
||||
raw = comfyui_fetch_output_image(fn, dest_dir="/tmp")["path"]
|
||||
if ap["post"].get("pixelize"): # gameboy/pixel-retro sellan el grid/paleta
|
||||
comfyui_pixelize_image(raw, "/tmp/knight.png", **ap["post"]["pixelize"])
|
||||
```
|
||||
|
||||
Validado e2e en GPU con el MISMO `knight character` en los 3 estilos (`reports/0190`):
|
||||
gameboy 4 colores verde (`prompt_id 0657e3e3`), ghibli 78 552 colores acuarela
|
||||
(`42f2f492`), pixel-art-retro SDXL 768 16 colores (`84b08581`) — tres looks
|
||||
visiblemente distintos y coherentes. **Gotcha**: el `post` no se aplica solo (el caller
|
||||
llama `comfyui_pixelize_image`); el LoRA y el checkpoint deben casar de base (pixel-art-xl
|
||||
es SDXL → exige juggernaut); OOM en 8 GB → bajar `size`, NO matar procesos.
|
||||
|
||||
## Pipelines one-shot (`gamedev-2d`, impuros)
|
||||
|
||||
| ID | Firma corta | Qué hace |
|
||||
|
||||
Reference in New Issue
Block a user