Update avatar_layers implementation, assets and documentation

This commit is contained in:
cthangover committed 2026-10-31 15:28:48 +03:00
commit 1753766a5d
21 files changed
+757

No files matched your search

+42
View File
@@ -0,0 +1,42 @@
# Аватары из PNG-слоёв
`avatar_layers` — рабочая реализация `IAvatarRenderer` с идентификатором `layers`.
Контентный мод зависит от `avatar_layers>=1`, объявляет сущность `Kind: avatar` с
`Renderer: layers` и кладёт прозрачные PNG в свою папку `avatar_layers/`.
[Полный формат и пример ресурса](en.md).
## Привязки пресетов
- `canvas`: объект `Width`, `Height`, по умолчанию 512×1024 логических пикселя.
- `layers/<id>`: путь к PNG с расширением, либо объект настройки слоя.
- `null` вместо слоя удаляет его из изображения.
Объект слоя содержит `Image`, `Order`, `X`, `Y`, `Width`, `Height`, `Visible`,
`Opacity`, `FlipH`, `FlipV`. Нулевые размеры означают размер холста. Для вырезанных
фрагментов задавай прямоугольник явно; для слоёв одинакового холста достаточно пути.
Порядок отрисовки — по `Order`, при равенстве по ID слоя. Более поздний слой выше.
Неизвестные свойства, отсутствующие PNG и неверные размеры отклоняются.
```csharp
IAvatar avatar = AvatarCatalog.Create("my_content/marao");
IAvatarRenderer renderer = AvatarRenderers.Create(avatar);
host.AddChild(renderer.View);
avatar.ApplyPresets(new Dictionary<string, string> { ["eyes_state"] = "closed" });
renderer.Apply(avatar.Resolve());
// До уничтожения host или выгрузки мода:
renderer.Dispose();
```
Пресеты переключают картинки дискретно, даже если передано время перехода.
Положение, прозрачность и отражение также задаются целевым состоянием.
Плавные деформации, маски, анимации моргания и интеграция с диалогами пока не реализованы.
Рендерер переиспользует неизменившиеся PNG и освобождает ненужные текстуры после
удаления старых узлов. Ошибочное визуальное состояние не заменяет предыдущее.
Логическое состояние аватара хранится отдельно. Владелец явно применяет изменения
и освобождает рендерер. Все визуальные операции выполняются на главном потоке Godot.
Тестовый набор `--itest=avatar_layers_contracts` содержит синтетические PNG и проверяет
настоящую отрисовку по цветам пикселей, переключение пресетов и освобождение ресурсов.
Для пиксельных проверок нужен оконный рендерер. В обычной игре тестовые ресурсы не загружаются.