Rosakasa
Минималистичный 3D-игровой движок для игровой системы Lys. (В некотором роде галлюцинаторный, поскольку реальность определяется на стороне сервера)
Каркасный движок фреймбуфера на языке 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 как центр квадрата.
