한국어
레퍼런스
패키지

패키지

Mirage Engine은 pnpm 모노레포입니다. 보통 설치하는 건 mirage-engine 하나이고, 나머지는 필요한 조각만 골라 쓸 수 있도록 개별 배포됩니다.

패키지npm의존
mirage-engine↗ (opens in a new tab)core, painter, sandwich
@mirage-engine/core↗ (opens in a new tab)painter, dom-tracker, wasm-compute
@mirage-engine/painter↗ (opens in a new tab)three (peer)
@mirage-engine/dom-tracker↗ (opens in a new tab)—
@mirage-engine/sandwich↗ (opens in a new tab)dom-tracker
@mirage-engine/wasm-compute내부용Rust / wasm-bindgen

  • @mirage-engine/core

    파사드를 뺀 전부입니다. 자체 래퍼를 만들 때 사용하세요.

    import { Engine, WasmSynchronizer } from "@mirage-engine/core";
    import type { CoreConfig, SceneNode, Quality } from "@mirage-engine/core";

    Engine

    메서드시그니처비고
    constructor(target, config: CoreConfig)스타일 주입, 컨테이너 결정, Renderer + Syncer 생성
    start(): Promise<void>wasm 부팅, 트래커 시작
    stop(): void트래커 정지
    dispose(): void정지 + 렌더러 해제
    getTracker(): Tracker내부 DOM 트래커
    getCanvas(): HTMLCanvasElement마운트된 캔버스
    updateUniforms(el, uniforms): void유니폼 직접 쓰기

    타입도 전부 함께 export됩니다 (SceneNode, NodeRect, Visibility, THREE_LAYERS, ATTR_* 상수, DIRTY_* 플래그, WASM_STRIDE와 OFFSET_* 인덱스).


    @mirage-engine/painter

    DOM 스타일을 그대로 반영하는 Three.js 머티리얼을 단독으로 제공합니다. DOM 관찰은 하지 않으며, 스타일은 직접 넘겨야 합니다.

    import { Painter, TextGenerator, createBoxMaterial } from "@mirage-engine/painter";

    Painter

    Painter.create(
      type: "BOX" | "TEXT",
      styles: BoxStyles | TextStyles,
      content: string,
      width: number,
      height: number,
      quality?: number,
      texture?: THREE.Texture | null,
      shaderHooks?: ShaderHooks,
    ): THREE.Material
     
    Painter.update(material, type, styles, content, width, height, quality?, texture?): void
     
    Painter.forceUpdateUniforms(material: THREE.ShaderMaterial, values: BoxUniformValues): void
    import * as THREE from "three";
    import { Painter } from "@mirage-engine/painter";
     
    const material = Painter.create("BOX", {
      backgroundColor: "rgb(20, 20, 30)",
      backgroundImage: "linear-gradient(45deg, #f00, #00f)",
      opacity: 1,
      zIndex: 0,
      borderRadius: "16px",
      borderColor: "rgba(255,255,255,0.2)",
      borderWidth: "2px",
      boxShadow: "0 8px 24px rgba(0,0,0,0.4)",
    }, "", 320, 180);
     
    const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), material);
    mesh.scale.set(320, 180, 1);

    TextGenerator

    텍스트를 CanvasTexture에 그리는 THREE.MeshBasicMaterial 서브클래스입니다.

    const mat = new TextGenerator("Hello", textStyles, 200, 40, 2);
    mat.updateText("Goodbye", textStyles, 200, 40);
    mat.dispose();

    CSS 파서

    parsePixelValue, parseColor, splitByComma, parseLinearGradient, parseBoxShadow가 재사용 가능하도록 export됩니다. getComputedStyle이 반환하는 문자열 형태를 그대로 받습니다.

    import { parseLinearGradient } from "@mirage-engine/painter";
     
    parseLinearGradient("linear-gradient(45deg, red 0%, blue 100%)");
    // { angle: 0.785…, stops: [ { color, alpha, stop }, … ] }

    @mirage-engine/dom-tracker

    렌더링에 관여하지 않는, 배치 처리 DOM 옵저버입니다. 의존성이 없습니다.

    import { Tracker, extractFromStyle } from "@mirage-engine/dom-tracker";
     
    const tracker = new Tracker(document.body, { resizeDebounce: { delay: 200 } });
     
    tracker.onLayoutChange.add((mask, deletions) => { /* … */ });
    tracker.onStyleChange.add((styles) => { /* Map<HTMLElement, StyleData> */ });
    tracker.onRender.add(() => { /* 매 프레임 */ });
     
    tracker.start();
    훅페이로드발생 시점
    onBeforeRender—매 프레임, 가장 먼저
    onLayoutChange(mask: number, deletions: Set<HTMLElement>)트리가 더티일 때만
    onScrollChange(scrollX, scrollY)윈도우 스크롤이 바뀌었을 때
    onStyleChangeMap<HTMLElement, StyleData>인라인 스타일이 변경됐을 때
    onRender—매 프레임, 가장 마지막

    각 훅은 Set이므로 add / delete로 구독을 관리합니다.

    Mirage 자신은 onLayoutChange, onStyleChange, onRender를 구독합니다. onScrollChange는 발생하지만 내장 구독자가 없습니다 — 여러분을 위한 자리입니다.


    @mirage-engine/sandwich

    DOM 텔레포테이션. 페이지 레이아웃을 유지한 채 요소를 캔버스 위로 올립니다.

    import { SandwichRenderer } from "@mirage-engine/sandwich";
     
    const sandwich = new SandwichRenderer({ frontSelector: "[data-hud]" });
    sandwich.init();
    메서드용도
    init()레이어 생성, front 요소 이관, 훅 연결, 트래커 시작
    useTracker(tracker)새로 만들지 않고 기존 트래커를 재사용

    Mirage는 useTracker(engine.getTracker())를 자동으로 호출해서 둘이 하나의 requestAnimationFrame 루프를 공유하게 합니다.


    @mirage-engine/wasm-compute

    wasm-pack으로 컴파일하는 Rust 크레이트입니다. 직접 쓰라고 만든 건 아닙니다.

    pub struct MemoryManager { /* Vec<f32> */ }
     
    impl MemoryManager {
        pub fn new(capacity: usize) -> MemoryManager;
        pub fn get_pointer(&self) -> *const f32;
        pub fn get_length(&self) -> usize;
        pub fn update_physics(&mut self, node_count: usize);
    }

    노드당 5개의 float으로 구성됩니다.

    [ parentIndex, localX, localY, worldX, worldY ]

    update_physics는 노드를 순서대로 훑으면서 부모의 월드 좌표를 자식의 로컬 오프셋에 더합니다. 추출 단계에서 부모가 자식보다 먼저 기록되므로, 한 번의 정방향 패스로 트리 전체가 해결됩니다.


    Mirage Engine — MIT 라이선스 © 2026 dltldn333