Rosakasa
Elixir

Rosakasa

适用于 Lys 娱乐系统的极简 3D 游戏引擎。(由于现实由服务器端定义,因此体验有些超现实)

GitHub|

一个带演示卡带和 PC SDL2 主机的 C 语言帧缓冲引擎框架。

该项目计划未来在 ESP32 硬件上运行。当前的 PC
主机作为原生开发目标,用于在嵌入式集成前测试帧缓冲引擎和
演示卡带。

rosakasa_core 还与
Lys Entertainment System
项目相关联,该项目位于一个独立的代码库中。

结构

include/rosakasa/display/   公共帧缓冲区/显示 API
demo/ 演示卡带的初始化/更新入口点
demo/src/ 演示卡带的渲染辅助函数及源代码
host/pc/ 将引擎与演示卡带连接起来的 PC 可执行文件
src/engine/ 引擎生命周期、HTTP/WebSocket 包以及 SDL 显示后端

位于 demo/src/ 下的演示卡带源代码会由 CMake 自动识别。

原生 PC

make build
make run

如果本地未安装 SDL2,CMake 会默认通过 FetchContent 下载 SDL2。

引擎配置

rosakasa_engine 通过 RosakasaEngineConfig 管理包配置。
HTTP 和 WebSocket 包虽然存在,但默认处于禁用状态,直到连接上
嵌入式或 PC 后端为止:

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 帧写入。在 PC 上,这可以由原生 WebSocket
库提供支持;在 ESP32 上,则可以由 ESP-IDF WebSocket 客户端提供支持。

PC 主机包含一个基本的 ws:// 后端。在运行前,请通过环境
变量启用它:

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

ROSAKASA_WS_TLS=1 专用于 wss://,但 PC 后端目前尚不支持
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 参数视为正方形的中心。