На Hasselblad X2D запустили Doom, связав движок со штатным интерфейсом камеры

Разработчик Radium Wang запустил классический Doom на среднеформатной камере Hasselblad X2D 100C. Для этого ему пришлось не просто перенести игровой движок на ARM-платформу, а связать его со штатным интерфейсом устройства. В результате кнопка спуска затвора стала отвечать за стрельбу, свайпы по сенсорному экрану — за поворот персонажа, а встроенный динамик воспроизводит звуковые эффекты.
Эксперимент проводился на первой версии Hasselblad X2D 100C с прошивкой 4.2.0, сборка 24849. Камера оснащена 100-мегапиксельным сенсором и 3,6-дюймовым сенсорным дисплеем. В продажу устройство поступило в 2022 году по цене 8200 долларов без объектива.
Как Doom подключили к интерфейсу камеры
Изучив прошивку, разработчик обнаружил 64-разрядную ARM-платформу, Android API 28 и интерфейс, построенный на Qt 6.4.1 с использованием Wayland. При этом Qt Quick уже встроен в штатное приложение камеры, однако отдельной библиотеки для запуска сторонних программ в системе нет.
Поэтому проект разделили на две части: независимый игровой движок и отдельную страницу внутри интерфейса камеры. Чтобы загрузить эту страницу, Wang заменил скомпилированный QML-файл прямо в памяти процесса. Прошивку при этом редактировать не пришлось.
Основой проекта стал порт doomgeneric. Для вывода изображения, обработки ввода и управления игровым циклом разработчик написал адаптер на C. Сам движок собрали с помощью Zig в статический исполняемый файл для ARM64.
Обмен кадрами, управление и звук
Изображение передаётся через файлы, размещённые в оперативной памяти. Функция DG_DrawFrame() формирует кадр размером 320 × 200 пикселей во временном BMP-файле, а после завершения записи переименовывает его в frame.bmp. Такой подход не позволяет интерфейсу прочитать файл до того, как кадр будет полностью записан.
QML-страница с интервалом 30 миллисекунд проверяет номер кадра, загружает обновлённое изображение и растягивает его до соотношения сторон 4:3. В обратную сторону передаются данные управления: интерфейс записывает состояния клавиш и смещения свайпов, после чего движок преобразует их в игровые события. Благодаря мультитач игрок может одновременно двигаться и поворачивать персонажа.
Звуковой модуль извлекает эффекты из WAD-файла Doom и формирует 16-битный стереопоток с частотой 48 кГц. Затем поток через буфер в общей памяти передаётся процессу, который взаимодействует непосредственно с динамиком камеры. Пока проект поддерживает только звуковые эффекты — воспроизведение музыки не реализовано.
Исходный код опубликован на GitHub под лицензией GPL. Готового установщика для запуска Doom на Hasselblad X2D разработчик не подготовил, поэтому повторить эксперимент можно только самостоятельно, используя опубликованные материалы и совместимую версию камеры.


