Выпустил на YouTube-канале небольшое обзорное видео самых интересных новых возможностей Dagon:
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
. Добавлена поддержка логирования в буфер.
Обновления
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
).