#include "game.hpp" namespace interface { state_t::state_t(sf::RenderWindow *window_, game::state_t *game_) { window = window_; game = game_; } static sf::Vector2f compute_pan(sf::RenderWindow *window, sf::Vector2f pan_ref) { sf::Vector2i mouse = sf::Mouse::getPosition(*window); sf::Vector2f vmouse = window->mapPixelToCoords(mouse); return -(vmouse - pan_ref); } void state_t::tick(double dt) { sf::Vector2u size; sf::Event event; sf::Vector2f view_size; v2f_t wmouse; // Mouse position in world space; size = window->getSize(); camera.zoom = expfade(camera.zoom, camera.target_zoom, 15, dt); { float view_scale; view_scale = 3 * exp(camera.zoom * 0.12); 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)) { // FIXME: refactor this nested switch clusterfuck switch (event.type) { case sf::Event::Closed: window->close(); return; case sf::Event::MouseButtonPressed: wmouse = window->mapPixelToCoords(sf::Vector2i(event.mouseButton.x, event.mouseButton.y)); switch (event.mouseButton.button) { case sf::Mouse::Button::Left: select.selecting = true; select.rect[0] = wmouse; select.rect[1] = wmouse; break; case sf::Mouse::Button::Right: game->command(wmouse); break; case sf::Mouse::Button::Middle: camera.panning = true; camera.pan_ref = wmouse; break; default:; } break; case sf::Event::MouseButtonReleased: switch (event.mouseButton.button) { case sf::Mouse::Button::Left: if (select.selecting) game->select(select.rect); select.selecting = false; break; case sf::Mouse::Button::Middle: if (camera.panning) camera.center += compute_pan(window, camera.pan_ref); camera.panning = false; break; default:; } break; case sf::Event::MouseWheelScrolled: camera.target_zoom -= event.mouseWheelScroll.delta; if (camera.target_zoom < 0) camera.target_zoom = 0; if (camera.target_zoom > 17) camera.target_zoom = 17; break; case sf::Event::KeyPressed: switch (event.key.code) { case sf::Keyboard::Key::F1: debug_draw_cmodels ^= 1; break; case sf::Keyboard::Key::F2: debug_draw_paths ^= 1; break; case sf::Keyboard::Key::F3: debug_draw_tile_coords ^= 1; break; default:; } default:; } } if (camera.panning) { sf::Vector2f delta = compute_pan(window, camera.pan_ref); window->setView(sf::View(camera.center + delta, view_size)); } else window->setView(sf::View(camera.center, view_size)); // Compute this _after_ the setView above. wmouse = window->mapPixelToCoords(sf::Mouse::getPosition(*window)); if (select.selecting) select.rect[1] = wmouse; } void state_t::print(std::string str) { log.push_back((log_entry_t){game->now, str}); std::cout << str << std::endl; } void state_t::render_to(render::state_t *render) { size_t w = window->getSize().x, h = window->getSize().y; v2f_t x; if (select.selecting) render->render_hlrect(select.rect, sf::Color(200, 100, 50)); window->setView(sf::View(sf::FloatRect(0, 0, w, h))); em = std::min(w, h) * 0.04; for (auto i = log.begin(); i != log.end(); ) { if (i->time + 3 < game->now) i = log.erase(i); else i++; } x = v2f_t(0.0f, 0.0f); for (log_entry_t &entry : log) { render->render_text(x, em, entry.text, render::ALIGN_LEFT_TOP, sf::Color::White); x[1] += em; } } } // namespace interface