fixed color bug; added saving settings
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 15 Nov 2020 23:18:37 +0000 (17:18 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 15 Nov 2020 23:18:37 +0000 (17:18 -0600)
res/shaders/planet_frag.glsl
src/settings.cpp
src/sim.cpp

index eed53c3072ac6c6f9ddf564279cc6c39dfc730fc..1722372f70123884e932da55d97ce66bb49d3bd1 100644 (file)
@@ -2,11 +2,11 @@
 
 precision mediump float;
 
-uniform vec4 u_planet_colors[4];
+uniform vec3 u_planet_colors[32];
 
 in float planet_color_idx;
 out vec4 fragColor;
 
 void main() {
-       fragColor = u_planet_colors[int(planet_color_idx)];
+       fragColor = vec4(u_planet_colors[int(planet_color_idx)], 1.0);
 }
index c6a51f32fbcb77fd4596ac9434cc98bf584f8c5f..7833841ffe8cdf66eea68f7776b8d8e8c9f9695f 100644 (file)
@@ -14,6 +14,41 @@ load_settings_from_file(SimSettings* settings, const char* filename)
 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
@@ -25,12 +60,14 @@ generate_random_settings(SimSettings* settings)
     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 };
@@ -43,11 +80,12 @@ generate_random_settings(SimSettings* settings)
     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),
index 75b4a46971ae3936fab305a6933519e611175ae0..fe49721a22b61547de5dd85c88e1ff4269068161 100644 (file)
@@ -329,16 +329,9 @@ main(i32 argc, char* argv[])
                                   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);