Rosakasa
Elixir

Rosakasa

Lysエンターテインメントシステム向けのミニマルな3Dゲームエンジン。(現実がサーバー側で定義されるため、ある種の幻覚的な体験となる)

GitHub|

デモカートリッジとPC用SDL2ホストを備えた、Skeleton 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=1wss:// 用に予約されていますが、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 引数を正方形の中心として扱います。