diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 75b6d9ebf..12907a823 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -1501,8 +1501,8 @@ static void RequireTypedOrbitConsumerKeys(string root) [Path.Combine(root, "Assets", "Scripts", "Zone Display", "ZoneRenderer.cs")] = new[] { "foreach (var pose in _daemonBodyPoses)", - "zone.PlanetInstances.TryGetValue(pose.BodyKey, out var planet)", - "zone.AsteroidBelts.TryGetValue(pose.BodyKey, out var belt)", + "foreach (var body in daemonZone?.Bodies ?? Array.Empty())", + "zone.AsteroidBelts.TryGetValue(body.BodyKey ?? \"\", out var belt)", "_daemonBodyPosesByBodyKey.TryGetValue(planet.Key, out var pose)", "var p = new float2((float)pose.CenterX, (float)pose.CenterZ);", "var parent = new float2((float)pose.ParentCenterX, (float)pose.ParentCenterZ);" @@ -1759,7 +1759,7 @@ static void RequireTypedZoneRuntimeCollections(string root) "private Dictionary _beltMatrices = new Dictionary(StringComparer.Ordinal);", "_beltMeshes[runtimeBelt.BodyKey] = meshes.ToArray();", "_beltObjects[runtimeBelt.BodyKey] = belt;", - "Planets[planetInstance.BodyKey] = planet;" + "Planets[bodyKey] = planet;" }; var missingRendererSymbols = requiredRendererSymbols .Where(symbol => !zoneRenderer.Contains(symbol, StringComparison.Ordinal)) @@ -1923,7 +1923,9 @@ static void RequireDaemonRenderQueryAuthority(string root) "ZoneRenderer must sample animation and terrain from daemon simulation time instead of mirrored Unity Zone time."); } - if (zoneRenderer.Contains("Zone.PlanetInstances[planet.Key]", StringComparison.Ordinal)) + if (zoneRenderer.Contains("Zone.PlanetInstances[planet.Key]", StringComparison.Ordinal) || + zoneRenderer.Contains("zone.PlanetInstances.TryGetValue(pose.BodyKey, out var planet)", StringComparison.Ordinal) || + zoneRenderer.Contains("LoadPlanet(planet)", StringComparison.Ordinal)) { throw new InvalidOperationException( "ZoneRenderer frame updates must read body render state from daemon body poses instead of indexed mirrored Unity planets."); @@ -1991,8 +1993,10 @@ static void RequireDaemonRenderQueryAuthority(string root) "AetheriaRuntimeDaemonRenderQueries.QueryGravityTerrainBand(", "private readonly List _visibleAsteroidInstancePoses", "foreach (var pose in _daemonBodyPoses)", - "zone.PlanetInstances.TryGetValue(pose.BodyKey, out var planet)", - "zone.AsteroidBelts.TryGetValue(pose.BodyKey, out var belt)", + "foreach (var body in daemonZone?.Bodies ?? Array.Empty())", + "LoadPlanet(body)", + "void LoadPlanet(AetheriaRuntimeBodySnapshotCommit body)", + "zone.AsteroidBelts.TryGetValue(body.BodyKey ?? \"\", out var belt)", "foreach (var entitySnapshot in daemonZone?.Entities ?? Array.Empty())", "entitiesByDaemonIndex.TryGetValue(entitySnapshot.EntityIndex, out var entity)", "foreach (var entity in EntityInstances.Keys.ToArray())", diff --git a/Assets/Scripts/Zone Display/ZoneRenderer.cs b/Assets/Scripts/Zone Display/ZoneRenderer.cs index 8aabff43d..59d040a9d 100644 --- a/Assets/Scripts/Zone Display/ZoneRenderer.cs +++ b/Assets/Scripts/Zone Display/ZoneRenderer.cs @@ -192,16 +192,20 @@ public class ZoneRenderer : MonoBehaviour SlimeGravityCamera.orthographicSize = zone.Radius; SlimeRenderer.ZoneRadius = zone.Radius; RefreshDaemonBodyPoses(); - foreach (var pose in _daemonBodyPoses) + foreach (var body in daemonZone?.Bodies ?? Array.Empty()) { - if (zone.PlanetInstances.TryGetValue(pose.BodyKey, out var planet)) - { - LoadPlanet(planet); + if (body == null) continue; - } - if (zone.AsteroidBelts.TryGetValue(pose.BodyKey, out var belt)) - LoadAsteroidBelt(belt); + if (string.Equals(body.Kind ?? "", "asteroid_belt", StringComparison.OrdinalIgnoreCase)) + { + if (zone.AsteroidBelts.TryGetValue(body.BodyKey ?? "", out var belt)) + LoadAsteroidBelt(belt); + } + else + { + LoadPlanet(body); + } } _suns = Planets.Values.Where(p => p is SunObject).ToArray(); @@ -375,49 +379,69 @@ public class ZoneRenderer : MonoBehaviour LODHandler.FindPlanets(); } - void LoadPlanet(Planet planetInstance) + void LoadPlanet(AetheriaRuntimeBodySnapshotCommit body) { + var bodyKey = body.BodyKey ?? ""; + if (bodyKey.Length == 0) + return; + PlanetObject planet; - if (planetInstance is GasGiant gasGiant) + var kind = body.Kind ?? ""; + var mass = (float)body.Mass; + var isSun = string.Equals(kind, "sun", StringComparison.OrdinalIgnoreCase); + var isGasGiant = isSun || string.Equals(kind, "gas_giant", StringComparison.OrdinalIgnoreCase); + if (isGasGiant) { - if (planetInstance is Sun sun) + if (isSun) { planet = Instantiate(Sun, ZoneRoot); var sunObject = (SunObject) planet; - sunObject.Light.color = sun.LightColor.ToColor(); - sunObject.Light.range = sun.LightRadius; - sunObject.FogTint.transform.localScale = sun.LightRadius * Vector3.one; - sunObject.FogTint.material.SetColor("_Color", sun.FogTintColor.ToColor()); + var sunVisual = body.SunVisual ?? new AetheriaRuntimeSunVisualCommit(); + var lightRadius = Settings.PlanetSettings.LightRadius.Evaluate(mass) * (float)sunVisual.LightRadiusMultiplier; + sunObject.Light.color = new Color((float)sunVisual.LightColorX, (float)sunVisual.LightColorY, (float)sunVisual.LightColorZ); + sunObject.Light.range = lightRadius; + sunObject.FogTint.transform.localScale = lightRadius * Vector3.one; + sunObject.FogTint.material.SetColor( + "_Color", + new Color((float)sunVisual.FogTintColorX, (float)sunVisual.FogTintColorY, (float)sunVisual.FogTintColorZ)); } else planet = Instantiate(GasGiant, ZoneRoot); var gas = (GasGiantObject) planet; - gas.Body.material.SetTexture("_ColorRamp", gasGiant.Colors.ToGradient(!(planetInstance is Sun)).ToTexture()); - gas.GravityWaves.transform.localScale = gasGiant.GravityWavesRadius * Vector3.one; - gas.GravityWaves.material.SetFloat("_Depth", gasGiant.GravityWavesDepth); - gas.GravityWaves.material.SetFloat("_Frequency", Settings.PlanetSettings.WaveFrequency.Evaluate(planetInstance.Mass)); + var colors = ToUnityColors(body.GasGiantVisual?.Colors); + gas.Body.material.SetTexture("_ColorRamp", colors.ToGradient(!isSun).ToTexture()); + gas.GravityWaves.transform.localScale = (float)body.GravityWaveRadius * Vector3.one; + gas.GravityWaves.material.SetFloat("_Depth", (float)body.GravityWaveDepth); + gas.GravityWaves.material.SetFloat("_Frequency", Settings.PlanetSettings.WaveFrequency.Evaluate(mass)); } else { planet = Instantiate(Planet, ZoneRoot); var possibleSettings = Settings.BodySettingsCollections - .Where(p => p.MinimumMass < planetInstance.Mass) + .Where(p => p.MinimumMass < mass) .MaxBy(p => p.MinimumMass).BodySettings; planet.Generator.body = possibleSettings[Random.Range(0, possibleSettings.Length)]; - //Debug.Log($"Generating planet with {planetInstance.Mass} mass! Choosing {planet.Generator.body.name} settings!"); + //Debug.Log($"Generating planet with {mass} mass! Choosing {planet.Generator.body.name} settings!"); //planet.Icon.material.mainTexture = planetInstance.Mass > Context.GlobalData.PlanetMass ? PlanetIcon : PlanetoidIcon; } - planet.Body.transform.localScale = planetInstance.BodyRadius * Vector3.one; - planet.GravityWell.transform.localScale = planetInstance.GravityWellRadius * Vector3.one; + 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; + planet.Body.transform.localScale = bodyRadius * Vector3.one; + planet.GravityWell.transform.localScale = gravityWellRadius * Vector3.one; // var depth = planetInstance.GravityWellDepth; // if (depth > _maxDepth) _maxDepth = depth; - planet.GravityWell.material.SetFloat("_Depth", planetInstance.GravityWellDepth); - planet.Icon.transform.position = new Vector3(0, -planetInstance.GravityWellDepth, 0); - planet.Icon.transform.localScale = Settings.IconSize.Evaluate(planetInstance.Mass) * Vector3.one; + planet.GravityWell.material.SetFloat("_Depth", gravityWellDepth); + planet.Icon.transform.position = new Vector3(0, -gravityWellDepth, 0); + planet.Icon.transform.localScale = Settings.IconSize.Evaluate(mass) * Vector3.one; - Planets[planetInstance.BodyKey] = planet; + Planets[bodyKey] = planet; if (!_rootFound) { _rootFound = true; @@ -427,6 +451,17 @@ public class ZoneRenderer : MonoBehaviour LODHandler.FindPlanets(); } + private static float4[] ToUnityColors(IReadOnlyList colors) + { + var converted = (colors ?? Array.Empty()) + .Where(color => color != null) + .Select(color => new float4((float)color.X, (float)color.Y, (float)color.Z, (float)color.W)) + .ToArray(); + return converted.Length > 0 + ? converted + : new[] { new float4(0.35f, 0.45f, 0.8f, 0), new float4(0.85f, 0.9f, 1f, 1) }; + } + // private void Update() // { // if (Tour)