Add layered system viewer and local coordinates

This commit is contained in:
2026-03-13 00:48:08 -04:00
parent 22a4b18be8
commit a9c08124f5
7 changed files with 576 additions and 94 deletions

View File

@@ -116,6 +116,8 @@ public readonly record struct Vector3(float X, float Y, float Z)
{
public static Vector3 Zero => new(0f, 0f, 0f);
public float LengthSquared() => (X * X) + (Y * Y) + (Z * Z);
public float DistanceTo(Vector3 other)
{
var dx = X - other.X;

View File

@@ -111,9 +111,9 @@ public sealed class ScenarioLoader
Id = $"node-{++nodeIdCounter}",
SystemId = system.Definition.Id,
Position = new Vector3(
system.Position.X + (MathF.Cos(node.Angle) * node.RadiusOffset),
system.Position.Y + balance.YPlane,
system.Position.Z + (MathF.Sin(node.Angle) * node.RadiusOffset)),
MathF.Cos(node.Angle) * node.RadiusOffset,
balance.YPlane,
MathF.Sin(node.Angle) * node.RadiusOffset),
SourceKind = node.SourceKind,
ItemId = node.ItemId,
OreRemaining = node.OreAmount,
@@ -149,7 +149,7 @@ public sealed class ScenarioLoader
var patrolRoutes = scenario.PatrolRoutes.ToDictionary(
(route) => route.SystemId,
(route) => route.Points.Select(ToVector).ToList(),
(route) => route.Points.Select((point) => NormalizeScenarioPoint(systemsById[route.SystemId], point)).ToList(),
StringComparer.Ordinal);
var shipsRuntime = new List<ShipRuntime>();
@@ -164,7 +164,7 @@ public sealed class ScenarioLoader
for (var index = 0; index < formation.Count; index += 1)
{
var offset = new Vector3((index % 3) * 18f, balance.YPlane, (index / 3) * 18f);
var position = Add(ToVector(formation.Center), offset);
var position = Add(NormalizeScenarioPoint(systemsById[formation.SystemId], formation.Center), offset);
shipsRuntime.Add(new ShipRuntime
{
Id = $"ship-{++shipIdCounter}",
@@ -832,7 +832,7 @@ public sealed class ScenarioLoader
{
if (plan.Position is { Length: 3 })
{
return ToVector(plan.Position);
return NormalizeScenarioPoint(system, plan.Position);
}
if (plan.PlanetIndex is int planetIndex && planetIndex >= 0 && planetIndex < system.Definition.Planets.Count)
@@ -840,15 +840,28 @@ public sealed class ScenarioLoader
var planet = system.Definition.Planets[planetIndex];
var side = plan.LagrangeSide ?? 1;
return new Vector3(
system.Position.X + planet.OrbitRadius + (side * 72f),
system.Position.Y + balance.YPlane,
system.Position.Z + ((planetIndex + 1) * 42f * side));
planet.OrbitRadius + (side * 72f),
balance.YPlane,
(planetIndex + 1) * 42f * side);
}
return new Vector3(system.Position.X + 180f, system.Position.Y + balance.YPlane, system.Position.Z);
return new Vector3(180f, balance.YPlane, 0f);
}
private static Vector3 ToVector(float[] values) => new(values[0], values[1], values[2]);
private static Vector3 NormalizeScenarioPoint(SystemRuntime system, float[] values)
{
var raw = ToVector(values);
var relativeToSystem = new Vector3(
raw.X - system.Position.X,
raw.Y - system.Position.Y,
raw.Z - system.Position.Z);
return relativeToSystem.LengthSquared() < raw.LengthSquared()
? relativeToSystem
: raw;
}
private static Vector3 Add(Vector3 left, Vector3 right) => new(left.X + right.X, left.Y + right.Y, left.Z + right.Z);
}

View File

@@ -77,7 +77,7 @@ public sealed class SimulationEngine
world.Nodes.Select(ToNodeDelta).Select((node) => new ResourceNodeSnapshot(
node.Id,
node.SystemId,
node.Position,
node.LocalPosition,
node.SourceKind,
node.OreRemaining,
node.MaxOre,
@@ -87,7 +87,7 @@ public sealed class SimulationEngine
station.Label,
station.Category,
station.SystemId,
station.Position,
station.LocalPosition,
station.Color,
station.DockedShips,
station.OreStored,
@@ -99,9 +99,9 @@ public sealed class SimulationEngine
ship.Role,
ship.ShipClass,
ship.SystemId,
ship.Position,
ship.Velocity,
ship.TargetPosition,
ship.LocalPosition,
ship.LocalVelocity,
ship.TargetLocalPosition,
ship.State,
ship.OrderKind,
ship.DefaultBehaviorKind,