$darkmode
Suckless OGL 1.0.0
A lean, high-performance C11 PBR Renderer
nbody.h
Go to the documentation of this file.
1 
13 #ifndef NBODY_H
14 #define NBODY_H
15 
16 #include "sphere_types.h"
17 #include <cglm/types.h>
18 #include <stdbool.h>
19 
21 enum { NBODY_MAX_BODIES = 32 };
22 
24 static const float NBODY_DEFAULT_G = 1.0F;
25 
29 static const float NBODY_SOFTENING_SQ = 0.25F;
30 
35 static const float NBODY_SOFTENING_FACTOR = 2.0F;
36 
38 static const float NBODY_FIXED_DT = 1.0F / 120.0F;
39 
44 static const float NBODY_MAX_ACCUMULATOR = 1.0F / 10.0F;
45 
50 static const float NBODY_CONFINEMENT_RADIUS = 25.0F;
51 
55 static const float NBODY_CONFINEMENT_K = 5.0F;
56 
64 static const float NBODY_CONFINEMENT_DAMPING = 20.0F;
65 
70 typedef struct {
71  double position[3];
72  double mass;
73  double velocity[3];
74  float radius;
75  vec3 albedo;
76  float metallic;
77  float roughness;
78  double prev_position[3];
81 
87 static const float NBODY_TIME_SCALE_RATE = 3.0F;
88 
97 typedef struct {
98  vec3 position;
99  vec3 color;
100  float velocity;
101  bool active;
102 } NBodyImpact;
103 
104 typedef struct NBodySim {
107  float gravity;
108  float accumulator;
109  float time_scale;
112  float sim_time;
113  bool paused;
115  /* Confinement impact events — one slot per body, cleared each frame.
116  * Only the peak velocity across integration sub-steps is kept. */
118 } NBodySim;
119 
124 void nbody_init_preset(NBodySim* sim);
125 
133 void nbody_step(NBodySim* sim, float delta_time);
134 
141 void nbody_write_instances(const NBodySim* sim, SphereInstance* out);
142 
146 int nbody_get_count(const NBodySim* sim);
147 
154 float nbody_total_energy(const NBodySim* sim);
155 
159 float nbody_kinetic_energy(const NBodySim* sim);
160 
166 float nbody_energy_drift(const NBodySim* sim);
167 
172 float nbody_energy_drift_signed(const NBodySim* sim);
173 
182 void nbody_update_time_scale(NBodySim* sim, float delta_time);
183 
184 #endif /* NBODY_H */
int nbody_get_count(const NBodySim *sim)
Returns the number of active bodies.
Definition: nbody.c:449
void nbody_init_preset(NBodySim *sim)
Initializes the simulation with a preset solar system configuration.
Definition: nbody.c:110
float nbody_energy_drift_signed(const NBodySim *sim)
Definition: nbody.c:476
static const float NBODY_CONFINEMENT_DAMPING
Definition: nbody.h:64
static const float NBODY_MAX_ACCUMULATOR
Definition: nbody.h:44
static const float NBODY_DEFAULT_G
Definition: nbody.h:24
void nbody_step(NBodySim *sim, float delta_time)
Advances the simulation by the given wall-clock delta time.
Definition: nbody.c:389
static const float NBODY_FIXED_DT
Definition: nbody.h:38
float nbody_total_energy(const NBodySim *sim)
Computes the total energy (kinetic + gravitational potential).
Definition: nbody.c:180
float nbody_energy_drift(const NBodySim *sim)
Returns the relative energy drift |E(t) - E₀| / |E₀|.
Definition: nbody.c:464
static const float NBODY_SOFTENING_FACTOR
Definition: nbody.h:35
@ NBODY_MAX_BODIES
Definition: nbody.h:21
static const float NBODY_TIME_SCALE_RATE
Definition: nbody.h:87
static const float NBODY_CONFINEMENT_RADIUS
Definition: nbody.h:50
void nbody_write_instances(const NBodySim *sim, SphereInstance *out)
Writes current body positions and materials into a SphereInstance array suitable for the instanced re...
Definition: nbody.c:428
void nbody_update_time_scale(NBodySim *sim, float delta_time)
Smoothly transitions time_scale toward target_time_scale.
Definition: nbody.c:490
float nbody_kinetic_energy(const NBodySim *sim)
Computes kinetic energy only: Σ ½ m v².
Definition: nbody.c:454
static const float NBODY_SOFTENING_SQ
Definition: nbody.h:29
static const float NBODY_CONFINEMENT_K
Definition: nbody.h:55
Pure-data type for per-instance sphere attributes.
Records a confinement boundary hit for visual effects.
Definition: nbody.h:97
vec3 color
Definition: nbody.h:99
bool active
Definition: nbody.h:101
vec3 position
Definition: nbody.h:98
float velocity
Definition: nbody.h:100
A single gravitational body.
Definition: nbody.h:70
float roughness
Definition: nbody.h:77
float radius
Definition: nbody.h:74
double mass
Definition: nbody.h:72
vec3 albedo
Definition: nbody.h:75
float metallic
Definition: nbody.h:76
State container for the N-body simulation.
Definition: nbody.h:104
float initial_energy
Definition: nbody.h:111
NBodyParticle bodies[NBODY_MAX_BODIES]
Definition: nbody.h:105
bool paused
Definition: nbody.h:113
float target_time_scale
Definition: nbody.h:110
float accumulator
Definition: nbody.h:108
int body_count
Definition: nbody.h:106
float gravity
Definition: nbody.h:107
float time_scale
Definition: nbody.h:109
float sim_time
Definition: nbody.h:112
NBodyImpact impacts[NBODY_MAX_BODIES]
Definition: nbody.h:117
Per-instance data sent to the shader via an instanced VBO.
Definition: sphere_types.h:25