Шоурил 2025

Выпустил на YouTube-канале небольшое обзорное видео самых интересных новых возможностей Dagon:

Dagon 0.25.0

Вышла очередная версия движка! Наиболее интересным нововведением является расширение dagon:video, о котором я писал ранее — теперь в играх можно воспроизводить видео при помощи библиотеки libVLC. Видеопоток декодируется в текстуру, которую можно применить к любому материалу. Для полноэкранного отображения видео предусмотрен виджет FullscreenMediaView.

Наконец-то добавил в упрощенный рендер поддержку точечных и конусных источников света. Поддерживается до 8 источников света на слой, их нужно добавлять методом SimpleRenderPass.addLight. Также в упрощенном рендере появилась поддержка cel-шейдинга — управляется свойствами Material.celShading и Material.rimLight. В deferred-рендере эти свойства ни на что не влияют.

Появилась поддежка uniform-блоков в шейдерах. Вы можете создать массив uniform-структур при помощи объекта UniformBlockParameter. Поля структуры должны соответствовать требованиям std140.

Реализован MaterialAsset — ресурс описания материала, основанный на том же синтаксисе, что и конфигурационные файлы. Кстати, в файлах *.conf теперь поддерживаются матрицы 4×4 и 3×3 (фактически они являются массивами из 16 или 9 числовых значений, которые можно интерпретировать в приложении как матрицы с построчным расположением элементов).

Из мелочей: поддержка Entity.opacity в HUD-проходе, поддержка анимации для свойства Entity.opacity, поддержка Material.emissionEnergy в шейдере Sky, свойство TextureAsset.loaded.

libVLC и видеотекстуры

Я давно искал удобное решение для воспроизведения видео в играх, и вот, наконец, оно найдено — libVLC, библиотека, на которой основан всеми любимый плеер VLC. В отличие от FFMPEG, это высокоуровневый API, который позволяет буквально в несколько строк добавить видеоплеер в любое окно по HWND (или X window ID под Linux). Но самое интересное, конечно, декодировать видео во внеэкранный буфер, чтобы потом передать его в OpenGL-текстуру — libVLC это также позволяет с минимальными телодвижениями. Я уже добавил в репозиторий Dagon экспериментальное расширение dagon:video, которое предоставляет класс Video, обертку над libvlc_media_t* и libvlc_media_player_t*. Использовать его очень просто — сначала создается VideoManager, общий для всего приложения (лучше хранить его в классе, наследующем от Game):

VideoManager videoManager = New!VideoManager(this);

Затем, уже в сцене, создается источник видео:

Video video = New!Video(videoManager, 1920, 1080, assetManager);
video.open("media/video.mp4");

auto videoMaterial = addMaterial();
videoMaterial.baseColorTexture = video.texture;
videoMaterial.alphaTestThreshold = 0.0f;

video.play();

Можно использовать видеотекстуру для любых целей — показать заставку в начале игры, натянув на screen-aligned плоскость, или применить к мешу для создания внутриигрового экрана. Можно даже воспроизводить 360-градусные ролики в равнопромежуточной проекции для отображения на панорамном фоне.

Dagon 0.24.0

Выпустил новую версию движка. Основное нововведение — рендеринг текста теперь является частью ядра движка в качестве модуля dagon.graphics.font (таким образом, FreeType становится зависимостью ядра). Расширение dagon:ftfont удалено. В связи с этим я решил добавить в Dagon встроенный простой GUI. В данный момент поддерживаются перетаскиваемые окна, вывод многострочного текста (TextView), строка ввода (TextInput) и консоль (Console). GUI-тулкит встроен в объект Scene — доступен как свойство Scene.ui.

Добавлен менеджер шрифтов (Application.fontManager). Он загружает шрифты по умолчанию (Liberation Sans и Liberation Mono, которые прилагаются к движку) и позволяет создавать новые.
Добавлена базовая поддержка библиотеки Assimp (расширение dagon:assimp). Поддерживаются меши, узлы и некоторые свойства материалов (диффузный цвет, текстуры).

Также реализована возможность изменить системный курсор мыши методом Application.setCursor. Добавлена поддержка логирования в буфер.

Встроенный UI в Dagon

Наконец-то дошли руки начать пилить свой уютный UI-тулкит! Убийцу ImGui я, конечно, не планирую — это будет набор базовых виджетов для добавления в игру простых отладочных инструментов. Уже готовы окна и TextView — на скриншоте ниже демонстрируется вывод лога приложения.

Обновления

Dagon 0.23.1

Небольшое обновление Dagon 0.23. Добавлена поддержка переключения отдельных рендер-таргетов в PassTerrain — то есть, для материалов ландшафта работают свойства outputColor, outputNormal и др. Движок теперь использует dlib 1.3.2. Добавлены новые уроки — 9, 13 и 15.

К следующему релизу готовлю поддержку Assimp, о которой уже писал, а также перенос расширения dagon:ftfont в ядро движка, что позволит реализовать различные встроенные UI-компоненты.

BindbC-Assimp

Биндинг к Assimp 5 размещен на GitHub и доступен в качестве DUB-пакета. К сожалению, название bindbc-assimp занято заброшенным и несуществующим ныне проектом, поэтому пришлось зарегать как bindbc-assimp5.

Оптимизация блога

Я настроил объектный кэш на основе Redis, а также добавил HTML-кэш и заголовок Cache-Control, что заметно ускорило загрузку страниц блога. Было исправлено множество мелких проблем верстки. Все архивные игры теперь размещены на одном сервере с блогом.

Тема, которую я использую, теперь также доступна на GitHub. Это форк WPEX Blogger 1.2 от WPExplorer, в котором я внес исправления для совместимости с PHP 8, исправил поиск в мобильном меню, добавил новые переводы на русский, а также внес патч, исправляющий совместимость с плагином Code Syntax Block.

Поддержка Assimp

Библиотека Assimp — относительно тяжеловесное, но самое функциональное решение для загрузки 3D-моделей. У меня наконец-то дошли руки добавить поддержку Assimp 5+ в Dagon как расширение dagon:assimp, благодаря чему можно будет использовать в движке модели форматов FBX, Collada, 3DS и многих других. Пока загружаются только меши, но в планах добавить поддержку материалов, узлов и анимации.

Перед загрузкой модели можно задать кастомные флаги постпроцессора:

AssimpAsset aModel;

override void beforeLoad()
{
    aModel = this.addAssimpAsset("assets/cacodemon.fbx");
    aModel.loaderOption =
        aiPostProcessSteps.Triangulate | aiPostProcessSteps.FlipUVs;
}

После этого можно использовать меши из массива aModel.meshes для рендеринга:

auto e = addEntity();
e.drawable = aModel.meshes[0];

Новый сайт Dagon

Серьезно обновил https://gecko0307.github.io/dagon — реализован новый движок на основе рендеринга Markdown-документов, сайт переверстан в более современном дизайне, добавлены уроки, появилась отдельная страница со списком фич и скриншотами. Напомню, справка по API теперь живет на том же сайте: https://gecko0307.github.io/dagon/doc/dagon.html.

Написал новые уроки:

Также обновил урок Tutorial 11. Exporting Assets from Blender — там теперь подробности по экспорту из Blender и загрузке в Dagon моделей glTF.

Dagon 0.23.0

Обновил Dagon. Релиз не содержит нововведений и, в основном, оптимизирующий: теперь объекты Shader хранят прямые ссылки на параметры и обращаются по ним вместо строковых имен, когда записывают данные в методе bind. Индексы субрутин GLSL также извлекаются один раз при инициализации шейдера. Эта оптимизация дала весьма ощутимый прирост производительности на стороне CPU.

Удалено расширение dagon:stbi, так как стандартный загрузчик текстур Dagon полностью его заменяет. bindbc-sdl обновлен до версии 1.5.2.

К движку наконец-то появилась онлайн-документация — она доступна здесь. Документация генерируется из исходников. Полностью задокументированы пакеты dagon.core, dagon.graphics, dagon.resource, dagon.game и dagon.ui.

Dagon 0.22.0

Вышла новая версия движка! Как уже было упомянуто, добавил поддержку скелетной анимации glTF — спасибо denizzzka за реализацию модуля dagon.resource.gltf.animation с необходимыми классами GLTFAnimationSampler, GLTFAnimationChannel и GLTFAnimation. Скелетная анимация постепенно будет интегрирована в ядро движка: уже добавил абстрактный класс Pose для хранения матриц костей и необходимую функциональность для их передачи в вершинные шейдеры во всех стандартных пайплайнах Dagon. Вычисление этих матриц зависит от конкретного анимационного воркфлоу, для glTF предусмотрены GLTFPose и GLTFBlendedPose.

Также появилась поддержка мешей glTF без текстурных координат, нормалей и индексов. Загрузчик выводит предупреждение, если важные атрибуты отсутствуют, но такие модели теперь можно использовать без проблем.

В движок добавлен встроенный логгер — dagon.core.logger, который позволяет делать записи функциями logInfo, logDebug, logError и logFatalError. Лог по умолчанию выводится в консоль, можно также включить вывод в файл. Функции логирования работают аналогично writeln — то есть, поддерживают вариативные параметры любых типов. Можно отключить записи ниже минимального уровня, изменив глобальную переменную logLevel (по умолчанию — LogLevel.All).

Улучшения в dagon.core.event: горячее подключение игрового контроллера и поддержка вибрации (EventManager.gameControllerRumble).

Добавлен новый примитив — конус (ShapeCone).