Position asteroid belts from daemon poses
This commit is contained in:
parent
5bfe9d9b29
commit
4e68ce29af
4 changed files with 166 additions and 8 deletions
|
|
@ -786,6 +786,54 @@ public class DaemonRuntimeDocumentTests
|
|||
Assert.AreEqual(3.5, poses[1].GravityWaveSpeed, 0.0001);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DaemonRenderQueriesPublishAsteroidBeltPosesFromZoneSnapshot()
|
||||
{
|
||||
var zone = new AetheriaRuntimeZoneSnapshotCommit
|
||||
{
|
||||
Orbits = new[]
|
||||
{
|
||||
new AetheriaRuntimeOrbitSnapshotCommit
|
||||
{
|
||||
OrbitKey = "orbit:belt",
|
||||
FixedPositionX = 11,
|
||||
FixedPositionY = -4
|
||||
}
|
||||
},
|
||||
Bodies = new[]
|
||||
{
|
||||
new AetheriaRuntimeBodySnapshotCommit
|
||||
{
|
||||
BodyKey = "body:belt",
|
||||
OrbitKey = "orbit:belt",
|
||||
Kind = "asteroid_belt",
|
||||
Asteroids = new[]
|
||||
{
|
||||
new AetheriaRuntimeAsteroidCommit { Distance = 3 },
|
||||
new AetheriaRuntimeAsteroidCommit { Distance = 7 },
|
||||
new AetheriaRuntimeAsteroidCommit { Distance = 5 }
|
||||
}
|
||||
},
|
||||
new AetheriaRuntimeBodySnapshotCommit
|
||||
{
|
||||
BodyKey = "body:planet",
|
||||
OrbitKey = "orbit:belt",
|
||||
Kind = "planet"
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var poses = AetheriaRuntimeDaemonRenderQueries.QueryAsteroidBeltPoses(zone);
|
||||
|
||||
Assert.AreEqual(1, poses.Length);
|
||||
Assert.AreEqual("body:belt", poses[0].BodyKey);
|
||||
Assert.AreEqual("orbit:belt", poses[0].OrbitKey);
|
||||
Assert.AreEqual(11, poses[0].CenterX, 0.0001);
|
||||
Assert.AreEqual(-4, poses[0].CenterZ, 0.0001);
|
||||
Assert.AreEqual(7, poses[0].Radius, 0.0001);
|
||||
Assert.AreEqual(3, poses[0].AsteroidCount);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SoaViewIndexRejectsInvalidRenderGroups()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -89,6 +89,10 @@ public class ZoneRenderer : MonoBehaviour
|
|||
private readonly List<AetheriaRuntimeDaemonBodyPose> _daemonBodyPoses = new List<AetheriaRuntimeDaemonBodyPose>();
|
||||
private readonly Dictionary<string, AetheriaRuntimeDaemonBodyPose> _daemonBodyPosesByBodyKey =
|
||||
new Dictionary<string, AetheriaRuntimeDaemonBodyPose>(StringComparer.Ordinal);
|
||||
private readonly List<AetheriaRuntimeDaemonAsteroidBeltPose> _daemonAsteroidBeltPoses =
|
||||
new List<AetheriaRuntimeDaemonAsteroidBeltPose>();
|
||||
private readonly Dictionary<string, AetheriaRuntimeDaemonAsteroidBeltPose> _daemonAsteroidBeltPosesByBodyKey =
|
||||
new Dictionary<string, AetheriaRuntimeDaemonAsteroidBeltPose>(StringComparer.Ordinal);
|
||||
|
||||
public Dictionary<Wormhole, (GameObject gravity, CompassIcon icon)> WormholeInstances = new Dictionary<Wormhole, (GameObject, CompassIcon)>();
|
||||
private List<ItemPickup> _loot = new List<ItemPickup>();
|
||||
|
|
@ -470,16 +474,21 @@ public class ZoneRenderer : MonoBehaviour
|
|||
|
||||
Shader.SetGlobalFloat("_AsteroidVerticalOffset", ActionGameManager.Instance.Settings.PlanetSettings.AsteroidVerticalOffset);
|
||||
RefreshDaemonBodyPoses();
|
||||
RefreshDaemonAsteroidBeltPoses();
|
||||
|
||||
Plane[] planes = GeometryUtility.CalculateFrustumPlanes(MainCamera);
|
||||
bool isVisible(Bounds bounds) => GeometryUtility.TestPlanesAABB(planes, bounds);
|
||||
|
||||
foreach (var (key, belt) in Zone.AsteroidBelts)
|
||||
{
|
||||
var height = GetTerrainHeight(belt.OrbitPosition);
|
||||
if (!_daemonAsteroidBeltPosesByBodyKey.TryGetValue(key, out var beltPose))
|
||||
continue;
|
||||
|
||||
var center = new float2((float)beltPose.CenterX, (float)beltPose.CenterZ);
|
||||
var height = GetTerrainHeight(center);
|
||||
if(isVisible(new Bounds(
|
||||
new Vector3(belt.OrbitPosition.x,height,belt.OrbitPosition.y),
|
||||
new Vector3(belt.Radius * 2,100,belt.Radius * 2))))
|
||||
new Vector3(center.x,height,center.y),
|
||||
new Vector3((float)beltPose.Radius * 2,100,(float)beltPose.Radius * 2))))
|
||||
{
|
||||
var meshes = _beltMeshes[key];
|
||||
var matrices = _beltMatrices[key];
|
||||
|
|
@ -503,7 +512,7 @@ public class ZoneRenderer : MonoBehaviour
|
|||
}
|
||||
|
||||
if(_showAsteroidUI)
|
||||
_beltObjects[key].Update(belt.Transforms, height);
|
||||
_beltObjects[key].Update(belt.Transforms, center, height, (float)beltPose.Radius);
|
||||
}
|
||||
|
||||
foreach (var planet in Planets)
|
||||
|
|
@ -583,6 +592,17 @@ public class ZoneRenderer : MonoBehaviour
|
|||
}
|
||||
}
|
||||
|
||||
private void RefreshDaemonAsteroidBeltPoses()
|
||||
{
|
||||
AetheriaRuntimeDaemonRenderQueries.QueryAsteroidBeltPoses(_daemonZoneSnapshot, _daemonAsteroidBeltPoses);
|
||||
_daemonAsteroidBeltPosesByBodyKey.Clear();
|
||||
foreach (var pose in _daemonAsteroidBeltPoses)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(pose.BodyKey))
|
||||
_daemonAsteroidBeltPosesByBodyKey[pose.BodyKey] = pose;
|
||||
}
|
||||
}
|
||||
|
||||
private float GetTerrainHeight(float2 position)
|
||||
{
|
||||
return (float)AetheriaRuntimeDaemonRenderQueries.EvaluateGravityTerrainHeight(
|
||||
|
|
@ -716,9 +736,8 @@ public class AsteroidBeltUI
|
|||
//_collider.sharedMesh = _mesh;
|
||||
}
|
||||
|
||||
public void Update(float4[] transforms, float height)
|
||||
public void Update(float4[] transforms, float2 center, float height, float radius)
|
||||
{
|
||||
var parentPosition = _belt.OrbitPosition;
|
||||
for (var i = 0; i < transforms.Length; i++)
|
||||
{
|
||||
var transform = transforms[i];
|
||||
|
|
@ -730,7 +749,8 @@ public class AsteroidBeltUI
|
|||
_vertices[i * 4 + 3] = rotation * new Vector3(transform.w * _scale, -transform.w * _scale, 0) + position;
|
||||
}
|
||||
|
||||
_mesh.bounds = new Bounds(new Vector3(parentPosition.x, 0, parentPosition.y), Vector3.one * (_size * 2));
|
||||
var boundsRadius = Math.Max(_size, radius);
|
||||
_mesh.bounds = new Bounds(new Vector3(center.x, 0, center.y), Vector3.one * (boundsRadius * 2));
|
||||
_mesh.vertices = _vertices;
|
||||
//_collider.sharedMesh = _mesh;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue