mirror of
https://github.com/exogen/t2-mapper.git
synced 2026-07-14 07:56:42 +00:00
v2
This commit is contained in:
parent
3c8cce685d
commit
0f2e103294
12 changed files with 776 additions and 80 deletions
2
app/global.d.ts
vendored
2
app/global.d.ts
vendored
|
|
@ -1,9 +1,11 @@
|
|||
import type { getMissionList, getMissionInfo } from "@/src/manifest";
|
||||
import type { DemoRecording } from "@/src/demo/types";
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
setMissionName?: (missionName: string) => void;
|
||||
getMissionList?: typeof getMissionList;
|
||||
getMissionInfo?: typeof getMissionInfo;
|
||||
loadDemoRecording?: (recording: DemoRecording) => void;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
210
app/page.tsx
210
app/page.tsx
|
|
@ -29,6 +29,9 @@ import { ObserverCamera } from "@/src/components/ObserverCamera";
|
|||
import { AudioProvider } from "@/src/components/AudioContext";
|
||||
import { DebugElements } from "@/src/components/DebugElements";
|
||||
import { CamerasProvider } from "@/src/components/CamerasProvider";
|
||||
import { DemoProvider, useDemo } from "@/src/components/DemoProvider";
|
||||
import { DemoPlayback } from "@/src/components/DemoPlayback";
|
||||
import { DemoControls } from "@/src/components/DemoControls";
|
||||
import { getMissionList, getMissionInfo } from "@/src/manifest";
|
||||
import { createParser, parseAsBoolean, useQueryState } from "nuqs";
|
||||
|
||||
|
|
@ -174,92 +177,141 @@ function MapInspector() {
|
|||
return (
|
||||
<QueryClientProvider client={queryClient}>
|
||||
<main>
|
||||
<SettingsProvider
|
||||
fogEnabledOverride={fogEnabledOverride}
|
||||
onClearFogEnabledOverride={clearFogEnabledOverride}
|
||||
>
|
||||
<KeyboardControls map={KEYBOARD_CONTROLS}>
|
||||
<div id="canvasContainer">
|
||||
{showLoadingIndicator && (
|
||||
<div id="loadingIndicator" data-complete={!isLoading}>
|
||||
<div className="LoadingSpinner" />
|
||||
<div className="LoadingProgress">
|
||||
<div
|
||||
className="LoadingProgress-bar"
|
||||
style={{ width: `${loadingProgress * 100}%` }}
|
||||
/>
|
||||
</div>
|
||||
<div className="LoadingProgress-text">
|
||||
{Math.round(loadingProgress * 100)}%
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
<Canvas
|
||||
frameloop="always"
|
||||
gl={glSettings}
|
||||
shadows={{ type: PCFShadowMap }}
|
||||
onCreated={(state) => {
|
||||
cameraRef.current = state.camera;
|
||||
}}
|
||||
>
|
||||
<CamerasProvider>
|
||||
<AudioProvider>
|
||||
<Mission
|
||||
key={`${missionName}~${missionType}`}
|
||||
name={missionName}
|
||||
missionType={missionType}
|
||||
onLoadingChange={handleLoadingChange}
|
||||
/>
|
||||
<ObserverCamera />
|
||||
<DebugElements />
|
||||
{isTouch === null ? null : isTouch ? (
|
||||
<TouchCameraMovement
|
||||
joystickState={joystickStateRef}
|
||||
joystickZone={joystickZoneRef}
|
||||
lookJoystickState={lookJoystickStateRef}
|
||||
lookJoystickZone={lookJoystickZoneRef}
|
||||
<DemoProvider>
|
||||
<SettingsProvider
|
||||
fogEnabledOverride={fogEnabledOverride}
|
||||
onClearFogEnabledOverride={clearFogEnabledOverride}
|
||||
>
|
||||
<KeyboardControls map={KEYBOARD_CONTROLS}>
|
||||
<div id="canvasContainer">
|
||||
{showLoadingIndicator && (
|
||||
<div id="loadingIndicator" data-complete={!isLoading}>
|
||||
<div className="LoadingSpinner" />
|
||||
<div className="LoadingProgress">
|
||||
<div
|
||||
className="LoadingProgress-bar"
|
||||
style={{ width: `${loadingProgress * 100}%` }}
|
||||
/>
|
||||
) : (
|
||||
<ObserverControls />
|
||||
)}
|
||||
</AudioProvider>
|
||||
</CamerasProvider>
|
||||
</Canvas>
|
||||
</div>
|
||||
{isTouch && (
|
||||
<TouchJoystick
|
||||
joystickState={joystickStateRef}
|
||||
joystickZone={joystickZoneRef}
|
||||
lookJoystickState={lookJoystickStateRef}
|
||||
lookJoystickZone={lookJoystickZoneRef}
|
||||
/>
|
||||
)}
|
||||
{isTouch === false && <KeyboardOverlay />}
|
||||
<InspectorControls
|
||||
missionName={missionName}
|
||||
missionType={missionType}
|
||||
onChangeMission={changeMission}
|
||||
onOpenMapInfo={() => setMapInfoOpen(true)}
|
||||
cameraRef={cameraRef}
|
||||
isTouch={isTouch}
|
||||
/>
|
||||
{mapInfoOpen && (
|
||||
<Suspense fallback={null}>
|
||||
<MapInfoDialog
|
||||
open={mapInfoOpen}
|
||||
onClose={() => setMapInfoOpen(false)}
|
||||
missionName={missionName}
|
||||
missionType={missionType ?? ""}
|
||||
</div>
|
||||
<div className="LoadingProgress-text">
|
||||
{Math.round(loadingProgress * 100)}%
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
<Canvas
|
||||
frameloop="always"
|
||||
gl={glSettings}
|
||||
shadows={{ type: PCFShadowMap }}
|
||||
onCreated={(state) => {
|
||||
cameraRef.current = state.camera;
|
||||
}}
|
||||
>
|
||||
<CamerasProvider>
|
||||
<AudioProvider>
|
||||
<Mission
|
||||
key={`${missionName}~${missionType}`}
|
||||
name={missionName}
|
||||
missionType={missionType}
|
||||
onLoadingChange={handleLoadingChange}
|
||||
/>
|
||||
<ObserverCamera />
|
||||
<DebugElements />
|
||||
<DemoPlayback />
|
||||
<DemoAwareControls
|
||||
isTouch={isTouch}
|
||||
joystickStateRef={joystickStateRef}
|
||||
joystickZoneRef={joystickZoneRef}
|
||||
lookJoystickStateRef={lookJoystickStateRef}
|
||||
lookJoystickZoneRef={lookJoystickZoneRef}
|
||||
/>
|
||||
</AudioProvider>
|
||||
</CamerasProvider>
|
||||
</Canvas>
|
||||
</div>
|
||||
{isTouch && (
|
||||
<TouchJoystick
|
||||
joystickState={joystickStateRef}
|
||||
joystickZone={joystickZoneRef}
|
||||
lookJoystickState={lookJoystickStateRef}
|
||||
lookJoystickZone={lookJoystickZoneRef}
|
||||
/>
|
||||
</Suspense>
|
||||
)}
|
||||
</KeyboardControls>
|
||||
</SettingsProvider>
|
||||
)}
|
||||
{isTouch === false && <KeyboardOverlay />}
|
||||
<InspectorControls
|
||||
missionName={missionName}
|
||||
missionType={missionType}
|
||||
onChangeMission={changeMission}
|
||||
onOpenMapInfo={() => setMapInfoOpen(true)}
|
||||
cameraRef={cameraRef}
|
||||
isTouch={isTouch}
|
||||
/>
|
||||
{mapInfoOpen && (
|
||||
<Suspense fallback={null}>
|
||||
<MapInfoDialog
|
||||
open={mapInfoOpen}
|
||||
onClose={() => setMapInfoOpen(false)}
|
||||
missionName={missionName}
|
||||
missionType={missionType ?? ""}
|
||||
/>
|
||||
</Suspense>
|
||||
)}
|
||||
<DemoControls />
|
||||
<DemoWindowAPI />
|
||||
</KeyboardControls>
|
||||
</SettingsProvider>
|
||||
</DemoProvider>
|
||||
</main>
|
||||
</QueryClientProvider>
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Disables observer/touch controls when a demo is playing so they don't
|
||||
* fight the animated camera.
|
||||
*/
|
||||
function DemoAwareControls({
|
||||
isTouch,
|
||||
joystickStateRef,
|
||||
joystickZoneRef,
|
||||
lookJoystickStateRef,
|
||||
lookJoystickZoneRef,
|
||||
}: {
|
||||
isTouch: boolean | null;
|
||||
joystickStateRef: React.RefObject<JoystickState>;
|
||||
joystickZoneRef: React.RefObject<HTMLDivElement | null>;
|
||||
lookJoystickStateRef: React.RefObject<JoystickState>;
|
||||
lookJoystickZoneRef: React.RefObject<HTMLDivElement | null>;
|
||||
}) {
|
||||
const { isPlaying } = useDemo();
|
||||
if (isPlaying) return null;
|
||||
if (isTouch === null) return null;
|
||||
if (isTouch) {
|
||||
return (
|
||||
<TouchCameraMovement
|
||||
joystickState={joystickStateRef}
|
||||
joystickZone={joystickZoneRef}
|
||||
lookJoystickState={lookJoystickStateRef}
|
||||
lookJoystickZone={lookJoystickZoneRef}
|
||||
/>
|
||||
);
|
||||
}
|
||||
return <ObserverControls />;
|
||||
}
|
||||
|
||||
/** Exposes `window.loadDemoRecording` for automation/testing. */
|
||||
function DemoWindowAPI() {
|
||||
const { setRecording } = useDemo();
|
||||
|
||||
useEffect(() => {
|
||||
window.loadDemoRecording = setRecording;
|
||||
return () => {
|
||||
delete window.loadDemoRecording;
|
||||
};
|
||||
}, [setRecording]);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
export default function HomePage() {
|
||||
return (
|
||||
<Suspense>
|
||||
|
|
|
|||
|
|
@ -187,6 +187,11 @@ input[type="range"] {
|
|||
transform: translate(0, 1px);
|
||||
}
|
||||
|
||||
.IconButton[data-active="true"] {
|
||||
background: rgba(0, 117, 213, 0.9);
|
||||
border-color: rgba(255, 255, 255, 0.4);
|
||||
}
|
||||
|
||||
.Controls-toggle {
|
||||
margin: 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue