# Re2DSprite v1 — развёртка всего персонажа, прототип головы

> Это совместимый ранний формат. Текущий большой атлас, мимика, тело и
> подмены описаны в [Re2DSprite v2](RE2DSPRITE_V2).

Re2DSprite синтезирует спрайт из одной PNG-развёртки поверхности. Готовых
ракурсов, меша, скелета и перспективной камеры в ассете нет. Это новый
генератор 2D-спрайта, а не новый renderer: результат входит в обычный батч.
`$.cels` выбирает готовые кадры, `$.mesh` деформирует вершины; ни одна из этих
подсистем не решает эту задачу. Они остаются самостоятельными.

## Строгий PNG

Базовый PNG для авторинга: `assets/rotsprite/rotsprite_v1_template.png`.
Пример заполнения той же раскладки маскотом:
`demos/assets/art/mascot/russi_rotsprite_v1.png`.
Оба 512×512 (`N=64`). Направляющие шаблона нужно закрасить, не переносить
в готовый арт. Генераторы и запуск — [README демо](demos/rotsprite).

Размер `8N × 8N`, целое `N = 8..256`, RGBA после декодирования SDL_image.
Альфа только 0 или 255; полупрозрачные пиксели отклоняются. Версия формата
задана API v1, без распознавания произвольных картинок и метаданных.

| Область | Назначение |
|---|---|
| `[0,0,4N,2N]` | вся поверхность головы, longitude/latitude |
| `[4N,0,N,N]` / `[4N,N,N,N]` | левое ухо спереди / сзади |
| `[5N,0,N,N]` / `[5N,N,N,N]` | правое ухо спереди / сзади |
| `[6N,0,2N,2N]` | длинные волосы |
| `[0,2N,4N,2N]` | торс |
| `[4N,2N,2N,2N]` / `[6N,2N,2N,2N]` | руки |
| `[0,4N,4N,2N]` | таз / юбка |
| `[4N,4N,2N,2N]` / `[6N,4N,2N,2N]` | ноги |
| `[0,6N,8N,2N]` | хвост, чёлка, кисти и обувь: четыре слота 2N×2N |

**Всегда один общий атлас всего тела.** Первый вертикальный срез читает
голову и уши из него; остальные области сохраняются как данные для следующих
milestones. Их проекция пока не реализована. Размещение областей фиксировано;
параметризацию тела нужно утвердить при реализации тела, v1 её не обещает.

Голова: `u = 0.5 + atan2(x/14,z/12)/(2π)`,
`v = acos(-y/18)/π`. Фронт находится в центре полосы (`u=0.5`), затылок
на шве `u=0/1`, макушка `v=0`, подбородок `v=1`. U цикличен, V зажат.
Это текстура непрерывной поверхности, а не пять портретов.

Уши — фиксированные треугольные призмы толщиной 6 пикселей.
Левое: вершины XY `(-16,-9),(-13,-27),(-4,-12)`, правое зеркально.
UV уха: `(x+16)/12, (y+27)/18` (для правого сначала зеркалируется X).
Передняя поверхность `z=3`, задняя `z=-3`; боковая кромка использует тот же
планарный рисунок. Задняя область хранит материал сзади, а не готовый ракурс.
Прозрачное ухо позволяет видеть голову за ним. Прозрачность головы — маска
ближайшей поверхности, не сквозное отверстие до обратной стороны.

## Математика и пиксели

Встроенный шаблон: эллипсоид головы с полуосями `(14,18,12)` и две призмы.
Вспомогательная глубина локальна одному спрайту; миру R2D она не передаётся.
Растер 64×64, центр `(32,32)`, проба в центре каждого пикселя.
Обратный ортографический луч пересекает шаблон; ближайшая непрозрачная
поверхность выбирает один texel PNG. Нет билинейной фильтрации, освещения,
сглаживания, усреднения цветов и нарисованных промежуточных ракурсов.

Yaw в градусах, нормализация в `[-180,180)`. Положительный yaw поворачивает
нос вправо на экране. Затем pitch вокруг экранной X; положительный pitch
наклоняет нос вниз. Pitch ограничен `[-75,75]`. NaN/Infinity — ошибка.
Один нативный проход на изменённую позу, один переиспользуемый CPU-буфер и
GPU-текстура на голову. Повтор той же позы не делает upload.

## Интеграция и границы

Публичный API — `$.re2dSprite`, см. [rotsprite.md](highlevel/re2dsprite).
Узел `<rotsprite>` использует существующий renderer hook и батч спрайтов.
Экранный левый верхний угол привязывается к целой логической координате,
размер — к целому масштабу пикселя. Nearest задаётся только его спрайту.
Поворот в плоскости, произвольный pivot и неравномерный scale в v1 не
поддержаны; yaw/pitch задаются отдельным методом. Клип, слой, цвет, альфа,
видимость и положение камеры обслуживаются существующим 2D-путём.

Форма фиксирована: отдельные пряди, нос с собственной глубиной, тело,
анимация выражений, пользовательские профили формы и производственный
редактор развёрток — следующие milestones. Растяжение рисунка на больших
углах является ограничением этой параметризации, не готовым решением арта.
Новый пакет/зависимость не нужен. Файлы PNG читаются через действующий VFS,
поэтому тот же ассет доступен игре из каталога и из груза.
