void
save_settings_to_file(SimSettings* settings, const char* filename)
{
+ FILE* file = fopen(filename, "w");
+ if (file == NULL)
+ {
+ logprint(LOG_LEVEL_ERROR, "Failed to open file '%s' for saving settings.", filename);
+ return;
+ }
+ defer { fclose(file); };
+
+ fprintf(file, "thread_count %d\n", settings->thread_count);
+ fprintf(file, "body_count %d\n", settings->body_count);
+ fprintf(file, "body_type_count %d\n", settings->body_type_count);
+
+ foreach (i, 0, settings->body_type_count)
+ {
+ BodyColor c = settings->body_colors[i];
+ fprintf(file, "body_color %d %f %f %f\n", i, c.r, c.g, c.b);
+ }
+
+ foreach (i, 0, settings->body_type_count)
+ {
+ BodyMassRange r = settings->body_mass_range[i];
+ fprintf(file, "body_mass_range %d %f %f\n", i, r.min, r.max);
+ }
+
+ fprintf(file, "friction %f\n", settings->friction);
+ fprintf(file, "universe_scale %f\n", settings->universe_scale);
+
+ foreach (i, 0, settings->body_type_count)
+ {
+ foreach (j, 0, settings->body_type_count)
+ {
+ BodyRelation br = settings->body_relations[i * settings->body_type_count + j];
+ fprintf(file, "interaction %d %d %f %f\n", i, j, br.distance_range, br.max_force);
+ }
+ }
}
void
settings->body_type_count = num_body_types;
settings->body_colors.init(num_body_types);
+ settings->body_colors.count = num_body_types;
settings->body_colors[0] = { 1.0, 0.0, 0.0 };
settings->body_colors[1] = { 0.0, 1.0, 0.0 };
settings->body_colors[2] = { 0.0, 0.0, 1.0 };
settings->body_colors[3] = { 1.0, 1.0, 1.0 };
settings->body_mass_range.init(num_body_types);
+ settings->body_mass_range.count = num_body_types;
settings->body_mass_range[0] = { 4.0, 6.0 };
settings->body_mass_range[1] = { 4.0, 6.0 };
settings->body_mass_range[2] = { 4.0, 6.0 };
settings->thread_count = 4;
settings->body_relations.init(num_body_types * num_body_types);
+ settings->body_relations.count = num_body_types * num_body_types;
foreach (i, 0, num_body_types)
{
foreach (j, 0, num_body_types)
{
- settings->body_relations[i * num_body_types] =
+ settings->body_relations[i * num_body_types + j] =
{
.distance_range = randf(4.0f, 7.0f),
.max_force = randf(-200.0f, 200.0f),
load_shader(GL_FRAGMENT_SHADER, "res/shaders/planet_frag.glsl"));
glUseProgram(body_program);
- // :ArbitraryConstant
- persist GLfloat planet_colors[4][4] =
- {
- { 1.0f, 0.0f, 0.0f, 1.0f },
- { 0.0f, 1.0f, 0.0f, 1.0f },
- { 0.0f, 0.0f, 1.0f, 1.0f },
- { 1.0f, 1.0f, 1.0f, 1.0f },
- };
GLuint planet_colors_loc = glGetUniformLocation(body_program, "u_planet_colors");
- glUniform4fv(planet_colors_loc, 4, (GLfloat *) planet_colors);
+ GLfloat* planet_colors = (GLfloat *) global_settings.body_colors.data;
+ glUniform3fv(planet_colors_loc, global_settings.body_type_count, planet_colors);
auto state = alloc<SimState>();
sim_state_init(state);