Lower zone body views from daemon render queries

This commit is contained in:
Meta Vens 2026-06-21 23:01:34 +01:00
commit 2a8414aa10
4 changed files with 146 additions and 12 deletions

View file

@ -985,6 +985,58 @@ public class DaemonRuntimeDocumentTests
Assert.AreEqual(3.5, poses[1].GravityWaveSpeed, 0.0001);
}
[Test]
public void DaemonRenderQueriesPublishBodyViewsFromZoneSnapshot()
{
var zone = new AetheriaRuntimeZoneSnapshotCommit
{
Orbits = new[]
{
new AetheriaRuntimeOrbitSnapshotCommit
{
OrbitKey = "orbit:planet",
FixedPositionX = 12,
FixedPositionY = -8
},
new AetheriaRuntimeOrbitSnapshotCommit
{
OrbitKey = "orbit:belt",
Distance = 30
}
},
Bodies = new[]
{
new AetheriaRuntimeBodySnapshotCommit
{
BodyKey = "body:planet",
OrbitKey = "orbit:planet",
Kind = "planet",
GravityInfluenceRadius = 40,
GravityWellDepth = 7
},
new AetheriaRuntimeBodySnapshotCommit
{
BodyKey = "body:belt",
OrbitKey = "orbit:belt",
Kind = "asteroid_belt"
}
}
};
var views = new List<AetheriaRuntimeDaemonBodyView>();
var count = AetheriaRuntimeDaemonRenderQueries.QueryBodyViews(zone, views);
Assert.AreEqual(2, count);
Assert.AreEqual("body:planet", views[0].Body.BodyKey);
Assert.IsFalse(views[0].IsAsteroidBelt);
Assert.AreEqual(12, views[0].Pose.CenterX, 0.0001);
Assert.AreEqual(-8, views[0].Pose.CenterZ, 0.0001);
Assert.AreEqual(40, views[0].Body.GravityInfluenceRadius, 0.0001);
Assert.AreEqual(7, views[0].Body.GravityWellDepth, 0.0001);
Assert.AreEqual("body:belt", views[1].Body.BodyKey);
Assert.IsTrue(views[1].IsAsteroidBelt);
}
[Test]
public void DaemonRenderQueriesPublishAsteroidBeltPosesFromZoneSnapshot()
{

View file

@ -85,6 +85,7 @@ public class ZoneRenderer : MonoBehaviour
private bool _showAsteroidUI;
private AetheriaRuntimeRunCheckpointCommit _daemonRunSnapshot;
private AetheriaRuntimeZoneSnapshotCommit _daemonZoneSnapshot;
private readonly List<AetheriaRuntimeDaemonBodyView> _daemonBodyViews = new List<AetheriaRuntimeDaemonBodyView>();
private readonly List<AetheriaRuntimeDaemonBodyPose> _daemonBodyPoses = new List<AetheriaRuntimeDaemonBodyPose>();
private readonly Dictionary<string, AetheriaRuntimeDaemonBodyPose> _daemonBodyPosesByBodyKey =
new Dictionary<string, AetheriaRuntimeDaemonBodyPose>(StringComparer.Ordinal);
@ -220,17 +221,17 @@ public class ZoneRenderer : MonoBehaviour
{
ClearZone();
ApplyDaemonFrame(daemonZone, daemonRun);
RefreshDaemonBodyViews();
RefreshDaemonBodyPoses();
RefreshDaemonAsteroidBeltPoses();
var beltPosesByBodyKey = _daemonAsteroidBeltPoses
.Where(pose => !string.IsNullOrWhiteSpace(pose.BodyKey))
.ToDictionary(pose => pose.BodyKey, StringComparer.Ordinal);
foreach (var body in daemonZone?.Bodies ?? Array.Empty<AetheriaRuntimeBodySnapshotCommit>())
foreach (var bodyView in _daemonBodyViews)
{
if (body == null)
continue;
var body = bodyView.Body;
if (string.Equals(body.Kind ?? "", "asteroid_belt", StringComparison.OrdinalIgnoreCase))
if (bodyView.IsAsteroidBelt)
{
if (beltPosesByBodyKey.TryGetValue(body.BodyKey ?? "", out var beltPose))
LoadAsteroidBelt(beltPose);
@ -467,12 +468,8 @@ public class ZoneRenderer : MonoBehaviour
}
var bodyRadius = Settings.PlanetSettings.BodyRadius.Evaluate(mass) * (float)body.BodyRadiusMultiplier;
var gravityWellRadius = body.GravityInfluenceRadius > 0
? (float)body.GravityInfluenceRadius
: Settings.PlanetSettings.GravityRadius.Evaluate(mass) * (float)body.GravityRadiusMultiplier;
var gravityWellDepth = body.GravityWellDepth != 0
? (float)body.GravityWellDepth
: Settings.PlanetSettings.GravityDepth.Evaluate(mass) * (float)body.GravityDepthMultiplier;
var gravityWellRadius = Mathf.Max(0f, (float)body.GravityInfluenceRadius);
var gravityWellDepth = (float)body.GravityWellDepth;
planet.Body.transform.localScale = bodyRadius * Vector3.one;
planet.GravityWell.transform.localScale = gravityWellRadius * Vector3.one;
// var depth = planetInstance.GravityWellDepth;
@ -675,6 +672,11 @@ public class ZoneRenderer : MonoBehaviour
// MinimapTintQuad.transform.position = gravPos - Vector3.up*10;
}
private void RefreshDaemonBodyViews()
{
AetheriaRuntimeDaemonRenderQueries.QueryBodyViews(_daemonZoneSnapshot, _daemonBodyViews);
}
private void RefreshDaemonBodyPoses()
{
AetheriaRuntimeDaemonRenderQueries.QueryBodyPoses(_daemonZoneSnapshot, _daemonBodyPoses);