1616#include " mapgen/Walker.hpp"
1717#include " rang.hpp"
1818
19+ #include < cmath>
20+
1921// TODO: move ints to utils.cpp
2022template <typename T> using filterFunc = std::function<bool (T *)>;
2123template <typename T> using sortFunc = std::function<bool (T *, T *)>;
@@ -52,6 +54,12 @@ class Painter {
5254 bgColor.g = static_cast <sf::Uint8>(color[1 ] * 255 .f );
5355 bgColor.b = static_cast <sf::Uint8>(color[2 ] * 255 .f );
5456 window->clear (bgColor);
57+
58+ char spath[100 ];
59+ sprintf (spath, " %s/blur.frag" , dir.c_str ());
60+
61+ shader_blur.loadFromFile (spath, sf::Shader::Type::Fragment);
62+ shader_blur.setUniform (" blur_radius" , 0 .004f );
5563 };
5664
5765 sf::Font sffont;
@@ -69,6 +77,7 @@ class Painter {
6977 bool needUpdate = true ;
7078 sf::Clock clock;
7179 std::vector<Walker*> walkers;
80+ sf::Shader shader_blur;
7281
7382 std::string get_selfpath () {
7483 char buff[PATH_MAX ];
@@ -113,6 +122,7 @@ class Painter {
113122
114123public:
115124 std::vector<sf::ConvexShape> polygons;
125+ std::vector<sf::ConvexShape> waterPolygons;
116126 std::vector<sf::ConvexShape> infoPolygons;
117127 std::vector<sf::CircleShape> poi;
118128 std::vector<sf::Sprite> sprites;
@@ -131,6 +141,8 @@ class Painter {
131141 bool states = true ;
132142 bool areas = false ;
133143 bool showWalkers = true ;
144+ bool lables = true ;
145+ bool blur = true ;
134146
135147 bool isIncreasing{true };
136148
@@ -170,7 +182,7 @@ class Painter {
170182 if (mapgen->map != nullptr ) {
171183 sf::Text operation (mapgen->map ->status , sffont);
172184 operation.setCharacterSize (20 );
173- operation.setColor (sf::Color::White);
185+ operation.setFillColor (sf::Color::White);
174186
175187 auto middle = (sf::Vector2f (window->getSize ())) / 2 .f ;
176188 operation.setPosition (sf::Vector2f (
@@ -325,8 +337,61 @@ class Painter {
325337 }
326338 }
327339
340+ void drawLables () {
341+ for (auto c : mapgen->map ->cities ) {
342+
343+ sf::RectangleShape bg;
344+ bg.setFillColor (sf::Color (50 ,30 ,22 , 200 ));
345+ if (c->isCapital ) {
346+ bg.setOutlineColor (c->region ->state ->color );
347+ } else {
348+ bg.setOutlineColor (sf::Color (200 ,200 ,180 , 180 ));
349+ }
350+ bg.setOutlineThickness (1 );
351+
352+ sf::Text label (c->name , sffont);
353+ label.setCharacterSize (10 );
354+ label.setFillColor (sf::Color (255 ,255 ,220 ));
355+ label.setPosition (sf::Vector2f (c->region ->site ->x , c->region ->site ->y + 10 ));
356+
357+ bg.setSize (sf::Vector2f (label.getGlobalBounds ().width + 8 , 18 ));
358+ bg.setPosition (sf::Vector2f (c->region ->site ->x - 4 , c->region ->site ->y + 7 ));
359+
360+ window->draw (bg);
361+ window->draw (label);
362+ }
363+ }
364+
328365 void drawMap () {
329366 if (needUpdate) {
367+ sf::Vector2u windowSize = window->getSize ();
368+ for (auto p : waterPolygons) {
369+ window->draw (p);
370+ }
371+
372+ if (blur) {
373+ for (auto p : polygons) {
374+ window->draw (p);
375+ }
376+ cachedMap.create (windowSize.x , windowSize.y );
377+ cachedMap.update (*window);
378+
379+ sf::RectangleShape rectangle;
380+ rectangle.setSize (sf::Vector2f (window->getSize ().x , window->getSize ().y ));
381+ rectangle.setPosition (0 , 0 );
382+ rectangle.setTexture (&cachedMap);
383+
384+ window->draw (rectangle, &shader_blur);
385+
386+ for (auto p : polygons) {
387+ auto p2 = sf::ConvexShape (p);
388+ p2.setFillColor (bgColor);
389+ p2.setOutlineColor (sf::Color (50 ,20 ,0 ));
390+ p2.setOutlineThickness (2 );
391+ window->draw (p2);
392+ }
393+ }
394+
330395 for (auto p : polygons) {
331396 window->draw (p);
332397 }
@@ -339,11 +404,10 @@ class Painter {
339404 window->draw (sprite);
340405 }
341406
342- // if (info) {
343- // for (auto p : poi) {
344- // window->draw(p);
345- // }
346- // }
407+ if (lables) {
408+ drawLables ();
409+ }
410+
347411 if (states) {
348412 drawBorders ();
349413 }
@@ -368,7 +432,6 @@ class Painter {
368432 }
369433 drawMark ();
370434
371- sf::Vector2u windowSize = window->getSize ();
372435 cachedMap.create (windowSize.x , windowSize.y );
373436 cachedMap.update (*window);
374437 needUpdate = false ;
@@ -377,6 +440,7 @@ class Painter {
377440 rectangle.setSize (sf::Vector2f (window->getSize ().x , window->getSize ().y ));
378441 rectangle.setPosition (0 , 0 );
379442 rectangle.setTexture (&cachedMap);
443+
380444 window->draw (rectangle);
381445 }
382446 }
@@ -469,7 +533,7 @@ class Painter {
469533 sprintf (mt, " Mapgen [%s] by Averrin" , VERSION .c_str ());
470534 sf::Text mark (mt, sffont);
471535 mark.setCharacterSize (15 );
472- mark.setColor (sf::Color::White);
536+ mark.setFillColor (sf::Color::White);
473537 mark.setPosition (sf::Vector2f (windowSize.x - 240 , windowSize.y - 25 ));
474538 window->draw (mark);
475539 }
@@ -483,6 +547,7 @@ class Painter {
483547 void update () {
484548 infoPolygons.clear ();
485549 polygons.clear ();
550+ waterPolygons.clear ();
486551 poi.clear ();
487552 sprites.clear ();
488553 walkers.clear ();
@@ -610,7 +675,11 @@ class Painter {
610675 polygon.setFillColor (col);
611676 }
612677 }
613- polygons.push_back (polygon);
678+ if (region->megaCluster ->isLand ) {
679+ polygons.push_back (polygon);
680+ } else {
681+ waterPolygons.push_back (polygon);
682+ }
614683 }
615684
616685 needUpdate = true ;
0 commit comments