aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornathansmith117 <nathansmith@disroot.org>2025-03-05 15:00:14 +0000
committernathansmith117 <nathansmith@disroot.org>2025-03-05 15:00:14 +0000
commit449e5a9c92c1fe62dc0dd75718486b791717184f (patch)
treeacdaf7302839fb6f8a7e719ee0c0240f6d166a33
parentc163983e324968907a878bd43a3b27a4be8cffe4 (diff)
downloadsldj-449e5a9c92c1fe62dc0dd75718486b791717184f.tar.gz
sldj-449e5a9c92c1fe62dc0dd75718486b791717184f.tar.bz2
sldj-449e5a9c92c1fe62dc0dd75718486b791717184f.zip
Fps slider
-rw-r--r--src/sldj.c93
-rw-r--r--src/sldj.h13
-rw-r--r--src/sldjConfig.h6
3 files changed, 96 insertions, 16 deletions
diff --git a/src/sldj.c b/src/sldj.c
index c900995..85b18fe 100644
--- a/src/sldj.c
+++ b/src/sldj.c
@@ -8,23 +8,72 @@ void initSldj(Sldj* sldj)
sldj->isPaused = false;
- //SetTargetFPS(DEFAULT_FRAME_RATE);
+ SetTargetFPS(DEFAULT_FRAME_RATE);
sldj->targetFps = DEFAULT_FRAME_RATE;
sldj->viewport = LoadRenderTexture(DEFAULT_SCREEN_WIDTH, DEFAULT_SCREEN_HEIGHT);
sldj->frameCounter = 0;
sldj->xCount = UINT16_MAX / DEFAULT_SCREEN_WIDTH;
sldj->yCount = UINT16_MAX / DEFAULT_SCREEN_HEIGHT;
+ resetViewportRect(sldj, DEFAULT_SCREEN_SCALE);
// Scripting.
initScripting(&sldj->scripting);
sldj->scriptFilepath[0] = '\0';
+
+ // Gui.
+ resizeGui(sldj);
+ sldj->gui.fpsSliderValue = (float)DEFAULT_FRAME_RATE;
+}
+
+void handleInput(Sldj* sldj)
+{
+ if (IsKeyPressed(KEY_R))
+ {
+ reloadScript(sldj);
+ sldj->isPaused = false;
+ }
+
+ if (IsKeyPressed(KEY_SPACE))
+ {
+ sldj->isPaused = !sldj->isPaused;
+ }
+}
+
+void drawGui(Sldj* sldj)
+{
+ char buf[15]; // Used for many things.
+
+ // Fps.
+ float oldFps = sldj->gui.fpsSliderValue;
+
+ if (oldFps > FRAME_RATE_MAX)
+ {
+ strncpy(buf, "unlimited", sizeof(buf));
+ }
+ else
+ {
+ snprintf(buf, sizeof(buf), "%d", (int)oldFps);
+ }
+
+ GuiSlider(sldj->gui.fpsSlider, "fps", buf, &sldj->gui.fpsSliderValue, FRAME_RATE_MIN, FRAME_RATE_MAX + 1);
+
+ // Fps has changed.
+ if (sldj->gui.fpsSliderValue != oldFps)
+ {
+ sldj->targetFps = (uint32_t)sldj->gui.fpsSliderValue;
+ sldj->targetFps = sldj->targetFps > FRAME_RATE_MAX ? 0 : sldj->targetFps;
+
+ SetTargetFPS(sldj->targetFps);
+ }
}
void updateSldj(Sldj* sldj)
{
BeginDrawing();
+ handleInput(sldj);
+
// Scan image.
BeginTextureMode(sldj->viewport);
@@ -58,25 +107,14 @@ void updateSldj(Sldj* sldj)
DrawTexturePro(
viewport,
(Rectangle){0.0, 0.0, viewport.width, viewport.height},
- (Rectangle){0.0, 0.0, viewport.width, viewport.height},
+ sldj->viewPortRect,
(Vector2){0.0, 0.0},
0.0,
WHITE
);
DrawFPS(0, viewport.height);
-
- // Handle input.
- if (IsKeyPressed(KEY_R))
- {
- reloadScript(sldj);
- sldj->isPaused = false;
- }
-
- if (IsKeyPressed(KEY_SPACE))
- {
- sldj->isPaused = !sldj->isPaused;
- }
+ drawGui(sldj);
EndDrawing();
}
@@ -89,12 +127,37 @@ void closeSldj(Sldj* sldj)
CloseWindow();
}
-void resetViewport(Sldj* sldj, int width, int height)
+void resizeGui(Sldj* sldj)
+{
+ Rectangle view = sldj->viewPortRect;
+
+ // Starting place for ui.
+ float startX = view.x + view.width + 5.0;
+ float startY = 5.0;
+
+ // Standard sizes unit for gui elements.
+ float guiWidth = 50.0;
+ float guiHeight = 25.0;
+
+ sldj->gui.fpsSlider = (Rectangle){startX + 20.0, startY, guiWidth * 3.0, guiHeight};
+}
+
+void resetViewportRect(Sldj* sldj, float scale)
+{
+ Texture texture = sldj->viewport.texture;
+ sldj->viewPortRect = (Rectangle){0.0, 0.0, texture.width * scale, texture.height * scale};
+}
+
+void resetViewport(Sldj* sldj, int width, int height, float scale)
{
UnloadRenderTexture(sldj->viewport);
sldj->viewport = LoadRenderTexture(width, height);
+
+ // Set up scan counters.
sldj->xCount = UINT16_MAX / width;
sldj->yCount = UINT16_MAX / height;
+
+ resetViewportRect(sldj, scale);
}
void reloadScriptContext(Sldj* sldj)
diff --git a/src/sldj.h b/src/sldj.h
index a577a60..694882e 100644
--- a/src/sldj.h
+++ b/src/sldj.h
@@ -4,6 +4,7 @@
#include <math.h>
#include <raylib.h>
+#include <raygui.h>
#include "sldjConfig.h"
#include "scripting.h"
@@ -14,6 +15,7 @@
typedef struct Sldj {
RenderTexture viewport;
+ Rectangle viewPortRect;
bool isPaused;
uint8_t targetFps;
@@ -25,13 +27,22 @@ typedef struct Sldj {
SldjScripting scripting;
char scriptFilepath[SLDJ_NAMEMAX];
+
+ struct {
+ Rectangle fpsSlider;
+ float fpsSliderValue;
+ } gui;
} Sldj;
void initSldj(Sldj* sldj);
void updateSldj(Sldj* sldj);
void closeSldj(Sldj* sldj);
-void resetViewport(Sldj* sldj, int width, int height);
+void resizeGui(Sldj* sldj);
+
+void resetViewportRect(Sldj* sldj, float scale);
+void resetViewport(Sldj* sldj, int width, int height, float scale);
+
void reloadScriptContext(Sldj* sldj);
void reloadScript(Sldj* sldj);
diff --git a/src/sldjConfig.h b/src/sldjConfig.h
index c8285bd..69297de 100644
--- a/src/sldjConfig.h
+++ b/src/sldjConfig.h
@@ -1,13 +1,19 @@
#ifndef CONFIG_SLDJ_H
#define CONFIG_SLDJ_H
+// Window.
#define WINDOW_WIDTH 960
#define WINDOW_HEIGHT 720
+// Screen.
#define DEFAULT_SCREEN_WIDTH 480
#define DEFAULT_SCREEN_HEIGHT 360
+#define DEFAULT_SCREEN_SCALE 1.0
+// Frame rate.
#define DEFAULT_FRAME_RATE 24
+#define FRAME_RATE_MIN 5
+#define FRAME_RATE_MAX 60
#define SLDJ_NAMEMAX 255