Rosakasa
Elixir

Rosakasa

Минималистичный 3D-игровой движок для игровой системы Lys. (В некотором роде галлюцинаторный, поскольку реальность определяется на стороне сервера)

GitHub|

Каркасный движок фреймбуфера на языке C с демонстрационным картриджем и хостом SDL2 для ПК.

В будущем этот проект планируется запустить на аппаратной платформе ESP32. Текущий хост для ПК
служит в качестве нативной среды разработки для тестирования движка фреймбуфера и
демонстрационного картриджа перед интеграцией в встраиваемые системы.

rosakasa_core также связан с проектом
Lys Entertainment System
, который находится в отдельном репозитории.

Структура

include/rosakasa/display/   Общедоступный API фреймбуфера/отображения
demo/ Точка входа для настройки/обновления демо-картриджа
demo/src/ Вспомогательные функции рендеринга и исходные коды демо-картриджа
host/pc/ Исполняемый файл для ПК, связывающий движок с демо-картриджем
src/engine/ Жизненный цикл движка, пакеты HTTP/WebSocket и бэкенд отображения SDL

Исходные коды демонстрационного картриджа, расположенные в каталоге demo/src/, автоматически подбираются CMake.

Нативная версия для ПК

make build
make run

Если SDL2 не установлен локально, CMake по умолчанию загружает SDL2 с помощью FetchContent.

Настройка движка

rosakasa_engine управляет настройками пакетов через RosakasaEngineConfig.
Пакеты HTTP и WebSocket присутствуют, но по умолчанию отключены до тех пор, пока не будет подключен
встроенный или ПК-бэкенд:

RosakasaEngineConfig config = rosakasa_engine_default_config();

config.websocket.enabled = true;
config.websocket.host = "192.168.1.10";
config.websocket.path = "/socket";
config.websocket.port = 80;
config.websocket.use_tls = false;
config.websocket.send = platform_websocket_send;
config.websocket.user_data = platform_websocket;

rosakasa_engine_create_with_config(&config, &engine);

API отправки данных, доступное для движка, не зависит от конкретного бэкенда:

RosakasaWebSocket *websocket = rosakasa_engine_websocket(engine);

rosakasa_websocket_send_text(websocket, "{\"type\":\"ping\"}");

Настроенный обратный вызов send отвечает за фактическую передачу данных по платформе
и запись фреймов WebSocket. На ПК это может осуществляться с помощью нативной библиотеки WebSocket;
на ESP32 — с помощью клиента WebSocket ESP-IDF.

Хост на ПК включает базовый бэкэнд ws://. Включите его с помощью переменных
среды перед запуском:

ROSAKASA_WS_HOST=127.0.0.1 ROSAKASA_WS_PORT=4000 ROSAKASA_WS_PATH=/socket make run

ROSAKASA_WS_TLS=1 зарезервировано для wss://, но бэкэнд на ПК пока не поддерживает
TLS.

Демонстрация рисования

В демо используется собственная абстракция локального фреймбуфера:

typedef struct {
    uint8_t *pixels;
    int width;
    int height;
    int pitch_bytes;
} Framebuffer;

Вспомогательные функции рисования принимают Framebuffer *, поэтому в местах вызова не нужно повторять размеры экрана:

draw_line(&demo_framebuffer, (Point){20, 20}, (Point){220, 220}, 220);
draw_square(&demo_framebuffer, center, length, 255);

Координаты экрана отсчитываются от левого верхнего угла:

(0, 0) x увеличивается ->
  |
  v
y увеличивается

Для фреймбуфера размером 240x240 по умолчанию центр экрана находится в точке:

Point screen_center = {
    demo_framebuffer.width / 2,
    demo_framebuffer.height / 2,
};

Функция draw_square рассматривает свой аргумент типа Point как центр квадрата.