Files
webeditor3d/src/runtime-three/navigation-controller.ts

67 lines
1.7 KiB
TypeScript
Raw Normal View History

2026-03-31 03:04:15 +02:00
import type { PerspectiveCamera } from "three";
import type { Vec3 } from "../core/vector";
import type {
FirstPersonPlayerShape,
ResolvedPlayerMotion
} from "./player-collision";
import type {
RuntimeNavigationMode,
RuntimeSceneDefinition,
RuntimeSpawnPoint
} from "./runtime-scene-build";
2026-03-31 03:04:15 +02:00
export interface FirstPersonTelemetry {
feetPosition: Vec3;
eyePosition: Vec3;
grounded: boolean;
locomotionState: RuntimeLocomotionState;
inWaterVolume: boolean;
cameraSubmerged: boolean;
inFogVolume: boolean;
2026-03-31 03:04:15 +02:00
pointerLocked: boolean;
spawn: RuntimeSpawnPoint;
}
export type RuntimeLocomotionState = "grounded" | "swimming" | "flying";
export interface RuntimePlayerVolumeState {
inWater: boolean;
inFog: boolean;
}
2026-03-31 03:04:15 +02:00
export interface RuntimeControllerContext {
camera: PerspectiveCamera;
domElement: HTMLCanvasElement;
getRuntimeScene(): RuntimeSceneDefinition;
resolveFirstPersonMotion(
feetPosition: Vec3,
motion: Vec3,
shape: FirstPersonPlayerShape
): ResolvedPlayerMotion | null;
resolvePlayerVolumeState(feetPosition: Vec3): RuntimePlayerVolumeState;
resolveThirdPersonCameraCollision(
pivot: Vec3,
desiredCameraPosition: Vec3,
radius: number
): Vec3;
2026-03-31 03:04:15 +02:00
setRuntimeMessage(message: string | null): void;
setFirstPersonTelemetry(telemetry: FirstPersonTelemetry | null): void;
}
export interface NavigationControllerDeactivateOptions {
releasePointerLock?: boolean;
}
2026-03-31 03:04:15 +02:00
export interface NavigationController {
id: RuntimeNavigationMode;
activate(ctx: RuntimeControllerContext): void;
deactivate(
ctx: RuntimeControllerContext,
options?: NavigationControllerDeactivateOptions
): void;
2026-04-11 04:14:44 +02:00
resetSceneState(): void;
2026-03-31 03:04:15 +02:00
update(dt: number): void;
}