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;
#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);
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(
/* ---------- 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;
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));
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;
#include "math/vec.h"
#include "math/rect.h"
#include "math/triangle.h"
+#include "config.h"
typedef struct {
bool debug_mode;
float scale;
SDL_Renderer *renderer;
Sprite_font *font;
+ Vec2f effective_scale;
} Camera;
Camera create_camera(SDL_Renderer *renderer,
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_