Rosakasa
Motor de jogos 3D minimalista para o Lys Entertainment System. (De certa forma alucinatório, já que a realidade é definida no lado do servidor)
Motor de framebuffer em C com um cartucho de demonstração e um host SDL2 para PC.
Este projeto tem como objetivo rodar no hardware ESP32 no futuro. O atual host para PC
existe como um alvo de desenvolvimento nativo para testar o motor de framebuffer e
o cartucho de demonstração antes da integração em sistemas embarcados.
O rosakasa_core também está vinculado ao
Lys Entertainment System
, projeto que se encontra em um repositório separado.
Estrutura
include/rosakasa/display/ API pública do framebuffer/exibição
demo/ Ponto de entrada para configuração/atualização do cartucho de demonstração
demo/src/ Auxiliares de renderização e fontes do cartucho de demonstração
host/pc/ Executável para PC que conecta o mecanismo ao cartucho de demonstração
src/engine/ Ciclo de vida do motor, pacotes HTTP/WebSocket e backend de exibição SDL
Os códigos-fonte do cartucho de demonstração em demo/src/ são detectados automaticamente pelo CMake.
PC nativo
make build
make run
Se o SDL2 não estiver instalado localmente, o CMake baixa o SDL2 com o FetchContent por padrão.
Configuração do motor
O rosakasa_engine controla a configuração dos pacotes por meio do RosakasaEngineConfig.
Os pacotes HTTP e WebSocket estão presentes, mas desativados por padrão até que um
backend incorporado ou de PC seja conectado:
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);
A API de envio voltada para o mecanismo é independente do backend:
RosakasaWebSocket *websocket = rosakasa_engine_websocket(engine);
rosakasa_websocket_send_text(websocket, "{\"type\":\"ping\"}");
A função de retorno send configurada é responsável pelo transporte efetivo na plataforma
e pela gravação do quadro WebSocket. No PC, isso pode ser feito por meio de uma biblioteca WebSocket nativa;
no ESP32, pode ser feito por meio do cliente WebSocket do ESP-IDF.
O host do PC inclui um backend básico ws://. Habilite-o com variáveis de ambiente
antes de executar:
ROSAKASA_WS_HOST=127.0.0.1 ROSAKASA_WS_PORT=4000 ROSAKASA_WS_PATH=/socket make run
ROSAKASA_WS_TLS=1 está reservado para wss://, mas o backend do PC ainda não oferece suporte
a TLS.
Desenho da demonstração
A demonstração possui uma abstração de framebuffer local:
typedef struct {
uint8_t *pixels;
int width;
int height;
int pitch_bytes;
} Framebuffer;
As funções auxiliares de desenho recebem um Framebuffer *, de modo que os pontos de chamada não precisam repetir as dimensões da tela:
draw_line(&demo_framebuffer, (Point){20, 20}, (Point){220, 220}, 220);
draw_square(&demo_framebuffer, center, length, 255);
As coordenadas da tela começam no canto superior esquerdo:
(0, 0) x aumenta ->
|
v
y aumenta
Para o framebuffer padrão 240x240, o centro da tela é:
Point screen_center = {
demo_framebuffer.width / 2,
demo_framebuffer.height / 2,
};
A função draw_square trata seu argumento Point como o centro do quadrado.
