using Godot; using System; public class OrbitSystem : Node, IMassive, ILocation { [Export] private NodePath _a; [Export] private NodePath _b; [Export] private NodePath _barycenter; private readonly PointMass[] _pointMasses = new PointMass[2]; public Vector3 Position => Barycenter; [Export] public Vector3 Barycenter { get { var p0 = _pointMasses[0].Position; var p1 = _pointMasses[1].Position; return p0.LinearInterpolate(p1, .5f); } set => _ = value; } public float Mass { get; } = 1; private Orbit _orbit; private ImmediateGeometry _orbitGeometry; public override void _Ready() { InitPointMasses(); InitGeometry(); } public override void _Process(float delta) { DrawOrbit(); } private void InitOrbit() { } private void DrawOrbit() { int steps = 100; _orbitGeometry.Clear(); _orbitGeometry.Begin(Mesh.PrimitiveType.LineLoop); _orbitGeometry.SetColor(new Color(1, 0, 0)); var ellipse = new Ellipse(1, .5); for (int i = 0; i < steps; i++) { float t = i / (float)steps; float a = t * Mathf.Tau; var v2 = ellipse.Focus0 + ellipse.GetPosition(a); _orbitGeometry.AddVertex(new Vector3 { x = (float)v2.X, z = (float)v2.Y }); } _orbitGeometry.End(); } private void InitGeometry() { _orbitGeometry = new ImmediateGeometry(); var m = new SpatialMaterial(); m.VertexColorUseAsAlbedo = true; m.FlagsUnshaded = true; _orbitGeometry.MaterialOverride = m; AddChild(_orbitGeometry); } private void InitPointMasses() { var a = GetPointMass(_a); var b = GetPointMass(_b); if (a.Mass > b.Mass) { _pointMasses[0] = a; _pointMasses[1] = b; } else { _pointMasses[0] = b; _pointMasses[1] = a; } } private PointMass GetPointMass(NodePath path) { var spatial = GetNode(path); //var massive = node.GetChild(0); return new PointMass(spatial, 1f); } }