From 6479a3aebed78a0ef4ff1df364d6321241284932 Mon Sep 17 00:00:00 2001
From: Florian Burgener <florian.brgnr@gmail.com>
Date: Sun, 19 Dec 2021 03:10:26 +0100
Subject: [PATCH] Free memory

---
 CelestialObject.c | 13 +++++++++----
 CelestialObject.h |  7 ++++---
 PlanetarySystem.c |  9 +++++++++
 PlanetarySystem.h |  1 +
 drawing.c         |  4 ++--
 drawing.h         |  2 +-
 main.c            | 20 +++++++++++++-------
 7 files changed, 39 insertions(+), 17 deletions(-)

diff --git a/CelestialObject.c b/CelestialObject.c
index 61d9cff..d15849e 100644
--- a/CelestialObject.c
+++ b/CelestialObject.c
@@ -8,7 +8,7 @@
 
 const int32_t PREVIOUS_POSITIONS_LENGTH = 200;
 
-CelestialObject *celestial_object_create(char *name, double mass, double semi_major_axis, double eccentricity, uint32_t drawing_disc_radius, uint32_t drawing_color) {
+CelestialObject *celestial_object_create(char *name, double mass, double semi_major_axis, double eccentricity, int32_t drawing_disc_radius, int32_t drawing_color) {
     CelestialObject *object = (CelestialObject *)malloc(sizeof(CelestialObject));
 
     strcpy(object->name, name);
@@ -30,7 +30,12 @@ CelestialObject *celestial_object_create(char *name, double mass, double semi_ma
     return object;
 }
 
-uint32_t get_zoomed_drawing_disc_radius(CelestialObject *object, double zoom_factor) {
+void celestial_object_destroy(CelestialObject *object) {
+    free(object->previous_positions);
+    free(object);
+}
+
+int32_t get_zoomed_drawing_disc_radius(CelestialObject *object, double zoom_factor) {
     if (zoom_factor < 1) {
         return object->drawing_disc_radius * zoom_factor;
     }
@@ -39,7 +44,7 @@ uint32_t get_zoomed_drawing_disc_radius(CelestialObject *object, double zoom_fac
 }
 
 void celestial_object_draw(CelestialObject *object, Vector2 reference_frame, double zoom_factor) {
-    uint32_t color = object->drawing_color;
+    int32_t color = object->drawing_color;
     glColor3ub((color & 0xFF0000) >> 16, (color & 0x00FF00) >> 8, (color & 0x0000FF) >> 0);
 
     Vector2 scaled_position = scale_position(zoom_factor, object->current_position, reference_frame);
@@ -57,6 +62,6 @@ void celestial_object_draw_name(CelestialObject *object, Vector2 reference_frame
         return;
     }
 
-    uint32_t zoomed_drawing_disc_radius = get_zoomed_drawing_disc_radius(object, zoom_factor);
+    int32_t zoomed_drawing_disc_radius = get_zoomed_drawing_disc_radius(object, zoom_factor);
     draw_text(object->name, vector2_add(scaled_position, vector2_create(zoomed_drawing_disc_radius + 5, -10)));
 }
diff --git a/CelestialObject.h b/CelestialObject.h
index 55925d7..45553eb 100644
--- a/CelestialObject.h
+++ b/CelestialObject.h
@@ -10,13 +10,14 @@ typedef struct CelestialObject {
     Vector2 current_position;
     double semi_major_axis;
     double eccentricity;
-    uint32_t drawing_disc_radius;
-    uint32_t drawing_color;
+    int32_t drawing_disc_radius;
+    int32_t drawing_color;
     Vector2 *previous_positions;
     int32_t previous_positions_length;
 } CelestialObject;
 
-CelestialObject *celestial_object_create(char *name, double mass, double semi_major_axis, double eccentricity, uint32_t drawing_disc_radius, uint32_t drawing_color);
+CelestialObject *celestial_object_create(char *name, double mass, double semi_major_axis, double eccentricity, int32_t drawing_disc_radius, int32_t drawing_color);
+void celestial_object_destroy(CelestialObject *object);
 void celestial_object_draw(CelestialObject *object, Vector2 reference_frame, double zoom_factor);
 void celestial_object_draw_name(CelestialObject *object, Vector2 reference_frame, double zoom_factor);
 
diff --git a/PlanetarySystem.c b/PlanetarySystem.c
index 85d4983..324fb40 100644
--- a/PlanetarySystem.c
+++ b/PlanetarySystem.c
@@ -63,6 +63,15 @@ PlanetarySystem *planetary_system_create() {
     return system;
 }
 
+void planetary_system_destroy(PlanetarySystem *planetary_system) {
+    for (int32_t i = 0; i < planetary_system->objects_length; i += 1) {
+        celestial_object_destroy(planetary_system->objects[i]);
+    }
+
+    free(planetary_system->objects);
+    free(planetary_system);
+}
+
 CelestialObject *planetary_system_get_star(PlanetarySystem *planetary_system) {
     return planetary_system->objects[0];
 }
diff --git a/PlanetarySystem.h b/PlanetarySystem.h
index 768cee7..759638c 100644
--- a/PlanetarySystem.h
+++ b/PlanetarySystem.h
@@ -18,6 +18,7 @@ typedef struct PlanetarySystem {
 } PlanetarySystem;
 
 PlanetarySystem *planetary_system_create();
+void planetary_system_destroy(PlanetarySystem *planetary_system);
 void planetary_system_update(PlanetarySystem *planetary_system, double interval);
 Vector2 planetary_system_get_reference_frame(PlanetarySystem *system);
 void planetary_system_draw(PlanetarySystem *planetary_system);
diff --git a/drawing.c b/drawing.c
index 4d817df..7d5c311 100644
--- a/drawing.c
+++ b/drawing.c
@@ -8,9 +8,9 @@
 #include "PlanetarySystem.h"
 #include "Vector2.h"
 
-void draw_disc(Vector2 position, uint32_t radius) {
+void draw_disc(Vector2 position, int32_t radius) {
     glBegin(GL_POLYGON);
-    for (uint32_t i = 0; i < 360; i += 1) {
+    for (int32_t i = 0; i < 360; i += 1) {
         double theta = i * 3.1415 / 180;
         double x = position.x + radius * cos(theta);
         double y = position.y + radius * sin(theta);
diff --git a/drawing.h b/drawing.h
index ca03066..45a772d 100644
--- a/drawing.h
+++ b/drawing.h
@@ -5,7 +5,7 @@
 
 #include "Vector2.h"
 
-void draw_disc(Vector2 position, uint32_t radius);
+void draw_disc(Vector2 position, int32_t radius);
 void draw_line(Vector2 a, Vector2 b);
 void draw_scaled_lines(Vector2 *points, int32_t points_length, Vector2 reference_frame, double zoom_factor);
 void draw_text(char *text, Vector2 position);
diff --git a/main.c b/main.c
index eeb37f7..4406584 100644
--- a/main.c
+++ b/main.c
@@ -25,11 +25,14 @@ const double ZOOM_MULTIPLIER = 1.1;
 const int32_t DEFAULT_SIMULATION_SPEED_IN_DAYS = 10;
 // Maximum speed of the simulation in days.
 const int32_t SIMULATION_MAXIMUM_SPEED_IN_DAYS = 500;
-// Time that elapses in the planetary system per second.
+// Time that elapses by default in the planetary system per second, in seconds.
 const int32_t DEFAULT_SIMULATION_SPEED_IN_SECONDS = DEFAULT_SIMULATION_SPEED_IN_DAYS * ONE_DAY_IN_SECONDS;
 // Maximum time that elapses in the planetary system at each call of the planetary_system_update function, this value must be small enough for the planetary system to work.
 const int32_t PLANETARY_SYSTEM_INTERVAL = 100;
 
+const unsigned char KEYBOARD_ESCAPE_KEY = 27;
+const unsigned char KEYBOARD_T_KEY = 't';
+
 // https://stackoverflow.com/questions/3417837/what-is-the-best-way-to-suppress-a-unused-variable-x-warning
 #ifdef UNUSED
 #elif defined(__GNUC__)
@@ -78,7 +81,7 @@ void draw() {
     glClear(GL_COLOR_BUFFER_BIT);
 
     char title[100];
-    double elapsed_time = (get_current_time() - start_time) / ONE_SECOND_IN_MICROSECONDS;
+    double elapsed_time = (double)(get_current_time() - start_time) / ONE_SECOND_IN_MICROSECONDS;
     sprintf(title, "Solar System (%.2lf)", elapsed_time);
     glutSetWindowTitle(title);
 
@@ -97,12 +100,12 @@ void draw_timer() {
 }
 
 void handle_keyboard_input(unsigned char key, int UNUSED(x), int UNUSED(y)) {
-    if (key == 27) {
-        // TODO : Free
-        exit(0);
+    if (key == KEYBOARD_ESCAPE_KEY) {
+        glutLeaveMainLoop();
+        return;
     }
 
-    if (key == 116) {
+    if (key == KEYBOARD_T_KEY) {
         planetary_system->show_names = !planetary_system->show_names;
     }
 }
@@ -157,7 +160,7 @@ int main(int argc, char *argv[]) {
     glutSetOption(GLUT_MULTISAMPLE, 16);
     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE);
     glutInitWindowSize(SCREEN_WIDTH, SCREEN_HEIGHT);
-    glutCreateWindow(WINDOW_NAME);
+    int window = glutCreateWindow(WINDOW_NAME);
 
     glClearColor(0.0, 0.0, 0.0, 1.0);
     glMatrixMode(GL_PROJECTION);
@@ -177,5 +180,8 @@ int main(int argc, char *argv[]) {
 
     glutMainLoop();
 
+    glutDestroyWindow(window);
+    planetary_system_destroy(planetary_system);
+
     return EXIT_SUCCESS;
 }
-- 
GitLab