Rosakasa
Elixir

Rosakasa

Minimale 3D-Spiel-Engine für das Lys-Unterhaltungssystem. (Wirkt etwas halluzinatorisch, da die Realität serverseitig definiert wird)

GitHub|

C-Framebuffer-Engine im Grundgerüst mit einer Demo-Kassette und einem PC-SDL2-Host.

Dieses Projekt ist dafür vorgesehen, künftig auf ESP32-Hardware zu laufen. Der aktuelle PC-
Host dient als natives Entwicklungsziel zum Testen der Framebuffer-Engine und der
Demo-Kassette vor der Integration in ein eingebettetes System.

rosakasa_core ist außerdem mit dem
Lys Entertainment System
verknüpft, das sich in einem separaten Repository befindet.

Aufbau

include/rosakasa/display/   Öffentliche Framebuffer-/Anzeige-API
demo/ Einstiegspunkt für Einrichtung/Aktualisierung der Demo-Kassette
demo/src/ Rendering-Hilfsfunktionen und Quellcode der Demo-Kassette
host/pc/ PC-Ausführungsdatei, die die Engine mit der Demo-Kassette verbindet
src/engine/ Lebenszyklus der Engine, HTTP-/WebSocket-Pakete und SDL-Anzeige-Backend

Die Quellcodes der Demo-Kassette unter demo/src/ werden automatisch von CMake eingelesen.

Nativer PC

make build
make run

Wenn SDL2 lokal nicht installiert ist, lädt CMake SDL2 standardmäßig mit FetchContent herunter.

Engine-Konfiguration

rosakasa_engine verwaltet die Paketkonfiguration über RosakasaEngineConfig.
Die HTTP- und WebSocket-Pakete sind vorhanden, aber standardmäßig deaktiviert, bis ein
Embedded- oder PC-Backend angebunden wird:

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);

Die für die Engine bestimmte Send-API ist backend-neutral:

RosakasaWebSocket *websocket = rosakasa_engine_websocket(engine);

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

Der konfigurierte send-Callback ist für den eigentlichen Plattformtransport
und das Schreiben des WebSocket-Frames zuständig. Auf einem PC kann dies durch eine native WebSocket-
Bibliothek unterstützt werden; auf dem ESP32 kann dies durch den ESP-IDF-WebSocket-Client erfolgen.

Der PC-Host enthält ein einfaches ws://-Backend. Aktivieren Sie es vor der Ausführung
über Umgebungsvariablen:

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

ROSAKASA_WS_TLS=1 ist für wss:// reserviert, das PC-Backend unterstützt jedoch
TLS noch nicht.

Demo-Zeichnung

Die Demo verfügt über eine lokale Framebuffer-Abstraktion:

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

Zeichenhilfen nehmen einen Framebuffer * entgegen, sodass die Aufrufstellen die Bildschirmabmessungen nicht wiederholen müssen:

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

Die Bildschirmkoordinaten beginnen oben links:

(0, 0) x steigt ->
  |
  v
y steigt

Für den Standard-Framebuffer 240x240 liegt die Bildschirmmitte bei:

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

draw_square behandelt sein Point-Argument als Mittelpunkt des Quadrats.