From 2bc59fd6840739c22b056765a90bed65b3b58088 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Wed, 22 Apr 2026 17:54:24 +0200 Subject: [PATCH] auto-git: [change] src/entities/entity-instances.ts --- src/entities/entity-instances.ts | 47 +++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/entities/entity-instances.ts b/src/entities/entity-instances.ts index 6ebc3e13..d2e23504 100644 --- a/src/entities/entity-instances.ts +++ b/src/entities/entity-instances.ts @@ -696,6 +696,14 @@ function normalizeCameraRigTargetEntityId(entityId: string): string { return normalizedEntityId; } +function normalizeCameraRigPathId(pathId: string | undefined): string { + if (pathId === undefined) { + return ""; + } + + return pathId.trim(); +} + export function createCameraRigPlayerTargetRef(): CameraRigPlayerTargetRef { return { kind: "player" @@ -868,8 +876,45 @@ export function resolveCameraRigDocumentTargetPosition( } } +export function resolveCameraRigDocumentPosition( + rig: CameraRigEntity, + entities: Record, + paths: Record, + options: { fallbackToPathStart?: boolean } = {} +): Vec3 | null { + switch (rig.rigType) { + case "fixed": + return cloneVec3(rig.position); + case "rail": { + const path = paths[rig.pathId] ?? null; + + if (path === null) { + return null; + } + + const resolvedPath = resolveScenePath(path); + const baseTarget = resolveCameraRigDocumentTargetPosition( + rig.target, + entities + ); + + if (baseTarget === null) { + return options.fallbackToPathStart === true && + resolvedPath.points.length > 0 + ? cloneVec3(resolvedPath.points[0]!.position) + : null; + } + + return resolveNearestPointOnResolvedScenePath( + resolvedPath, + baseTarget + ).position; + } + } +} + export function resolveCameraRigDocumentLookTarget( - rig: Pick, + rig: Pick, entities: Record ): Vec3 | null { const baseTarget = resolveCameraRigDocumentTargetPosition(rig.target, entities);