diff options
author | nathansmith117 <nathansmith@disroot.org> | 2025-03-05 15:00:14 +0000 |
---|---|---|
committer | nathansmith117 <nathansmith@disroot.org> | 2025-03-05 15:00:14 +0000 |
commit | 449e5a9c92c1fe62dc0dd75718486b791717184f (patch) | |
tree | acdaf7302839fb6f8a7e719ee0c0240f6d166a33 /src | |
parent | c163983e324968907a878bd43a3b27a4be8cffe4 (diff) | |
download | sldj-449e5a9c92c1fe62dc0dd75718486b791717184f.tar.gz sldj-449e5a9c92c1fe62dc0dd75718486b791717184f.tar.bz2 sldj-449e5a9c92c1fe62dc0dd75718486b791717184f.zip |
Fps slider
Diffstat (limited to 'src')
-rw-r--r-- | src/sldj.c | 93 | ||||
-rw-r--r-- | src/sldj.h | 13 | ||||
-rw-r--r-- | src/sldjConfig.h | 6 |
3 files changed, 96 insertions, 16 deletions
@@ -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) @@ -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 |