From 5c7e606aa6fd54edc5b1eff80207be8f6b36ab2e Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Sat, 11 Apr 2026 22:12:59 +0200 Subject: [PATCH] Add water surface height to volume state and update camera submerged logic --- src/runtime-three/first-person-navigation-controller.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/runtime-three/first-person-navigation-controller.ts b/src/runtime-three/first-person-navigation-controller.ts index 0ae30c68..022c19d4 100644 --- a/src/runtime-three/first-person-navigation-controller.ts +++ b/src/runtime-three/first-person-navigation-controller.ts @@ -328,7 +328,8 @@ export class FirstPersonNavigationController implements NavigationController { resolveVolumeState: (feetPosition) => this.context?.resolvePlayerVolumeState(feetPosition) ?? { inWater: false, - inFog: false + inFog: false, + waterSurfaceHeight: null }, probeGround: (feetPosition, shape, maxDistance) => this.context?.probePlayerGround?.(feetPosition, shape, maxDistance) ?? { @@ -437,6 +438,10 @@ export class FirstPersonNavigationController implements NavigationController { ); const cameraVolumeState = this.context.resolvePlayerVolumeState(eyePosition); + const cameraSubmerged = + cameraVolumeState.inWater && + cameraVolumeState.waterSurfaceHeight !== null && + eyePosition.y < cameraVolumeState.waterSurfaceHeight; const telemetry = createPlayerControllerTelemetry({ feetPosition: { @@ -449,7 +454,7 @@ export class FirstPersonNavigationController implements NavigationController { this.context.getRuntimeScene().playerMovement ), inWaterVolume: this.inWaterVolume, - cameraSubmerged: cameraVolumeState.inWater, + cameraSubmerged, inFogVolume: this.inFogVolume, pointerLocked: this.pointerLocked, spawn: this.context.getRuntimeScene().spawn,