Add third-person navigation mode and update runtime scene definition
This commit is contained in:
@@ -13,7 +13,11 @@ import {
|
|||||||
} from "../document/brushes";
|
} from "../document/brushes";
|
||||||
import type { SceneDocument } from "../document/scene-document";
|
import type { SceneDocument } from "../document/scene-document";
|
||||||
import { cloneWorldSettings, type WorldSettings } from "../document/world-settings";
|
import { cloneWorldSettings, type WorldSettings } from "../document/world-settings";
|
||||||
import { getEntityInstances, getPrimaryPlayerStartEntity, type EntityInstance } from "../entities/entity-instances";
|
import {
|
||||||
|
getEntityInstances,
|
||||||
|
getPrimaryPlayerStartEntity,
|
||||||
|
type EntityInstance
|
||||||
|
} from "../entities/entity-instances";
|
||||||
import { getBoxBrushBounds } from "../geometry/box-brush";
|
import { getBoxBrushBounds } from "../geometry/box-brush";
|
||||||
import { buildBoxBrushDerivedMeshData } from "../geometry/box-brush-mesh";
|
import { buildBoxBrushDerivedMeshData } from "../geometry/box-brush-mesh";
|
||||||
import { buildGeneratedModelCollider, type GeneratedColliderBounds, type GeneratedModelCollider } from "../geometry/model-instance-collider-generation";
|
import { buildGeneratedModelCollider, type GeneratedColliderBounds, type GeneratedModelCollider } from "../geometry/model-instance-collider-generation";
|
||||||
@@ -22,7 +26,7 @@ import { cloneMaterialDef, type MaterialDef } from "../materials/starter-materia
|
|||||||
import { assertRuntimeSceneBuildable } from "./runtime-scene-validation";
|
import { assertRuntimeSceneBuildable } from "./runtime-scene-validation";
|
||||||
import { FIRST_PERSON_PLAYER_SHAPE, type FirstPersonPlayerShape } from "./player-collision";
|
import { FIRST_PERSON_PLAYER_SHAPE, type FirstPersonPlayerShape } from "./player-collision";
|
||||||
|
|
||||||
export type RuntimeNavigationMode = "firstPerson" | "orbitVisitor";
|
export type RuntimeNavigationMode = "firstPerson" | "thirdPerson";
|
||||||
|
|
||||||
export interface RuntimeBrushFace {
|
export interface RuntimeBrushFace {
|
||||||
materialId: string | null;
|
materialId: string | null;
|
||||||
@@ -93,6 +97,7 @@ export interface RuntimePlayerStart {
|
|||||||
entityId: string;
|
entityId: string;
|
||||||
position: Vec3;
|
position: Vec3;
|
||||||
yawDegrees: number;
|
yawDegrees: number;
|
||||||
|
navigationMode: RuntimeNavigationMode;
|
||||||
collider: FirstPersonPlayerShape;
|
collider: FirstPersonPlayerShape;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -208,6 +213,7 @@ export interface RuntimeSceneDefinition {
|
|||||||
interactionLinks: InteractionLink[];
|
interactionLinks: InteractionLink[];
|
||||||
playerStart: RuntimePlayerStart | null;
|
playerStart: RuntimePlayerStart | null;
|
||||||
playerCollider: FirstPersonPlayerShape;
|
playerCollider: FirstPersonPlayerShape;
|
||||||
|
navigationMode: RuntimeNavigationMode;
|
||||||
spawn: RuntimeSpawnPoint;
|
spawn: RuntimeSpawnPoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,6 +223,17 @@ export interface BuildRuntimeSceneOptions {
|
|||||||
sceneEntryId?: string | null;
|
sceneEntryId?: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function resolveRuntimeNavigationMode(
|
||||||
|
playerStartEntity: ReturnType<typeof getPrimaryPlayerStartEntity>,
|
||||||
|
authoredOverride?: RuntimeNavigationMode
|
||||||
|
): RuntimeNavigationMode {
|
||||||
|
if (authoredOverride !== undefined) {
|
||||||
|
return authoredOverride;
|
||||||
|
}
|
||||||
|
|
||||||
|
return playerStartEntity?.navigationMode ?? "thirdPerson";
|
||||||
|
}
|
||||||
|
|
||||||
function cloneVec3(vector: Vec3): Vec3 {
|
function cloneVec3(vector: Vec3): Vec3 {
|
||||||
return {
|
return {
|
||||||
x: vector.x,
|
x: vector.x,
|
||||||
@@ -613,8 +630,14 @@ function resolveRuntimeSpawn(
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function buildRuntimeSceneFromDocument(document: SceneDocument, options: BuildRuntimeSceneOptions = {}): RuntimeSceneDefinition {
|
export function buildRuntimeSceneFromDocument(document: SceneDocument, options: BuildRuntimeSceneOptions = {}): RuntimeSceneDefinition {
|
||||||
|
const playerStartEntity = getPrimaryPlayerStartEntity(document.entities);
|
||||||
|
const navigationMode = resolveRuntimeNavigationMode(
|
||||||
|
playerStartEntity,
|
||||||
|
options.navigationMode
|
||||||
|
);
|
||||||
|
|
||||||
assertRuntimeSceneBuildable(document, {
|
assertRuntimeSceneBuildable(document, {
|
||||||
navigationMode: options.navigationMode ?? "orbitVisitor",
|
navigationMode,
|
||||||
loadedModelAssets: options.loadedModelAssets
|
loadedModelAssets: options.loadedModelAssets
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -641,7 +664,6 @@ export function buildRuntimeSceneFromDocument(document: SceneDocument, options:
|
|||||||
const modelInstances = getModelInstances(document.modelInstances).map(buildRuntimeModelInstance);
|
const modelInstances = getModelInstances(document.modelInstances).map(buildRuntimeModelInstance);
|
||||||
const collections = buildRuntimeSceneCollections(document);
|
const collections = buildRuntimeSceneCollections(document);
|
||||||
const interactionLinks = getInteractionLinks(document.interactionLinks).map((link) => cloneInteractionLink(link));
|
const interactionLinks = getInteractionLinks(document.interactionLinks).map((link) => cloneInteractionLink(link));
|
||||||
const playerStartEntity = getPrimaryPlayerStartEntity(document.entities);
|
|
||||||
const playerCollider = buildRuntimePlayerShape(playerStartEntity);
|
const playerCollider = buildRuntimePlayerShape(playerStartEntity);
|
||||||
|
|
||||||
for (const modelInstance of getModelInstances(document.modelInstances)) {
|
for (const modelInstance of getModelInstances(document.modelInstances)) {
|
||||||
@@ -666,6 +688,7 @@ export function buildRuntimeSceneFromDocument(document: SceneDocument, options:
|
|||||||
entityId: playerStartEntity.id,
|
entityId: playerStartEntity.id,
|
||||||
position: cloneVec3(playerStartEntity.position),
|
position: cloneVec3(playerStartEntity.position),
|
||||||
yawDegrees: playerStartEntity.yawDegrees,
|
yawDegrees: playerStartEntity.yawDegrees,
|
||||||
|
navigationMode,
|
||||||
collider: playerCollider
|
collider: playerCollider
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -681,6 +704,7 @@ export function buildRuntimeSceneFromDocument(document: SceneDocument, options:
|
|||||||
interactionLinks,
|
interactionLinks,
|
||||||
playerStart,
|
playerStart,
|
||||||
playerCollider,
|
playerCollider,
|
||||||
|
navigationMode,
|
||||||
spawn: resolveRuntimeSpawn(
|
spawn: resolveRuntimeSpawn(
|
||||||
playerStart,
|
playerStart,
|
||||||
collections.entities.sceneEntries,
|
collections.entities.sceneEntries,
|
||||||
|
|||||||
Reference in New Issue
Block a user