diff --git a/src/core/xrSetup.ts b/src/core/xrSetup.ts index e405f2d..db76b2b 100644 --- a/src/core/xrSetup.ts +++ b/src/core/xrSetup.ts @@ -68,6 +68,10 @@ async function createXRExperience(): Promise { } ); log.debug('Pointer selection enabled with renderingGroupId:', XR_RENDERING_GROUP); + + // Set far clipping plane for distant planets + DefaultScene.XR.baseExperience.camera.maxZ = 100000; + createFadeSphere(); } diff --git a/src/environment/asteroids/rockFactory.ts b/src/environment/asteroids/rockFactory.ts index 530d716..c1718f3 100644 --- a/src/environment/asteroids/rockFactory.ts +++ b/src/environment/asteroids/rockFactory.ts @@ -150,6 +150,7 @@ export class RockFactory { this._asteroidMesh.material.freeze(); if (this._asteroidMesh) { this._asteroidMesh.setEnabled(false); + this._asteroidMesh.renderingGroupId = 2; } log.debug(this._asteroidMesh); } diff --git a/src/environment/stations/starBase.ts b/src/environment/stations/starBase.ts index 2ea5c1b..5638953 100644 --- a/src/environment/stations/starBase.ts +++ b/src/environment/stations/starBase.ts @@ -55,6 +55,11 @@ export default class StarBase { this._loadedBase = { baseMesh, landingMesh, container: importMeshes.container }; + // Set rendering group for all base meshes + for (const mesh of importMeshes.meshes.values()) { + if (mesh) mesh.renderingGroupId = 2; + } + log.debug(`[StarBase] Added to scene (hidden: ${hidden})`); return { baseMesh, landingMesh, container: importMeshes.container }; } diff --git a/src/levels/config/levelDeserializer.ts b/src/levels/config/levelDeserializer.ts index 861ba60..83d1c39 100644 --- a/src/levels/config/levelDeserializer.ts +++ b/src/levels/config/levelDeserializer.ts @@ -5,6 +5,8 @@ import { Observable, PBRMaterial, PhysicsAggregate, + PhysicsMotionType, + PhysicsShapeType, Texture, Vector3, } from "@babylonjs/core"; @@ -51,6 +53,9 @@ export class LevelDeserializer { // Store score observable for deferred physics private _scoreObservable: Observable | null = null; + // Store planets for deferred physics + private _planets: { mesh: AbstractMesh; diameter: number }[] = []; + /** * Deserialize meshes only (Phase 2 - before XR, hidden) */ @@ -96,6 +101,18 @@ export class LevelDeserializer { // Initialize asteroid physics RockFactory.initPhysics(); + // Initialize planet physics (static spheres) + for (const { mesh, diameter } of this._planets) { + const agg = new PhysicsAggregate( + mesh, + PhysicsShapeType.SPHERE, + { radius: diameter / 2, mass: 0 }, + this.scene + ); + agg.body.setMotionType(PhysicsMotionType.STATIC); + } + log.debug(`[LevelDeserializer] Created physics for ${this._planets.length} planets`); + return landingAggregate; } @@ -137,6 +154,7 @@ export class LevelDeserializer { //material.emissiveColor.set(0.5, 0.5, 0.1); material.unlit = true; sun.material = material; + sun.renderingGroupId = 2; return sun; } @@ -185,8 +203,10 @@ export class LevelDeserializer { material.metallic = 0; material.unlit = true; planet.material = material; + planet.renderingGroupId = 2; planets.push(planet); + this._planets.push({ mesh: planet, diameter: planetConfig.diameter }); } log.debug(`Created ${planets.length} planets from config`); diff --git a/src/ship/ship.ts b/src/ship/ship.ts index b622468..ecd57e5 100644 --- a/src/ship/ship.ts +++ b/src/ship/ship.ts @@ -173,6 +173,11 @@ export class Ship { this._loadedAssetData = await loadAsset("ship.glb", "default", { hidden }); this._ship = this._loadedAssetData.container.transformNodes[0]; + // Set rendering group for all ship meshes + for (const mesh of this._loadedAssetData.meshes.values()) { + if (mesh) mesh.renderingGroupId = 2; + } + if (initialPosition) { this._ship.position.copyFrom(initialPosition); } @@ -198,6 +203,7 @@ export class Ship { this._camera = new FreeCamera("Flat Camera", new Vector3(0, 1.5, 0), DefaultScene.MainScene); this._camera.parent = this._ship; this._camera.rotation = new Vector3(0, Math.PI, 0); + this._camera.maxZ = 100000; // Far clipping plane for distant planets if (!DefaultScene.XR && !this._isReplayMode) { DefaultScene.MainScene.activeCamera = this._camera;