Shared base #1
@@ -271,7 +271,6 @@ export class BodyDetailSceneComponent implements AfterViewInit, OnDestroy {
|
|||||||
scene.add(sunLight);
|
scene.add(sunLight);
|
||||||
|
|
||||||
const geometry = new THREE.SphereGeometry(1, 64, 48);
|
const geometry = new THREE.SphereGeometry(1, 64, 48);
|
||||||
const viewModel = this.viewModel();
|
|
||||||
this.planetMaterial = new THREE.MeshStandardMaterial({
|
this.planetMaterial = new THREE.MeshStandardMaterial({
|
||||||
// White, always: the map that arrives a moment later carries the colour, whether it is a
|
// White, always: the map that arrives a moment later carries the colour, whether it is a
|
||||||
// photograph or a surface derived from the body's own measurements.
|
// photograph or a surface derived from the body's own measurements.
|
||||||
|
|||||||
@@ -604,7 +604,7 @@ describe('GalaxySystemSceneComponent camera-flight transitions', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
it('links the stars being drawn, and asks again once a new set of them holds still', async () => {
|
it('links the stars being drawn, and asks again once a new set of them holds still', async () => {
|
||||||
const links = vi.fn((_rangePc: number, _drawn: Uint32Array) => Promise.resolve(new Float32Array(0)));
|
const links = vi.fn<LinkScene['routing']['links']>(() => Promise.resolve(new Float32Array(0)));
|
||||||
const component = linkScene(links);
|
const component = linkScene(links);
|
||||||
await settle();
|
await settle();
|
||||||
expect(links).toHaveBeenCalledTimes(1);
|
expect(links).toHaveBeenCalledTimes(1);
|
||||||
@@ -625,7 +625,7 @@ describe('GalaxySystemSceneComponent camera-flight transitions', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('asks for as much of the graph as a million pixels of line make, around where the view is centred', async () => {
|
it('asks for as much of the graph as a million pixels of line make, around where the view is centred', async () => {
|
||||||
const links = vi.fn((_rangePc: number, _drawn: Uint32Array, _budget?: LinkBudget) => Promise.resolve(new Float32Array(0)));
|
const links = vi.fn<LinkScene['routing']['links']>(() => Promise.resolve(new Float32Array(0)));
|
||||||
Object.defineProperty((fixture.nativeElement as HTMLElement).querySelector('canvas')!, 'clientHeight', { value: 1080 });
|
Object.defineProperty((fixture.nativeElement as HTMLElement).querySelector('canvas')!, 'clientHeight', { value: 1080 });
|
||||||
// A screen scaled to 200%: 1080 CSS pixels are 2160 drawn ones, and the lines are drawn in those.
|
// A screen scaled to 200%: 1080 CSS pixels are 2160 drawn ones, and the lines are drawn in those.
|
||||||
engine.pixelRatio = 2;
|
engine.pixelRatio = 2;
|
||||||
@@ -641,7 +641,7 @@ describe('GalaxySystemSceneComponent camera-flight transitions', () => {
|
|||||||
|
|
||||||
it('asks again once the view has zoomed past the budget it asked with, though the drawn stars are the same', async () => {
|
it('asks again once the view has zoomed past the budget it asked with, though the drawn stars are the same', async () => {
|
||||||
// All three stars fit the star budget, so the drawn set never changes: only the budget can.
|
// All three stars fit the star budget, so the drawn set never changes: only the budget can.
|
||||||
const links = vi.fn((_rangePc: number, _drawn: Uint32Array, _budget?: LinkBudget) => Promise.resolve(new Float32Array(0)));
|
const links = vi.fn<LinkScene['routing']['links']>(() => Promise.resolve(new Float32Array(0)));
|
||||||
Object.defineProperty((fixture.nativeElement as HTMLElement).querySelector('canvas')!, 'clientHeight', { value: 1080 });
|
Object.defineProperty((fixture.nativeElement as HTMLElement).querySelector('canvas')!, 'clientHeight', { value: 1080 });
|
||||||
const component = linkScene(links);
|
const component = linkScene(links);
|
||||||
await advanceFrames(engine, 0.3);
|
await advanceFrames(engine, 0.3);
|
||||||
@@ -658,7 +658,7 @@ describe('GalaxySystemSceneComponent camera-flight transitions', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('asks for no graph from inside a system, where distances are in astronomical units', async () => {
|
it('asks for no graph from inside a system, where distances are in astronomical units', async () => {
|
||||||
const links = vi.fn((_rangePc: number, _drawn: Uint32Array, _budget?: LinkBudget) => Promise.resolve(new Float32Array(0)));
|
const links = vi.fn<LinkScene['routing']['links']>(() => Promise.resolve(new Float32Array(0)));
|
||||||
navigationStore.selectStar(SUN.id);
|
navigationStore.selectStar(SUN.id);
|
||||||
await flushAsync();
|
await flushAsync();
|
||||||
await advanceFrames(engine, 2.5);
|
await advanceFrames(engine, 2.5);
|
||||||
@@ -695,7 +695,7 @@ describe('GalaxySystemSceneComponent camera-flight transitions', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('gives a view on the move a new graph at least every quarter second, rather than waiting for it to stop', async () => {
|
it('gives a view on the move a new graph at least every quarter second, rather than waiting for it to stop', async () => {
|
||||||
const links = vi.fn((_rangePc: number, _drawn: Uint32Array) => Promise.resolve(new Float32Array(0)));
|
const links = vi.fn<LinkScene['routing']['links']>(() => Promise.resolve(new Float32Array(0)));
|
||||||
const component = linkScene(links);
|
const component = linkScene(links);
|
||||||
await settle();
|
await settle();
|
||||||
|
|
||||||
|
|||||||
@@ -484,7 +484,7 @@ export class GalaxySystemSceneComponent implements AfterViewInit, OnDestroy {
|
|||||||
// Reads both signals, so flipping the layer on and dragging the range each land here.
|
// Reads both signals, so flipping the layer on and dragging the range each land here.
|
||||||
effect(() => {
|
effect(() => {
|
||||||
this.jumpRangePc();
|
this.jumpRangePc();
|
||||||
this.display().jumpLinks;
|
void this.display().jumpLinks;
|
||||||
this.scheduleJumpLinks();
|
this.scheduleJumpLinks();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -1804,8 +1804,6 @@ export class GalaxySystemSceneComponent implements AfterViewInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private swapToSystemSpace(star: StarRecord, direction: THREE.Vector3, onComplete: () => void): void {
|
private swapToSystemSpace(star: StarRecord, direction: THREE.Vector3, onComplete: () => void): void {
|
||||||
const camera = this.engine.getCamera();
|
|
||||||
|
|
||||||
this.systemRenderer?.dispose();
|
this.systemRenderer?.dispose();
|
||||||
if (this.starMarker) {
|
if (this.starMarker) {
|
||||||
this.systemGroup.remove(this.starMarker);
|
this.systemGroup.remove(this.starMarker);
|
||||||
@@ -1912,7 +1910,6 @@ export class GalaxySystemSceneComponent implements AfterViewInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private swapToGalaxySpace(exitingStarId: number, direction: THREE.Vector3, isSwitchingSystems: boolean, onComplete: () => void): void {
|
private swapToGalaxySpace(exitingStarId: number, direction: THREE.Vector3, isSwitchingSystems: boolean, onComplete: () => void): void {
|
||||||
const camera = this.engine.getCamera();
|
|
||||||
const star = this.starsById.get(exitingStarId);
|
const star = this.starsById.get(exitingStarId);
|
||||||
const starPc = star ? new THREE.Vector3(star.x, star.y, star.z) : GALAXY_OVERVIEW_TARGET.clone();
|
const starPc = star ? new THREE.Vector3(star.x, star.y, star.z) : GALAXY_OVERVIEW_TARGET.clone();
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import * as THREE from 'three/webgpu';
|
import * as THREE from 'three/webgpu';
|
||||||
|
|
||||||
import { GALACTIC_BASIS_EQUATORIAL, SUN_HEIGHT_ABOVE_MIDPLANE_PC } from '../../shared/astro/galaxy';
|
import { GALACTIC_BASIS_EQUATORIAL } from '../../shared/astro/galaxy';
|
||||||
|
|
||||||
const SEGMENTS_PER_RING = 180;
|
const SEGMENTS_PER_RING = 180;
|
||||||
|
|
||||||
|
|||||||
@@ -87,9 +87,9 @@ export function createRandom(seed: number): () => number {
|
|||||||
|
|
||||||
/** Standard normal sample, by the polar form of Box-Muller. */
|
/** Standard normal sample, by the polar form of Box-Muller. */
|
||||||
function gaussian(random: () => number): number {
|
function gaussian(random: () => number): number {
|
||||||
let u = 0;
|
let u: number;
|
||||||
let v = 0;
|
let v: number;
|
||||||
let s = 0;
|
let s: number;
|
||||||
do {
|
do {
|
||||||
u = random() * 2 - 1;
|
u = random() * 2 - 1;
|
||||||
v = random() * 2 - 1;
|
v = random() * 2 - 1;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { BrightnessIndex, brightnessIndex, Positioned } from '../../shared/astro
|
|||||||
import { spectralTypeToColorIndex } from '../../shared/astro/spectral';
|
import { spectralTypeToColorIndex } from '../../shared/astro/spectral';
|
||||||
import { SceneCamera } from '../../core/engine/engine.service';
|
import { SceneCamera } from '../../core/engine/engine.service';
|
||||||
import { StarRecord } from '../../shared/models/star.model';
|
import { StarRecord } from '../../shared/models/star.model';
|
||||||
import { PIXELS_TO_ANGULAR_SIZE, REFERENCE_FOV_DEGREES, REFERENCE_VIEWPORT_HEIGHT_PX } from './angular-size';
|
import { PIXELS_TO_ANGULAR_SIZE, REFERENCE_FOV_DEGREES } from './angular-size';
|
||||||
|
|
||||||
/** Apparent star diameters, in pixels at {@link REFERENCE_VIEWPORT_HEIGHT_PX}. */
|
/** Apparent star diameters, in pixels at {@link REFERENCE_VIEWPORT_HEIGHT_PX}. */
|
||||||
const MIN_POINT_SIZE = 1.5;
|
const MIN_POINT_SIZE = 1.5;
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ export class BookmarksStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private read(): Bookmark[] {
|
private read(): Bookmark[] {
|
||||||
let raw: string | null = null;
|
let raw: string | null;
|
||||||
try {
|
try {
|
||||||
raw = localStorage.getItem(STORAGE_KEY);
|
raw = localStorage.getItem(STORAGE_KEY);
|
||||||
} catch {
|
} catch {
|
||||||
|
|||||||
Reference in New Issue
Block a user