aboutsummaryrefslogtreecommitdiffstats
path: root/ui.cpp
blob: 23a2b487640ad23702cc9620a215f638b3794c97 (plain) (blame)
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104

#include "ui.hpp"

/*
    All modes :
        - h, j, k, l : move around
        - i, o : zoom in/out
    
*/

UI::UI(hilare_a_param *p) {
    _param = p;

    _p.begin_pos.param = _p.end_pos.param = p;

    _view.x0 = _view.y0 = 0;
    _view.zoom = 1;
}

void UI::run() {
    _settings.antialiasingLevel = 8;

    _win.create(sf::VideoMode(800, 600), "PR", sf::Style::Default, _settings);
    _win.setVerticalSyncEnabled(true);
    _win.setFramerateLimit(30);

    while (_win.isOpen()) {
        sf::Event ev;
        while (_win.pollEvent(ev)) {
            if (ev.type == sf::Event::Closed)
                _win.close();

            if (ev.type == sf::Event::TextEntered) {
                int k = ev.text.unicode;

                // TODO
            }
        }

        _win.clear(sf::Color::Black);

        render_internal();
        render_solution();
        render_problem();

        _win.display();
    }
}

void UI::render_circle(const circle &c, sf::Color border, sf::Color inside, int w) {
    double r = c.r * _view.zoom;
    sf::CircleShape a(r);
    a.setPosition(to_view(c.c));
    a.move(-r, -r);
    a.setFillColor(inside);
    a.setOutlineColor(border);
    a.setOutlineThickness(w);
    _win.draw(a);
}

void UI::render_pos(const hilare_a &pos, sf::Color c) {
    render_circle(circle(pos.pos(), pos.param->r_c_car), c, sf::Color::Transparent, 2);

    render_circle(circle(pos.pos_trolley(), pos.param->r_c_trolley), c, sf::Color::Transparent, 2);
}

void UI::render_obstacle(const obstacle &o) {
    render_circle(o.c, sf::Color::Transparent, sf::Color(100, 100, 100), 0);
}

void UI::render_mvt(const hilare_a_mvt &m) {
    // TODO
}

void UI::render_problem() {
    render_pos(_p.begin_pos, sf::Color::Blue);
    render_pos(_p.end_pos, sf::Color::Red);

    for (auto i = _p.obstacles.begin(); i != _p.obstacles.end(); i++) {
        render_obstacle(*i);
    }
}

void UI::render_solution() {
    for (auto i = _s.movement.begin(); i != _s.movement.end(); i++) {
        if (i != _s.movement.begin())
            render_pos(i->from, sf::Color::Green);
        render_mvt(*i);
    }
}

void UI::render_internal() {
    // TODO
}

sf::Vector2f UI::to_view(const vec &p) {
    return sf::Vector2f((p.x - _view.x0) * _view.zoom, (p.y - _view.y0) * _view.zoom);
}

vec UI::from_view(const sf::Vector2f &p) {
    return vec(p.x / _view.zoom + _view.x0, p.y / _view.zoom + _view.y0);
}

/* vim: set ts=4 sw=4 tw=0 noet :*/