Svart hål

This commit is contained in:
2026-11-01 12:09:43 +01:00
parent c4a5a4b4ed
commit 8274a20001
14 changed files with 399 additions and 7 deletions

View File

@@ -0,0 +1,65 @@
using Universe.App.Runtime;
using Universe.Core.Generation;
using Universe.Core.Math;
using Universe.Core.World;
namespace Universe.Tests;
public sealed class BlackHoleTests
{
[Fact]
public void ReplacementIsDeterministicAndPlanetsClearTheDisk()
{
var generator = new UniverseGenerator(123, blackHoles: new() { OccurrenceChance = 1 });
var first = generator.Generate(new(-2, 1, 3));
var second = generator.Generate(first.Coordinate);
var hole = Assert.Single(first.Stars);
Assert.True(hole.IsBlackHole);
Assert.Equal(hole, Assert.Single(second.Stars));
Assert.Equal(hole.RadiusMeters, hole.BlackHole!.HorizonRadiusMeters);
Assert.All(first.Planets, p => Assert.True((p.PositionMeters - hole.PositionMeters).Length >
hole.RadiusMeters * hole.BlackHole.DiskOuterRadiusInHorizons));
}
[Fact]
public void NearestSearchMatchesWideExhaustiveSearchAndFlightReachesTheHole()
{
var generator = new UniverseGenerator(0x554E495645525345UL);
var streamer = new UniverseStreamer(generator);
var start = UniversePosition.AtCellCenter(new(0, 0, 0), generator.CellSizeMeters);
var found = streamer.FindNearestBlackHole(start);
Assert.True(found.HasValue);
var target = found!.Value;
var exhaustive = generator.GenerateNeighborhood(start.Sector, 3)
.SelectMany(s => s.Stars.Where(h => h.IsBlackHole).Select(h => (System: s, Hole: h)))
.MinBy(b => UniversePosition.AtCellCenter(b.System.Coordinate, generator.CellSizeMeters)
.Add(b.Hole.PositionMeters, generator.CellSizeMeters).RelativeTo(start, generator.CellSizeMeters).Length);
Assert.Equal(exhaustive.Hole.Id, target.Hole.Id);
var neighborhood = streamer.Load(start.Sector);
var groundPlanet = neighborhood.ActiveSystem.Planets[0];
var groundBody = start.Add(groundPlanet.PositionMeters, generator.CellSizeMeters);
var groundRadial = new DVector3(1, .3, -.2).Normalized();
var groundPosition = groundBody.Add(groundRadial * (TerrainHeight.Sample(groundPlanet, groundRadial) + 1.8), generator.CellSizeMeters);
var camera = new FlyCamera(groundPosition, generator.CellSizeMeters);
camera.RequestBlackHoleView(target.System, target.Hole, neighborhood.NearbySystems.Append(neighborhood.ActiveSystem));
for (var i = 0; i < 650; i++)
{
camera.Update(1d / 60, DVector3.Zero, neighborhood);
if (camera.Position.Sector != neighborhood.ActiveSystem.Coordinate) neighborhood = streamer.Load(camera.Position.Sector);
}
var body = UniversePosition.AtCellCenter(target.System.Coordinate, generator.CellSizeMeters)
.Add(target.Hole.PositionMeters, generator.CellSizeMeters);
var relative = body.RelativeTo(camera.Position, generator.CellSizeMeters);
Assert.False(camera.IsFocusing);
Assert.InRange(relative.Length / target.Hole.RadiusMeters, 25.99, 26.01);
Assert.InRange(DVector3.Dot(relative.Normalized(), camera.Forward), .999, 1.001);
}
[Fact]
public void ZeroChanceDisablesGenerationAndSearch()
{
var generator = new UniverseGenerator(123, blackHoles: new() { OccurrenceChance = 0 });
Assert.All(generator.GenerateNeighborhood(new()), s => Assert.All(s.Stars, h => Assert.False(h.IsBlackHole)));
Assert.Null(new UniverseStreamer(generator).FindNearestBlackHole(UniversePosition.AtCellCenter(new(), generator.CellSizeMeters)));
}
}