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 ImmediateGeometry _orbit; public override void _Ready() { InitPointMasses(); InitGeometry(); } public override void _Process(float delta) { DrawOrbit(); } private void DrawOrbit() { int steps = 100; _orbit.Clear(); _orbit.Begin(Mesh.PrimitiveType.LineLoop); _orbit.SetColor(new Color(1, 0, 0)); for (int i = 0; i < steps; i++) { float t = i / (float)steps; float a = t * Mathf.Tau; _orbit.AddVertex(new Vector3 { x = Mathf.Sin(a), z = Mathf.Cos(a) }); } _orbit.End(); } private void InitGeometry() { _orbit = new ImmediateGeometry(); var m = new SpatialMaterial(); m.VertexColorUseAsAlbedo = true; m.FlagsUnshaded = true; _orbit.MaterialOverride = m; AddChild(_orbit); } 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); } }