From 44911658d0e7546971f535f28e319312496a42cb Mon Sep 17 00:00:00 2001 From: En Yi Date: Sat, 12 Oct 2024 15:02:08 +0800 Subject: [PATCH] Add basic window resizing --- engine/engine.c | 35 +++++++++++++++++++++++++++++++++-- engine/engine.h | 1 + main.c | 1 + 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/engine/engine.c b/engine/engine.c index 24b787f..d56139a 100644 --- a/engine/engine.c +++ b/engine/engine.c @@ -15,6 +15,7 @@ void init_engine(GameEngine_t* engine, Vector2 starting_win_size) init_assets(&engine->assets); engine->intended_window_size = starting_win_size; InitWindow(starting_win_size.x, starting_win_size.y, "raylib"); + engine->base_canvas = LoadRenderTexture(starting_win_size.x, starting_win_size.y); } void deinit_engine(GameEngine_t* engine) @@ -24,6 +25,7 @@ void deinit_engine(GameEngine_t* engine) sc_queue_term(&engine->key_buffer); sc_queue_term(&engine->scene_stack); sc_heap_term(&engine->scenes_render_order); + UnloadRenderTexture(engine->base_canvas); CloseAudioDevice(); CloseWindow(); } @@ -239,7 +241,6 @@ static void _internal_render_scene(Scene_t* scene) Vector2 draw_pos = {draw_rec.x, draw_rec.y}; draw_rec.x = 0; draw_rec.y = 0; - draw_rec.height *= -1; DrawTextureRec( layer->layer_tex.texture, draw_rec, @@ -251,8 +252,38 @@ static void _internal_render_scene(Scene_t* scene) inline void render_scene(Scene_t* scene) { - BeginDrawing(); + BeginTextureMode(scene->engine->base_canvas); _internal_render_scene(scene); + EndTextureMode(); + + int curr_width = GetRenderWidth(); + int curr_height = GetRenderHeight(); + Vector2 original_size = scene->engine->intended_window_size; + float wscale = (curr_width / original_size.x); + float hscale = (curr_height / original_size.y); + float min_dim = (wscale > hscale) ? hscale : wscale; + wscale = min_dim; + hscale = min_dim; + + Rectangle draw_rec = { + 0,0, + scene->engine->intended_window_size.x, + scene->engine->intended_window_size.y + }; + Rectangle draw_pos = { + draw_rec.x * wscale, draw_rec.y * hscale, + draw_rec.width * wscale, draw_rec.height * hscale + }; + draw_rec.y *= -1; + + BeginDrawing(); + ClearBackground((Color){0,0,0,255}); + DrawTexturePro( + scene->engine->base_canvas.texture, + draw_rec, + draw_pos, + (Vector2){0,0}, 0.0, WHITE + ); EndDrawing(); } diff --git a/engine/engine.h b/engine/engine.h index cfafc5b..4045a54 100644 --- a/engine/engine.h +++ b/engine/engine.h @@ -37,6 +37,7 @@ typedef struct GameEngine { // This is in case of window scaling, where there needs to be // an absolute reference Vector2 intended_window_size; + RenderTexture2D base_canvas; } GameEngine_t; #define SCENE_ACTIVE_BIT (1 << 0) // Systems Active diff --git a/main.c b/main.c index aa197b8..562a55d 100644 --- a/main.c +++ b/main.c @@ -26,6 +26,7 @@ int main(void) { // Initialization //-------------------------------------------------------------------------------------- + SetConfigFlags(FLAG_WINDOW_RESIZABLE); init_engine(&engine, (Vector2){screenWidth, screenHeight}); SetTargetFPS(60); // Set our game to run at 60 frames-per-second #ifndef NDEBUG