From 4f8a1474e9c9d70c91d9e7369645f0b71d05ab14 Mon Sep 17 00:00:00 2001
From: AnonymusRaccoon
Date: Wed, 11 Mar 2020 17:30:03 +0100
Subject: [PATCH] Adding an option for framerate
---
CMakeLists.txt | 2 +-
include/setup.h | 3 ++
lib/gamacon | 2 +-
prefabs/options.gcprefab | 4 +++
src/framerate.c | 67 ++++++++++++++++++++++++++++++++++++++++
src/game_loader.c | 2 ++
src/main_menu.c | 2 ++
7 files changed, 80 insertions(+), 2 deletions(-)
create mode 100644 src/framerate.c
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 49ba380..9a4b40e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -252,7 +252,7 @@ add_executable(My3D
src/components/isometry/map_manager_component.c
include/components/isometry/map_manager_component.h
lib/gamacon/src/components/isometry/vertex_data_loader.c
- lib/gamacon/include/vertex_data_loader.h src/toolbar.c lib/gamacon/include/callbacks.h src/selectors.c)
+ lib/gamacon/include/vertex_data_loader.h src/toolbar.c lib/gamacon/include/callbacks.h src/selectors.c src/framerate.c)
add_compile_options(-W -Wall -Wextra -Wshadow)
diff --git a/include/setup.h b/include/setup.h
index 606312d..de33326 100644
--- a/include/setup.h
+++ b/include/setup.h
@@ -21,10 +21,13 @@ bool toggle_pause(gc_engine *engine, gc_entity *entity, gc_vector2 _);
int checkbox_update(gc_scene *s, gc_entity *entity, bool checked);
void resolution_set_text(gc_entity *entity, gc_engine *engine);
+void framerate_set_text(gc_entity *entity, gc_engine *engine);
bool fullscreen(gc_engine *engine, gc_entity *entity, gc_vector2 _);
bool resolution_down(gc_engine *engine, gc_entity *entity, gc_vector2 _);
bool resolution_up(gc_engine *engine, gc_entity *entity, gc_vector2 _);
+bool framerate_up(gc_engine *engine, gc_entity *entity, gc_vector2 _);
+bool framerate_down(gc_engine *engine, gc_entity *entity, gc_vector2 _);
bool tile_select(gc_engine *engine, gc_entity *entity, gc_vector2 _);
bool vertex_select(gc_engine *engine, gc_entity *entity, gc_vector2 _);
diff --git a/lib/gamacon b/lib/gamacon
index e23cf1c..9becdae 160000
--- a/lib/gamacon
+++ b/lib/gamacon
@@ -1 +1 @@
-Subproject commit e23cf1c4fcb128bf11a89fdad17b00d094b4df7d
+Subproject commit 9becdaece57a97ee5706924d4a7575a2162bc86f
diff --git a/prefabs/options.gcprefab b/prefabs/options.gcprefab
index cae308a..72b21bc 100644
--- a/prefabs/options.gcprefab
+++ b/prefabs/options.gcprefab
@@ -11,6 +11,10 @@
+
+
+
+
diff --git a/src/framerate.c b/src/framerate.c
new file mode 100644
index 0000000..157d38b
--- /dev/null
+++ b/src/framerate.c
@@ -0,0 +1,67 @@
+//
+// Created by anonymus-raccoon on 3/11/20.
+//
+
+#include "entity.h"
+#include "engine.h"
+#include
+#include "utility.h"
+#include "renderer.h"
+#include "systems/sfml_renderer_system.h"
+#include "limits.h"
+
+static const int framerates[] = {
+ 30,
+ 60,
+ 120,
+ INT_MAX
+};
+
+void framerate_set_text(gc_entity *entity, gc_engine *engine)
+{
+ struct sfml_renderer_system *rend = GETSYS(engine, sfml_renderer_system);
+ struct renderer *renderer;
+ char *framerate;
+
+ if (!entity)
+ return;
+ renderer = GETCMP(entity, renderer);
+ if (!rend || !renderer || renderer->type != GC_TXTREND)
+ return;
+ framerate = tostr(rend->framerate);
+ free(((gc_text *)renderer->data)->text);
+ ((gc_text *)renderer->data)->text = framerate;
+}
+
+
+bool framerate_down(gc_engine *engine, gc_entity *entity, gc_vector2 _)
+{
+ struct sfml_renderer_system *rend = GETSYS(engine, sfml_renderer_system);
+ int i = 2;
+
+ if (!rend || rend->is_fullscreen)
+ return (false);
+ while (i > 0 && framerates[i] >= rend->framerate)
+ i--;
+ sfRenderWindow_setFramerateLimit(rend->window, framerates[i]);
+ rend->framerate = framerates[i];
+ framerate_set_text(engine->scene->get_entity(engine->scene, 52), engine);
+ return (true);
+}
+
+bool framerate_up(gc_engine *engine, gc_entity *entity, gc_vector2 _)
+{
+ struct sfml_renderer_system *rend = GETSYS(engine, sfml_renderer_system);
+ int i = 0;
+
+ if (!rend || rend->is_fullscreen)
+ return (false);
+ while (framerates[i] <= rend->framerate)
+ i++;
+ if (framerates[i] == INT_MAX)
+ return (true);
+ sfRenderWindow_setFramerateLimit(rend->window, framerates[i]);
+ rend->framerate = framerates[i];
+ framerate_set_text(engine->scene->get_entity(engine->scene, 52), engine);
+ return (true);
+}
\ No newline at end of file
diff --git a/src/game_loader.c b/src/game_loader.c
index f65d64d..9d094ef 100644
--- a/src/game_loader.c
+++ b/src/game_loader.c
@@ -27,6 +27,8 @@ const struct callback callbacks[] = {
{"map_manage_click", &tile_interact},
{"resolution_down", &resolution_down},
{"resolution_up", &resolution_up},
+ {"framerate_up", &framerate_up},
+ {"framerate_down", &framerate_down},
{"absent_check", &absent_check},
{"absent_cross", &absent_cross},
{"forgot_lmfao", &forgot_lmfao},
diff --git a/src/main_menu.c b/src/main_menu.c
index 5198220..e517b09 100644
--- a/src/main_menu.c
+++ b/src/main_menu.c
@@ -36,6 +36,8 @@ bool options(gc_engine *engine, gc_entity *entity, gc_vector2 _)
checkbox_update(engine->scene, entity, rend->is_fullscreen);
entity = engine->scene->get_entity(engine->scene, 51);
resolution_set_text(entity, engine);
+ entity = engine->scene->get_entity(engine->scene, 52);
+ framerate_set_text(entity, engine);
return (true);
}