diff --git a/src/main.cpp b/src/main.cpp index 90e64d4..b9f9500 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -38,6 +38,7 @@ void run_gui_simulation(SimulationState* sim) { // Initialize UI state render_state.selected_body_index = -1; // No selection initially + render_state.previous_selected_body = -1; // Previous selected body index render_state.body_list_scroll = 0; // Initial scroll position render_state.body_list_active = -1; // No active item initially render_state.camera_follow_body = false; // Camera not following initially diff --git a/src/renderer.cpp b/src/renderer.cpp index 96fa5c3..e02149a 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -49,6 +49,17 @@ void update_camera(RenderState* render_state, SimulationState* sim) { } } + // Preserve distance when switching to different body + if (render_state->camera_follow_body && render_state->selected_body_index >= 0 && + render_state->selected_body_index != render_state->previous_selected_body && + render_state->selected_body_index < sim->body_count) { + // Body selection changed - recalculate offset to maintain distance + Vector3 body_pos = sim_to_render(sim->bodies[render_state->selected_body_index].position, render_state->distance_scale); + render_state->camera.target = body_pos; + // Use current offset to maintain distance to new body + render_state->camera.position = Vector3Add(body_pos, render_state->camera_offset); + } + // Update target position when following if (render_state->camera_follow_body && render_state->selected_body_index >= 0 && render_state->selected_body_index < sim->body_count) { @@ -136,8 +147,9 @@ void update_camera(RenderState* render_state, SimulationState* sim) { } } - // Store previous follow state + // Store previous follow state and selected body render_state->was_following_body = render_state->camera_follow_body; + render_state->previous_selected_body = render_state->selected_body_index; } // Transform from simulation coordinates (XY plane) to render coordinates (XZ plane) diff --git a/src/renderer.h b/src/renderer.h index 0595dbc..f25e000 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -10,6 +10,7 @@ struct RenderState { double distance_scale; // Scale factor for distances double size_scale; // Scale factor for body sizes int selected_body_index; // -1 = no selection + int previous_selected_body; // Previous selected body index int body_list_scroll; // Scroll position for body list int body_list_active; // Active item index in body list bool camera_follow_body; // Whether camera follows selected body