From 384e4dd24d232708c118432504fa8223b7ef60fe Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Mon, 25 Nov 2024 17:40:24 +0100 Subject: working on it --- src/scenes/world_map.c | 71 +++++++++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 30 deletions(-) (limited to 'src/scenes') diff --git a/src/scenes/world_map.c b/src/scenes/world_map.c index eb106cb..4f1e20e 100644 --- a/src/scenes/world_map.c +++ b/src/scenes/world_map.c @@ -981,48 +981,59 @@ static void world_map_draw_viewing_job(platform_window* window) static void world_handle_scroll(platform_window* window) { - static float target_zoom = 1.0f; + float prev_zoom = zoom; + bool changed = false; if (global_ui_context.mouse->scroll_state == SCROLL_UP) { - if (target_zoom < zoom) target_zoom = zoom; - target_zoom+=0.1f; + zoom+=0.1f; + changed = true; } if (global_ui_context.mouse->scroll_state == SCROLL_DOWN) { - if (target_zoom > zoom) target_zoom = zoom; - target_zoom-=0.1f; + zoom-=0.1f; + changed = true; } + if (zoom < 1.0f) zoom = 1.0f; + else if (zoom > 2.0f) zoom = 2.0f; - // Keep camera position - if (target_zoom != zoom) { - vec4 area = camera_get_target_rectangle(window); - int orig_w = area.w * zoom; - int orig_h = area.h * zoom; - int new_w = area.w * target_zoom; - int new_h = area.h * target_zoom; - - float errorw = new_w - orig_w; - float errorh = new_h - orig_h; - camera_x -= errorw / 25.0f; - camera_y -= errorh / 40.0f; - } + if (changed && prev_zoom != zoom) { - // Smooth scrolling - if (target_zoom != zoom) - { - float error = target_zoom - zoom; - zoom += error / 10; - } + float cursor_offset_x = (((_global_mouse.x) - (float)area.w / 2) / area.w); + float cursor_offset_y = (((_global_mouse.y) - (float)area.h / 2) / area.h); - if (zoom < 1.0f) zoom = 1.0f; - if (zoom > 5.0f) zoom = 5.0f; + if (zoom < prev_zoom) { + float center_y = -((area.h * zoom) - area.h) / 2; + float center_x = -((area.w * zoom) - area.w) / 2; - if (camera_x > 0.0f) camera_x = 0.0f; - if (camera_y > 0.0f) camera_y = 0.0f; + float diffy = center_y - camera_y; + float diffx = center_x - camera_x; - //if (is_left_down_peak()) - { + //camera_x -= (camera_x - center_x)/150; + //camera_y -= (camera_y - center_y)/150; + + //camera_x = center_x; + //camera_y = center_y; + + printf("%f %f\n", diffx, diffy); + } + else { + int space_lost_x = ( (area.w * zoom) - (area.w * prev_zoom) ); + camera_x -= space_lost_x/2 + (cursor_offset_x*150); + + int space_lost_y = ( (area.h * zoom) - (area.h * prev_zoom) ); + camera_y -= space_lost_y/2 + (cursor_offset_y*150); + } + + vec4 area = camera_get_target_rectangle(window); + + if (camera_x > 0.0f) camera_x = 0.0f; + if (camera_y > 0.0f) camera_y = 0.0f; + + float max_camera_offset_y = -((area.h * zoom) - area.h); + float max_camera_offset_x = -((area.w * zoom) - area.w); + if (camera_y < max_camera_offset_y) camera_y = max_camera_offset_y; + if (camera_x < max_camera_offset_x) camera_x = max_camera_offset_x; } } -- cgit v1.2.3-70-g09d2