import * as THREE from "three"; import type { CelestialVisual, ClaimVisual, ConstructionSiteVisual, NodeVisual, PlanetVisual, Selectable, ShipVisual, StructureVisual, } from "./viewerTypes"; /** * System rendering layer. * Scene coordinate unit: km * DISPLAY_UNITS_PER_KILOMETER * ACTIVE_SYSTEM_DETAIL_SCALE. * Camera far plane covers a solar system. * Only the active system's objects are visible; inactive system objects are hidden in place. */ export class SystemLayer { readonly scene = new THREE.Scene(); readonly camera = new THREE.PerspectiveCamera(50, 1, 0.000005, 300000); readonly celestialGroup = new THREE.Group(); readonly nodeGroup = new THREE.Group(); readonly stationGroup = new THREE.Group(); readonly claimGroup = new THREE.Group(); readonly constructionSiteGroup = new THREE.Group(); readonly shipGroup = new THREE.Group(); readonly selectableTargets = new Map(); readonly planetVisuals: PlanetVisual[] = []; readonly shipVisuals = new Map(); readonly celestialVisuals = new Map(); readonly nodeVisuals = new Map(); readonly stationVisuals = new Map(); readonly claimVisuals = new Map(); readonly constructionSiteVisuals = new Map(); constructor() { this.scene.add(new THREE.AmbientLight(0x90a6c0, 0.55)); const keyLight = new THREE.DirectionalLight(0xdcecff, 1.3); keyLight.position.set(1000, 1200, 800); this.scene.add(keyLight); this.scene.add( this.celestialGroup, this.nodeGroup, this.stationGroup, this.claimGroup, this.constructionSiteGroup, this.shipGroup, ); } updateCamera(systemFocus: THREE.Vector3, orbitOffset: THREE.Vector3) { this.camera.position.copy(systemFocus).add(orbitOffset); this.camera.lookAt(systemFocus); } onResize(aspect: number) { this.camera.aspect = aspect; this.camera.updateProjectionMatrix(); } render(renderer: THREE.WebGLRenderer) { renderer.render(this.scene, this.camera); } }