Rosakasa
Elixir

Rosakasa

Moteur de jeu 3D minimaliste pour le système de divertissement Lys. (Un peu hallucinatoire, puisque la réalité est définie côté serveur)

GitHub|

Moteur de framebuffer C minimal avec une cartouche de démonstration et un hôte PC SDL2.

Ce projet est destiné à fonctionner à l’avenir sur du matériel ESP32. L’hôte PC
actuel sert de cible de développement native pour tester le moteur de framebuffer et
la cartouche de démonstration avant leur intégration dans un système embarqué.

rosakasa_core est également lié au
projet Lys Entertainment System
, qui se trouve dans un dépôt distinct.

Structure

include/rosakasa/display/   API publique du framebuffer/de l’affichage
demo/ Point d’entrée de configuration/mise à jour de la cartouche de démo
demo/src/ Aides au rendu et sources de la cartouche de démo
host/pc/ Exécutable PC reliant le moteur à la cartouche de démo
src/engine/ Cycle de vie du moteur, paquets HTTP/WebSocket et backend d’affichage SDL

Les sources de la cartouche de démo situées dans demo/src/ sont automatiquement prises en charge par CMake.

PC natif

make build
make run

Si SDL2 n’est pas installé localement, CMake télécharge SDL2 avec FetchContent par défaut.

Configuration du moteur

rosakasa_engine gère la configuration des paquets via RosakasaEngineConfig.
Les paquets HTTP et WebSocket sont présents mais désactivés par défaut jusqu’à ce qu’un
backend embarqué ou PC soit associé :

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 d'envoi orientée moteur est indépendante du backend :

RosakasaWebSocket *websocket = rosakasa_engine_websocket(engine);

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

La fonction de rappel send configurée est chargée du transport sur la plateforme
et de l’écriture de la trame WebSocket. Sur PC, cela peut s’appuyer sur une bibliothèque WebSocket native ;
sur ESP32, cela peut s’appuyer sur le client WebSocket ESP-IDF.

L’hôte PC intègre un backend ws:// de base. Activez-le à l’aide de variables d’environnement
avant l’exécution :

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

ROSAKASA_WS_TLS=1 est réservé à wss://, mais le backend PC ne prend pas encore en charge
le protocole TLS.

Démonstration de dessin

La démo dispose d’une abstraction de framebuffer local :

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

Les fonctions d’aide au dessin prennent un Framebuffer * en paramètre, ce qui évite aux appelants de devoir répéter les dimensions de l’écran :

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

Les coordonnées de l'écran commencent en haut à gauche :

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

Pour le framebuffer par défaut 240x240, le centre de l'écran est :

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

La fonction draw_square considère son argument Point comme le centre du carré.