Refactor simulation and viewer architecture
This commit is contained in:
59
apps/viewer/src/viewerRenderLoop.ts
Normal file
59
apps/viewer/src/viewerRenderLoop.ts
Normal file
@@ -0,0 +1,59 @@
|
||||
import * as THREE from "three";
|
||||
import { classifyZoomLevel } from "./viewerMath";
|
||||
import type { PerformanceStats } from "./viewerTypes";
|
||||
|
||||
export interface RenderFrameParams {
|
||||
clock: THREE.Clock;
|
||||
renderer: THREE.WebGLRenderer;
|
||||
scene: THREE.Scene;
|
||||
camera: THREE.PerspectiveCamera;
|
||||
updateCamera: (delta: number) => void;
|
||||
updateAmbience: (delta: number) => void;
|
||||
updatePlanetPresentation: () => void;
|
||||
updateShipPresentation: () => void;
|
||||
updateNetworkPanel: () => void;
|
||||
applyZoomPresentation: () => void;
|
||||
recordPerformanceStats: (frameMs: number) => void;
|
||||
updatePerformancePanel: () => void;
|
||||
}
|
||||
|
||||
export interface ResizeParams {
|
||||
renderer: THREE.WebGLRenderer;
|
||||
camera: THREE.PerspectiveCamera;
|
||||
}
|
||||
|
||||
export interface CameraStepParams {
|
||||
currentDistance: number;
|
||||
desiredDistance: number;
|
||||
orbitPitch: number;
|
||||
delta: number;
|
||||
}
|
||||
|
||||
export function renderFrame(params: RenderFrameParams) {
|
||||
const frameStartedAtMs = performance.now();
|
||||
const delta = Math.min(params.clock.getDelta(), 0.033);
|
||||
params.updateCamera(delta);
|
||||
params.updateAmbience(delta);
|
||||
params.updatePlanetPresentation();
|
||||
params.updateShipPresentation();
|
||||
params.updateNetworkPanel();
|
||||
params.applyZoomPresentation();
|
||||
params.renderer.render(params.scene, params.camera);
|
||||
params.recordPerformanceStats(performance.now() - frameStartedAtMs);
|
||||
params.updatePerformancePanel();
|
||||
}
|
||||
|
||||
export function resizeViewer(params: ResizeParams) {
|
||||
const width = window.innerWidth;
|
||||
const height = window.innerHeight;
|
||||
params.camera.aspect = width / height;
|
||||
params.camera.updateProjectionMatrix();
|
||||
params.renderer.setSize(width, height);
|
||||
}
|
||||
|
||||
export function stepCamera(params: CameraStepParams) {
|
||||
const currentDistance = THREE.MathUtils.damp(params.currentDistance, params.desiredDistance, 7.5, params.delta);
|
||||
const zoomLevel = classifyZoomLevel(currentDistance);
|
||||
const orbitPitch = THREE.MathUtils.clamp(params.orbitPitch, 0.18, 1.3);
|
||||
return { currentDistance, zoomLevel, orbitPitch };
|
||||
}
|
||||
Reference in New Issue
Block a user