- Replace position/velocity with orbit table parsing
- Parse all orbital element fields with defaults
- Support altitude convenience field for semi_major_axis
- Add validation for orbital elements
- Remove manual position/velocity calculation from loader
- Build succeeds (expected unused function warning)
- Rename CelestialBody/Spacecraft position/velocity to global_*
- Add OrbitalElements struct to both bodies and spacecraft
- Rename old OrbitalElements to OrbitalMetrics (for output/analysis)
- Update all references throughout codebase
- Preserve parent_index in outer structs (not in OrbitalElements)
- Build succeeds with only unused variable warning
Replace 3D billboard rendering with 2D screen-space overlays using
GetWorldToScreen() and DrawTexturePro() for constant visibility.
Changes:
- Rename render functions to *_screen_space suffix
- Use GetWorldToScreen() to transform 3D positions to screen coordinates
- Replace DrawBillboard/DrawBillboardPro() with DrawTexturePro() for 2D rendering
- Use constant pixel sizes (40px spacecraft, 20-60px markers)
- Add off-screen culling to skip rendering outside viewport
- Update render order: 3D scene first, then 2D overlays
- Update documentation to reflect screen-space approach
Benefits:
- Markers remain visible at all zoom levels (constant screen size)
- Simplified sizing with pixel values instead of world-space math
- Better performance with off-screen culling
- Clearer separation: 3D scene vs UI indicators
- Create ui_renderer.cpp/h with all raygui UI panel rendering functions
- Remove UI rendering code from renderer.cpp (421 lines moved)
- Remove UI state fields from RenderState, create separate UIState struct
- Remove raygui dependency from renderer module
- Update main.cpp to initialize UIState and call UI render functions
- Update documentation to reflect new module structure
- Improve separation of concerns between 3D rendering and UI overlays
Extract large update_simulation function into focused helpers:
- update_bodies_physics() - Handle body RK4 and SOI transitions
- update_spacecraft_physics() - RK4 integration for spacecraft
- execute_pending_maneuvers() - Check triggers and execute burns
- compute_spacecraft_globals() - Global coords for spacecraft
Simplified update_simulation to call helpers sequentially:
1. Bodies physics
2. Bodies global coords
3. Spacecraft physics
4. Maneuver execution
5. Spacecraft global coords
6. Time step
Benefits:
- Single responsibility per function
- Cleaner, more readable code
- Easier to test individual components
- Net change: +96 lines (helper functions) -86 lines (removal)
All maneuver tests still passing.
Updated docs to reflect that the spacecraft initialization bug has been
resolved by config validation.
docs/test_plan_invalid_parent_assignment.md:
- Changed status from "Implementation phase" to "Complete (Tests 1-3 resolved)"
- Updated bug diagnosis to show solution implemented
- Updated all test cases with actual results (Tests 1-3: ✅ PASS, Test 4: ❌ FAIL)
- Added implementation summary with commit references
- Updated test matrix to show actual results
- Updated future work section to reflect current status
docs/mission_planning.md:
- Marked FIXME as RESOLVED with solution details
- Updated spacecraft parameters to show corrected position
- Added note that delta-v issue remains pending
- Updated "position/velocity" line to reflect current implementation
Test Status:
- Test 1 (Earth→Spacecraft parent switch): ✅ RESOLVED
- Test 2 (Mass hierarchy): ✅ RESOLVED
- Test 3 (Config validation): ✅ RESOLVED
- Test 4 (Mutual SOI): ❌ PENDING (separate issue)
Added validation in config_loader to prevent bodies from starting too close
to their parent bodies (distance must be >= parent.radius + body.radius).
Changes:
- src/config_loader.cpp: Add parent-child distance validation before initialization
- tests/configs/earth_mars_simple.toml: Fix spacecraft position to LEO altitude
(Earth position + 6.571e6 m offset = 1.49606571e11 m)
- tests/test_invalid_parent_assignment.cpp: Update test 3 to use radius-based validation
- docs/mission_planning.md: Add TODO about spacecraft config pattern changes
Test results:
- Test 1: ✅ PASS (Earth no longer becomes child of spacecraft)
- Test 2: ✅ PASS (Mass hierarchy preserved)
- Test 3: ✅ PASS (Spacecraft at valid LEO position)
- Test 4: ❌ FAIL (mutual SOI bug, as expected)
This prevents the spacecraft initialization bug where Earth would incorrectly
become a child of the spacecraft due to distance=0.
Added comprehensive tests to capture parent-child relationship bugs:
- Test 1: Detect Earth becoming child of spacecraft (exact FIXME bug)
- Test 2: Validate mass hierarchy (massive bodies never have small parents)
- Test 3: Detect invalid config placeholder values (bodies at same position)
- Test 4: Mutual SOI edge case (similar-mass planets within SOI)
All tests fail as expected, documenting bugs for future fixes.
Tests 1-3 will pass after spacecraft separation fix.
Test 4 captures separate mutual SOI issue.
Files:
- docs/test_plan_invalid_parent_assignment.md (test plan)
- tests/test_invalid_parent_assignment.cpp (4 test cases)
- tests/configs/mutual_soi_close.toml (edge case config)
- Extract adaptive timestepping section from patched_conics_plan.md
- Add to mission_planning.md Future Work section (after Capture Burns)
- Problem: Fixed 60s timestep too coarse/fast for different orbital phases
- Solution: Adaptive timestep based on orbital period using Kepler's third law
- Implementation: calculate_adaptive_timestep() with 10s-600s clamping
- Delete obsolete patched_conics_plan.md (689 lines, superseded by implementation)
- Renumber sections 5-11 to accommodate new section 5
- Net reduction: ~645 lines of documentation
- Replace full function implementations with summaries
- Add references to actual source files for implementation details
- Replace full test code with test structure summary
- Replace full TOML config with config summary
- Reduced document from 744 to 459 lines (38% reduction)
- Improved maintainability: source code is now source of truth
- Old doc renamed to mission_planning.md.old for reference
- New doc (leospacecraft_impulse_burn_plan.md) renamed to mission_planning.md
- Updated version includes LEO spacecraft, impulse burn, test config, and future work
- Add spacecraft body to earth_mars_simple.toml config file
- Implement initialize_spacecraft_leo() to set circular LEO at 200km altitude
- Implement apply_transfer_burn() for Hohmann transfer impulse burn
- Implement calculate_phase_angle() for launch window verification
- Add comprehensive test case with SOI transition tracking
- Preserve debug printf statements from main branch investigation
- LEO initialization verified: position, velocity, energy all correct
- Issue identified: delta-v calculation doesn't account for spacecraft LEO phase
- Test completes 8/9 assertions (fails post-burn energy check)
- Session documented in docs/leospacecraft_impulse_burn_plan.md
Next: Fix apply_transfer_burn() to use vector-based delta-v instead of magnitude-based
Add completed camera follow features to implementation plan:
- Camera follow for selected bodies
- Distance preservation when switching bodies
- Proper orbital rotation using camera.up
- Mark all UI implementation phases as completed in ui_implementation_plan.md
- Add UI body selection to completed items in implementation_plan.md
- Move ui_implementation_summary.md to docs/session_summaries/ for better organization
Add core orbital mechanics calculations and spacecraft spawning infrastructure
for interplanetary trajectory planning. Enables calculation of realistic
transfer orbits with proper departure window timing.
New Module (mission_planning.h/cpp):
- calculate_hohmann_transfer(): Returns transfer orbit parameters
- calculate_angular_position(): Computes body angle in XY plane
- calculate_required_phase_angle(): Calculates optimal launch phase
- check_launch_window(): Tests if current phase allows optimal launch
- wait_for_launch_window(): Fast-forwards to launch window
- spawn_spacecraft_on_transfer(): Creates spacecraft on transfer trajectory
Simulation Extensions (simulation.cpp/h):
- add_body_to_simulation(): Dynamic body creation at runtime
- Properly handles local/global coordinate initialization
- SOI radius calculation for dynamically added bodies
Test Suite:
- test_mission_planning.cpp: Core calculations validated
- test_hohmann_transfer.cpp: Spacecraft spawning verified
- earth_mars_simple.toml: Test configuration for transfers
Validations:
- Transfer parameters match NASA references (±5%)
- Earth→Mars transfer: 259 days, 44.3° phase, 2.94 km/s Δv
- Spacecraft spawns with correct velocity and position
- Launch window detection works (waits ~94 days for optimal window)
Status: Phases 1-3 complete, Phase 4 debugging in progress
(trajectory divergence after first update_simulation() call)
Decisions made:
1. Hysteresis: Adaptive approach (Option B) - prevents oscillation while enabling round-trips
2. Integration timing: Current approach (Option A) - defer half-step optimization to future TODO
3. Test priorities: Create all 3 test cases first - expect failures for unimplemented features
4. Adaptive timesteps: Deferred to later work - focus on SOI transitions first
Updated plan with:
- Decisions Made section documenting all 4 choices
- Updated implementation phases with decisions
- Updated timeline and success criteria
- Marked Phase 5 as deferred
- Ready to begin Phase 1 implementation
- Update hierarchical_frames_plan.md with recent work (Jan 13, 2026)
- Add comprehensive patched conics implementation plan
- Document SOI transition requirements and implementation phases
- Include 4 open questions for strategy discussion
- Add 6 test scenarios for multi-body transitions
- Document success criteria and timeline estimates