feat: production chain
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import * as THREE from "three";
|
||||
import { ACTIVE_SYSTEM_DETAIL_SCALE, PROJECTED_GALAXY_RADIUS } from "./viewerConstants";
|
||||
import { computeMoonLocalPosition, computePlanetLocalPosition, currentWorldTimeSeconds } from "./viewerMath";
|
||||
import { rawObject } from "./viewerScenePrimitives";
|
||||
import type { PlanetVisual, ShipVisual, SystemSummaryVisual, SystemVisual, WorldState } from "./viewerTypes";
|
||||
|
||||
export function getAnimatedShipLocalPosition(visual: ShipVisual, now = performance.now()) {
|
||||
@@ -40,19 +41,21 @@ export function updatePlanetPresentation(
|
||||
? localPosition.clone().sub(systemFocusLocal).multiplyScalar(scale)
|
||||
: localPosition.multiplyScalar(scale);
|
||||
|
||||
visual.orbit.scale.setScalar(scale);
|
||||
visual.orbit.position.copy(orbitOffset);
|
||||
visual.mesh.position.copy(position);
|
||||
visual.icon.position.copy(position);
|
||||
visual.orbit.setScaleScalar(scale);
|
||||
visual.orbit.setPosition(orbitOffset);
|
||||
visual.mesh.setPosition(position);
|
||||
visual.icon.setPosition(position);
|
||||
if (visual.ring) {
|
||||
visual.ring.position.copy(position);
|
||||
visual.ring.setPosition(position);
|
||||
}
|
||||
|
||||
for (const [moonIndex, moon] of visual.moons.entries()) {
|
||||
moon.orbit.position.copy(position);
|
||||
moon.orbit.scale.setScalar(scale);
|
||||
moon.mesh.position.copy(position).add(
|
||||
computeMoonLocalPosition(visual.planet, moonIndex, nowSeconds, world?.seed ?? 1).multiplyScalar(scale),
|
||||
moon.orbit.setPosition(position);
|
||||
moon.orbit.setScaleScalar(scale);
|
||||
moon.mesh.setPosition(
|
||||
position.clone().add(
|
||||
computeMoonLocalPosition(visual.planet, moonIndex, nowSeconds, world?.seed ?? 1).multiplyScalar(scale),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -69,7 +72,7 @@ export function updateSystemSummaryPresentation(
|
||||
const distance = camera.position.distanceTo(worldPosition);
|
||||
const minimumScale = activeSystemId && systemId !== activeSystemId ? 1200 : 1400;
|
||||
const scale = Math.max(minimumScale, distance * distanceScale);
|
||||
visual.sprite.scale.set(scale, scale * 0.3125, 1);
|
||||
rawObject(visual.sprite).scale.set(scale, scale * 0.3125, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,49 +81,49 @@ export function updateSystemStarPresentation(
|
||||
activeSystemId: string | undefined,
|
||||
systemFocusLocal: THREE.Vector3,
|
||||
camera: THREE.PerspectiveCamera,
|
||||
setShellReticleOpacity: (sprite: THREE.Sprite, opacity: number) => void,
|
||||
setShellReticleOpacity: (sprite: SystemVisual["shellReticle"], opacity: number) => void,
|
||||
) {
|
||||
const activeSystem = activeSystemId ? systemVisuals.get(activeSystemId) : undefined;
|
||||
|
||||
for (const [systemId, visual] of systemVisuals.entries()) {
|
||||
visual.root.position.copy(visual.galaxyPosition);
|
||||
visual.shellReticle.scale.setScalar(visual.shellReticleBaseScale);
|
||||
visual.root.setPosition(visual.galaxyPosition);
|
||||
visual.shellReticle.setScaleScalar(visual.shellReticleBaseScale);
|
||||
|
||||
if (!activeSystem) {
|
||||
visual.starCluster.position.set(0, 0, 0);
|
||||
visual.icon.position.set(0, 0, 0);
|
||||
visual.icon.visible = true;
|
||||
visual.shellReticle.position.set(0, 0, 0);
|
||||
visual.shellReticle.visible = false;
|
||||
visual.starCluster.setPosition(new THREE.Vector3(0, 0, 0));
|
||||
visual.icon.setPosition(new THREE.Vector3(0, 0, 0));
|
||||
visual.icon.setVisible(true);
|
||||
visual.shellReticle.setPosition(new THREE.Vector3(0, 0, 0));
|
||||
visual.shellReticle.setVisible(false);
|
||||
setShellReticleOpacity(visual.shellReticle, 0);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (systemId !== activeSystemId) {
|
||||
visual.starCluster.position.set(0, 0, 0);
|
||||
visual.icon.position.set(0, 0, 0);
|
||||
visual.icon.visible = false;
|
||||
visual.shellReticle.position.set(0, 0, 0);
|
||||
visual.shellReticle.visible = true;
|
||||
visual.starCluster.setPosition(new THREE.Vector3(0, 0, 0));
|
||||
visual.icon.setPosition(new THREE.Vector3(0, 0, 0));
|
||||
visual.icon.setVisible(false);
|
||||
visual.shellReticle.setPosition(new THREE.Vector3(0, 0, 0));
|
||||
visual.shellReticle.setVisible(true);
|
||||
setShellReticleOpacity(visual.shellReticle, 1);
|
||||
const direction = visual.galaxyPosition.clone().sub(activeSystem.galaxyPosition);
|
||||
if (direction.lengthSq() > 0.0001) {
|
||||
visual.root.position.copy(
|
||||
visual.root.setPosition(
|
||||
activeSystem.galaxyPosition.clone().add(direction.normalize().multiplyScalar(PROJECTED_GALAXY_RADIUS)),
|
||||
);
|
||||
}
|
||||
const reticleWorldPosition = visual.root.getWorldPosition(new THREE.Vector3());
|
||||
const reticleDistance = camera.position.distanceTo(reticleWorldPosition);
|
||||
const reticleScale = Math.max(900, reticleDistance * 0.032);
|
||||
visual.shellReticle.scale.setScalar(reticleScale);
|
||||
visual.shellReticle.setScaleScalar(reticleScale);
|
||||
continue;
|
||||
}
|
||||
|
||||
const offset = systemFocusLocal.clone().multiplyScalar(-ACTIVE_SYSTEM_DETAIL_SCALE);
|
||||
visual.starCluster.position.copy(offset);
|
||||
visual.icon.position.copy(offset);
|
||||
visual.icon.visible = true;
|
||||
visual.shellReticle.visible = false;
|
||||
visual.starCluster.setPosition(offset);
|
||||
visual.icon.setPosition(offset);
|
||||
visual.icon.setVisible(true);
|
||||
visual.shellReticle.setVisible(false);
|
||||
setShellReticleOpacity(visual.shellReticle, 0);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user