Докинг в ImGui

В тулките ImGui меня особенно радует поддержка докинга окон – это просто киллер-фича для создания сложных интерфейсов для различных редакторов, причем использовать ее очень легко, нужно только создать ImGuiIO со включенным докингом (io.ConfigFlags |= ImGuiConfigFlags.DockingEnable), а затем добавить в очередь объект DockSpace поверх вьюпорта:

ImGuiViewport* viewport = cast(ImGuiViewport*)igGetMainViewport();
ImGuiID mainDockSpaceId = igDockSpaceOverViewport(viewport, 
    ImGuiDockNodeFlags.PassthruCentralNode);

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

if (igBegin("Settings", null, ImGuiWindowFlags.NoCollapse))
{
    if (igCollapsingHeader("Post-processing"))
    {
        //...
    }
    
    igEnd();
}

Состояние докинга сохраняется в файл imgui.ini, и при повторном запуске приложения ваши окна будут закреплены уже изначально, что очень удобно.

Физика автомобиля: новое видео

Записал видео обновленной демки с физикой автомобиля на движке Dagon: новая модель трения (формула Пасейки), поддержка звуков (используется движок SoLoud), множество мелких улучшений и багфиксов.

Хобби-проекты как интеллектуальный капитал

Задумываясь над тем, какая польза от такого неординарного увлечения, как графическая разработка, я пришел к следующему выводу. Почти все, что я написал в своей жизни “для души”, так или иначе оправдало вложенные усилия – не всегда напрямую и не всегда в материальном выражении, но тем не менее: я получил опыт, который профессионально пригождается буквально каждый день, в каждом проекте. Например:

  • Что возможно и что невозможно. Область применимости машинной логики, вычислений и алгоритмов. Что можно решить за конечное время, а что нет. Какие задачи можно решить точно, какие – приближенно. Где можно положиться на строгую математику, а где лучше работает эвристика.
  • Какие математические модели оптимальны для изображения на компьютере тех или иных явлений реального мира. Под изображением я имею в виду не только реалистичное 3D, но и абстрактную графику, которая используется в анимационном дизайне – вплоть до того, как эффективнее всего рисовать геометрические фигуры. Как лучше всего хранить ту или иную информацию, какая точность чисел для нее оптимальна. Каков минимум параметров, которыми можно выразить ту или иную моделируемую сущность.
  • Как перевести концепцию, выраженную на человеческом языке, на машинный или математический уровень абстракции. Например, говоря о движении, люди любят оперировать такими неформальными понятиями, как “плавно”, “мягко”, “летает”, “парит”, “выскакивает” и т. д. Эти слова не имеют однозначного определения на языке математики, поэтому их приходится трактовать интуитивно, с пониманием контекста и общей картины, заранее воображая в голове, как должен выглядеть результат – и уже исходя из этого представления выводить матмодель: функции движения, изинги, тайминги и т.д.
  • Сколько времени требуется на реализацию тех или иных моделей, механик, алгоритмов и т.д. Какие существуют готовые решения для стандартных задач, и как выбрать оптимальное из нескольких вариантов.

Разработка на языке D – 13 лет спустя

13 лет назад я написал статью «Перспективы использования D в разработке игр» для журнала «FPS», в которой дал краткую характеристику основных особенностей языка и выделил главные его преимущества перед конкурентами. D изначально создавался как альтернатива C++ для разработки десктопных и серверных приложений – за прошедшие годы область применения языка не изменилась, хотя и добавились такие замечательные возможности, как поддержка ARM и Web Assembly. Но конъюнктура рынка и технологический статус кво сегодня уже несколько иные, поэтому я счел необходимым написать новую статью на ту же тему: насколько D актуален в геймдеве в 2023 году?

(далее…)

dlib 1.2 и другие обновления

Несколько обновлений за последние месяцы:

dlib 1.2.0 – добавлены функции гомотетии (homothetyMatrix, homothetyMatrix2D) в модуль dlib.math.transformation, функции конвертации радианов в обороты и обратно (radtorev, revtorad) в модуль dlib.math.utils. В dlib.image.render.shapes появилась функция отрисовки прямоугольника (drawRect) – автор реализации ReactiveAlkali. Добавлен файл CODE_OF_CONDUCT.md – краткий кодекс поведения для сообщества dlib:

Code of Conduct

Этот проект приветствует вклад в любой форме и поощряет открытое обсуждение и обмен мнениями о его функциях, архитектуре и деталях реализации. Для поддержания надлежащей культуры общения был сформулирован настоящий Кодекс поведения. Это относится к системе отслеживания проблем проекта, чату и, возможно, другим каналам связи.

1. Мы не приемлем нецензурные выражения, грубые и/или пренебрежительные сообщения, использование сексуальной, жестокой и иной оскорбительной лексики и изображений.

2. Любая критика должна быть конструктивной и разумной. Простого личного недовольства без каких-либо объективных причин недостаточно, чтобы делать критические заявления и влиять на развитие dlib.

3. Этот проект держится в стороне от нетехнологических вопросов и тем. Мы приветствуем всех, независимо от возраста, гендерной идентичности, религии, этнической принадлежности, гражданства или культурного происхождения, и наше сообщество не придерживается какой-либо определенной идеологии. Сайты, репозитории, каналы связи и прочие ресурсы, связанные с dlib, не должны использоваться как площадка для пропаганды.

Также добавлена поддержка Doxygen для генерирования документации.

bindbc-wgpu 0.16.0 – синхронизация с wgpu-native 0.16.0.1. Кстати, также обновил демку wgpu-dlang, добавил поддержку мипмаппинга и перевел на dlib 1.2.0.

Dagon 0.15 пока, к сожалению, откладывается на неопределенный срок – не доходят руки сделать поддержку 1D-текстур, которой не хватает для того, чтобы реализовать загрузчик KTX. В марте добавил новые параметры постобработки для ручного управления эффектом Depth of Field (dofManual, dofNearStart, dofNearDistance, dofFarStart, dofFarDistance) – это нужно, если необходимо реализовать кастомную расфокусированность, труднодостижимую стандартными параметрами focalDepth, focalLength и fStop.