]> git.lizzy.rs Git - nothing.git/commitdiff
Try to recalculate effective scale only when it's needed
authorrexim <reximkut@gmail.com>
Sat, 7 Dec 2019 18:37:25 +0000 (01:37 +0700)
committerrexim <reximkut@gmail.com>
Sat, 7 Dec 2019 18:37:25 +0000 (01:37 +0700)
src/config.h
src/game.c
src/game/camera.c
src/game/camera.h

index c5bf63c497a422daec2d7d03321ab84afc989922..b2e423f8741968b154393ff5bdb973ded4c5073e 100644 (file)
@@ -19,4 +19,7 @@
 
 #define SNAPPING_THRESHOLD 10.0f
 
+#define CAMERA_RATIO_X 16.0f
+#define CAMERA_RATIO_Y 9.0f
+
 #endif  // CONFIG_H_
index 818af559dff78f58acb40cdbef7059ee8588373b..d120cff3f2e209b8af80af857bc927d48d595993 100644 (file)
@@ -221,6 +221,11 @@ int game_update(Game *game, float delta_time)
     trace_assert(game);
     trace_assert(delta_time > 0.0f);
 
+    // TODO: effective scale recalculation should be probably done only when the size of the window is changed
+    SDL_Rect view_port;
+    SDL_RenderGetViewport(game->camera.renderer, &view_port);
+    game->camera.effective_scale = effective_scale(&view_port);
+
     if (game->console_enabled) {
         if (console_update(game->console, delta_time) < 0) {
             return -1;
index fe05bbe403d142b7becb893598ac9bf51a19f9f8..693792da2b7a9e206a5079ed183f51d120bfde59 100644 (file)
 #include "system/log.h"
 #include "system/stacktrace.h"
 
-#define RATIO_X 16.0f
-#define RATIO_Y 9.0f
-
-static Vec2f effective_ratio(const SDL_Rect *view_port);
-static Vec2f effective_scale(const SDL_Rect *view_port);
 static Triangle camera_triangle(const Camera *camera,
                                 const Triangle t);
 
@@ -172,7 +167,7 @@ int camera_render_text(const Camera *camera,
     SDL_Rect view_port;
     SDL_RenderGetViewport(camera->renderer, &view_port);
 
-    const Vec2f scale = effective_scale(&view_port);
+    const Vec2f scale = camera->effective_scale;
     const Vec2f screen_position = camera_point(camera, position);
 
     if (sprite_font_render_text(
@@ -312,22 +307,6 @@ int camera_is_text_visible(const Camera *camera,
 
 /* ---------- Private Function ---------- */
 
-static Vec2f effective_ratio(const SDL_Rect *view_port)
-{
-    if ((float) view_port->w / RATIO_X > (float) view_port->h / RATIO_Y) {
-        return vec(RATIO_X, (float) view_port->h / ((float) view_port->w / RATIO_X));
-    } else {
-        return vec((float) view_port->w / ((float) view_port->h / RATIO_Y), RATIO_Y);
-    }
-}
-
-static Vec2f effective_scale(const SDL_Rect *view_port)
-{
-    return vec_entry_div(
-        vec((float) view_port->w, (float) view_port->h),
-        vec_scala_mult(effective_ratio(view_port), 50.0f));
-}
-
 Vec2f camera_point(const Camera *camera, const Vec2f p)
 {
     SDL_Rect view_port;
@@ -337,7 +316,7 @@ Vec2f camera_point(const Camera *camera, const Vec2f p)
         vec_scala_mult(
             vec_entry_mult(
                 vec_sum(p, vec_neg(camera->position)),
-                effective_scale(&view_port)),
+                camera->effective_scale),
             camera->scale),
         vec((float) view_port.w * 0.5f,
             (float) view_port.h * 0.5f));
@@ -388,7 +367,7 @@ Vec2f camera_map_screen(const Camera *camera,
     SDL_Rect view_port;
     SDL_RenderGetViewport(camera->renderer, &view_port);
 
-    Vec2f es = effective_scale(&view_port);
+    Vec2f es = camera->effective_scale;
     es.x = 1.0f / es.x;
     es.y = 1.0f / es.y;
 
index 71943de9eb4468b6a82aebe2a40574d976d97cfd..4f574bd06fc91c45111f0177a5afbd1a7c028533 100644 (file)
@@ -8,6 +8,7 @@
 #include "math/vec.h"
 #include "math/rect.h"
 #include "math/triangle.h"
+#include "config.h"
 
 typedef struct {
     bool debug_mode;
@@ -16,6 +17,7 @@ typedef struct {
     float scale;
     SDL_Renderer *renderer;
     Sprite_font *font;
+    Vec2f effective_scale;
 } Camera;
 
 Camera create_camera(SDL_Renderer *renderer,
@@ -101,4 +103,20 @@ int camera_fill_rect_screen(const Camera *camera,
 
 const Sprite_font *camera_font(const Camera *camera);
 
+static Vec2f effective_ratio(const SDL_Rect *view_port)
+{
+    if ((float) view_port->w / CAMERA_RATIO_X > (float) view_port->h / CAMERA_RATIO_Y) {
+        return vec(CAMERA_RATIO_X, (float) view_port->h / ((float) view_port->w / CAMERA_RATIO_X));
+    } else {
+        return vec((float) view_port->w / ((float) view_port->h / CAMERA_RATIO_Y), CAMERA_RATIO_Y);
+    }
+}
+
+static Vec2f effective_scale(const SDL_Rect *view_port)
+{
+    return vec_entry_div(
+        vec((float) view_port->w, (float) view_port->h),
+        vec_scala_mult(effective_ratio(view_port), 50.0f));
+}
+
 #endif  // CAMERA_H_