commit ba89fc3585bd7cff88251651d79c686f76197942
parent c1c48c0c888a54fc3ef775e95cca23f7a0f929a9
Author: hhvn <dev@hhvn.uk>
Date: Thu, 1 Sep 2022 11:31:57 +0100
Body sorting
Diffstat:
A | src/body.c | | | 62 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
M | src/main.h | | | 8 | ++++++-- |
M | src/system.c | | | 41 | +++-------------------------------------- |
3 files changed, 71 insertions(+), 40 deletions(-)
diff --git a/src/body.c b/src/body.c
@@ -0,0 +1,62 @@
+#include <stdlib.h>
+#include <raylib.h>
+#include "main.h"
+
+static char *bodytype_names[BODY_LAST] = {
+ [BODY_STAR] = "Star",
+ [BODY_PLANET] = "Planet",
+ [BODY_DWARF] = "Dwarf planet",
+ [BODY_ASTEROID] = "Asteroid",
+ [BODY_COMET] = "Comet",
+ [BODY_MOON] = "Moon",
+ [BODY_PLANET + BODY_MOON] = "Moon",
+ [BODY_DWARF + BODY_MOON] = "Dwarf planet moon",
+ [BODY_ASTEROID + BODY_MOON] = "Asteroid moon",
+ [BODY_COMET + BODY_MOON] = "Comet moon",
+};
+
+int
+bodytype_enumify(char *name) {
+ if (strsuffix(name, "moon") || streq(name, "Moon"))
+ return BODY_MOON;
+ else if (streq(name, "Star"))
+ return BODY_STAR;
+ else if (streq(name, "Planet"))
+ return BODY_PLANET;
+ else if (streq(name, "Dwarf planet"))
+ return BODY_DWARF;
+ else if (streq(name, "Asteroid"))
+ return BODY_ASTEROID;
+ else if (streq(name, "Comet"))
+ return BODY_COMET;
+ else
+ return -1;
+}
+
+char *
+bodytype_strify(Body *body) {
+ return bodytype_names[body->type +
+ (body->parent ? body->parent->type : 0)];
+}
+
+int
+body_cmp(Body *b1, Body *b2) {
+ float v1, v2;
+ Body *p;
+
+ for (p = b1, v1 = 0; p->parent; p = p->parent)
+ v1 += (p->type == BODY_COMET ? p->maxdist : p->dist);
+ for (p = b2, v2 = 0; p->parent; p = p->parent)
+ v2 += (p->type == BODY_COMET ? p->maxdist : p->dist);
+ return (v1 == v2 ? 0 : (v1 > v2 ? 1 : -1));
+}
+
+static int
+body_cmp_sort(const void *a, const void *b) {
+ return body_cmp(*(const Body **)a, *(const Body **)b);
+}
+
+void
+body_sort(Body **bodies, size_t n) {
+ qsort(bodies, n, sizeof(Body *), body_cmp_sort);
+}
diff --git a/src/main.h b/src/main.h
@@ -109,8 +109,6 @@ float pane_y(float y);
Vector2 pane_v(Vector2 v);
/* system.c */
-int bodytype_enumify(char *name);
-char * bodytype_strify(Body *body);
Vector2 sys_vectorize(Polar polar);
Vector2 sys_vectorize_around(Vector2 around, Polar polar);
Polar sys_polarize(Vector2 vector);
@@ -123,6 +121,12 @@ System *sys_load(System *s, char *name);
System *sys_get(char *name);
System *sys_default(void);
+/* body.c */
+int bodytype_enumify(char *name);
+char * bodytype_strify(Body *body);
+int body_cmp(Body *b1, Body *b2);
+void body_sort(Body **bodies, size_t n);
+
/* save.c */
#define SAVE_READ_STEPS 2
void save_read(Loader *lscr, char *dir);
diff --git a/src/system.c b/src/system.c
@@ -1,46 +1,9 @@
#include <math.h>
#include <string.h>
#include <stdlib.h>
-#include "raylib.h"
+#include <raylib.h>
#include "main.h"
-static char *bodytype_names[BODY_LAST] = {
- [BODY_STAR] = "Star",
- [BODY_PLANET] = "Planet",
- [BODY_DWARF] = "Dwarf planet",
- [BODY_ASTEROID] = "Asteroid",
- [BODY_COMET] = "Comet",
- [BODY_MOON] = "Moon",
- [BODY_PLANET + BODY_MOON] = "Moon",
- [BODY_DWARF + BODY_MOON] = "Dwarf planet moon",
- [BODY_ASTEROID + BODY_MOON] = "Asteroid moon",
- [BODY_COMET + BODY_MOON] = "Comet moon",
-};
-
-int
-bodytype_enumify(char *name) {
- if (strsuffix(name, "moon") || streq(name, "Moon"))
- return BODY_MOON;
- else if (streq(name, "Star"))
- return BODY_STAR;
- else if (streq(name, "Planet"))
- return BODY_PLANET;
- else if (streq(name, "Dwarf planet"))
- return BODY_DWARF;
- else if (streq(name, "Asteroid"))
- return BODY_ASTEROID;
- else if (streq(name, "Comet"))
- return BODY_COMET;
- else
- return -1;
-}
-
-char *
-bodytype_strify(Body *body) {
- return bodytype_names[body->type +
- (body->parent ? body->parent->type : 0)];
-}
-
Vector2
sys_vectorize(Polar polar) {
return (Vector2) {
@@ -226,6 +189,8 @@ sys_load(System *s, char *name) {
dblistfree(bname, blen);
free(dir);
+ body_sort(s->bodies, s->bodies_len);
+
return s;
}