feat: improved visualisation and x4 data import
This commit is contained in:
@@ -1,17 +1,18 @@
|
||||
import * as THREE from "three";
|
||||
import { classifyPovLevel } from "./viewerMath";
|
||||
import type { PovLevel, PerformanceStats } from "./viewerTypes";
|
||||
import type { PovLevel } from "./viewerTypes";
|
||||
import type { UniverseLayer } from "./viewerUniverseLayer";
|
||||
import type { GalaxyLayer } from "./viewerGalaxyLayer";
|
||||
import type { SystemLayer } from "./viewerSystemLayer";
|
||||
import type { LocalLayer } from "./viewerLocalLayer";
|
||||
|
||||
export interface RenderFrameParams {
|
||||
clock: THREE.Clock;
|
||||
renderer: THREE.WebGLRenderer;
|
||||
universeScene: THREE.Scene;
|
||||
galaxyScene: THREE.Scene;
|
||||
galaxyCamera: THREE.PerspectiveCamera;
|
||||
systemScene: THREE.Scene;
|
||||
systemCamera: THREE.PerspectiveCamera;
|
||||
localScene: THREE.Scene;
|
||||
localCamera: THREE.PerspectiveCamera;
|
||||
universeLayer: UniverseLayer;
|
||||
galaxyLayer: GalaxyLayer;
|
||||
systemLayer: SystemLayer;
|
||||
localLayer: LocalLayer;
|
||||
getPovLevel: () => PovLevel;
|
||||
updateCamera: (delta: number) => void;
|
||||
updateAmbience: (delta: number) => void;
|
||||
@@ -25,9 +26,9 @@ export interface RenderFrameParams {
|
||||
|
||||
export interface ResizeParams {
|
||||
renderer: THREE.WebGLRenderer;
|
||||
galaxyCamera: THREE.PerspectiveCamera;
|
||||
systemCamera: THREE.PerspectiveCamera;
|
||||
localCamera: THREE.PerspectiveCamera;
|
||||
galaxyLayer: GalaxyLayer;
|
||||
systemLayer: SystemLayer;
|
||||
localLayer: LocalLayer;
|
||||
}
|
||||
|
||||
export interface CameraStepParams {
|
||||
@@ -48,22 +49,22 @@ export function renderFrame(params: RenderFrameParams) {
|
||||
params.applyZoomPresentation();
|
||||
|
||||
const povLevel = params.getPovLevel();
|
||||
const activeCamera = povLevel === "galaxy" ? params.galaxyCamera : params.systemCamera;
|
||||
const activeCamera = povLevel === "galaxy" ? params.galaxyLayer.camera : params.systemLayer.camera;
|
||||
params.renderer.autoClear = false;
|
||||
params.renderer.clear();
|
||||
// Universe backdrop — always first, rendered with the active camera so it aligns with the foreground
|
||||
params.renderer.render(params.universeScene, activeCamera);
|
||||
params.universeLayer.render(params.renderer, activeCamera);
|
||||
params.renderer.clearDepth();
|
||||
if (povLevel === "galaxy") {
|
||||
// Galaxy map on top of universe backdrop
|
||||
params.renderer.render(params.galaxyScene, params.galaxyCamera);
|
||||
params.galaxyLayer.render(params.renderer);
|
||||
} else if (povLevel === "system") {
|
||||
params.renderer.render(params.systemScene, params.systemCamera);
|
||||
params.systemLayer.render(params.renderer);
|
||||
} else {
|
||||
// local: system as mid-ground backdrop, then local on top
|
||||
params.renderer.render(params.systemScene, params.systemCamera);
|
||||
params.systemLayer.render(params.renderer);
|
||||
params.renderer.clearDepth();
|
||||
params.renderer.render(params.localScene, params.localCamera);
|
||||
params.localLayer.render(params.renderer);
|
||||
}
|
||||
|
||||
params.recordPerformanceStats(performance.now() - frameStartedAtMs);
|
||||
@@ -73,10 +74,9 @@ export function renderFrame(params: RenderFrameParams) {
|
||||
export function resizeViewer(params: ResizeParams) {
|
||||
const width = window.innerWidth;
|
||||
const height = window.innerHeight;
|
||||
for (const camera of [params.galaxyCamera, params.systemCamera, params.localCamera]) {
|
||||
camera.aspect = width / height;
|
||||
camera.updateProjectionMatrix();
|
||||
}
|
||||
params.galaxyLayer.onResize(width / height);
|
||||
params.systemLayer.onResize(width / height);
|
||||
params.localLayer.onResize(width / height);
|
||||
params.renderer.setSize(width, height);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user