added loading some settings
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 22 Nov 2020 23:11:07 +0000 (17:11 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 22 Nov 2020 23:11:07 +0000 (17:11 -0600)
include/physics.h
include/settings.h
src/physics.cpp
src/settings.cpp
src/sim.cpp

index d2ac939a6a47c992c743066ed225a38f1a34086d..6d76058a0c545755be76aa3ab223af9a6c0ef021 100644 (file)
@@ -29,7 +29,6 @@ struct BodyRelation
     f32 max_force;
 };
 
-void nocheckin_init_other_bodies();
 void body_accumulate_move(Body* body, QuadTree<Body>* qt_bodies, f64 dt);
 void body_apply_move(Body* body, f64 dt);
 
index ec5b8d5e380b0cdd839fde8e96bfb53657dbe9d8..8fc46af20b90183345a0234f65f4e318bc0dff95 100644 (file)
@@ -36,8 +36,8 @@ struct SimSettings
 
 extern SimSettings global_settings;
 
-void load_settings_from_file(SimSettings* settings, const char* filename);
-void save_settings_to_file(SimSettings* settings, const char* filename);
+bool load_settings_from_file(SimSettings* settings, const char* filename);
+bool save_settings_to_file(SimSettings* settings, const char* filename);
 void generate_random_settings(SimSettings* settings);
 
 #endif
index 4270996cf189f0f33f1b6ef7a51935074c3e61c9..f7a6285949f7753f0e0e8824d8f67532fda5fe2f 100644 (file)
@@ -48,18 +48,12 @@ body_can_move(Body* body, const Array<Body> other_bodies, V2f d)
     return true;
 }
 
-// TODO(Brendan): :Parallel This is used to allow for a statically allocated array for the quad tree results. This will need to be a thread local variable.
-thread_local internal Array<Body *> other_bodies;
-void nocheckin_init_other_bodies()
-{
-    other_bodies.ensure_capacity(1024);
-}
-
 void
 body_accumulate_move(Body* body, QuadTree<Body>* qt_bodies, f64 dt)
 {
     V2f force = { 0.0f, 0.0f };
 
+    thread_local persist Array<Body *> other_bodies;
     other_bodies.clear();
     qt_bodies->query(AABB { body->pos.x - 300, body->pos.y - 300, 600, 600 }, &other_bodies); // :ArbitraryConstant
 
index 7833841ffe8cdf66eea68f7776b8d8e8c9f9695f..c7318160744edfefe04699b96569fa22de97ceee 100644 (file)
 #include "settings.h"
+#include <cstring>
 
 SimSettings global_settings;
 
-void
+internal bool
+starts_with_and_advance(const char* pattern, char **str)
+{
+    if (!strncmp(pattern, *str, strlen(pattern)))
+    {
+        *str = *str + strlen(pattern);
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+bool
 load_settings_from_file(SimSettings* settings, const char* filename)
 {
     FILE* file = fopen(filename, "r");
+    if (file == NULL)
+    {
+        logprint(LOG_LEVEL_ERROR, "Failed to open file '%s' for loading settings.", filename);
+        return false;
+    }
     defer { fclose(file); };
 
+    /*
+    BNF Grammar:
+        <file> = <line> '\n' <file>
+               = <line> '\n'?
+
+        <line> = '#' .*
+               | <setting>
+               | e
+
+        <setting> = ...
+    */
+
+    bool hiterror = false;
+    char *rawline = NULL;
+    char *line = NULL;
+    size_t linesize = 0;
+    ssize_t linelen = 0;
+
+    while (!hiterror && ((linelen = getline(&rawline, &linesize, file)) != -1))
+    {
+        line = rawline;
+
+        // NOTE(Brendan): Empty line
+        if (linelen == 1) continue;
 
+        // NOTE(Brendan): Comment
+        if (line[0] == '#') continue;
+
+        if (starts_with_and_advance("body_count", &line))
+        {
+            settings->body_count = strtoll(line, &line, 10);
+            logprint(LOG_LEVEL_INFO, "Loaded setting: body_count = %ld", settings->body_count);
+        }
+        else if (starts_with_and_advance("thread_count", &line))
+        {
+            settings->thread_count = strtoll(line, &line, 10);
+            logprint(LOG_LEVEL_INFO, "Loaded setting: thread_count = %ld", settings->thread_count);
+        }
+        else if (starts_with_and_advance("body_type_count", &line))
+        {
+            settings->body_type_count = strtoll(line, &line, 10);
+            logprint(LOG_LEVEL_INFO, "Loaded setting: body_type_count = %ld", settings->body_type_count);
+        }
+        else if (starts_with_and_advance("friction", &line))
+        {
+            settings->friction = strtof(line, &line);
+            logprint(LOG_LEVEL_INFO, "Loaded setting: friction = %f", settings->friction);
+        }
+        else if (starts_with_and_advance("universe_scale", &line))
+        {
+            settings->universe_scale = strtof(line, &line);
+            logprint(LOG_LEVEL_INFO, "Loaded setting: universe_scale = %f", settings->universe_scale);
+        }
+    }
+
+    if (rawline) free(rawline);
+
+    return true;
 }
 
-void
+bool
 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;
+        return false;
     }
     defer { fclose(file); };
 
@@ -49,6 +126,8 @@ save_settings_to_file(SimSettings* settings, const char* filename)
             fprintf(file, "interaction %d %d %f %f\n", i, j, br.distance_range, br.max_force);
         }
     }
+
+    return true;
 }
 
 void
@@ -92,4 +171,6 @@ generate_random_settings(SimSettings* settings)
             };
         }
     }
+
+    save_settings_to_file(settings, "generated.settings");
 }
index fe49721a22b61547de5dd85c88e1ff4269068161..c78e4afd80e16a616c4397961cf4043e212430c8 100644 (file)
@@ -316,6 +316,7 @@ main(i32 argc, char* argv[])
 {
     srand(time(NULL));
 
+    load_settings_from_file(&global_settings, "dummy.settings");
     generate_random_settings(&global_settings);
 
     init_glfw();
@@ -356,7 +357,6 @@ main(i32 argc, char* argv[])
         glBindBuffer(GL_ARRAY_BUFFER, -1);
     }
 
-    nocheckin_init_other_bodies();
     loop(state);
 
     return 0;