vibe coding an orbital mechanics simulation to try out claude code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

5.3 KiB

UI Implementation Plan - Body Selection and Information Display

Overview

Add UI elements using raygui to list celestial bodies and display detailed information about selected bodies.

UI Library Choice

raygui - raylib's official immediate-mode GUI library

  • Seamless integration with existing raylib code
  • Lightweight and follows raylib's C-style conventions
  • Provides GuiListView() for body lists and GuiWindowBox() for information panels
  • No additional dependencies beyond raylib

Implementation Status: COMPLETED

All phases have been successfully implemented. See docs/ui_implementation_summary.md for detailed implementation summary.

Implementation Phases

Phase 1: Add raygui Submodule (COMPLETED)

  1. Added raygui as git submodule in ext/raygui/

    • Follows existing pattern with ext/ directory
    • Keeps raygui version-controlled and easily updatable
    • Matches current dependency management approach
  2. Updated .gitmodules

    • Added new entry for raygui submodule

Phase 2: Update Build System (COMPLETED)

  1. Modified Makefile

    • Added raygui include path: -I./ext/raygui/src
    • Added raygui.c compilation integration
    • Updated linking to include raygui objects
  2. Integration approach

    • Followed existing pattern from tomlc17 integration
    • Added raygui implementation with #define RAYGUI_IMPLEMENTATION in renderer.cpp

Phase 3: Code Integration (COMPLETED)

  1. Updated renderer.h

    • Added raygui include with #define RAYGUI_IMPLEMENTATION
    • Extended RenderState with UI fields:
      • int selected_body_index // -1 = no selection
      • bool show_body_list // Toggle for list panel
      • bool show_body_info // Toggle for info panel
  2. Added UI functions to renderer.h

    • void render_body_list_ui(SimulationState* sim, RenderState* render_state);
    • void render_body_info_ui(SimulationState* sim, RenderState* render_state);

Phase 4: Implementation Details (COMPLETED)

  1. UI Layout Strategy - IMPLEMENTED

    • Left panel (200px x 400px): Body list using GuiListView()
    • Right panel (250px x 300px): Detailed info using GuiLabel()
    • Both panels toggleable with keyboard shortcuts
  2. raygui-specific considerations - IMPLEMENTED

    • raygui immediate-mode integration in renderer.cpp
    • Used #define RAYGUI_IMPLEMENTATION in renderer.cpp
    • Compiled alongside raylib without conflicts
  3. Controls Integration - IMPLEMENTED

    • 'B' key: Toggle body list panel
    • 'I' key: Existing info toggle (simulation info)
    • Mouse: Select from list, close panels with X button
    • ESC: Quit (unchanged)
  4. Body Information Display - IMPLEMENTED When a body is selected, displays:

    • Name, mass, radius
    • Current position (x, y, z) and velocity magnitude
    • Orbital parameters (eccentricity, semi-major axis)
    • Parent body and SOI radius

Phase 5: Integration and Polish (COMPLETED)

  1. Updated main render loop

    • UI rendering functions called after 3D rendering before EndDrawing()
    • Proper depth ordering maintained (3D scene → UI panels → end frame)
    • UI state initialized in main.cpp
  2. User experience enhancements - PARTIALLY IMPLEMENTED

    • Body list and info panels functional
    • Selection persists across frames
    • Info panel auto-opens when body selected
    • Window close (X) buttons functional

Key Technical Details (IMPLEMENTED)

raygui Functions Used:

  • GuiWindowBox(bounds, title) - Draggable window containers
  • GuiListView(bounds, text, scrollIndex, active) - Scrollable body list
  • GuiLabel(bounds, text) - Multi-line information display

Data Flow:

  1. Simulation populates SimulationState with bodies
  2. UI reads body names from sim->bodies[i].name and converts to semicolon-separated string
  3. Selection updates render_state->selected_body_index
  4. Info panel displays detailed data from selected body

Layout Strategy (IMPLEMENTED):

  • Body list: Left side of screen (200px wide, 400px tall)
  • Info panel: Right side of screen (250px wide, 300px tall)
  • Both panels can be toggled independently
  • Maintain existing 3D viewport in center

Files Modified:

  1. Makefile - Added raygui compilation
  2. src/renderer.h - Added UI declarations and RenderState extensions
  3. src/renderer.cpp - Implemented UI rendering functions and raygui integration
  4. src/main.cpp - Initialize UI state and add keyboard controls
  5. .gitmodules - Added raygui submodule entry

Integration Notes (VERIFIED):

  • Maintains C-style architecture
  • Immediate-mode UI fits existing rendering loop
  • Minimal state management required
  • Follows existing dependency patterns (git submodules)

Future Enhancements (Optional)

Potential Improvements:

  • Camera focus: Option to focus camera on selected body
  • Visual highlighting: Highlight selected body in 3D view
  • Enhanced info: Add real-time orbital metrics
  • Search functionality: Filter body list by name
  • Multiple selection: Select multiple bodies for comparison

Advanced Features:

  • Reference frame switching: View from selected body's perspective
  • Orbit manipulation: Edit orbital parameters via UI
  • Time controls: Jump to specific orbital positions
  • Export functionality: Save body data to file