summaryrefslogtreecommitdiff
path: root/src/interface.cpp
blob: 16fc77d1d674c975704c5790af33aea31b8a54b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "common.hpp"

namespace interface {

state_t::state_t(sf::RenderWindow *window_, game::state_t *game_)
{
	window = window_;
	game = game_;
}

static sf::Vector2f compute_drag(sf::RenderWindow *window, sf::Vector2f drag_ref)
{
	sf::Vector2i mouse = sf::Mouse::getPosition(*window);
	sf::Vector2f vmouse = window->mapPixelToCoords(mouse);
	return -(vmouse - drag_ref);
}

void state_t::tick(void)
{
	sf::Vector2u size;
	sf::Event event;
	sf::Vector2f view_size;

	size = window->getSize();

	camera.zoom = (camera.zoom + camera.target_zoom) / 2;

	{
		float view_scale;

		view_scale = 3 * exp(camera.zoom * 0.3);
		if (size.x > size.y) {
			view_size.y = view_scale;
			view_size.x = view_scale * size.x / size.y;
		} else {
			view_size.x = view_scale;
			view_size.y = view_scale * size.y / size.x;
		}

		window->setView(sf::View(camera.center, view_size));
	}


	while (window->pollEvent(event)) {
		switch (event.type)  {
		case sf::Event::Closed:
			window->close();
			return;

		case sf::Event::MouseButtonPressed:
			if (event.mouseButton.button == 1) {
				camera.dragging = true;
				camera.drag_ref = window->mapPixelToCoords(
				                  sf::Vector2i(event.mouseButton.x,
				                  event.mouseButton.y));
			}
			break;

		case sf::Event::MouseButtonReleased:
			if (event.mouseButton.button == 1) {
				if (camera.dragging)
					camera.center += compute_drag(window, camera.drag_ref);
				camera.dragging = false;
			}
			break;

		case sf::Event::MouseWheelScrolled:
			camera.target_zoom -= event.mouseWheelScroll.delta;
			if (camera.target_zoom < 0)
				camera.target_zoom = 0;
			if (camera.target_zoom > 10)
				camera.target_zoom = 10;
			break;

		default:;
		}
	}

	if (camera.dragging) {
		sf::Vector2f delta = compute_drag(window, camera.drag_ref);
		window->setView(sf::View(camera.center + delta, view_size));
	} else
		window->setView(sf::View(camera.center, view_size));
}

} // namespace interface