ProjectRR — нативный прототип на ассетах ProjectR

- Все 189 скелетов Spine сконвертированы в нативные Godot Skeleton2D (.tscn), без Spine в рантайме
- Меню + сцены: подземелье (карта комнат), просмотр спрайтов, нативные анимации
- Кастомизация цвета (кожа/волосы/глаза) через шейдер
- Вытащенные текстуры/UI/шрифты + нарезка спрайтов из атласа
- Датасет комнат для LoRA, офлайн-инструменты конвертации в tools/

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Leonid Pershin
2026-08-03 16:29:21 +03:00
co-authored by Claude Opus 4.8
commit 04cf5f90b0
2193 changed files with 360105 additions and 0 deletions
+131
View File
@@ -0,0 +1,131 @@
# ProjectRR — нативный просмотрщик персонажей
Тестовый проект: персонажи и анимации, извлечённые из игры **ProjectR** и
**полностью переведённые в нативный Godot** (`Skeleton2D` + взвешенные `Polygon2D` +
`AnimationPlayer`). **Spine в рантайме не используется** — проект работает на обычном Godot.
## Требования к движку
Запуск/редактирование проекта — **обычный Godot 4.7.1 mono** (модуль Spine не нужен):
```
D:\Godot_v4.7.1\Godot_v4.7.1-stable_mono_win64.exe
```
Все персонажи уже нативные, поэтому Spine-сборка для игры не нужна. Офлайн-инструменты
пересборки (`tools/bake_anim.gd`, `tools/build_tscn.gd`, `tools/convert_all.gd`) требуют
отдельную **spine-godot 4.2**-сборку — но только если понадобится перегенерировать `.tscn`.
## Запуск
1. Открыть проект обычным Godot 4.6.1 mono.
2. Нажать ▶ (F5). Главная сцена — `scenes/MainMenu.tscn` (меню).
## Меню и сцены
Главное меню (`scenes/MainMenu.tscn`) ведёт на три сцены (назад в меню — `Esc`):
1. **Подземелье** (`scenes/Dungeon.tscn`) — разрез убежища à la Fallout Shelter: сетка 6×5
комнат. ЛКМ/WASD — панорама, колесо — зум, `R` — сброс.
2. **Просмотр спрайтов** (`scenes/SpriteViewer.tscn`) — галерея вытащенных изображений
(UI, фоны, эффекты, нарезанные спрайты). `A/D` — картинка, `W/S` — категория, колесо — зум.
3. **Нативные анимации** (`scenes/NativeViewer.tscn`) — браузер всех 38 персонажей нативно:
`Q/E` — персонаж, `W/S` — состояние (скелет), `A/D` — анимация. Внизу — **кастомизация
цвета** (Кожа / Волосы / Глаза + Сброс): части красятся шейдером `assets/recolor.gdshader`
(замена оттенка с сохранением светотени) по имени слота.
Все **189 скелетов** (38 персонажей × их состояния) сконвертированы в нативные
`characters/<char>/<state>_native.tscn`.
## Управление
**Персонажи:**
| Клавиша | Действие |
|---|---|
| `Q` / `E` | предыдущий / следующий персонаж |
| `W` / `S` (↑ / ↓) | предыдущее / следующее состояние |
| `A` / `D` (← / →) | предыдущая / следующая анимация |
| колесо мыши | зум |
| `Пробел` | перезапустить анимацию |
| `R` | сбросить вид |
**Текстуры (галерея):**
| Клавиша | Действие |
|---|---|
| `A` / `D` (← / →) | предыдущая / следующая картинка |
| `W` / `S` (↑ / ↓) | предыдущая / следующая категория (папка) |
| колесо мыши | зум · `R` — сброс |
## Структура
```
characters/ — персонажи
<name>/*_native.tscn — НАТИВНЫЕ сцены (Skeleton2D + Polygon2D + AnimationPlayer) — то, что играется
<name>/spine/ — исходники Spine (.skel.bytes/.atlas.txt/.png). PNG нужны нативным сценам
как текстуры; .skel/.atlas — только для пересборки (можно удалить)
assets/ — прочее 2D-искусство (из AssetRipper-экспорта)
fonts/ — шрифты игры (.ttf/.otf)
ui/ — UI-скин: button/toggle/slider/window/textfield/scrollbar, Maininterface_*, Button_*
backgrounds/ — фоны, дороги, лес, замок, небо
fx/ — текстуры эффектов (Cartoon FX / cfxr)
cursors/ icons/ misc/ — курсоры, иконки, логотип
atlas/ — большие упакованные листы SpriteAtlas (UI/Room, 4096²) — сырые
ui_sliced/ — 286 отдельных UI-спрайтов, нарезанных из атласа по Unity-разметке
room_sliced/ — 15 спрайтов комнат из атласа
scenes/MainMenu.tscn — главное меню (главная сцена)
scenes/Dungeon.tscn / SpriteViewer.tscn / NativeViewer.tscn — три сцены из меню
src/MainMenu.cs — меню (кнопки, тема из игрового арта)
src/NativeBrowser.cs — браузер всех нативных персонажей (сканирует *_native.tscn)
src/TextureGallery.cs — галерея текстур
src/RoomMap.cs — карта убежища (сетка комнат, панорама/зум)
tools/convert_all.gd — ПАКЕТНАЯ конвертация всех скелетов в *_native.tscn
tools/bake_anim.gd — запекатель анимаций одного скелета (Spine → кости, JSON)
tools/build_tscn.gd — сборка одной .tscn из геометрии + запечённых анимаций
tools/spineconv/ — офлайн-экспортёр геометрии Spine → JSON (см. его README)
tools/rig/geom/*.json — выгруженная геометрия всех скелетов (для пересборки)
tools/slice_atlas.gd — нарезчик спрайтов из атласа (по tools/sprite_layout.json)
tools/sprite_layout.json — разметка спрайтов (имя, атлас, rect, 9-slice border)
```
## Как всё переведено в натив (Вариант B)
Все 189 скелетов конвертированы в нативный Godot. Пайплайн (нужна spine-godot 4.2-сборка):
1. **`tools/spineconv/`** (через `spine-csharp`) — выгружает геометрию рига каждого скелета
в `tools/rig/geom/*.json` (кости + меши с вершинами/UV/треугольниками/весами).
Batch: `spineconv --batch <characters> tools/rig/geom`.
2. **`tools/convert_all.gd`** — один прогон: по каждой геометрии запекает анимации из
Spine-рантайма (локальные трансформы костей + draw order покадрово) и **сохраняет**
`characters/<char>/<state>_native.tscn` (`Skeleton2D` + взвешенные `Polygon2D` +
`AnimationPlayer`).
Готовые `.tscn` + атлас-PNG работают в **обычном Godot без модуля Spine** и редактируются
в редакторе (кости, веса, ключи, draw order через `z_index`).
Пересобрать всё: `godot-4.2-... --headless --path . --script res://tools/convert_all.gd`.
## Перенарезать спрайты из атласа
Разметка `tools/sprite_layout.json` получена из AssetRipper `Sprite/*.json`
(PathID→атлас: 129=UI, 49/128=Room; координаты Unity снизу-вверх → нарезка делает flip по Y).
Повторная нарезка:
```
godot-4.2-4.6.1-stable-mono.exe --headless --path . --script res://tools/slice_atlas.gd
```
Не переносилось (движковый/Unity-мусор): водяные знаки и сплэши Unity, lookup-текстуры
пост-обработки (BayerMatrix, AreaTex, SearchTex, Falloff*, LDR_LLL1_* дизеринг),
TMP-атласы шрифтов, редакторные UI-иконки, White1px/none.
## Примечания
- В игре **каждое состояние персонажа — отдельный скелет**, поэтому смена состояния
инстанцирует другую `.tscn`.
- Среди анимаций встречаются рабочие огрызки аниматора (`dd`, `dfdfa`, `test` и т.п.) —
показываются все как есть.
- Анимации с **деформацией мешей** конвертер не переносит (только кости); у elf1 их нет,
у некоторых персонажей отдельные части могут быть чуть «жёстче» оригинала.
- Контент игры 18+.