commit 6282e42d22db93c841e2fd8137c20ff2bf1c2b6e
parent e1dc11030e3248648db58de69e027f19b6a8edb3
Author: hhvn <dev@hhvn.uk>
Date: Sat, 6 Aug 2022 17:44:56 +0200
Icons
Diffstat:
23 files changed, 150 insertions(+), 50 deletions(-)
diff --git a/Makefile b/Makefile
@@ -11,6 +11,7 @@ LDFLAGS = $(RAYLIB) $(DBLIB)
CFLAGS = -Wall -g3 -O0
all: db data $(BIN)
+src/data.o: data/icons/*
$(OBJ): src/struct.h
$(BIN): $(OBJ) $(DBLIB)
diff --git a/data/.gitignore b/data/.gitignore
@@ -0,0 +1 @@
+*.h
diff --git a/data/Makefile b/data/Makefile
@@ -1,5 +1,6 @@
FONTS = $(shell find . -name "*.ttf")
-HEADERS = $(FONTS:.ttf=.h)
+ICONS = $(shell find icons -name "*.png")
+HEADERS = $(FONTS:.ttf=.h) $(ICONS:.png=.h)
all: $(HEADERS) sol
@@ -16,8 +17,10 @@ worlds.tsv:
.ttf.h:
xxd -i < $< > $@
+.png.h:
+ xxd -i < $< > $@
clean:
rm -rf $(HEADERS) sol
-.SUFFIXES: .h .ttf
+.SUFFIXES: .h .ttf .png
diff --git a/data/icons/COPYING b/data/icons/COPYING
@@ -0,0 +1 @@
+The files in this directory are placed in the public domain by their author(s).
diff --git a/data/icons/colonies.png b/data/icons/colonies.png
Binary files differ.
diff --git a/data/icons/colonies.xcf b/data/icons/colonies.xcf
Binary files differ.
diff --git a/data/icons/design.png b/data/icons/design.png
Binary files differ.
diff --git a/data/icons/design.xcf b/data/icons/design.xcf
Binary files differ.
diff --git a/data/icons/fleet.png b/data/icons/fleet.png
Binary files differ.
diff --git a/data/icons/fleet.xcf b/data/icons/fleet.xcf
Binary files differ.
diff --git a/data/icons/settings.png b/data/icons/settings.png
Binary files differ.
diff --git a/data/icons/settings.xcf b/data/icons/settings.xcf
Binary files differ.
diff --git a/data/icons/sys.png b/data/icons/sys.png
Binary files differ.
diff --git a/data/icons/sys.xcf b/data/icons/sys.xcf
Binary files differ.
diff --git a/data/icons/tactical.png b/data/icons/tactical.png
Binary files differ.
diff --git a/data/icons/tactical.xcf b/data/icons/tactical.xcf
Binary files differ.
diff --git a/src/data.c b/src/data.c
@@ -1,6 +1,74 @@
-#include <stddef.h>
+#include <raylib.h>
+#include "main.h"
+
+#define IMAGE(name) \
+ static Image raw_image_##name; \
+ Texture image_##name
+
+Font font;
+IMAGE(tactical);
+IMAGE(colonies);
+IMAGE(fleet);
+IMAGE(design);
+IMAGE(sys);
+IMAGE(settings);
unsigned char DejaVuSansMono_ttf[] = {
#include "../data/DejaVuSansMono.h"
};
-size_t DejaVuSansMono_ttf_size = sizeof(DejaVuSansMono_ttf);
+
+unsigned char tactical_png[] = {
+#include "../data/icons/tactical.h"
+};
+
+unsigned char colonies_png[] = {
+#include "../data/icons/colonies.h"
+};
+
+unsigned char fleet_png[] = {
+#include "../data/icons/fleet.h"
+};
+
+unsigned char design_png[] = {
+#include "../data/icons/design.h"
+};
+
+unsigned char sys_png[] = {
+#include "../data/icons/sys.h"
+};
+
+unsigned char settings_png[] = {
+#include "../data/icons/settings.h"
+};
+
+#define IMAGE_LOAD(name) \
+ raw_image_##name = LoadImageFromMemory(".png", \
+ name##_png, sizeof(name##_png)); \
+ image_##name = LoadTextureFromImage(raw_image_##name)
+
+void
+data_load(void) {
+ font = LoadFontFromMemory(".ttf", DejaVuSansMono_ttf,
+ sizeof(DejaVuSansMono_ttf), FONT_SIZE, NULL, 0);
+ IMAGE_LOAD(tactical);
+ IMAGE_LOAD(colonies);
+ IMAGE_LOAD(fleet);
+ IMAGE_LOAD(design);
+ IMAGE_LOAD(sys);
+ IMAGE_LOAD(settings);
+}
+
+#define IMAGE_UNLOAD(name) \
+ UnloadTexture(image_##name); \
+ UnloadImage(raw_image_##name);
+
+void
+data_unload(void) {
+ UnloadFont(font);
+ IMAGE_UNLOAD(tactical);
+ IMAGE_UNLOAD(colonies);
+ IMAGE_UNLOAD(fleet);
+ IMAGE_UNLOAD(design);
+ IMAGE_UNLOAD(sys);
+ IMAGE_UNLOAD(settings);
+}
diff --git a/src/main.c b/src/main.c
@@ -11,11 +11,12 @@ main(void) {
char *system;
ui_init();
+ data_load();
save = save_init(TESTSAVE);
system = dbget(save->db.dir, "index", "selsystem");
if (!system) system = "Sol"; /* TODO: 1. selsystem, 2. player home, 3. uhh? */
- save->system = system_load(NULL, system);
+ save->system = sys_load(NULL, system);
while (!WindowShouldClose()) {
ui_clickable_update();
diff --git a/src/main.h b/src/main.h
@@ -50,31 +50,38 @@ void ui_handle_view_main(void);
void ui_handle_view_colonies(void);
void ui_handle_view_fleets(void);
void ui_handle_view_design(void);
-void ui_handle_view_systems(void);
+void ui_handle_view_sys(void);
void ui_handle_view_settings(void);
void ui_draw_view_main(void);
void ui_draw_view_colonies(void);
void ui_draw_view_fleets(void);
void ui_draw_view_design(void);
-void ui_draw_view_systems(void);
+void ui_draw_view_sys(void);
void ui_draw_view_settings(void);
/* system.c */
int bodytype_enumify(char *name);
char * bodytype_strify(Body *body);
-Vector2 system_vectorize(Polar polar);
-Vector2 system_vectorize_around(Vector2 around, Polar polar);
-Polar system_polarize(Vector2 vector);
-Polar system_sum_polar(Polar absolute, Polar relative);
-Vector2 system_get_vector(Body *body);
-Polar system_get_polar(Body *body);
-System *system_init(char *name);
-System *system_load(System *s, char *name);
+Vector2 sys_vectorize(Polar polar);
+Vector2 sys_vectorize_around(Vector2 around, Polar polar);
+Polar sys_polarize(Vector2 vector);
+Polar sys_sum_polar(Polar absolute, Polar relative);
+Vector2 sys_get_vector(Body *body);
+Polar sys_get_polar(Body *body);
+System *sys_init(char *name);
+System *sys_load(System *s, char *name);
/* save.c */
Save * save_init(char *savedir);
+void save_write(Save *s);
/* data.c */
-#include <stddef.h>
-extern unsigned char DejaVuSansMono_ttf[];
-extern size_t DejaVuSansMono_ttf_size;
+extern Font font;
+extern Texture image_tactical;
+extern Texture image_colonies;
+extern Texture image_fleet;
+extern Texture image_design;
+extern Texture image_sys;
+extern Texture image_settings;
+void data_load(void);
+void data_unload(void);
diff --git a/src/struct.h b/src/struct.h
@@ -81,6 +81,7 @@ typedef struct {
int n;
int sel;
struct {
+ Texture *icon;
char *name;
int w; /* 0 = fill */
} tabs[TABS_MAX];
diff --git a/src/style.h b/src/style.h
@@ -26,11 +26,13 @@
#undef MAGENTA
#undef RAYWHITE
+#define X_PUREWHITE 0xffffffff
#define X_WHITE 0xe6e6e6ff
#define X_AURORA_GREY 0x1e1e1eff
#define X_AURORA_BLUE 0x00003cff
#define X_DARKBLUE 0x00002cff
#define X_AURORA_GREEN 0x649696ff
+#define X_TRANSPARENT 0x00000000
#define UNHEX(col) ((Color){ \
((col & (0xff << 24)) >> 24), \
@@ -38,11 +40,13 @@
((col & (0xff << 8)) >> 8), \
(col & 0xff)})
+#define PUREWHITE UNHEX(X_PUREWHITE)
#define WHITE UNHEX(X_WHITE)
#define AURORA_GREY UNHEX(X_AURORA_GREY)
#define AURORA_BLUE UNHEX(X_AURORA_BLUE)
#define DARKBLUE UNHEX(X_DARKBLUE)
#define AURORA_GREEN UNHEX(X_AURORA_GREEN)
+#define TRANSPARENT UNHEX(X_TRANSPARENT)
/* colours */
#define COL_FG WHITE
@@ -54,3 +58,6 @@
/* font */
#define FONT_SIZE 10
+
+/* textures */
+#define NO_TINT PUREWHITE /* shrug */
diff --git a/src/system.c b/src/system.c
@@ -42,7 +42,7 @@ bodytype_strify(Body *body) {
}
Vector2
-system_vectorize(Polar polar) {
+sys_vectorize(Polar polar) {
return (Vector2) {
polar.r * cosf(polar.theta),
polar.r * sinf(polar.theta)
@@ -50,8 +50,8 @@ system_vectorize(Polar polar) {
}
Vector2
-system_vectorize_around(Vector2 around, Polar polar) {
- Vector2 relative = system_vectorize(polar);
+sys_vectorize_around(Vector2 around, Polar polar) {
+ Vector2 relative = sys_vectorize(polar);
return (Vector2) {
around.x + relative.x,
around.y + relative.y
@@ -59,7 +59,7 @@ system_vectorize_around(Vector2 around, Polar polar) {
}
Polar
-system_polarize(Vector2 vector) {
+sys_polarize(Vector2 vector) {
return (Polar) {
hypotf(vector.x, vector.y),
atan2f(vector.y, vector.x)
@@ -67,17 +67,17 @@ system_polarize(Vector2 vector) {
}
Polar
-system_sum_polar(Polar absolute, Polar relative) {
- return system_polarize(system_vectorize_around(system_vectorize(absolute), relative));
+sys_sum_polar(Polar absolute, Polar relative) {
+ return sys_polarize(sys_vectorize_around(sys_vectorize(absolute), relative));
}
Vector2
-system_get_vector(Body *body) {
- return system_vectorize(system_get_polar(body));
+sys_get_vector(Body *body) {
+ return sys_vectorize(sys_get_polar(body));
}
Polar
-system_get_polar(Body *body) {
+sys_get_polar(Body *body) {
Polar polar;
if (body->polar.r != INFINITY &&
@@ -89,7 +89,7 @@ system_get_polar(Body *body) {
polar.r = body->curdist;
polar.theta = body->theta;
} else {
- polar = system_sum_polar(system_get_polar(body->parent),
+ polar = sys_sum_polar(sys_get_polar(body->parent),
(Polar){body->curdist, body->theta});
}
} else {
@@ -97,7 +97,7 @@ system_get_polar(Body *body) {
polar.r = body->dist;
polar.theta = body->curtheta;
} else {
- polar = system_sum_polar(system_get_polar(body->parent),
+ polar = sys_sum_polar(sys_get_polar(body->parent),
(Polar){body->dist, body->curtheta});
}
}
@@ -107,7 +107,7 @@ system_get_polar(Body *body) {
}
System *
-system_init(char *name) {
+sys_init(char *name) {
System *ret = malloc(sizeof(System));
if (!ret) return NULL;
ret->name = nstrdup(name);
@@ -127,16 +127,16 @@ filter_bodyinsystem(void *data, char *path) {
}
/* If s is true, ignore name and load the system.
- * If s is NULL, call system_init(name); */
+ * If s is NULL, call sys_init(name); */
System *
-system_load(System *s, char *name) {
+sys_load(System *s, char *name) {
char *dir, *tmp;
char **bname;
char **bparent;
size_t blen, i;
int pos;
- if (!s) s = system_init(name);
+ if (!s) s = sys_init(name);
dir = smprintf("%s/", s->name);
s->bodies_len = blen = dblistgroups_f(&bname, save->db.systems, &filter_bodyinsystem, dir);
@@ -171,7 +171,7 @@ system_load(System *s, char *name) {
s->bodies[i]->curtheta = strnum(dbget(save->db.systems, bname[i], "curtheta"));
}
- /* so system_get_polar() knows if it's usable */
+ /* so sys_get_polar() knows if it's usable */
s->bodies[i]->polar = (Polar) { INFINITY, INFINITY };
}
@@ -187,9 +187,9 @@ system_load(System *s, char *name) {
/* third pass: get coords (needs parent ptr from second pass) */
for (i = 0; i < blen; i++) {
- system_get_polar(s->bodies[i]); /* Builds the cache for us: this is more
+ sys_get_polar(s->bodies[i]); /* Builds the cache for us: this is more
efficient as it can cache the parent too */
- s->bodies[i]->vector = system_vectorize(s->bodies[i]->polar);
+ s->bodies[i]->vector = sys_vectorize(s->bodies[i]->polar);
}
for (i = 0; i < blen; i++) {
diff --git a/src/ui.c b/src/ui.c
@@ -11,7 +11,6 @@
#define MIN_BODY_DIAM 3
#define SCREEN_RECT() ((Rect){0, 0, GetScreenWidth(), GetScreenHeight()})
-static Font font;
static Clickable clickable[CLICKABLE_MAX];
void (*view_handlers[UI_VIEW_LAST])(void) = {
@@ -19,7 +18,7 @@ void (*view_handlers[UI_VIEW_LAST])(void) = {
[UI_VIEW_COLONIES] = ui_handle_view_colonies,
[UI_VIEW_FLEETS] = ui_handle_view_fleets,
[UI_VIEW_DESIGN] = ui_handle_view_design,
- [UI_VIEW_SYSTEMS] = ui_handle_view_systems,
+ [UI_VIEW_SYSTEMS] = ui_handle_view_sys,
[UI_VIEW_SETTINGS] = ui_handle_view_settings,
};
@@ -28,15 +27,19 @@ void (*view_drawers[UI_VIEW_LAST])(void) = {
[UI_VIEW_COLONIES] = ui_draw_view_colonies,
[UI_VIEW_FLEETS] = ui_draw_view_fleets,
[UI_VIEW_DESIGN] = ui_draw_view_design,
- [UI_VIEW_SYSTEMS] = ui_draw_view_systems,
+ [UI_VIEW_SYSTEMS] = ui_draw_view_sys,
[UI_VIEW_SETTINGS] = ui_draw_view_settings,
};
Tabs view_tabs = {
/* Tactical is the terminology used in Aurora, so I decided to use it
* in the ui; in the code it's just called 'main' for my fingers' sake */
- UI_VIEW_LAST, 0, {{"Tactical", 0}, {"Colonies", 0}, {"Fleets", 0}, {"Design", 0},
- {"Systems", 0}, {"Settings", 0}}
+ UI_VIEW_LAST, 0, {{&image_tactical, "Tactical", 0},
+ {&image_colonies, "Colonies", 0},
+ {&image_fleet, "Fleets", 0},
+ {&image_design, "Design", 0},
+ {&image_sys, "Systems", 0},
+ {&image_settings, "Settings", 0}}
};
static struct {
@@ -69,7 +72,7 @@ static struct {
} view_main = {
.infobox = {
.tabs = {
- 2, 0, {{"Display", 0}, {"Minerals", 0}}
+ 2, 0, {{NULL, "Display", 0}, {NULL, "Minerals", 0}}
},
.names = {
.dwarf = {1, "Name: dwarf planets"},
@@ -107,10 +110,6 @@ ui_init(void) {
InitWindow(500, 500, "testing raylib");
SetWindowState(FLAG_WINDOW_RESIZABLE);
SetTargetFPS(TARGET_FPS);
-
- font = LoadFontFromMemory(".ttf",
- DejaVuSansMono_ttf, DejaVuSansMono_ttf_size,
- FONT_SIZE, NULL, 0);
}
void
@@ -266,6 +265,7 @@ ui_draw_tabs(int x, int y, int w, int h, Tabs *tabs) {
int fw, fn, ftabw;
int tabw;
int padx, pady;
+ int iw;
int cx, selx = -1;
int i;
@@ -288,12 +288,22 @@ ui_draw_tabs(int x, int y, int w, int h, Tabs *tabs) {
tabw = ftabw;
else
tabw = tabs->tabs[i].w;
- padx = (tabw - ui_textsize(tabs->tabs[i].name)) / 2;
+
+ if (tabs->tabs[i].icon)
+ iw = tabs->tabs[i].icon->width;
+ else
+ iw = 0;
+
+ padx = (tabw - ui_textsize(tabs->tabs[i].name) - iw) / 2;
if (i == tabs->sel)
selx = cx;
else
DrawRectangle(cx, y, tabw, h, COL_UNSELBG);
- ui_print(cx + padx, y + pady, COL_FG, "%s", tabs->tabs[i].name);
+ ui_print(cx + padx + iw, y + pady, COL_FG, "%s", tabs->tabs[i].name);
+ if (tabs->tabs[i].icon)
+ DrawTexture(*tabs->tabs[i].icon, cx + padx / 2,
+ y + (h - tabs->tabs[i].icon->width) / 2,
+ COL_FG);
DrawRectangle(cx + tabw - 1, y, 1, h, COL_BORDER);
}
@@ -418,7 +428,7 @@ ui_handle_view_design(void) {
}
void
-ui_handle_view_systems(void) {
+ui_handle_view_sys(void) {
ui_title("Systems");
}
@@ -579,7 +589,7 @@ ui_draw_view_design(void) {
}
void
-ui_draw_view_systems(void) {
+ui_draw_view_sys(void) {
ui_print(10, GetScreenHeight() / 2, COL_FG, "System info/settings menu");
ui_print(GetScreenWidth() / 2, GetScreenHeight() / 2, COL_FG, "Pannable system view");
}