diff --git a/src/runtime-three/runtime-interaction-system.ts b/src/runtime-three/runtime-interaction-system.ts index d7b3ae11..5616eede 100644 --- a/src/runtime-three/runtime-interaction-system.ts +++ b/src/runtime-three/runtime-interaction-system.ts @@ -280,32 +280,6 @@ function isPlayerInsideTriggerVolume( ); } -function raySphereHitDistance( - origin: Vec3, - direction: Vec3, - center: Vec3, - radius: number -): number | null { - const offset = subtractVec3(origin, center); - const halfB = dotVec3(offset, direction); - const c = dotVec3(offset, offset) - radius * radius; - const discriminant = halfB * halfB - c; - - if (discriminant < 0) { - return null; - } - - const discriminantRoot = Math.sqrt(discriminant); - const nearestHit = -halfB - discriminantRoot; - - if (nearestHit >= 0) { - return nearestHit; - } - - const farHit = -halfB + discriminantRoot; - return farHit >= 0 ? 0 : null; -} - function resolveTeleportTarget( runtimeScene: RuntimeSceneDefinition, entityId: string @@ -472,7 +446,6 @@ interface RuntimeInteractionTargetSource { acquisitionRange: number; horizontalRadius: number; bounds?: { min: Vec3; max: Vec3 }; - targetRadius?: number; } interface Vec2 { @@ -554,8 +527,7 @@ function collectRuntimeInteractionTargetSources( distance, range: interactable.radius, acquisitionRange, - horizontalRadius: targetRadius, - targetRadius + horizontalRadius: targetRadius }); } @@ -753,43 +725,6 @@ export function resolveStableRuntimeTargetProposal( return best; } -function updateBestPrompt( - currentBestPrompt: RuntimeInteractionPrompt | null, - currentBestHitDistance: number, - candidateEntityId: string, - candidatePrompt: string, - candidateDistance: number, - candidateRange: number, - candidateHitDistance: number -): { prompt: RuntimeInteractionPrompt | null; hitDistance: number } { - const nextPrompt: RuntimeInteractionPrompt = { - sourceEntityId: candidateEntityId, - prompt: candidatePrompt, - distance: candidateDistance, - range: candidateRange - }; - - if ( - candidateHitDistance < currentBestHitDistance || - (candidateHitDistance === currentBestHitDistance && - (currentBestPrompt === null || - candidateDistance < currentBestPrompt.distance || - (candidateDistance === currentBestPrompt.distance && - candidateEntityId.localeCompare(currentBestPrompt.sourceEntityId) < - 0))) - ) { - return { - prompt: nextPrompt, - hitDistance: candidateHitDistance - }; - } - - return { - prompt: currentBestPrompt, - hitDistance: currentBestHitDistance - }; -} - export class RuntimeInteractionSystem { private readonly occupiedTriggerVolumes = new Set(); diff --git a/tests/domain/scene-document-validation.test.ts b/tests/domain/scene-document-validation.test.ts index 5dd42c91..f49a491f 100644 --- a/tests/domain/scene-document-validation.test.ts +++ b/tests/domain/scene-document-validation.test.ts @@ -575,6 +575,7 @@ describe("validateSceneDocument", () => { yawDegrees: Number.NaN, navigationMode: "invalidMode" as unknown as "firstPerson", interactionReachMeters: Number.NaN, + interactionAngleDegrees: Number.NaN, movementTemplate: { kind: "invalidTemplate", moveSpeed: 0, @@ -649,6 +650,9 @@ describe("validateSceneDocument", () => { expect.objectContaining({ code: "invalid-player-start-interaction-reach" }), + expect.objectContaining({ + code: "invalid-player-start-interaction-angle" + }), expect.objectContaining({ code: "invalid-player-start-movement-template-kind" }),