Обновления

Dagon 0.29.0

В очередной версии Dagon добавлены эффекты ретро-рендеринга — снаппинг вершин (SimpleRenderPass.retroVertexSnapping) и пикселизация (PresentRenderer.pixelization, PresentRenderer.pixelSize). SimpleRenderer теперь поддерживает свечение, туман и фоновые объекты. Исправлен баг с неправильным рендерингом упрощенной тени в SimpleRenderer.

В модуль dagon.graphics.texture добавлены функции конвертации текстурных форматов между различными API: dxgiFormatToGLFormat, vkFormatToGLFormat, glFormatToVkFormat.

Исправлены некоторые важные баги, в том числе интерполяция кадров в GLTFPose и GLTFBlendedPose, а также, благодаря переходу на новую версию dlib, очень неприятный баг с повреждением памяти в загрузчике glTF.

dlib 1.3.3

Багфикс-релиз, исправляющий повреждение памяти в декодере JSON из-за неправильного поведения лексера.

PN Reloaded 2.7.0

К этой версии редактора прилагается плагин PNScript, реализующий поддержку скриптов на JavaScript (на основе Node.js). Скрипты работают как текстовые фильтры, с их помощью можно реализовать форматирование, умный поиск, деобфускацию, различные алгоритмы анализа данных и т.д. Можно устанавливать NPM-пакеты, что дает практически неограниченные возможности обработки текстов. Автоматизация самого редактора (создание макросов) пока не поддерживается.

Также добавлена опция «Load ASCII files as UTF-8».

Сборку можно скачать на странице релиза.

PN Reloaded 2.6

Практически сразу занялся добавлением в Programmer’s Notepad новых фич, которые хотел годами.

  • Файлы с неизвестной кодировкой теперь загружаются как UTF-8. Раньше очень раздражало, когда они открывались как ANSI/Windows-1251 — я считаю, что теперь надобность в устаревших кодировках отпала, и любой ASCII-файл должен бесшовно интерпретироваться как UTF-8;
  • Автоматическое определение индентации (табы/пробелы) из содержимого файла — очень понравилась эта фича из VSCode. Предусмотрена галочка, чтобы отключить эту опцию, и тогда будет работать по-старому — символ индентации по умолчанию будет всегда как в настройках;
  • Файлы *.exe теперь запускаются двойным кликом в браузере файлов и дереве проекта;
  • Схемы подсветки синтаксиса для HLSL и Haskell. В схему для GLSL добавлены новые типы и ключевые слова;
  • Поддержка JSON — json-файлы интерпретируются как JavaScript для подсветки синтаксиса;
  • Добавлены файлы, необходимые для сборки CHM-справки с помощью HTML Help Workshop.

Сборку можно скачать на странице релиза.

Programmer’s Notepad Reloaded

Некоторые, я думаю, знают, как я люблю старый/экзотический софт) Например, я до сих пор использую редактор Programmer’s Notepad, заброшенный еще с 2016 года. Ну а что, вещь хорошая, проверенная, редактор не перегруженный, не тормозит, не мешает подсказками. Поддерживает D из коробки. Конечно, это не IDE, но лучший «продвинутый блокнот» из бесплатных. На днях решил сделать его форк под названием Programmer’s Notepad Reloaded: https://github.com/gecko0307/pn-reloaded. Пока ничего значительно не менял, только исправил мелкие проблемы совместимости с современной Студией и добавил схемы подсветки синтаксиса для GLSL и WGSL.

Для компиляции нужен Boost 1.57 (🤮) — его надо скопировать в lib/boost/boost-1_57_0. WTL скачивать не нужно, я его положил прямо в репозиторий, так как весит совсем мало.

Можно скачать готовую сборку на странице релиза. К сожалению, пока только x86 — в 64-битном режиме PN собрать затруднительно из-за старых библиотек, но я работаю над этим.

Dagon 0.28.0

В этом году обновления Dagon выходят одно за другим — дело в том, что я решил увеличить частоту релизов, так как добавляемые улучшения мало связаны между собой и обычно не ломают обратную совместимость. Движок постепенно приближается к версии 1.0, после чего набор базовых фич будет стабилизирован, и я уже не буду вносить серьезных изменений в API.

В новом релизе добавлен оператор тональной компрессии Khronos PBR Neutral, а также новый extra-шейдер OceanShader, реализующий волны Герстнера. Исправлен баг с передачей неправильного буфера глубины в фильтр Depth of Field. Главный конфиг приложения (settings.conf) теперь поддерживает опции рендеринга — см. шаблон конфига в репозитории. Добавлено свойство PositionSync.mask для взвешенной/выборочной привязки к осям.

Шаблон проекта DUB (init-exec) теперь генерирует файлы settings.conf, input.conf и locales/en_US.lang.

До этого еще выходил небольшой патч Dagon 0.27.1, в котором я исправил баги в загрузчике KTX/KTX2 и добавил поддержку сохранения текстур в KTX2 (функция saveTextureToKTX2).

Шейдер океана

В следующей версии Dagon будет новый extra-шейдер OceanShader, реализующий волны Герстнера. Волны смещаются так, что объект воды можно двигать в плоскости XZ вместе с камерой — получается эффект бесконечного океана.

Пример:

auto oceanMesh = New!ShapePlane(150, 150, 100, assetManager);

auto waterMaterial = addMaterial();
waterMaterial.roughnessFactor = 0.0f;
waterMaterial.blendMode = Transparent;
waterMaterial.useCulling = false;
waterMaterial.textureScale = Vector2f(0.2f, 0.2f);
waterMaterial.shader = New!OceanShader(assetManager);

auto eWaterPlane = addEntity();
eWaterPlane.drawable = oceanMesh;
eWaterPlane.material = waterMaterial;
auto psyncWater = New!PositionSync(eventManager, eWaterPlane, camera);
psyncWater.mask = Vector3f(1.0f, 0.0f, 1.0f);

Dagon 0.27.0

Выпустил новую версию движка. В Dagon 0.27 наконец-то появились тени от позиционных источников света (то есть, для всех, кроме Sun) — это реализовано техникой двойного параболоида, которая значительно эффективнее классического подхода с теневой кубической картой. Чтобы включить тень, ничего особенного делать не надо, просто light.shadowEnabled = true;.

Также добавил префильтрацию кубических карт — свертку с использованием GGX BRDF под различные значения шероховатости. Чтобы сконвертировать равнопромежуточную карту в кубическую, а затем отфильтровать, нужно сделать так:

uint resolution = 1024;
Texture cubemap = generateCubemap(resolution, aEnvmap.texture, null);
Texture prefilteredCubemap = prefilterCubemap(resolution, cubemap, assetManager);
Delete(cubemap);

Появилась поддержка анизотропной фильтрации текстур (если поддерживается расширение GL_EXT_texture_filter_anisotropic). Включается следующим образом:

texture.useAnisotropicFiltering = true;
texture.anisotropy = texture.maxAnisotropy;

Добавлена поддержка поля extras для большинства объектов в загрузчике glTF (кроме материалов и текстур).

Еще одна новая фича — поддержка локализации приложений (dagon.core.i18n). Локали — файлы *.lang — загружаются из папки locales. Например, чтобы добавить русскую локаль, нужно добавить файл locales/ru_RU.lang.

Синтаксис файлов точно такой же, как у конфигов. Например, можно сделать так:

hello_world: "Привет, мир!";

В приложении:

string text = application.translate("hello_world");

Приложение сначала пытается загрузить locales/en_US.lang, затем локализацию, выбранную в зависимости от текущего системного языка и региона, перезаписывая дефолтные английские значения. Либо пользователь может явно указать нужную ему локаль в settings.conf:

locale: "ru_RU";