Rosakasa
Elixir

Rosakasa

Minimalistyczny silnik gier 3D dla systemu rozrywki Lys. (Trochę halucynogenny, ponieważ rzeczywistość jest definiowana po stronie serwera)

GitHub|

Silnik framebuffera Skeleton C z kartridżem demonstracyjnym i hostem PC SDL2.

Projekt ten ma w przyszłości działać na sprzęcie ESP32. Obecny host PC
służy jako natywny środowisko programistyczne do testowania silnika framebuffera i
kartridża demonstracyjnego przed integracją z systemem wbudowanym.

rosakasa_core jest również powiązany z
projektem Lys Entertainment System,
który znajduje się w oddzielnym repozytorium.

Układ

include/rosakasa/display/   Publiczny interfejs API framebuffera/wyświetlania
demo/ Punkt wejścia do konfiguracji/aktualizacji kartridża demonstracyjnego
demo/src/ Pomocnicze funkcje renderowania kartridża demonstracyjnego i kody źródłowe
host/pc/ Plik wykonywalny na PC, który łączy silnik z kartridżem demonstracyjnym
src/engine/ Cykl życia silnika, pakiety HTTP/WebSocket oraz backend wyświetlania SDL

Kody źródłowe kartridża demonstracyjnego w katalogu demo/src/ są automatycznie pobierane przez CMake.

Komputer PC

make build
make run

Jeśli biblioteka SDL2 nie jest zainstalowana lokalnie, CMake domyślnie pobiera ją za pomocą funkcji FetchContent.

Konfiguracja silnika

rosakasa_engine zarządza konfiguracją pakietów za pośrednictwem obiektu RosakasaEngineConfig.
Pakiety HTTP i WebSocket są obecne, ale domyślnie wyłączone, dopóki nie zostanie podłączony
backend wbudowany lub dla komputera 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);

Interfejs API wysyłania skierowany do silnika jest niezależny od backendu:

RosakasaWebSocket *websocket = rosakasa_engine_websocket(engine);

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

Skonfigurowana funkcja zwrotna send odpowiada za rzeczywisty transport na platformie
oraz zapis ramki WebSocket. Na komputerze PC może to być obsługiwane przez natywną bibliotekę WebSocket;
na ESP32 może to być obsługiwane przez klienta WebSocket ESP-IDF.

Host na komputerze PC zawiera podstawowy backend ws://. Należy go włączyć za pomocą zmiennych
środowiskowych przed uruchomieniem:

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

ROSAKASA_WS_TLS=1 jest zarezerwowane dla wss://, ale backend na komputerze PC nie obsługuje
jeszcze protokołu TLS.

Rysowanie w wersji demonstracyjnej

Wersja demonstracyjna posiada lokalną abstrakcję bufora ramki:

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

Funkcje pomocnicze do rysowania przyjmują Framebuffer *, więc w miejscach wywołania nie trzeba powtarzać wymiarów ekranu:

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

Współrzędne ekranu zaczynają się w lewym górnym rogu:

(0, 0) x rośnie ->
  |
  v
y rośnie

Dla domyślnego bufora ramki o wymiarach 240x240 środek ekranu znajduje się w punkcie:

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

Funkcja draw_square traktuje swój argument typu Point jako środek kwadratu.