Rosakasa
Elixir

Rosakasa

Minimale 3D-game-engine voor het Lys Entertainment System. (Een beetje hallucinant, aangezien de realiteit aan de serverzijde wordt gedefinieerd)

GitHub|

Skeleton C-framebuffer-engine met een democartridge en een PC-host met SDL2.

Dit project is bedoeld om in de toekomst op ESP32-hardware te draaien. De huidige PC-host
fungeert als een native ontwikkelingsdoel om de framebuffer-engine en
democartridge te testen voordat deze in een embedded systeem worden geïntegreerd.

rosakasa_core is ook gekoppeld aan het
Lys Entertainment System
project, dat zich in een aparte repository bevindt.

Indeling

include/rosakasa/display/   Openbare framebuffer-/weergave-API
demo/ Startpunt voor het instellen/bijwerken van de democartridge
demo/src/ Hulpfuncties en broncode voor het weergeven van de democartridge
host/pc/ PC-uitvoerbaar bestand dat de engine koppelt aan de democartridge
src/engine/ Levenscyclus van de engine, HTTP/WebSocket-pakketten en SDL-weergave-backend

De broncodes van de democartridge onder demo/src/ worden automatisch opgepikt door CMake.

Native PC

make build
make run

Als SDL2 niet lokaal is geïnstalleerd, downloadt CMake SDL2 standaard met FetchContent.

Engine-configuratie

rosakasa_engine beheert de pakketconfiguratie via RosakasaEngineConfig.
De HTTP- en WebSocket-pakketten zijn aanwezig, maar standaard uitgeschakeld totdat een
embedded- of PC-backend is gekoppeld:

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

De verzend-API voor de engine is backend-neutraal:

RosakasaWebSocket *websocket = rosakasa_engine_websocket(engine);

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

De geconfigureerde send-callback is verantwoordelijk voor het daadwerkelijke platformtransport
en het schrijven van WebSocket-frames. Op een pc kan dit worden ondersteund door een native WebSocket-
bibliotheek; op de ESP32 kan dit worden ondersteund door de ESP-IDF WebSocket-client.

De pc-host bevat een eenvoudige ws://-backend. Schakel deze in met omgevingsvariabelen
voordat je het programma uitvoert:

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

ROSAKASA_WS_TLS=1 is gereserveerd voor wss://, maar de pc-backend ondersteunt
TLS nog niet.

Demo-tekening

De demo beschikt over een lokale framebuffer-abstractie:

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

Tekenhulpfuncties nemen een Framebuffer * als argument, zodat de aanroepende code de schermafmetingen niet hoeft te herhalen:

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

Schermcoördinaten beginnen linksboven:

(0, 0) x neemt toe ->
  |
  v
y neemt toe

Voor de standaard 240x240 framebuffer is het midden van het scherm:

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

draw_square beschouwt het Point-argument als het middelpunt van het vierkant.