From ed1e50e8f87835e2b2b3a19f0eab3bb268f81a10 Mon Sep 17 00:00:00 2001 From: cinnaboot Date: Tue, 13 Jan 2026 09:47:38 -0500 Subject: [PATCH] remove simulation dependencies from physics module - Remove CelestialBody and SimulationState forward declarations from physics.h - Rename evaluate_acceleration_direct to evaluate_acceleration - Update rk4_step to accept Vec3* and mass parameters directly - Remove unused evaluate_acceleration function with SimulationState dependency - Update simulation.cpp to extract and pass masses to rk4_step Claude: partial refactoring cleanup --- src/physics.cpp | 58 ++++++++++++++++++++-------------------------- src/physics.h | 17 ++++---------- src/simulation.cpp | 9 +++---- 3 files changed, 32 insertions(+), 52 deletions(-) diff --git a/src/physics.cpp b/src/physics.cpp index 2703539..47c4e46 100644 --- a/src/physics.cpp +++ b/src/physics.cpp @@ -1,5 +1,4 @@ #include "physics.h" -#include "simulation.h" #include // Vector addition @@ -54,52 +53,30 @@ Vec3 calculate_acceleration(Vec3 force, double mass) { return {0.0, 0.0, 0.0}; } -Vec3 evaluate_acceleration(Vec3 pos, Vec3 vel, AccelerationContext* ctx) { - CelestialBody temp_body = *ctx->current_body; - temp_body.local_position = pos; - temp_body.local_velocity = vel; - - Vec3 total_force = {0.0, 0.0, 0.0}; - - if (temp_body.parent_index >= 0 && temp_body.parent_index < ctx->sim->body_count) { - CelestialBody* parent = &ctx->sim->bodies[temp_body.parent_index]; - - double distance = vec3_magnitude(pos); - if (distance < 1.0) { - distance = 1.0; - } - - double force_magnitude = G * temp_body.mass * parent->mass / (distance * distance); - Vec3 direction = vec3_normalize(vec3_scale(pos, -1.0)); - total_force = vec3_scale(direction, force_magnitude); - } - - return calculate_acceleration(total_force, temp_body.mass); -} - -void rk4_step(CelestialBody* body, AccelerationContext* ctx, double dt) { +void rk4_step(Vec3* position, Vec3* velocity, double dt, + double body_mass, double parent_mass) { Vec3 k1_vel, k2_vel, k3_vel, k4_vel; Vec3 k1_pos, k2_pos, k3_pos, k4_pos; - Vec3 pos0 = body->local_position; - Vec3 vel0 = body->local_velocity; + Vec3 pos0 = *position; + Vec3 vel0 = *velocity; - k1_vel = evaluate_acceleration(pos0, vel0, ctx); + k1_vel = evaluate_acceleration(pos0, body_mass, parent_mass); k1_pos = vel0; Vec3 pos1 = vec3_add(pos0, vec3_scale(k1_pos, dt * 0.5)); Vec3 vel1 = vec3_add(vel0, vec3_scale(k1_vel, dt * 0.5)); - k2_vel = evaluate_acceleration(pos1, vel1, ctx); + k2_vel = evaluate_acceleration(pos1, body_mass, parent_mass); k2_pos = vel1; Vec3 pos2 = vec3_add(pos0, vec3_scale(k2_pos, dt * 0.5)); Vec3 vel2 = vec3_add(vel0, vec3_scale(k2_vel, dt * 0.5)); - k3_vel = evaluate_acceleration(pos2, vel2, ctx); + k3_vel = evaluate_acceleration(pos2, body_mass, parent_mass); k3_pos = vel2; Vec3 pos3 = vec3_add(pos0, vec3_scale(k3_pos, dt)); Vec3 vel3 = vec3_add(vel0, vec3_scale(k3_vel, dt)); - k4_vel = evaluate_acceleration(pos3, vel3, ctx); + k4_vel = evaluate_acceleration(pos3, body_mass, parent_mass); k4_pos = vel3; Vec3 k_vel_sum = vec3_add(vec3_add(k1_vel, vec3_scale(k2_vel, 2.0)), @@ -107,6 +84,21 @@ void rk4_step(CelestialBody* body, AccelerationContext* ctx, double dt) { Vec3 k_pos_sum = vec3_add(vec3_add(k1_pos, vec3_scale(k2_pos, 2.0)), vec3_add(vec3_scale(k3_pos, 2.0), k4_pos)); - body->local_velocity = vec3_add(vel0, vec3_scale(k_vel_sum, dt / 6.0)); - body->local_position = vec3_add(pos0, vec3_scale(k_pos_sum, dt / 6.0)); + *velocity = vec3_add(vel0, vec3_scale(k_vel_sum, dt / 6.0)); + *position = vec3_add(pos0, vec3_scale(k_pos_sum, dt / 6.0)); +} + +Vec3 evaluate_acceleration(Vec3 relative_pos, double body_mass, double parent_mass) { + Vec3 total_force = {0.0, 0.0, 0.0}; + + double distance = vec3_magnitude(relative_pos); + if (distance < 1.0) { + distance = 1.0; + } + + double force_magnitude = G * body_mass * parent_mass / (distance * distance); + Vec3 direction = vec3_normalize(vec3_scale(relative_pos, -1.0)); + total_force = vec3_scale(direction, force_magnitude); + + return calculate_acceleration(total_force, body_mass); } diff --git a/src/physics.h b/src/physics.h index 721888f..a5c60a6 100644 --- a/src/physics.h +++ b/src/physics.h @@ -1,9 +1,6 @@ #ifndef PHYSICS_H #define PHYSICS_H -// Forward declaration -struct CelestialBody; - // 3D Vector struct Vec3 { double x, y, z; @@ -24,15 +21,9 @@ Vec3 vec3_normalize(Vec3 v); // Physics functions Vec3 calculate_acceleration(Vec3 force, double mass); -// Forward declaration for RK4 context -struct SimulationState; - -struct AccelerationContext { - SimulationState* sim; - CelestialBody* current_body; - int body_index; -}; - -void rk4_step(CelestialBody* body, AccelerationContext* ctx, double dt); +// Physics integration functions +void rk4_step(Vec3* position, Vec3* velocity, double dt, + double body_mass, double parent_mass); +Vec3 evaluate_acceleration(Vec3 relative_pos, double body_mass, double parent_mass); #endif diff --git a/src/simulation.cpp b/src/simulation.cpp index 4c8657e..737da51 100644 --- a/src/simulation.cpp +++ b/src/simulation.cpp @@ -104,12 +104,9 @@ void update_simulation(SimulationState* sim) { } if (body->parent_index >= 0 && body->parent_index < sim->body_count) { - AccelerationContext ctx; - ctx.sim = sim; - ctx.current_body = body; - ctx.body_index = i; - - rk4_step(body, &ctx, sim->dt); + CelestialBody* parent = &sim->bodies[body->parent_index]; + rk4_step(&body->local_position, &body->local_velocity, + sim->dt, body->mass, parent->mass); } }