Zooming in on mouse

This commit is contained in:
Synthasmagoria 2026-08-30 18:51:09 +02:00
commit ef350183e2
2 changed files with 12 additions and 3 deletions

View file

@ -38,6 +38,15 @@ grid_world_to_grid_matrix :: proc(zoom, offset: v2) -> mat3 {
return matrix3_translate2(offset) * matrix3_scale2(zoom_amount)
}
grid_zoom_in_on :: proc(grid: ^Grid, world_area: rect2, position: v2, amount: f32) {
area_size := rect_get_br(world_area)
mouse_screen_fraction := linalg.clamp(rl.GetMousePosition(), v2(0), area_size) / area_size
previous := matrix3_transform_xy(grid_world_to_grid_matrix(program.grid.zoom, program.grid.offset), area_size)
program.grid.zoom -= amount
current := matrix3_transform_xy(grid_world_to_grid_matrix(program.grid.zoom, program.grid.offset), area_size)
program.grid.offset -= (current - previous) * mouse_screen_fraction
}
draw_grid :: proc(grid: Grid, area, text_draw, text_clip: rect2, color: rl.Color) {
world_to_grid_matrix := grid_world_to_grid_matrix(grid.zoom, grid.offset)
grid_to_world_matrix := linalg.inverse(world_to_grid_matrix)

View file

@ -905,9 +905,9 @@ program_handle_mouse :: proc(mouse_state: MouseState, top_bar_container, matrix_
mouse_state = .DraggingGrid
break state_label
}
program.grid.zoom_previous = program.grid.zoom
grid_zoom_dimension_lock := v2{1.0 - f32(int(program.grid_zoom_y_only)), 1.0 - f32(int(program.grid_zoom_x_only))}
program.grid.zoom -= grid_zoom_dimension_lock * mouse_wheel.y * 0.2 * program.grid_zoom_speed
screen_size := v2(program_screen_size())
grid_zoom_in_on(&program.grid, {0, 0, screen_size.x, screen_size.y}, rl.GetMousePosition(), mouse_wheel.y * 0.1 * program.grid_zoom_speed)
case .DraggingDraggable:
if !rl.IsMouseButtonDown(.LEFT) {
mouse_state = .Hover