Update avatar_layers implementation, assets and documentation
This commit is contained in:
commit
1753766a5d
21 files changed
+757
No files matched your search
+42
@@ -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 и проверяет
|
||||
настоящую отрисовку по цветам пикселей, переключение пресетов и освобождение ресурсов.
|
||||
Для пиксельных проверок нужен оконный рендерер. В обычной игре тестовые ресурсы не загружаются.
|
||||
Reference in new issue
Block a user