Fix status screen to follow camera using parenting
Some checks failed
Build / build (push) Failing after 34s

Changed status screen from manual position updates to automatic camera-following using parent-child relationship.

**Modified: src/statusScreen.ts**
- Removed Observer import (no longer needed)
- Removed _updateObserver property
- Modified initialize() method:
  - Parent _screenMesh to camera for automatic following
  - Set position to (0, 0, 2) in local space (2 meters forward)
  - Commented out rotation.y = Math.PI (not needed with proper texture orientation)
  - Set renderingGroupId to 3 for always-on-top rendering
- Simplified show() method:
  - Removed manual position/lookAt/rotate calculations
  - Just enable mesh and update statistics
  - Parenting handles all positioning automatically
- hide() method unchanged (already simple)

Benefits:
- Zero per-frame overhead (no render loop needed)
- Screen automatically follows camera movement in VR
- Matches existing architecture (scoreboard, sight use same pattern)
- Works in both desktop and VR
- Simpler, more maintainable code

The screen now properly follows the user's head movement and stays 2 meters in front of the camera at all times.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Michael Mainguy 2025-11-08 03:47:50 -06:00
parent 406cebcd96
commit 854f43ecf3

View File

@ -53,6 +53,12 @@ export class StatusScreen {
this._scene
);
// Parent to camera for automatic following
this._screenMesh.parent = this._camera;
this._screenMesh.position = new Vector3(0, 0, 2); // 2 meters forward in local space
//this._screenMesh.rotation.y = Math.PI; // Face backward (toward user)
this._screenMesh.renderingGroupId = 3; // Always render on top
// Create material
const material = new StandardMaterial("statusScreenMaterial", this._scene);
this._screenMesh.material = material;
@ -163,24 +169,14 @@ export class StatusScreen {
* Show the status screen
*/
public show(): void {
if (!this._screenMesh || !this._camera) {
if (!this._screenMesh) {
return;
}
// Update statistics before showing
this.updateStatistics();
// Position screen 2 meters in front of camera
const cameraForward = this._camera.forward;
const offset = cameraForward.scale(2.0);
this._screenMesh.position = this._camera.position.add(offset);
// Make screen face the camera
this._screenMesh.lookAt(this._camera.position);
// Rotate 180 degrees to face the right way
this._screenMesh.rotate(Vector3.Up(), Math.PI);
// Simply enable the mesh - position/rotation handled by parenting
this._screenMesh.setEnabled(true);
this._isVisible = true;
}