@ -67,10 +67,9 @@ static bool parse_toml_body(toml_datum_t body_table, CelestialBody* body) {
body - > orbit . argument_of_periapsis = 0.0 ;
body - > orbit . true_anomaly = 0.0 ;
// Parse semi_major_axis (for elliptical/hyperbolic) or semi_latus_rectum (for parabolic) or altitude (convenience)
// Parse semi_major_axis (for elliptical/hyperbolic) or semi_latus_rectum (for parabolic)
toml_datum_t semi_major = toml_get ( orbit_table , " semi_major_axis " ) ;
toml_datum_t semi_latus = toml_get ( orbit_table , " semi_latus_rectum " ) ;
toml_datum_t altitude = toml_get ( orbit_table , " altitude " ) ;
// Parse eccentricity first to determine which parameter is required
toml_datum_t eccentricity = toml_get ( orbit_table , " eccentricity " ) ;
@ -85,22 +84,19 @@ static bool parse_toml_body(toml_datum_t body_table, CelestialBody* body) {
if ( is_parabolic ) {
// Parabolic orbit - requires semi_latus_rectum
if ( semi_latus . type ! = TOML_FP64 ) {
printf ( " Error: Parabolic orbit for body '%s' requires 'semi_latus_rectum' (not 'semi_major_axis' or 'altitude' ) \n " , body - > name ) ;
printf ( " Error: Parabolic orbit for body '%s' requires 'semi_latus_rectum' (not 'semi_major_axis') \n " , body - > name ) ;
return false ;
}
body - > orbit . semi_latus_rectum = semi_latus . u . fp64 ;
if ( semi_major . type = = TOML_FP64 | | altitude . type = = TOML_FP64 ) {
printf ( " Warning: Body '%s' has parabolic eccentricity, 'semi_latus_rectum' used instead of 'semi_major_axis' or 'altitude' \n " , body - > name ) ;
if ( semi_major . type = = TOML_FP64 ) {
printf ( " Warning: Body '%s' has parabolic eccentricity, 'semi_latus_rectum' used instead of 'semi_major_axis' \n " , body - > name ) ;
}
} else {
// Elliptical or hyperbolic - requires semi_major_axis or altitude
// Elliptical or hyperbolic - requires semi_major_axis
if ( semi_major . type = = TOML_FP64 ) {
body - > orbit . semi_major_axis = semi_major . u . fp64 ;
} else if ( altitude . type = = TOML_FP64 ) {
// altitude will be added to parent radius in initialization
body - > orbit . semi_major_axis = altitude . u . fp64 ;
} else {
printf ( " Error: Body '%s' must have either 'semi_major_axis' or 'altitude ' in orbit table (non-parabolic orbits) \n " , body - > name ) ;
printf ( " Error: Body '%s' must have 'semi_major_axis' in orbit table (non-parabolic orbits) \n " , body - > name ) ;
return false ;
}
if ( semi_latus . type = = TOML_FP64 ) {
@ -250,16 +246,6 @@ static bool load_spacecraft_from_toml(SimulationState* sim, toml_result_t result
}
}
for ( int i = 0 ; i < sim - > craft_count ; i + + ) {
Spacecraft * craft = & sim - > spacecraft [ i ] ;
bool is_parabolic = ( fabs ( craft - > orbit . eccentricity - 1.0 ) < 0.005 ) ;
if ( ! is_parabolic & & craft - > parent_index > = 0 & & craft - > parent_index < sim - > body_count ) {
CelestialBody * parent = & sim - > bodies [ craft - > parent_index ] ;
craft - > orbit . semi_major_axis + = parent - > radius ;
}
}
printf ( " Loaded %d spacecraft from %s \n " , craft_count , sim - > config_name ) ;
return true ;
}
@ -297,10 +283,9 @@ static bool parse_toml_spacecraft(toml_datum_t craft_table, Spacecraft* craft) {
craft - > orbit . argument_of_periapsis = 0.0 ;
craft - > orbit . true_anomaly = 0.0 ;
// Parse semi_major_axis (for elliptical/hyperbolic) or semi_latus_rectum (for parabolic) or altitude (convenience)
// Parse semi_major_axis (for elliptical/hyperbolic) or semi_latus_rectum (for parabolic)
toml_datum_t semi_major = toml_get ( orbit_table , " semi_major_axis " ) ;
toml_datum_t semi_latus = toml_get ( orbit_table , " semi_latus_rectum " ) ;
toml_datum_t altitude = toml_get ( orbit_table , " altitude " ) ;
// Parse eccentricity first to determine which parameter is required
toml_datum_t eccentricity = toml_get ( orbit_table , " eccentricity " ) ;
@ -315,22 +300,19 @@ static bool parse_toml_spacecraft(toml_datum_t craft_table, Spacecraft* craft) {
if ( is_parabolic ) {
// Parabolic orbit - requires semi_latus_rectum
if ( semi_latus . type ! = TOML_FP64 ) {
printf ( " Error: Parabolic orbit for spacecraft '%s' requires 'semi_latus_rectum' (not 'semi_major_axis' or 'altitude' ) \n " , craft - > name ) ;
printf ( " Error: Parabolic orbit for spacecraft '%s' requires 'semi_latus_rectum' (not 'semi_major_axis') \n " , craft - > name ) ;
return false ;
}
craft - > orbit . semi_latus_rectum = semi_latus . u . fp64 ;
if ( semi_major . type = = TOML_FP64 | | altitude . type = = TOML_FP64 ) {
printf ( " Warning: Spacecraft '%s' has parabolic eccentricity, 'semi_latus_rectum' used instead of 'semi_major_axis' or 'altitude' \n " , craft - > name ) ;
if ( semi_major . type = = TOML_FP64 ) {
printf ( " Warning: Spacecraft '%s' has parabolic eccentricity, 'semi_latus_rectum' used instead of 'semi_major_axis' \n " , craft - > name ) ;
}
} else {
// Elliptical or hyperbolic - requires semi_major_axis or altitude
// Elliptical or hyperbolic - requires semi_major_axis
if ( semi_major . type = = TOML_FP64 ) {
craft - > orbit . semi_major_axis = semi_major . u . fp64 ;
} else if ( altitude . type = = TOML_FP64 ) {
// altitude will be added to parent radius in initialization
craft - > orbit . semi_major_axis = altitude . u . fp64 ;
} else {
printf ( " Error: Spacecraft '%s' must have either 'semi_major_axis' or 'altitude ' in orbit table (non-parabolic orbits) \n " , craft - > name ) ;
printf ( " Error: Spacecraft '%s' must have 'semi_major_axis' in orbit table (non-parabolic orbits) \n " , craft - > name ) ;
return false ;
}
if ( semi_latus . type = = TOML_FP64 ) {