# Аватары из PNG-слоёв `avatar_layers` — рабочая реализация `IAvatarRenderer` с идентификатором `layers`. Контентный мод зависит от `avatar_layers>=1`, объявляет сущность `Kind: avatar` с `Renderer: layers` и кладёт прозрачные PNG в свою папку `avatar_layers/`. [Полный формат и пример ресурса](en.md). ## Привязки пресетов - `canvas`: объект `Width`, `Height`, по умолчанию 512×1024 логических пикселя. - `layers/`: путь к 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 { ["eyes_state"] = "closed" }); renderer.Apply(avatar.Resolve()); // До уничтожения host или выгрузки мода: renderer.Dispose(); ``` Пресеты переключают картинки дискретно, даже если передано время перехода. Положение, прозрачность и отражение также задаются целевым состоянием. Плавные деформации, маски, анимации моргания и интеграция с диалогами пока не реализованы. Рендерер переиспользует неизменившиеся PNG и освобождает ненужные текстуры после удаления старых узлов. Ошибочное визуальное состояние не заменяет предыдущее. Логическое состояние аватара хранится отдельно. Владелец явно применяет изменения и освобождает рендерер. Все визуальные операции выполняются на главном потоке Godot. Тестовый набор `--itest=avatar_layers_contracts` содержит синтетические PNG и проверяет настоящую отрисовку по цветам пикселей, переключение пресетов и освобождение ресурсов. Для пиксельных проверок нужен оконный рендерер. В обычной игре тестовые ресурсы не загружаются.