@ -182,32 +182,18 @@ void setup_camera(RenderState* render_state) {
}
static bool has_target_changed ( RenderState * render_state ) {
int current_target = - 1 ;
if ( render_state - > selected_body_index > = 0 ) {
current_target = render_state - > selected_body_index ;
} else if ( render_state - > selected_craft_index > = 0 ) {
current_target = - ( render_state - > selected_craft_index + 1 ) ;
}
int current_target = render_state - > selected_body_index ;
return current_target ! = render_state - > last_target_index ;
}
static void update_camera_target ( RenderState * render_state , SimulationState * sim ) {
if ( render_state - > selected_body_index > = 0 ) {
CelestialBody * body = & sim - > bodies [ render_state - > selected_body_index ] ;
if ( render_state - > selected_body_index < 0 ) return ;
// Camera target is at origin for selected body
CelestialBody * body = & sim - > bodies [ render_state - > selected_body_index ] ;
render_state - > camera . target = ( Vector3 ) { 0 , 0 , 0 } ;
// Set initial camera position based on children distance
float distance = get_initial_camera_distance ( body , sim , render_state ) ;
render_state - > camera . position = ( Vector3 ) { 0 , distance * CAMERA_INITIAL_HEIGHT_FACTOR , distance } ;
render_state - > camera_offset = render_state - > camera . position ;
} else if ( render_state - > selected_craft_index > = 0 ) {
Spacecraft * craft = & sim - > spacecraft [ render_state - > selected_craft_index ] ;
Vector3 craft_pos = sim_to_render ( craft - > global_position , render_state - > distance_scale ) ;
render_state - > camera . target = craft_pos ;
render_state - > camera . position = Vector3Add ( craft_pos , render_state - > camera_offset ) ;
}
}
static void rotate_camera_orbitally ( RenderState * render_state , float angle ) {
@ -237,24 +223,13 @@ static void rotate_camera_orbitally(RenderState* render_state, float angle) {
}
static float get_target_min_distance ( RenderState * render_state , SimulationState * sim ) {
float target_radius = 0.0f ;
if ( render_state - > selected_body_index > = 0 ) {
CelestialBody * body = & sim - > bodies [ render_state - > selected_body_index ] ;
target_radius = scale_radius ( body - > radius , render_state - > distance_scale ) ;
} else if ( render_state - > selected_craft_index > = 0 ) {
Spacecraft * craft = & sim - > spacecraft [ render_state - > selected_craft_index ] ;
if ( craft - > parent_index > = 0 & & craft - > parent_index < sim - > body_count ) {
CelestialBody * parent = & sim - > bodies [ craft - > parent_index ] ;
target_radius = scale_radius ( parent - > radius , render_state - > distance_scale ) ;
target_radius * = MIN_DISTANCE_SPACECRAFT_PARENT_RADIUS_MULT ;
} else {
return MIN_DISTANCE_SPACECRAFT_DEFAULT ;
}
} else {
if ( render_state - > selected_body_index < 0 ) {
return CAMERA_MIN_DISTANCE ;
}
CelestialBody * body = & sim - > bodies [ render_state - > selected_body_index ] ;
float target_radius = scale_radius ( body - > radius , render_state - > distance_scale ) ;
float radius_based_dist = target_radius * MIN_DISTANCE_BODY_RADIUS_MULT ;
float cull_based_dist = target_radius + CAMERA_NEAR_CULL_DISTANCE + 0.001f ;
return ( radius_based_dist > cull_based_dist ) ? radius_based_dist : cull_based_dist ;
@ -294,13 +269,7 @@ static void zoom_camera(RenderState* render_state, SimulationState* sim, ZoomDir
}
static void update_last_target ( RenderState * render_state ) {
if ( render_state - > selected_body_index > = 0 ) {
render_state - > last_target_index = render_state - > selected_body_index ;
} else if ( render_state - > selected_craft_index > = 0 ) {
render_state - > last_target_index = - ( render_state - > selected_craft_index + 1 ) ;
} else {
render_state - > last_target_index = - 1 ;
}
}
// Update camera with keyboard/mouse controls
@ -311,15 +280,8 @@ void update_camera(RenderState* render_state, SimulationState* sim) {
if ( target_changed ) {
update_camera_target ( render_state , sim ) ;
} else if ( render_state - > selected_body_index > = 0 ) {
// Body selected - camera orbits around origin (body at 0,0,0 in render space)
render_state - > camera . target = ( Vector3 ) { 0 , 0 , 0 } ;
render_state - > camera . position = render_state - > camera_offset ;
} else if ( render_state - > selected_craft_index > = 0 ) {
// Spacecraft selected - camera orbits around spacecraft
Spacecraft * craft = & sim - > spacecraft [ render_state - > selected_craft_index ] ;
Vector3 craft_pos = sim_to_render ( craft - > global_position , render_state - > distance_scale ) ;
render_state - > camera . target = craft_pos ;
render_state - > camera . position = Vector3Add ( craft_pos , render_state - > camera_offset ) ;
}
}
@ -723,25 +685,6 @@ void render_simulation(SimulationState* sim, RenderState* render_state) {
render_orbit ( craft_rel , craft - > local_velocity , origin_vec , selected - > mass , ( Color ) { 0 , 255 , 255 , 128 } , render_state ) ;
}
}
} else if ( render_state - > selected_craft_index > = 0 ) {
// === SPACECRAFT SELECTED MODE ===
Spacecraft * selected = & sim - > spacecraft [ render_state - > selected_craft_index ] ;
// Render parent body (for reference)
if ( selected - > parent_index > = 0 & & selected - > parent_index < sim - > body_count ) {
CelestialBody * parent = & sim - > bodies [ selected - > parent_index ] ;
Vec3 parent_rel = vec3_sub ( parent - > global_position , selected - > global_position ) ;
Vector3 parent_pos = sim_to_render ( parent_rel , render_state - > distance_scale ) ;
float parent_radius = scale_radius ( parent - > radius , render_state - > distance_scale ) ;
Color parent_color = { ( unsigned char ) ( parent - > color [ 0 ] * 255 ) , ( unsigned char ) ( parent - > color [ 1 ] * 255 ) , ( unsigned char ) ( parent - > color [ 2 ] * 255 ) , 255 } ;
DrawSphere ( parent_pos , parent_radius , parent_color ) ;
// Render spacecraft's orbit around parent
Vec3 origin_vec = { 0 , 0 , 0 } ;
render_orbit ( origin_vec , selected - > local_velocity , parent_rel , parent - > mass , ( Color ) { 0 , 255 , 255 , 128 } , render_state ) ;
}
}
EndMode3D ( ) ;