]> git.lizzy.rs Git - nothing.git/commitdiff
(#278) Implement camera_map_screen
authorrexim <reximkut@gmail.com>
Sat, 6 Apr 2019 18:38:07 +0000 (01:38 +0700)
committerrexim <reximkut@gmail.com>
Sat, 6 Apr 2019 18:38:07 +0000 (01:38 +0700)
src/game.c
src/game/camera.c
src/game/proto_rect.c

index 7ef76f3a0b9113795e405f3bdac9b5394af21f2d..ce82d80bfd706b3f4c5fdca9c2fdba735c3f6857 100644 (file)
@@ -508,7 +508,7 @@ static int game_render_cursor(const Game *game)
     trace_assert(game);
 
     SDL_Rect src = {0, 0, 32, 32};
-    SDL_Rect dest = {game->cursor_x, game->cursor_y, 32, 32};
+    SDL_Rect dest = {game->cursor_x, game->cursor_y, 128, 128};
     if (SDL_RenderCopy(game->renderer, game->texture_cursor, &src, &dest) < 0) {
         return -1;
     }
index d6aa1e157371d4c107adfe19b237ade44f82e3b6..90b2c6db428188259d039859b4a3168532c03102 100644 (file)
@@ -400,8 +400,24 @@ Vec camera_map_screen(const Camera *camera,
                       Sint32 x, Sint32 y)
 {
     trace_assert(camera);
-    (void) x;
-    (void) y;
-    // TODO: camera_map_screen is not implemented
-    return vec(0.0f, 0.0f);
+
+    SDL_Rect view_port;
+    SDL_RenderGetViewport(camera->renderer, &view_port);
+
+    Vec es = effective_scale(&view_port);
+    es.x = 1.0f / es.x;
+    es.y = 1.0f / es.y;
+
+    const Vec p = vec((float) x, (float) y);
+
+    return vec_sum(
+        vec_entry_mult(
+            vec_scala_mult(
+                vec_sum(
+                    p,
+                    vec((float) view_port.w * -0.5f,
+                        (float) view_port.h * -0.5f)),
+                1.0f / camera->scale),
+            es),
+        camera->position);
 }
index 6de59b06ec63fc36b571c5f8dd9826572022efd5..35f516893e842c18c63d575f06a5e57f300f0e81 100644 (file)
@@ -53,6 +53,13 @@ int proto_rect_event(ProtoRect *proto_rect,
             } break;
             }
         } break;
+
+        case SDL_MOUSEMOTION: {
+            proto_rect->end = camera_map_screen(
+                camera,
+                event->motion.x,
+                event->motion.y);
+        } break;
         }
     } else {
         // Inactive