От автора:
“В этой статье мы попытаемся подружить QtE5 и dlib, сделав несложный и удобный интерфейс для накладывания фильтров на изображения, оставив при этом возможность для пользователя добавлять свои фильтры”.
dlib
Фокусы с Compound
Недавно столкнулся с интересной задачей: описанием класса, который инкапсулирует неизвестный заранее набор объектов. Типы этих объектов задаются через variadic template – то есть, шаблон с переменным количеством параметров. Статические массивы для этой задачи, ясное дело, не годятся, но тут идеально подошел Compound из dlib.core.compound. Это своеобразный “гибрид” кортежа и структуры – составной тип данных, который можно создавать в шаблонах. Ему можно передавать кортеж параметров variadic-шаблона, и это позволяет проделывать замечательные вещи.
class Collection(C...)
{
protected Compound!C _components;
this(C comps)
{
_components = comps;
}
}
auto inc = new Collection!(int, char, bool)(10, 'a', false);
Проблема с обычными кортежами (Tuple) в том, что их нельзя возвращать из функции. Но Compound – можно. Таким образом, для ридонли-доступа к _components мы можем объявить следующий метод:
auto components() @property
{
return _components;
}
А еще мы можем заполнять Compound в цикле, читая значения, например, из массива:
this(int[] arr)
{
foreach(i, T; C)
{
_components[i] = cast(T)arr[i];
}
}
auto inc = new Collection!(int, char, bool)([5, 40, 0]);
Пример бессмысленный, но наглядный – мы проходим по всем типам кортежа C и записываем входное значение в наш Compound, конвертируя в нужный тип. Без дополнительных проверок это небезопасно, но если вы знаете, что делаете – очень полезно.
Анимация в dlib
Меня внезапно осенило, как можно добавить в dlib.image поддержку анимации без существенного рефакторинга библиотеки. Классы анимированных изображений (SuperAnimatedImage) могут быть простым расширением базового класса SuperImage с возможностью хранить несколько кадров и переключаться между ними. Такие изображения полностью совместимы с любым кодом, работающим с SuperImage – чтению и записи через привычный интерфейс SuperImage подлежит срез данных, относящийся к текущему кадру.
Также естественным образом вводится класс-фабрика для создания анимированных изображений, и в результате стало возможным расширить декодер PNG до поддержки APNG:
AnimatedImageFactory imgFac = new AnimatedImageFactory;
auto res = loadPNG(openForInput("animation.apng"), imgFac);
if (res[0])
{
SuperAnimatedImage animImg = cast(SuperAnimatedImage)res[0];
}
Итоги 2016 года
- Графический движок DGL был значительно отрефакторен и улучшен, был создан более эффективный формат для хранения сцен и реализованы различные новые техники рендеринга, самой интересной из которых является PBR. Движок стал работать намного быстрее, а картинка стала заметно современнее.
- Вышли подряд две новые версии коллекции библиотек dlib – 0.8 и 0.9.
- Вышло 6 номеров электронного журнала “FPS” (№№ 40, 41, 42, 43, 44, 45). В 2017 году журналу исполняется 9 лет.
- На сайте LightHouse Software вышли две мои статьи по D – “Стеганография в dlib” и “dlib.image и OpenCL”. Также Atrium и сопутствующие проекты привлекли внимание авторов Блога D, где был опубликован соответствующий отчет на английском.
- Я довел до ума и выложил трассировщик лучей и программный растеризатор, написанные на D, а, кроме того, все-таки доделал свой старый проект – Xtreme3D 3.0.
- Выход LunarG SDK, комплекта разработки под Vulkan. Одновременно появились и Vulkan-биндинги для разных языков, в числе которых и D. Поддержкой нового API постепенно обрастают и ведущие игровые движки.
- Открытие исходников CryEngine 5.
- Выход Krita 3.0 с поддержкой анимации.
- Переход Blender на OpenGL 2.1 для отрисовки интерфейса. Запускать последние версии Blender на своих старых ноутбуках я теперь не могу – а жаль…
- Появление Armory3D, альтернативного игрового движка для Blender – очень перспективный проект, картинкой и списком поддерживаемых платформ оставляет BGE далеко позади.
- Выход Doom 4. Покупать, правда, не стал, скачал на Steam бесплатную демо-версию. Чтобы запустить, пришлось немного пошаманить с настройками, но, в целом, остался доволен. Особенно порадовала пасхалка в виде комнаты с текстурами из классического Дума =)