#ifndef BODIES_H #define BODIES_H #include "physics.h" // Celestial body structure struct CelestialBody { char name[64]; double mass; // kg double radius; // meters Vec3 position; // meters from origin Vec3 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; double time; // simulation time (seconds) double dt; // time step (seconds) }; // Simulation management functions SimulationState* create_simulation(int max_bodies, double time_step); void destroy_simulation(SimulationState* sim); void add_body(SimulationState* sim, const char* name, double mass, double radius, Vec3 pos, Vec3 vel, int parent_index, float r, float g, float b, double eccentricity, double semi_major_axis); // 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); // Velocity initialization void compute_initial_velocities(SimulationState* sim); void calculate_initial_velocities(SimulationState* sim); // SOI helpers void calculate_soi_radii(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