#ifndef BODIES_H #define BODIES_H #include "physics.h" struct Spacecraft; struct Maneuver; // Celestial body structure struct CelestialBody { char name[64]; double mass; // kg double radius; // meters Vec3 local_position; // position relative to parent (meters) Vec3 local_velocity; // velocity relative to parent (m/s) Vec3 position; // global position (meters from origin) Vec3 velocity; // global velocity (m/s) double soi_radius; // sphere of influence radius (meters) int parent_index; // index of gravitational parent (-1 for root body like Sun) float color[3]; // RGB color for rendering double eccentricity; // orbital eccentricity (0 = circular, <1 = elliptical) double semi_major_axis; // meters }; // Simulation state struct SimulationState { CelestialBody* bodies; int body_count; int max_bodies; Spacecraft* spacecraft; int craft_count; int max_craft; Maneuver* maneuvers; int maneuver_count; int max_maneuvers; double time; double dt; char config_name[256]; }; // Simulation management functions SimulationState* create_simulation(int max_bodies, int max_craft, int max_maneuvers, double time_step); void destroy_simulation(SimulationState* sim); // Dynamic body management int add_body_to_simulation(SimulationState* sim, CelestialBody* body); int add_spacecraft(SimulationState* sim, Spacecraft* craft); // SOI and simulation update functions int find_dominant_body(SimulationState* sim, int body_index); void update_soi(CelestialBody* body, CelestialBody* parent, double semi_major_axis); void update_simulation(SimulationState* sim); double calculate_soi_radius(CelestialBody* body, CelestialBody* parent); void compute_global_coordinates(SimulationState* sim); // Combined initialization - sets velocities, SOI radii, and local coordinates in single loop void initialize_bodies(SimulationState* sim); // Orbital elements calculation struct OrbitalElements { double time_days; double semi_major_axis_au; double eccentricity; double specific_energy; double distance_to_sun_au; double distance_to_ref_body_au; double velocity_magnitude; }; OrbitalElements calculate_orbital_elements(CelestialBody* body, CelestialBody* primary, CelestialBody* optional_ref_body, double current_time); #endif