import { ReactNode } from 'react'; /** * StandMirror — HQ/LQ/OFF切替つきの姿見ミラー(VRChat文化の輸入)。 * * 参考: BOOTH「HQ・LQ切り替えスイッチ付ミラー」(booth.pm/ja/items/3640350) * =3モードをボタンで切り替えて描画コストを制御する。 * * モード: HQ=全景ミラー(解像度1024)/ LQ=アバターだけ映る軽量ミラー * (解像度512。反射パスのドローコールをアバター数体分まで削る=本命の軽量化) * / OFF=鏡を外す(枠だけ・描画コストゼロ)。 * * 実装は three + React Three Fiber(+drei/rapier)だけで完結し、 * XRift API(@xrift/world-components)には依存しない: * - 鏡面は three.js Reflector のフォーク(LayeredReflector)=色合成なしの恒等ミラー * - モード状態は非制御(内部state)が既定。全員同期したい場合は * mode/onModeChange を外部状態(XRiftの useInstanceState 等)に接続する * - スイッチの操作は既定でR3Fのポインタイベント。VRコントローラ対応が要る * 環境では renderInteract で Interactable 等を差し込む(./xrift.tsx が実装例) */ export type MirrorMode = 'hq' | 'lq' | 'off'; /** renderInteract に渡される、1ボタン分のインタラクション情報 */ export interface InteractOpts { id: string; /** ホバー時などに出す説明文 */ text: string; onInteract: () => void; } export interface StandMirrorProps { position?: [number, number, number]; /** Y回転。鏡面は+Zを向く */ rotationY?: number; /** 鏡面の幅(m)。枠はこれより一回り大きい */ width?: number; /** 鏡面の高さ(m) */ height?: number; /** 非制御時の初期モード。ワールド備え付けは 'off' 推奨(Quest配慮のVRChatミラー作法) */ defaultMode?: MirrorMode; /** 制御モード。外部状態(XRiftのインスタンス同期等)と組むときに onModeChange とセットで使う */ mode?: MirrorMode; onModeChange?: (mode: MirrorMode) => void; /** スイッチのインタラクション実装の差し替え(XRiftのInteractable等)。既定はR3Fポインタイベント */ renderInteract?: (node: ReactNode, opts: InteractOpts) => ReactNode; /** ボタンidの名前空間。複数設置時は一意にする */ id?: string; } /** * width/height から枠・台座・スイッチ列の配置を導く。 * Item.tsx の設置プレビュー(張りぼて)と共有するため公開。 * スイッチは右端に縦並び(上からHQ/LQ/OFF)。列の高さは手が届く1.2m目安、 * 低い鏡では枠の上端に収める。 */ export declare const mirrorLayout: (width: number, height: number) => { frameW: number; frameH: number; centerY: number; btnX: number; btnYs: readonly [number, number, number]; colCenterY: number; }; export declare const StandMirror: ({ position, rotationY, width, height, defaultMode, mode: controlledMode, onModeChange, renderInteract, id, }: StandMirrorProps) => import("react/jsx-runtime").JSX.Element; //# sourceMappingURL=StandMirror.d.ts.map