diff --git a/apps/game/tools/aiart/probe-b3/sd_fss_42_15steps.png b/apps/game/tools/aiart/probe-b3/sd_fss_42_15steps.png new file mode 100644 index 0000000..82663d6 --- /dev/null +++ b/apps/game/tools/aiart/probe-b3/sd_fss_42_15steps.png Binary files differ diff --git a/apps/game/tools/aiart/probe-b3/sd_fss_42_raw.png b/apps/game/tools/aiart/probe-b3/sd_fss_42_raw.png new file mode 100644 index 0000000..630c7a0 --- /dev/null +++ b/apps/game/tools/aiart/probe-b3/sd_fss_42_raw.png Binary files differ diff --git a/apps/game/tools/aiart/probe-b3/sd_q8_fss_42_broken.png b/apps/game/tools/aiart/probe-b3/sd_q8_fss_42_broken.png new file mode 100644 index 0000000..2364feb --- /dev/null +++ b/apps/game/tools/aiart/probe-b3/sd_q8_fss_42_broken.png Binary files differ diff --git a/docs/plan.md b/docs/plan.md index e8ec369..73fd437 100644 --- a/docs/plan.md +++ b/docs/plan.md @@ -13,7 +13,7 @@ | # | Задача | Статус | |---|--------|--------| | 1 | Срез «меньше ошибок»: реестры ID, pre-commit, разрезание LocationScene, фикстуры, fail-fast waitFor | ✅ сделано (c379f20, 16b59d8, 39c6349) | -| 2 | AI-генерация текстур и спрайтов (работа B, ниже) | B0+B1 ✅ (PoC); B2/B3 отложены — RD API или ручной арт | +| 2 | AI-генерация текстур и спрайтов (работа B, ниже) | B0+B1 ✅ (PoC); B3 проба ✅ (SD-атласы, 6.6 мин/вид); B2 отложено — RD API или ручной арт | | 3 | AI-генерация аудио (работа A, ниже) | 📋 спланировано, отложено | | 4 | Акт 2: новые локации/сюжет по `docs/world.md` | очередь после акта 1+AI-ассетов | | 5 | Замена сгенерированных плейсхолдеров арта на AI/ручной арт | в составе работы B | @@ -64,7 +64,8 @@ |--------|--------|--------|------------------|----------|-------------| | **PXG-Tiny** (HF: Tarul/pxg-tiny) | 483K | CPU, NumPy, 1.8 МБ | да (прямые индексы) | MIT + CC0 | 16×16, 38 классов. Идеален по железу, но узкий домен | | **PixelGPT-24×24** (github.com/unstonio/pixelgpt-24x24) | 68M | CPU, ~22 с | да, 5 цветов/спрайт, кастомная палитра на запрос | **нет (не указана)** | 24×24; отказов нет, домен тянет частично (см. B1). Веса в репо; датасет 20K — CC BY 4.0 | -| **Pixel Forge** (cochranblock) | 1.1–17M | CPU (Rust) | да, 7 встроенных палитр | Unlicense | 108 классов объектов; нет персонажей-атласов | +| **Pixel Forge** (cochranblock) | 1.1–17M | CPU (Rust) | да, 7 встроенных палитр | Unlicense | 108 классов объектов; появилась фича 4-directional sprite sheet relight — кандидат пробы B3 (нужен Rust-тулчейн) | +| **SD_PixelArt_SpriteSheet_Generator** (Onodofthenorth) | ~1B (SD 1.5) | CPU 6.6 мин/вид fp32 (25 шагов — 11 мин; q8 отвергнуто: медленнее и шумит) | нет (пост-обработка) | Apache-2.0 | 4 ракурса по токенам (FSS/RSS/BSS/LSS); кадры — позы стоя, не walk-цикл. Проба B3 ✅ — рабочий путь для разовых атласов | | **Retro Diffusion SD1.5** (LostMedia, архив) | ~1B | CPU минуты/картинку | нет (пост-обработка) | Public Domain | классика пиксель-диффузии; для офлайн-пакета | | **Retro Diffusion API (RD Plus/Tile/Animation)** | облако | — | да | платный API | лучший результат для тайлов/анимаций; фолбэк, если локальное не тянет | | **LPC-style (PIXEL-T2I и др.)** | research | GPU | нет | research | перспективное направление для атласов 4 ракурса × walk/slash | @@ -72,8 +73,12 @@ Вывод по классам (после B0+B1): инвентарь/декор — **PXG-Tiny локально** (её классы); простые объекты 24×24 — PixelGPT (но лицензии нет — только PoC); критичные интерактивы и тайлы сложных поверхностей — **RD API (платный) или -ручной арт**; дообучение под игру не делаем. Персонажи-атласы — **не решено** -(кандидаты: платный RD API или ручной арт поверх AI-болванок). +ручной арт**; дообучение под игру не делаем. Персонажи-атласы — кандидаты +пробы: SD_PixelArt_SpriteSheet_Generator (Apache-2.0, CPU-минуты) и Pixel +Forge relight (нужен Rust); фолбэк — платный RD API или ручной арт. Отдельный +путь для полноразмерных атласов с боевыми кадрами — LoRA к Qwen-Image-Edit +(Apache-2.0), но база ~20B: только разовая генерация на Kaggle/Colab GPU, +результат — в наш пайплайн пост-обработки. ### Пайплайн интеграции (проект решения) @@ -108,8 +113,16 @@ **лицензии на код/веса нет — в игру нельзя**. Манифест: `manifest-b1.json`. - **B2**: тайлы сложных поверхностей (img-условность от существующих тайлов) — локальным моделям недоступно, кандидат RD API; отложено. -- **B3**: персонажи/атласы — RD API (платный) или ручной арт; отложено - до потребности акта 2. +- **B3 (проба, 2026-09-06)**: SD_PixelArt_SpriteSheet_Generator на CPU + (venv-pxgpt, fp32). Токен-ракурс работает: 4 фигуры читаются; но кадры — + вариации позы стоя (не walk-цикл), промпт-цвета плавают, кадры ~120 px + (даунскейл до 16×24 некратный). Тайминги: 25 шагов — 11 мин, **15 шагов — + 6.6 мин** (взято за рабочий режим). Квантование q8_0 (stable-diffusion.cpp, + GGUF) отвергнуто: 34 мин (ggml-ядра int8 без VNNI медленнее fp32-oneDNN) и + VAE в q8 даёт шум — `probe-b3/sd_q8_fss_42_broken.png`. Вердикт: путь + рабочий для разовых атласов (4 вида ≈ 30 мин/персонажа), но кадры-позы + придётся дорабатывать руками; полный прогон — при потребности акта 2. + Пробы: `apps/game/tools/aiart/probe-b3/`. Фолбэк — RD API или ручной арт. --- @@ -148,6 +161,10 @@ код-композит в `gen.mjs`**; апскейл даёт мыло с чужой плотностью пикселя и залитым фоном (только черновая болванка), нативно больших размеров локальные модели не умеют. RD API остаётся опцией, если код-композита не хватит. + Неквадратные footprint'ы (2×1, 3×1, 4×2): движок умеет (`props` w×h; + поверхности заполняются обычными тайлами 1×1); AI-генерация — только квадраты + (неквадрат собираем из 1×1 на уровне карты), код-композит — любой размер, + RD API Tile — нативно прямоугольные. ---