Render zone terrain from daemon gravity queries

This commit is contained in:
Meta Vens 2026-06-21 15:14:15 +01:00
commit 95e09dc241
3 changed files with 43 additions and 4 deletions

View file

@ -1788,6 +1788,11 @@ static void RequireDaemonRenderQueryAuthority(string root)
? File.ReadAllText(indirectRendererPath)
: throw new InvalidOperationException("Cannot verify daemon render query authority; AetheriaDaemonIndirectRenderer.cs is missing.");
var zoneRendererPath = Path.Combine(root, "Assets", "Scripts", "Zone Display", "ZoneRenderer.cs");
var zoneRenderer = File.Exists(zoneRendererPath)
? File.ReadAllText(zoneRendererPath)
: throw new InvalidOperationException("Cannot verify daemon render query authority; ZoneRenderer.cs is missing.");
var canonicalSnapshotPath = Path.Combine(root, "Aetheria.State", "Documents", "AetheriaRuntimeStateDocuments.cs");
var canonicalSnapshot = File.Exists(canonicalSnapshotPath)
? File.ReadAllText(canonicalSnapshotPath)
@ -1866,6 +1871,29 @@ static void RequireDaemonRenderQueryAuthority(string root)
"Unity's daemon indirect renderer must query daemon SoA render groups by camera bounds before lowering draw calls: " +
string.Join(", ", missingRendererSymbols));
}
if (zoneRenderer.Contains("Zone.GetHeight(", StringComparison.Ordinal))
{
throw new InvalidOperationException(
"ZoneRenderer must evaluate gravity terrain from daemon render queries instead of the mirrored Unity Zone height evaluator.");
}
var requiredZoneRendererSymbols = new[]
{
"private AetheriaRuntimeZoneSnapshotCommit _daemonZoneSnapshot;",
"public void LoadZone(Zone zone, AetheriaRuntimeZoneSnapshotCommit daemonZone = null)",
"_daemonZoneSnapshot = daemonZone;",
"AetheriaRuntimeDaemonRenderQueries.EvaluateGravityTerrainHeight("
};
var missingZoneRendererSymbols = requiredZoneRendererSymbols
.Where(symbol => !zoneRenderer.Contains(symbol, StringComparison.Ordinal))
.ToArray();
if (missingZoneRendererSymbols.Length > 0)
{
throw new InvalidOperationException(
"ZoneRenderer must lower daemon-authored gravity terrain snapshots instead of recomputing render height through Zone: " +
string.Join(", ", missingZoneRendererSymbols));
}
}
static void RequireTypedZoneConstructionKeys(string root)

View file

@ -2067,7 +2067,7 @@ public class ActionGameManager : MonoBehaviour
Zone.Log = s => Debug.Log($"Zone: {s}");
ZoneRenderer.LoadZone(Zone);
ZoneRenderer.LoadZone(Zone, daemonZone);
if (CurrentEntity != null)
{

View file

@ -85,6 +85,7 @@ public class ZoneRenderer : MonoBehaviour
private List<IDisposable> _zoneSubscriptions = new List<IDisposable>();
private PlanetObject[] _suns;
private bool _showAsteroidUI;
private AetheriaRuntimeZoneSnapshotCommit _daemonZoneSnapshot;
public Dictionary<Wormhole, (GameObject gravity, CompassIcon icon)> WormholeInstances = new Dictionary<Wormhole, (GameObject, CompassIcon)>();
private List<ItemPickup> _loot = new List<ItemPickup>();
@ -181,10 +182,11 @@ public class ZoneRenderer : MonoBehaviour
_transposer = SceneCamera.GetCinemachineComponent<CinemachineTransposer>();
}
public void LoadZone(Zone zone)
public void LoadZone(Zone zone, AetheriaRuntimeZoneSnapshotCommit daemonZone = null)
{
ClearZone();
Zone = zone;
_daemonZoneSnapshot = daemonZone;
SectorBrushes.localScale = zone.Radius * 2 * Vector3.one;
SlimeGravityCamera.orthographicSize = zone.Radius;
SlimeRenderer.ZoneRadius = zone.Radius;
@ -470,7 +472,7 @@ public class ZoneRenderer : MonoBehaviour
foreach (var (key, belt) in Zone.AsteroidBelts)
{
var height = Zone.GetHeight(belt.OrbitPosition);
var height = GetTerrainHeight(belt.OrbitPosition);
if(isVisible(new Bounds(
new Vector3(belt.OrbitPosition.x,height,belt.OrbitPosition.y),
new Vector3(belt.Radius * 2,100,belt.Radius * 2))))
@ -504,7 +506,7 @@ public class ZoneRenderer : MonoBehaviour
{
var planetInstance = Zone.PlanetInstances[planet.Key];
var p = Zone.GetOrbitPosition(planetInstance.OrbitKey);
var height = Zone.GetHeight(p);
var height = GetTerrainHeight(p);
if (-height > maxDepth) maxDepth = -height;
planet.Value.transform.position = new Vector3(p.x, 0, p.y);
planet.Value.Body.transform.localPosition = new Vector3(0, height + planetInstance.BodyRadius * 2, 0);
@ -562,6 +564,15 @@ public class ZoneRenderer : MonoBehaviour
// MinimapTintQuad.transform.position = gravPos - Vector3.up*10;
}
private float GetTerrainHeight(float2 position)
{
return (float)AetheriaRuntimeDaemonRenderQueries.EvaluateGravityTerrainHeight(
_daemonZoneSnapshot,
position.x,
position.y,
Zone?.Time ?? 0);
}
public void DestroyLoot(ItemPickup loot)
{
_loot.Remove(loot);