static void game_loop(Client *client)
{
+ HUDElement *fps_hud = hud_add((HUDElementDefinition) {
+ .type = HUD_TEXT,
+ .pos = {-1.0f, -1.0f, 0.0f},
+ .offset = {5, 32},
+ .type_def = {
+ .text = {
+ .text = "",
+ .color = {1.0f, 1.0f, 1.0f},
+ },
+ },
+ });
+
+ f64 fps_update_timer = 1.0f;
+ int frames = 0;
+
struct timespec ts, ts_old;
clock_gettime(CLOCK_REALTIME, &ts_old);
f64 dtime = (f64) (ts.tv_sec - ts_old.tv_sec) + (f64) (ts.tv_nsec - ts_old.tv_nsec) / 1000000000.0;
ts_old = ts;
+ if ((fps_update_timer -= dtime) <= 0.0) {
+ // I don't think anyone will have more than 9999 FPS lol, but I have seen 1000 in jordan4ibanez' video yet so...
+ // 4 digits for FPS + space + "FPS" + \0
+ char fps[4 + 1 + 3 + 1];
+ sprintf(fps, "%d FPS", frames);
+ hud_change_text(fps_hud, fps);
+ fps_update_timer += 1.0;
+ frames = 0;
+ }
+
+ frames++;
+
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glEnable(GL_MULTISAMPLE);
hud.font_loc_projection = glGetUniformLocation(hud.font_prog, "projection");
hud.font_loc_text_color = glGetUniformLocation(hud.font_prog, "textColor");
-
hud.elements = list_create(NULL);
hud.image_mesh = mesh_create();
{
HUDElement *element = key;
- if (element->def.type == HUD_TEXT)
+ if (element->def.type == HUD_TEXT) {
font_delete(element->type_data.text);
+ free(element->def.type_def.text.text);
+ }
free(element);
}
element_transform(element);
- if (element->def.type == HUD_TEXT)
+ if (element->def.type == HUD_TEXT) {
+ element->def.type_def.text.text = strdup(element->def.type_def.text.text);
element->type_data.text = font_create(element->def.type_def.text.text);
+ }
list_set(&hud.elements, element, NULL);
return element;
}
+
+void hud_change_text(HUDElement *element, char *text)
+{
+ if (strcmp(element->def.type_def.text.text, text)) {
+ element->def.type_def.text.text = strdup(text);
+ font_delete(element->type_data.text);
+ element->type_data.text = font_create(text);
+ }
+}
void hud_on_resize(int width, int height);
void hud_render();
HUDElement *hud_add(HUDElementDefinition def);
+void hud_change_text(HUDElement *element, char *text);
#endif