Rosakasa
Elixir

Rosakasa

Motore di gioco 3D minimale per il sistema di intrattenimento Lys. (Un po' allucinatorio, dato che la realtà viene definita lato server)

GitHub|

Motore framebuffer C di base con una cartuccia demo e un host PC SDL2.

Questo progetto è destinato a funzionare in futuro su hardware ESP32. L'attuale host PC
funge da target di sviluppo nativo per testare il motore framebuffer e la
cartuccia demo prima dell'integrazione in ambiente embedded.

rosakasa_core è inoltre collegato al
Lys Entertainment System
, un progetto ospitato in un repository separato.

Struttura

include/rosakasa/display/   API pubblica del framebuffer/display
demo/ Punto di ingresso per la configurazione/aggiornamento della cartuccia demo
demo/src/ Funzioni di supporto al rendering e sorgenti della cartuccia demo
host/pc/ Eseguibile per PC che collega il motore alla cartuccia demo
src/engine/ Ciclo di vita del motore, pacchetti HTTP/WebSocket e backend di visualizzazione SDL

I sorgenti della cartuccia demo presenti in demo/src/ vengono rilevati automaticamente da CMake.

PC nativo

make build
make run

Se SDL2 non è installato localmente, CMake scarica SDL2 con FetchContent per impostazione predefinita.

Configurazione del motore

rosakasa_engine gestisce la configurazione dei pacchetti tramite RosakasaEngineConfig.
I pacchetti HTTP e WebSocket sono presenti ma disabilitati per impostazione predefinita finché non viene collegato un
backend integrato o per 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);

L'API di invio rivolta al motore è indipendente dal backend:

RosakasaWebSocket *websocket = rosakasa_engine_websocket(engine);

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

La callback send configurata è responsabile del trasporto effettivo sulla piattaforma
e della scrittura del frame WebSocket. Su PC può essere supportata da una libreria WebSocket nativa;
su ESP32 può essere supportata dal client WebSocket ESP-IDF.

L’host PC include un backend ws:// di base. Abilitalo tramite variabili d’ambiente
prima dell’esecuzione:

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

ROSAKASA_WS_TLS=1 è riservato per wss://, ma il backend del PC non supporta
ancora TLS.

Disegno dimostrativo

La demo dispone di un'astrazione locale del framebuffer:

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

Le funzioni di supporto al disegno accettano un Framebuffer *, quindi nei punti di chiamata non è necessario ripetere le dimensioni dello schermo:

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

Le coordinate dello schermo partono dall'angolo in alto a sinistra:

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

Per il framebuffer predefinito 240x240, il centro dello schermo è:

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

draw_square considera il proprio argomento Point come il centro del quadrato.