mirror of
https://github.com/exogen/t2-mapper.git
synced 2026-03-23 14:21:01 +00:00
82 lines
3 KiB
TypeScript
82 lines
3 KiB
TypeScript
import { useKeyboardControls } from "@react-three/drei";
|
|
import { Controls } from "./MouseAndKeyboardHandler";
|
|
import { useRecording } from "./RecordingProvider";
|
|
import { useLiveSelector } from "../state/liveConnectionStore";
|
|
import styles from "./KeyboardOverlay.module.css";
|
|
|
|
export function KeyboardOverlay() {
|
|
const recording = useRecording();
|
|
const liveReady = useLiveSelector((s) => s.liveReady);
|
|
const forward = useKeyboardControls<Controls>((s) => s.forward);
|
|
const backward = useKeyboardControls<Controls>((s) => s.backward);
|
|
const left = useKeyboardControls<Controls>((s) => s.left);
|
|
const right = useKeyboardControls<Controls>((s) => s.right);
|
|
const up = useKeyboardControls<Controls>((s) => s.up);
|
|
const down = useKeyboardControls<Controls>((s) => s.down);
|
|
const lookUp = useKeyboardControls<Controls>((s) => s.lookUp);
|
|
const lookDown = useKeyboardControls<Controls>((s) => s.lookDown);
|
|
const lookLeft = useKeyboardControls<Controls>((s) => s.lookLeft);
|
|
const lookRight = useKeyboardControls<Controls>((s) => s.lookRight);
|
|
|
|
// Show when no recording (map browsing) or during live mode once ready.
|
|
// Hidden during demo playback and during live map transitions.
|
|
if (recording && recording.source !== "live") return null;
|
|
if (recording?.source === "live" && !liveReady) return null;
|
|
|
|
return (
|
|
<div className={styles.Root}>
|
|
<div className={styles.Column}>
|
|
<div className={styles.Row}>
|
|
<div className={styles.Spacer} />
|
|
<div className={styles.Key} data-pressed={forward}>
|
|
W
|
|
</div>
|
|
<div className={styles.Spacer} />
|
|
</div>
|
|
<div className={styles.Row}>
|
|
<div className={styles.Key} data-pressed={left}>
|
|
A
|
|
</div>
|
|
<div className={styles.Key} data-pressed={backward}>
|
|
S
|
|
</div>
|
|
<div className={styles.Key} data-pressed={right}>
|
|
D
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div className={styles.Column}>
|
|
<div className={styles.Row}>
|
|
<div className={styles.Key} data-pressed={up}>
|
|
<span className={styles.Arrow}>↑</span> Space
|
|
</div>
|
|
</div>
|
|
<div className={styles.Row}>
|
|
<div className={styles.Key} data-pressed={down}>
|
|
<span className={styles.Arrow}>↓</span> Shift
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div className={styles.Column}>
|
|
<div className={styles.Row}>
|
|
<div className={styles.Spacer} />
|
|
<div className={styles.Key} data-pressed={lookUp}>
|
|
↑
|
|
</div>
|
|
<div className={styles.Spacer} />
|
|
</div>
|
|
<div className={styles.Row}>
|
|
<div className={styles.Key} data-pressed={lookLeft}>
|
|
←
|
|
</div>
|
|
<div className={styles.Key} data-pressed={lookDown}>
|
|
↓
|
|
</div>
|
|
<div className={styles.Key} data-pressed={lookRight}>
|
|
→
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|