feat: tactical icons, follow-camera orbit, and ship info panel
This commit is contained in:
@@ -16,6 +16,8 @@ import {
|
||||
updateSystemStarPresentation,
|
||||
getAnimatedShipLocalPosition,
|
||||
iconWorldScale,
|
||||
MIN_ICON_PIXELS,
|
||||
MAX_ICON_PIXELS,
|
||||
} from "./viewerPresentation";
|
||||
import { rawObject } from "./viewerScenePrimitives";
|
||||
import type {
|
||||
@@ -94,8 +96,16 @@ export function updateWorldPresentation(context: WorldPresentationContext) {
|
||||
visual.mesh.setPosition(displayPosition);
|
||||
visual.icon.setPosition(rawObject(visual.mesh).position.clone());
|
||||
const shipVisible = isShipVisible(renderMode, context.activeSystemId, ship);
|
||||
visual.mesh.setVisible(shipVisible);
|
||||
visual.icon.setVisible(shipVisible && rawObject(visual.icon).visible);
|
||||
const distToShip = context.camera.position.distanceTo(displayPosition);
|
||||
const useTacticalIcon = renderMode !== "local" || distToShip > 0.012;
|
||||
const iconScale = THREE.MathUtils.clamp(
|
||||
visual.iconBaseScale,
|
||||
iconWorldScale(distToShip, context.camera, MIN_ICON_PIXELS),
|
||||
iconWorldScale(distToShip, context.camera, MAX_ICON_PIXELS + 10),
|
||||
);
|
||||
visual.icon.setScaleScalar(iconScale);
|
||||
visual.mesh.setVisible(shipVisible && !useTacticalIcon);
|
||||
visual.icon.setVisible(shipVisible && useTacticalIcon);
|
||||
const desiredHeading = resolveShipHeading(visual, worldPosition, context.orbitYaw);
|
||||
if (desiredHeading.lengthSq() > 0.01) {
|
||||
visual.mesh.lookAt(rawObject(visual.mesh).position.clone().add(desiredHeading));
|
||||
|
||||
Reference in New Issue
Block a user