summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/scenes/world_map.c71
-rw-r--r--src/world.c2
2 files changed, 42 insertions, 31 deletions
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;
}
}
diff --git a/src/world.c b/src/world.c
index fb917b3..bcff4e8 100644
--- a/src/world.c
+++ b/src/world.c
@@ -1408,7 +1408,7 @@ world_update_result world_render(platform_window* window, world* world)
color line_clr = COLOR_CONNECTION_BETWEEN_LOCATION_ACCESSIBLE;
if (!source->is_accessible) line_clr = COLOR_CONNECTION_BETWEEN_LOCATION_INACCESSIBLE;
- renderer->render_line(source->map_position_x, source->map_position_y, destination->map_position_x, destination->map_position_y, 1, line_clr);
+ renderer->render_line(source->map_position_x, source->map_position_y, destination->map_position_x, destination->map_position_y, 2, line_clr);
}
}