---
name: comfyui_build_foliage_set_workflow
kind: function
lang: py
domain: ml
version: "1.0.0"
purity: pure
signature: "def comfyui_build_foliage_set_workflow(plant: str, *, view: str = \"side\", style: str = \"game foliage, stylized\", checkpoint: str = \"IMG_dreamshaper_8.safetensors\", size: int = 512, transparent: bool = True, seed: int = 0, lora: str | None = None, lora_strength: float = 1.0, rembg_model: str = \"u2net\", negative: str | None = None, steps: int = 28, cfg: float = 7.0, sampler_name: str = \"dpmpp_2m\", scheduler: str = \"karras\", filename_prefix: str = \"foliage_set\") -> dict"
description: "Construye el dict (API format) del workflow de UN elemento de vegetacion/foliage de escenario de juego 2D (arbol, arbusto, hierba alta, flores, helecho, hongo, cactus, tronco caido, juncos, hiedra): UN elemento de naturaleza AISLADO y centrado a perspectiva de juego (lateral/cenital via view), fondo limpio uniforme recortable a alpha, estilo consistente para poblar terrenos/escenarios. Diferenciado de comfyui_build_prop_object (vegetacion organica vs objeto manufacturado) y de structure (planta suelta vs edificio). Compone comfyui_build_txt2img_workflow + comfyui_inject_lora (estilo opcional) + Image Rembg (fondo transparente si transparent). Hermano de comfyui_build_prop_object/structure_workflow. Pura, sin red ni I/O. class_types verificados contra /object_info."
tags: [comfyui, ml, gamedev-2d, foliage, plant, vegetation, nature, scenery, environment, rembg, workflow]
uses_functions: [comfyui_build_txt2img_workflow_py_ml, comfyui_inject_lora_py_ml]
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: []
params:
  - name: plant
    desc: "Descripcion del elemento de naturaleza (ej. 'a large oak tree', 'a small bush', 'tall grass', 'a cluster of red flowers', 'a fern', 'a glowing mushroom', 'a desert cactus', 'a fallen log', 'reeds', 'a patch of ivy'). Se inserta en un prompt scaffold de foliage. No puede estar vacio."
  - name: view
    desc: "Perspectiva del juego con la que se muestra la planta. Se inserta como '{view} view' en el prompt (ej. 'side', 'top-down', 'front', '3/4', 'isometric'). Por defecto 'side' (la mas comun para vegetacion de plataformas/RPG lateral). Vacio/None -> sin clausula de vista. keyword-only."
  - name: style
    desc: "Descriptor de estilo que mantiene consistente la vegetacion del set (ej. 'game foliage, stylized', 'low poly stylized plant', 'pixel art foliage', 'painterly fantasy plant', 'cartoon nature asset'). Pasa el MISMO view + style + checkpoint + lora a todas las plantas del nivel para coherencia. keyword-only."
  - name: checkpoint
    desc: "Checkpoint del servidor. 'IMG_dreamshaper_8.safetensors' (SD1.5, holgado en 8GB lowvram) por defecto; 'IMG_juggernaut_xl_v11.safetensors' para SDXL (mas VRAM, subir size). keyword-only."
  - name: size
    desc: "Lado del cuadrado en px (width = height = size). 512 SD1.5 por defecto. keyword-only."
  - name: transparent
    desc: "Si True inyecta Image Rembg y el PNG sale con alpha (fondo recortado, listo para soltar sobre el terreno). False = planta opaca sobre fondo plano, recortable luego por el caller. keyword-only."
  - name: seed
    desc: "Semilla del KSampler. Misma seed + mismo plant/view/style -> misma planta. keyword-only."
  - name: lora
    desc: "LoRA de estilo opcional en models/loras (ej. 'SD15_stylized_nature.safetensors', 'SDXL_painterly_plants.safetensors'). None = sin LoRA. keyword-only."
  - name: lora_strength
    desc: "Fuerza del LoRA sobre model y clip. Se clampa a [0.0, 2.0]. keyword-only."
  - name: rembg_model
    desc: "Modelo Rembg ('u2net' general, 'isnet-anime' para anime). Solo se usa si transparent=True. keyword-only."
  - name: negative
    desc: "Prompt negativo. None usa el negativo por defecto pensado para foliage (un elemento vegetal entero, organico, sin objetos manufacturados/edificios/personas, sin bosque/paisaje denso, fondo limpio, sin texto/recorte). keyword-only."
  - name: steps
    desc: "Pasos del KSampler. keyword-only."
  - name: cfg
    desc: "CFG del KSampler. keyword-only."
  - name: sampler_name
    desc: "Sampler del KSampler. keyword-only."
  - name: scheduler
    desc: "Scheduler del KSampler. keyword-only."
  - name: filename_prefix
    desc: "Prefijo del PNG en output/. keyword-only."
output: "dict en API format listo para comfyui_submit_workflow: base txt2img cuadrada con prompt scaffold de foliage ('{plant}, {view} view, {style}, single plant element, centered, plain background, game nature asset, natural vegetation, organic...') + LoRA de estilo opcional + Image Rembg (si transparent). UN elemento; para poblar un nivel -> llamar por cada plant con mismo view/style/checkpoint/lora; contact-sheet de la vegetacion -> montar los PNG con comfyui_build_grid."
tested: true
tests: ["golden transparent: clases CheckpointLoaderSimple/KSampler/VAEDecode/SaveImage/Image Rembg; plant + 'single plant element' + 'game nature asset' + 'natural vegetation' + 'centered' + 'plain background' + 'side view' en prompt; SaveImage <- Rembg; transparency True", "edge transparent=False: sin Rembg, SaveImage <- VAEDecode", "edge size: width==height==768 (cuadrado)", "edge plant al inicio del scaffold", "edge view reflejado como '{view} view'", "edge view vacio: sin clausula 'view' colgando", "edge style del set en prompt", "edge negativo anti manufacturado/edificio/persona/bosque (diferenciado de prop_object y structure)", "edge lora: LoraLoader presente con strength", "edge lora_strength clampado a [0,2]", "edge transparent default True", "error plant vacio -> ValueError", "determinismo"]
test_file_path: "python/functions/ml/comfyui_build_foliage_set_workflow_test.py"
file_path: "python/functions/ml/comfyui_build_foliage_set_workflow.py"
---

## Ejemplo

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

# Un elemento de vegetacion con fondo transparente (alpha), listo para plantar en el terreno.
wf = comfyui_build_foliage_set_workflow(
    "a large oak tree",
    view="side",
    style="game foliage, stylized",
    transparent=True,
    seed=7,
)
# Poblar un nivel: variar `plant` con el MISMO view/style/checkpoint/(lora) para coherencia.
#   for p in ["a small bush", "tall grass", "a fern", "a cluster of red flowers", "a glowing mushroom"]:
#       wf = comfyui_build_foliage_set_workflow(p, view="side", style="game foliage, stylized", seed=7)
#       comfyui_submit_workflow(wf)  # -> comfyui_wait_result -> comfyui_fetch_output_image
# Contact-sheet de la vegetacion: montar los PNG resultantes con comfyui_build_grid.
```

O lanzable directo con: `./fn run comfyui_build_foliage_set_workflow` (imprime nodos + class_types del ejemplo).

## Cuando usarla

Cuando necesites vegetación/plantas para vestir el terreno de un escenario de juego
(RPG, plataformas, top-down, isométrico): árboles, arbustos, hierba alta, flores,
helechos, hongos, cactus, troncos caídos, juncos, hiedra. A diferencia de
`comfyui_build_prop_object_workflow` (un objeto MANUFACTURADO suelto: barril, cofre,
antorcha, mueble) y de `comfyui_build_structure_workflow` (un EDIFICIO completo: casa,
torre, castillo), aquí el asset es un elemento de NATURALEZA ORGÁNICA que se planta por
el nivel para vestir el suelo. Fija `view` (`side` por defecto) para la perspectiva del
escenario y pasa el MISMO `view` + `style` + `checkpoint` + (`lora`) a todas las plantas
del set para que combinen; varía solo `plant`. `transparent` recorta el fondo (alpha)
listo para soltar sobre el terreno. Para un atlas/contact-sheet de la vegetación, genera
cada elemento y monta los PNG con `comfyui_build_grid`.

## Gotchas

- **Foliage (vegetación orgánica) != prop_object (objeto manufacturado) != structure
  (edificio)**: si lo que quieres es un objeto de escena manufacturado (barril, cofre,
  mueble), usa `comfyui_build_prop_object_workflow`; si es una edificación grande (casa,
  torre), usa `comfyui_build_structure_workflow`. Este builder genera UN elemento vegetal
  aislado; el negativo por defecto rechaza `building / manmade object / barrel /
  furniture / person` para no degradar a un prop, un edificio ni una figura.
- **Un elemento, no un bosque**: el scaffold empuja `single plant element / isolated
  plant` y el negativo rechaza `multiple plants / dense forest / jungle / landscape`
  para mantener UN sprite suelto reutilizable, no un paisaje. Si insiste en pintar varios,
  refuerza `style` con "single isolated plant".
- **El recorte usa Rembg, NO luma-to-alpha**: una planta es una masa opaca con silueta
  vegetal definida (hojas, ramas, tallos), rembg la recorta limpia.
  `comfyui_matting_luma_to_alpha` es para translúcidos sobre negro (humo/fuego/magia). Si
  la planta es etérea/bioluminiscente y quieres conservar partes translúcidas, pon
  `transparent=False` y recorta aparte.
- **`view` fija la perspectiva del escenario**: `side` (default) para plataformas/RPG
  lateral; `top-down` para cenital; `isometric` para mapas iso 2:1; `3/4` para vista de ¾.
  Para iso estricto, añade una LoRA iso que fije mejor el ángulo que solo el prompt.
- **Coherencia del set = mismos parámetros**: si cambias `view`/`style`/`checkpoint`/`lora`/
  `seed` entre plantas, la vegetación deja de combinar. Fija esos y varía solo `plant`.
- **SDXL pide más VRAM y resolución**: con `checkpoint="IMG_juggernaut_xl_v11.safetensors"`
  sube `size` a 768/1024; con IMG_dreamshaper_8 (SD1.5) deja 512 (holgado en 8GB lowvram). Si
  hay OOM, baja `size` o usa SD1.5.
- **El negativo rechaza `pot / planter / vase`**: una planta en maceta es atrezzo
  (`prop_object`), no foliage. Aquí el elemento es la planta en sí. Si quieres una planta
  en tiesto, usa `comfyui_build_prop_object_workflow` con `prop="a potted plant"`.
- `transparent=False` deja la planta opaca sobre fondo plano: útil si prefieres recortar
  fuera del workflow o el motor compone sobre un fondo sólido.
- Es una función **pura**: solo arma el dict. La generación real (GPU) la hacen
  `comfyui_submit_workflow` + `comfyui_wait_result` + `comfyui_fetch_output_image`.
