Обновления

dlib 1.3.1

Вышло небольшое обновление dlib 1.3, в котором исправлена совместимость с отличными от x86 платформами.

BindBC-SPIRVCross

Написал D-биндинг к SPIRV-Cross, тулкиту для работы со SPIR-V. Теперь потенциально можно создать продвинутый фреймвок компиляции шейдеров – например, систему автоматической адаптации шейдеров к разным графическим API в одном приложении. Пригодится, когда я буду переходить на WebGPU.

dcore

Библиотека dcore, на основе которой я собираюсь писать вторую версию dlib, будет развиваться в качестве самостоятельного проекта: https://github.com/DLangGamedev/dcore. В связи с этим я решил создать организацию DLangGamedev, в которую перевел все BindBC-биндинги библиотек для разработки игр:

Статус dlib2

В последнее время редко пишу о dlib, но хочу заверить: разработка библиотеки на месте не стоит, в данный момент я разрабатываю dlib2, а точнее – ее низкоуровневый компонент dcore. dcore – это процедурный API, совместимый с betterC и минимально заменяющий стандартную библиотеку. Он полностью автономный, не зависит от Phobos, поддерживает компиляцию в машинный код под bare metal (то есть, без операционной системы) и в WebAssembly. Он предназначен для создания компактных приложений в стиле C, а также для написания высокоуровневых частей библиотеки на его основе.

Может возникнуть вопрос – для чего это нужно, если есть libc? dcore, конечно, использует стандартные функции C при компиляции в таргеты, которые поддерживают libc. Но все упирается в WebAssembly: своего Emscripten на D не существует. Поэтому, для упрощения написания WASM-модулей, я решил сделать минимальный набор абстракций, которые скрывают платформозависимые реализации самых важных компонентов приложения под универсальным низкоуровневым API. dcore элементарно позволяет использовать printf, malloc и т.д., не задумываясь, доступны ли они на целевой платформе.

Еще один важный момент – математика. Я уже публиковал пост о бенчмарках различных реализаций синуса и косинуса – dcore поддерживает все стандартные математические функции (sin, cos, tan, asin, acos, sqrt, cbrt и др.), предоставляя на каждой платформе оптимальные реализации: LLVM-интринсики, функции C, функции Phobos и кастомные, без зависимостей, предназначенные для нестандартных таргетов.

Из нового:

  • dcore.time – удобный враппер над C-шными localtime и gmtime. Позволяет получать текущую системную время-дату, в текущем часовом поясе или по Гринвичу;
  • dcore.sys – информация о системе: архитектура CPU, количество ядер, объем памяти, название и версия ОС. Модуль поддерживает x86/x64, ARM, ARM64, IA64, MIPS, SPARC, PPC. Информация об ОС поддерживается для всех версий Windows и двух больших семейств Unix – Linux/Solaris/AIX (через sysconf) и BSD/OSX (через sysctl);
  • dcore.process – позволяет кроссплатформенно получить PID.

Обновления

bindbc-newton 0.3.2

Небольшой исправляющий релиз, который фиксит список путей к Newton под Linux.

https://github.com/gecko0307/bindbc-newton/releases/tag/v0.3.2

dlib2 компилируется под WASM

Поддержка Web Assembly в LDC существует достаточно давно, и я когда-то уже делал экспериментальный мини-проект – приложение с треугольником, рисующимся через OpenGL ES, которое можно скомпилировать как под десктоп, так и в WASM-модуль. Для этой работы пришлось написать минимальную замену стандартной библиотеке, поскольку поддержка WASM в Phobos чуть более, чем никакая. Надеюсь изменить эту ситуацию в dlib2 – dcore уже сейчас можно собрать под WASM!

Например, вот такой “Hello, World” на десктопе печатает в стандартный вывод, а в браузере – в консоль, причем с поддержкой UTF-8:

module main;

import dcore.stdio;

extern(C):

void main()
{
    // Minimal cross-platform betterC application.
    // Will print to stdout on desktop and to the console in browser.
    
    printf("Hello from D! Привет из D!\n");
}

В ближайшее время напишу пост по статусу dlib2 и всем деталям планируемых фич.

Багфиксы и улучшения в MiniGL

Актуализировал и чуть доработал MiniGL, мой программный растеризатор. Исправил альфа-смешивание, а также теперь можно отключить запись и чтение z-буфера для отрисовки экранных спрайтов. Обновил также демонстрационное приложение – теперь это почти готовый движок для коридорных ретро-шутеров: есть проверка столкновений со стенами, стрельба магией и спрайт оружия.

Итоги 2024 года

Декабрь – время традиционного подведения итогов за прошедший год:

  • Выпустил три версии Dagon – 0.16, 0.17 и 0.18. В движке появились подповерхностное рассеивание, зонды локального освещения среды, тональная компрессия AgX, улучшен встроенный контроллер персонажа. Добавлена поддержка Wayland под Linux и поддержка экранов с высокой частотой обновления. Наконец-то появились меш-группы в загрузчике OBJ, что позволяет рендерить загруженную модель по частям с различными материалами и настройками. Появился новый встроенный шейдер звездного неба для ночных сцен и игр с космической тематикой. Доступны новые примеры: веревка на основе интегрирования Верле и механика игры от третьего лица.
  • Dagon, в числе других примечательных проектов на языке D, был упомянут на конференции FOSDEM 2024 в Брюсселе, а позже на эту тему вышло интервью со мной в онлайн-издании “Вечерняя Казань”.
  • Выпустил dlib 1.3.0, где был проделан ряд улучшений в математическом пакете и добавлен новый модуль dlib.math.random. Спасибо Александру Перфильеву aka aperfilev за багфиксы и поддержку GNU D Compiler в dlib.math.sse. В марте этого года библиотека побила все рекорды по скачиваниям за все время существования проекта – 14000 в месяц!

Ну и, конечно, небольшой список интересных событий в мире D и графического СПО:

  • Функция тональной компрессии AgX стала новым де-факто стандартом индустрии;
  • В языке Slang добавлена поддержка WGSL, что позволяет с большим удобством писать шейдеры для WebGPU-приложений;
  • На FOSDEM ’24 был представлен ознакомительный доклад о языке D и его преимуществах для разработки приложений компьютерной графики.
  • Upd: у GitHub Copilot появился бесплатный ограниченный доступ!

Стеганография в dlib

Моя статья 2016 года, изначально написанная для блога LightHouse Software. Приведенный код актуален и сегодня.

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

(далее…)