Rosakasa
Elixir

Rosakasa

Lys 엔터테인먼트 시스템을 위한 최소한의 3D 게임 엔진. (현실이 서버 측에서 정의되기 때문에 다소 환각적인 느낌을 줍니다)

GitHub|

데모 카트리지와 PC SDL2 호스트가 포함된 기본형 C 프레임버퍼 엔진.

이 프로젝트는 향후 ESP32 하드웨어에서 실행되도록 설계되었습니다. 현재의 PC
호스트는 임베디드 통합 전에 프레임버퍼 엔진과
데모 카트리지를 테스트하기 위한 네이티브 개발 대상입니다.

rosakasa_core는 별도의 저장소에 있는
Lys Entertainment System
프로젝트와도 연계되어 있습니다.

구조

include/rosakasa/display/   공개 프레임버퍼/디스플레이 API
demo/ 데모 카트리지 설정/업데이트 진입점
demo/src/ 데모 카트리지 렌더링 헬퍼 및 소스 코드
host/pc/ 엔진을 데모 카트리지에 연결하는 PC 실행 파일
src/engine/ 엔진 라이프사이클, HTTP/WebSocket 패키지 및 SDL 디스플레이 백엔드

demo/src/ 디렉토리에 있는 데모 카트리지 소스 코드는 CMake에 의해 자동으로 인식됩니다.

네이티브 PC

make build
make run

로컬에 SDL2가 설치되어 있지 않으면, CMake는 기본적으로 FetchContent를 통해 SDL2를 다운로드합니다.

엔진 구성

rosakasa_engineRosakasaEngineConfig를 통해 패키지 구성을 관리합니다.
HTTP 및 WebSocket 패키지는 존재하지만, 임베디드 또는 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);

엔진 측의 전송 API는 백엔드에 구애받지 않습니다:

RosakasaWebSocket *websocket = rosakasa_engine_websocket(engine);

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

구성된 send 콜백은 실제 플랫폼 전송
및 WebSocket 프레임 쓰기 작업을 담당합니다. PC에서는 네이티브 WebSocket
라이브러리를 기반으로 할 수 있으며, ESP32에서는 ESP-IDF WebSocket 클라이언트를 기반으로 할 수 있습니다.

PC 호스트에는 기본적인 ws:// 백엔드가 포함되어 있습니다. 실행하기 전에 환경
변수를 통해 이를 활성화하십시오:

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

ROSAKASA_WS_TLS=1wss://용으로 예약되어 있지만, PC 백엔드는 아직
TLS를 지원하지 않습니다.

데모 그리기

이 데모는 로컬 프레임버퍼 추상화 구조를 사용합니다:

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

그리기 헬퍼 함수는 Framebuffer *를 매개변수로 받으므로, 호출 측에서는 화면 크기를 반복해서 지정할 필요가 없습니다:

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

화면 좌표는 왼쪽 상단에서 시작합니다:

(0, 0) x가 증가하면 ->
  |
  v
y가 증가

기본 240x240 프레임버퍼의 경우, 화면 중심은 다음과 같습니다:

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

draw_squarePoint 인수를 정사각형의 중심으로 간주합니다.