diff --git a/index.html b/index.html index 9314ef6..8620535 100644 --- a/index.html +++ b/index.html @@ -22,7 +22,7 @@
-
Loading...
+
@@ -43,7 +43,8 @@
diff --git a/src/keyboardInput.ts b/src/keyboardInput.ts index 8b40b50..db90d55 100644 --- a/src/keyboardInput.ts +++ b/src/keyboardInput.ts @@ -78,7 +78,7 @@ export class KeyboardInput { document.onkeydown = (ev) => { // Recording controls (with modifiers) - if (ev.key === 'r' || ev.key === 'R') { + /*if (ev.key === 'r' || ev.key === 'R') { if (ev.ctrlKey || ev.metaKey) { // Ctrl+R or Cmd+R: Toggle long recording ev.preventDefault(); // Prevent browser reload @@ -93,7 +93,7 @@ export class KeyboardInput { this._onRecordingActionObservable.notifyObservers("exportRingBuffer"); return; } - } + }*/ switch (ev.key) { case 'i': @@ -131,6 +131,12 @@ export class KeyboardInput { case 'ArrowDown': this._rightStick.y = 1; break; + case 'ArrowLeft': + this._rightStick.x = -1; + break; + case 'ArrowRight': + this._rightStick.x = 1; + break; } }; } diff --git a/src/level1.ts b/src/level1.ts index b285f02..4065820 100644 --- a/src/level1.ts +++ b/src/level1.ts @@ -4,7 +4,8 @@ import { AbstractMesh, Observable, PhysicsAggregate, - Vector3 + Vector3, + WebXRState } from "@babylonjs/core"; import {Ship} from "./ship"; import Level from "./level"; @@ -47,7 +48,7 @@ export class Level1 implements Level { xr.baseExperience.onInitialXRPoseSetObservable.add(() => { xr.baseExperience.camera.parent = this._ship.transformNode; const currPose = xr.baseExperience.camera.globalPosition.y; - xr.baseExperience.camera.position = new Vector3(0, 0, 0); + xr.baseExperience.camera.position = new Vector3(0, 1.5, 0); // Start game timer when XR pose is set this._ship.gameStats.startTimer(); @@ -87,7 +88,7 @@ export class Level1 implements Level { } // If XR is available and session is active, check for controllers - if (DefaultScene.XR && DefaultScene.XR.baseExperience.state === 4) { // State 4 = IN_XR + if (DefaultScene.XR && DefaultScene.XR.baseExperience.state === WebXRState.IN_XR) { // XR session already active, just check for controllers debugLog('XR session already active, checking for controllers. Count:', DefaultScene.XR.input.controllers.length); DefaultScene.XR.input.controllers.forEach((controller, index) => { diff --git a/src/levelConfig.ts b/src/levelConfig.ts index 59b6b06..222563e 100644 --- a/src/levelConfig.ts +++ b/src/levelConfig.ts @@ -24,7 +24,7 @@ export interface MaterialConfig { id: string; name: string; type: "PBR" | "Standard" | "Basic"; - albedoColor?: Color4Array; + albedoColor?: Vector3Array; // RGB color (Color3) metallic?: number; roughness?: number; emissiveColor?: Vector3Array; diff --git a/src/levelSerializer.ts b/src/levelSerializer.ts index 2bb7466..0a3c28b 100644 --- a/src/levelSerializer.ts +++ b/src/levelSerializer.ts @@ -313,8 +313,7 @@ export class LevelSerializer { materialConfig.albedoColor = [ material.diffuseColor.r, material.diffuseColor.g, - material.diffuseColor.b, - 1.0 + material.diffuseColor.b ]; } if (material.emissiveColor) { diff --git a/src/main.ts b/src/main.ts index d8fcaf8..b099c9b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -99,6 +99,30 @@ export class Main { this._currentLevel.getReadyObservable().add(async () => { setLoadingMessage("Starting game..."); + // If we entered XR before level creation, manually setup camera parenting + // (This is needed because onInitialXRPoseSetObservable won't fire if we're already in XR) + if (DefaultScene.XR && xrSession && DefaultScene.XR.baseExperience.state === 2) { // WebXRState.IN_XR = 2 + const level1 = this._currentLevel as Level1; + const ship = (level1 as any)._ship; + + if (ship && ship.transformNode) { + debugLog('Manually parenting XR camera to ship transformNode'); + DefaultScene.XR.baseExperience.camera.parent = ship.transformNode; + DefaultScene.XR.baseExperience.camera.position = new Vector3(0, 1.5, 0); + + // Also start timer and recording here (since onInitialXRPoseSetObservable won't fire) + ship.gameStats.startTimer(); + debugLog('Game timer started (manual)'); + + if ((level1 as any)._physicsRecorder) { + (level1 as any)._physicsRecorder.startRingBuffer(); + debugLog('Physics recorder started (manual)'); + } + } else { + debugLog('WARNING: Could not parent XR camera - ship or transformNode not found'); + } + } + // Remove UI mainDiv.remove();